{"version":3,"file":"ping.mjs","names":[],"sources":["../../src/modules/ping.ts"],"sourcesContent":["import {\n  codeBlock,\n  GatewayDispatchEvents,\n  InteractionType,\n  LimitedCollection,\n  SnowflakeUtil,\n} from 'discord.js'\nimport prettyMilliseconds from 'pretty-ms'\nimport { SleetSlashCommand } from 'sleetcord'\n\nconst rawInteractions = new LimitedCollection<string, bigint>({\n  maxSize: 10,\n})\n\nexport const ping: SleetSlashCommand = new SleetSlashCommand(\n  {\n    name: 'ping',\n    description: 'Pong! Checks the bot latency',\n  },\n  {\n    raw(data) {\n      if (\n        data.t === GatewayDispatchEvents.InteractionCreate &&\n        data.d.type === InteractionType.ApplicationCommand &&\n        data.d.data.name === ping.name\n      ) {\n        rawInteractions.set(data.d.id, process.hrtime.bigint())\n      }\n    },\n    async run(interaction) {\n      // Handled first to minimize delay\n      const interactionHandled = process.hrtime.bigint()\n\n      const interactionCreate = SnowflakeUtil.timestampFrom(interaction.id)\n      const interactionReceived = rawInteractions.get(interaction.id)\n\n      const initialContent = formatResponseTime({\n        wsPing: this.client.ws.ping,\n        interactionCreate,\n        interactionReceived,\n        interactionHandled,\n      })\n\n      const messageSent = process.hrtime.bigint()\n\n      const reply = await interaction.reply({\n        content: initialContent,\n        fetchReply: true,\n      })\n\n      const content = formatResponseTime({\n        wsPing: this.client.ws.ping,\n        messageCreated: reply.createdTimestamp,\n        interactionCreate,\n\n        interactionReceived,\n        interactionHandled,\n        messageSent,\n        replyReceived: process.hrtime.bigint(),\n      })\n\n      await interaction.editReply(content)\n    },\n  },\n)\n\ninterface ResponseTime {\n  wsPing?: number | undefined\n  interactionCreate?: number | undefined\n  messageCreated?: number | undefined\n\n  interactionReceived?: bigint | undefined\n  interactionHandled?: bigint | undefined\n  messageSent?: bigint | undefined\n  replyReceived?: bigint | undefined\n}\n\nfunction formatResponseTime(r: ResponseTime): string {\n  return `**Websocket**: ${r.wsPing ? prettyMilliseconds(r.wsPing) : '...'}\\n${codeBlock(\n    'js',\n    `╭╼ Discord (ms)\n╰┬╼ Interaction Create (${r.interactionCreate ?? '...'})\n ├ ${delayBetween(r.interactionCreate, r.messageCreated)}\n ╰╼ Message Created (${r.messageCreated ?? '...'})\n\n╭╼ Bot (ns)\n╰┬╼ Interaction Received (${r.interactionReceived ?? '...'})\n ├ ${delayBetweenBI(r.interactionReceived, r.interactionHandled)}\n ├╼ Interaction Handled (${r.interactionHandled ?? '...'})\n ├ ${delayBetweenBI(r.interactionHandled, r.messageSent)}\n ├╼ Message Sent (${r.messageSent ?? '...'})\n ├ ${delayBetweenBI(r.messageSent, r.replyReceived)}\n ├╼ Reply Received (${r.replyReceived ?? '...'})\n ╰─╼ Total: ${delayBetweenBI(r.interactionReceived, r.replyReceived)}`,\n  )}`\n}\n\nfunction delayBetween(timeA: number | undefined, timeB: number | undefined): string {\n  if (timeA === undefined || timeB === undefined) {\n    return '...'\n  }\n\n  return prettyMilliseconds(timeB - timeA)\n}\n\nfunction delayBetweenBI(timeA: bigint | undefined, timeB: bigint | undefined): string {\n  if (timeA === undefined || timeB === undefined) {\n    return '...'\n  }\n\n  return prettyMilliseconds(Number(timeB - timeA) / 1_000_000, {\n    formatSubMilliseconds: true,\n  })\n}\n"],"mappings":";;;;AAUA,MAAM,kBAAkB,IAAI,kBAAkC,EAC5D,SAAS,IACV,CAAC;AAEF,MAAa,OAA0B,IAAI,kBACzC;CACE,MAAM;CACN,aAAa;CACd,EACD;CACE,IAAI,MAAM;AACR,MACE,KAAK,MAAM,sBAAsB,qBACjC,KAAK,EAAE,SAAS,gBAAgB,sBAChC,KAAK,EAAE,KAAK,SAAS,KAAK,KAE1B,iBAAgB,IAAI,KAAK,EAAE,IAAI,QAAQ,OAAO,QAAQ,CAAC;;CAG3D,MAAM,IAAI,aAAa;EAErB,MAAM,qBAAqB,QAAQ,OAAO,QAAQ;EAElD,MAAM,oBAAoB,cAAc,cAAc,YAAY,GAAG;EACrE,MAAM,sBAAsB,gBAAgB,IAAI,YAAY,GAAG;EAE/D,MAAM,iBAAiB,mBAAmB;GACxC,QAAQ,KAAK,OAAO,GAAG;GACvB;GACA;GACA;GACD,CAAC;EAEF,MAAM,cAAc,QAAQ,OAAO,QAAQ;EAE3C,MAAM,QAAQ,MAAM,YAAY,MAAM;GACpC,SAAS;GACT,YAAY;GACb,CAAC;EAEF,MAAM,UAAU,mBAAmB;GACjC,QAAQ,KAAK,OAAO,GAAG;GACvB,gBAAgB,MAAM;GACtB;GAEA;GACA;GACA;GACA,eAAe,QAAQ,OAAO,QAAQ;GACvC,CAAC;AAEF,QAAM,YAAY,UAAU,QAAQ;;CAEvC,CACF;AAaD,SAAS,mBAAmB,GAAyB;AACnD,QAAO,kBAAkB,EAAE,SAAS,mBAAmB,EAAE,OAAO,GAAG,MAAM,IAAI,UAC3E,MACA;0BACsB,EAAE,qBAAqB,MAAM;KAClD,aAAa,EAAE,mBAAmB,EAAE,eAAe,CAAC;uBAClC,EAAE,kBAAkB,MAAM;;;4BAGrB,EAAE,uBAAuB,MAAM;KACtD,eAAe,EAAE,qBAAqB,EAAE,mBAAmB,CAAC;2BACtC,EAAE,sBAAsB,MAAM;KACpD,eAAe,EAAE,oBAAoB,EAAE,YAAY,CAAC;oBACrC,EAAE,eAAe,MAAM;KACtC,eAAe,EAAE,aAAa,EAAE,cAAc,CAAC;sBAC9B,EAAE,iBAAiB,MAAM;cACjC,eAAe,EAAE,qBAAqB,EAAE,cAAc,GACjE;;AAGH,SAAS,aAAa,OAA2B,OAAmC;AAClF,KAAI,UAAU,KAAA,KAAa,UAAU,KAAA,EACnC,QAAO;AAGT,QAAO,mBAAmB,QAAQ,MAAM;;AAG1C,SAAS,eAAe,OAA2B,OAAmC;AACpF,KAAI,UAAU,KAAA,KAAa,UAAU,KAAA,EACnC,QAAO;AAGT,QAAO,mBAAmB,OAAO,QAAQ,MAAM,GAAG,KAAW,EAC3D,uBAAuB,MACxB,CAAC"}