@sapphire/framework
Version:
Discord bot framework built for advanced and amazing bots.
1 lines • 5.64 kB
Source Map (JSON)
{"version":3,"file":"InteractionHandlerStore.mjs","names":["promises: Promise<Result<unknown, { handler: InteractionHandler<InteractionHandlerOptions>; error: unknown }>>[]"],"sources":["../../../../src/lib/structures/InteractionHandlerStore.ts"],"sourcesContent":["import { Store } from '@sapphire/pieces';\nimport { Result, type Option } from '@sapphire/result';\nimport type { Interaction } from 'discord.js';\nimport { Events } from '../types/Events';\nimport { InteractionHandler, InteractionHandlerTypes, type InteractionHandlerOptions } from './InteractionHandler';\n\nexport class InteractionHandlerStore extends Store<InteractionHandler, 'interaction-handlers'> {\n\tpublic constructor() {\n\t\tsuper(InteractionHandler, { name: 'interaction-handlers' });\n\t}\n\n\tpublic async run(interaction: Interaction) {\n\t\t// Early-exit for optimization\n\t\tif (this.size === 0) return false;\n\n\t\tconst promises: Promise<Result<unknown, { handler: InteractionHandler<InteractionHandlerOptions>; error: unknown }>>[] = [];\n\n\t\t// Iterate through every registered handler\n\t\tfor (const handler of this.values()) {\n\t\t\tconst filter = InteractionHandlerFilters.get(handler.interactionHandlerType);\n\n\t\t\t// If the filter is missing (we don't support it or someone didn't register it manually while waiting for us to implement it),\n\t\t\t// or it doesn't match the expected handler type, skip the handler\n\t\t\tif (!filter?.(interaction)) continue;\n\n\t\t\t// Get the result of the `parse` method in the handler\n\t\t\tconst result = await Result.fromAsync(() => handler.parse(interaction));\n\t\t\tresult.match({\n\t\t\t\tok: (option) => {\n\t\t\t\t\t// Emit an event to the user to let them know `parse` was successful\n\t\t\t\t\tthis.container.client.emit(Events.InteractionHandlerParseSuccess, option, { interaction, handler });\n\n\t\t\t\t\toption.match({\n\t\t\t\t\t\t// If the `parse` method returned a `Some` (whatever that `Some`'s value is, it should be handled)\n\t\t\t\t\t\tsome: (value) => {\n\t\t\t\t\t\t\t// Emit an event to the user to let them know parse was successful and `some` was returned.\n\t\t\t\t\t\t\tthis.container.client.emit(Events.InteractionHandlerParseSome, option as Option.Some<typeof value>, {\n\t\t\t\t\t\t\t\tinteraction,\n\t\t\t\t\t\t\t\thandler,\n\t\t\t\t\t\t\t\tvalue\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// Schedule the run of the handler method\n\t\t\t\t\t\t\tconst promise = Result.fromAsync(() => handler.run(interaction, value)) //\n\t\t\t\t\t\t\t\t.then((res) => res.mapErr((error) => ({ handler, error })));\n\n\t\t\t\t\t\t\tpromises.push(promise);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// Emit an event to the user to let them know parse was successful and `none` was returned.\n\t\t\t\t\t\tnone: () => this.container.client.emit(Events.InteractionHandlerParseNone, option as Option.None, { interaction, handler })\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\terr: (error) => {\n\t\t\t\t\t// If the `parse` method threw an error (spoiler: please don't), skip the handler\n\t\t\t\t\tthis.container.client.emit(Events.InteractionHandlerParseError, error, { interaction, handler });\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// Yet another early exit\n\t\tif (promises.length === 0) return false;\n\n\t\tconst results = await Promise.allSettled(promises);\n\n\t\tfor (const result of results) {\n\t\t\tconst res = (\n\t\t\t\tresult as PromiseFulfilledResult<\n\t\t\t\t\tResult<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\terror: Error;\n\t\t\t\t\t\t\thandler: InteractionHandler;\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t>\n\t\t\t).value;\n\n\t\t\tres.inspectErr((value) =>\n\t\t\t\tthis.container.client.emit(Events.InteractionHandlerError, value.error, { interaction, handler: value.handler })\n\t\t\t);\n\t\t}\n\n\t\treturn true;\n\t}\n}\n\nexport const InteractionHandlerFilters = new Map<InteractionHandlerTypes, (interaction: Interaction) => boolean>([\n\t[InteractionHandlerTypes.Button, (interaction) => interaction.isButton()],\n\t[InteractionHandlerTypes.SelectMenu, (interaction) => interaction.isAnySelectMenu()],\n\t[InteractionHandlerTypes.ModalSubmit, (interaction) => interaction.isModalSubmit()],\n\n\t[InteractionHandlerTypes.MessageComponent, (interaction) => interaction.isMessageComponent()],\n\t[InteractionHandlerTypes.Autocomplete, (Interaction) => Interaction.isAutocomplete()]\n]);\n"],"mappings":";;;;;;AAMA,IAAa,0BAAb,cAA6C,MAAkD;CAC9F,AAAO,cAAc;AACpB,QAAM,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;;CAG5D,MAAa,IAAI,aAA0B;AAE1C,MAAI,KAAK,SAAS,EAAG,QAAO;EAE5B,MAAMA,WAAmH,EAAE;AAG3H,OAAK,MAAM,WAAW,KAAK,QAAQ,EAAE;AAKpC,OAAI,CAJW,0BAA0B,IAAI,QAAQ,uBAAuB,GAI9D,YAAY,CAAE;AAI5B,IADe,MAAM,OAAO,gBAAgB,QAAQ,MAAM,YAAY,CAAC,EAChE,MAAM;IACZ,KAAK,WAAW;AAEf,UAAK,UAAU,OAAO,KAAK,OAAO,gCAAgC,QAAQ;MAAE;MAAa;MAAS,CAAC;AAEnG,YAAO,MAAM;MAEZ,OAAO,UAAU;AAEhB,YAAK,UAAU,OAAO,KAAK,OAAO,6BAA6B,QAAqC;QACnG;QACA;QACA;QACA,CAAC;OAGF,MAAM,UAAU,OAAO,gBAAgB,QAAQ,IAAI,aAAa,MAAM,CAAC,CACrE,MAAM,QAAQ,IAAI,QAAQ,WAAW;QAAE;QAAS;QAAO,EAAE,CAAC;AAE5D,gBAAS,KAAK,QAAQ;;MAGvB,YAAY,KAAK,UAAU,OAAO,KAAK,OAAO,6BAA6B,QAAuB;OAAE;OAAa;OAAS,CAAC;MAC3H,CAAC;;IAEH,MAAM,UAAU;AAEf,UAAK,UAAU,OAAO,KAAK,OAAO,8BAA8B,OAAO;MAAE;MAAa;MAAS,CAAC;;IAEjG,CAAC;;AAIH,MAAI,SAAS,WAAW,EAAG,QAAO;EAElC,MAAM,UAAU,MAAM,QAAQ,WAAW,SAAS;AAElD,OAAK,MAAM,UAAU,QAapB,CAXC,OASC,MAEE,YAAY,UACf,KAAK,UAAU,OAAO,KAAK,OAAO,yBAAyB,MAAM,OAAO;GAAE;GAAa,SAAS,MAAM;GAAS,CAAC,CAChH;AAGF,SAAO;;;AAIT,MAAa,4BAA4B,IAAI,IAAoE;CAChH,CAAC,wBAAwB,SAAS,gBAAgB,YAAY,UAAU,CAAC;CACzE,CAAC,wBAAwB,aAAa,gBAAgB,YAAY,iBAAiB,CAAC;CACpF,CAAC,wBAAwB,cAAc,gBAAgB,YAAY,eAAe,CAAC;CAEnF,CAAC,wBAAwB,mBAAmB,gBAAgB,YAAY,oBAAoB,CAAC;CAC7F,CAAC,wBAAwB,eAAe,gBAAgB,YAAY,gBAAgB,CAAC;CACrF,CAAC"}