UNPKG

@sapphire/framework

Version:

Discord bot framework built for advanced and amazing bots.

1 lines 6.63 kB
{"version":3,"sources":["../../../../src/lib/structures/InteractionHandlerStore.ts"],"names":[],"mappings":"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","file":"InteractionHandlerStore.mjs","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"]}