seedcord 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +32 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +65 -5
- package/dist/index.d.ts +65 -5
- package/dist/index.mjs +33 -21
- package/dist/index.mjs.map +1 -1
- package/package.json +15 -19
- package/dist/index.d.mts +0 -959
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/interfaces/Plugin.ts","../src/interfaces/Components.ts","../src/bot/decorators/CommandRegisterable.ts","../src/bot/controllers/CommandRegistry.ts","../src/interfaces/Handler.ts","../src/bot/decorators/EventRegisterable.ts","../src/bot/controllers/EventController.ts","../src/bot/decorators/InteractionConfigurable.ts","../src/bot/errors/Database.ts","../src/bot/utilities/ErrorHandlingUtils.ts","../src/bot/decorators/Catchable.ts","../src/bot/defaults/UnhandledEvent.ts","../src/bot/controllers/InteractionController.ts","../src/bot/injectors/EmojiInjector.ts","../src/bot/Bot.ts","../src/effects/decorators/RegisterEffect.ts","../src/effects/interfaces/EffectsHandler.ts","../src/effects/interfaces/abstracts/WebhookLog.ts","../src/effects/default/UnknownException.ts","../src/effects/EffectsEmitter.ts","../src/effects/EffectsRegistry.ts","../src/Seedcord.ts","../src/bot/decorators/Checkable.ts","../src/bot/decorators/EventCatchable.ts","../src/library/Helpers.ts"],"names":["Plugin","pluggable","Pluggable","isInitialized","shutdown","startup","PLUGIN_INIT_TIMEOUT_MS","init","run","attach","key","startupPhase","args","Error","instance","entry","addTask","logger","info","chalk","bold","Object","assign","BuilderTypes","command","SlashCommandBuilder","embed","EmbedBuilder","button","ButtonBuilder","menu_string","StringSelectMenuBuilder","menu_option_string","StringSelectMenuOptionBuilder","menu_user","UserSelectMenuBuilder","menu_channel","ChannelSelectMenuBuilder","menu_mentionable","MentionableSelectMenuBuilder","menu_role","RoleSelectMenuBuilder","modal","ModalBuilder","context_menu","ContextMenuCommandBuilder","subcommand","SlashCommandSubcommandBuilder","group","SlashCommandSubcommandGroupBuilder","container","ContainerBuilder","text_display","TextDisplayBuilder","file","FileBuilder","media","MediaGalleryBuilder","section","SectionBuilder","separator","SeparatorBuilder","RowTypes","ActionRowBuilder","ModalTypes","text","TextInputBuilder","BaseComponent","_component","ComponentClass","buildCustomId","prefix","length","join","BuilderComponent","type","setColor","botColor","setContexts","InteractionContextType","Guild","component","fallback","RowComponent","ModalRow","addComponents","ModalComponent","BaseErrorEmbed","setTitle","CustomError","_emit","response","message","captureStackTrace","emit","CommandMetadataKey","Symbol","RegisterCommand","scope","guilds","ctor","meta","Reflect","defineMetadata","CommandRegistry","Logger","isInitialised","globalCommands","guildCommands","Map","core","config","bot","commands","path","loadCommands","green","magenta","size","dir","traverseDirectory","_full","rel","mod","exported","values","isCommandClass","registerCommand","obj","prototype","hasMetadata","getMetadata","comp","commandType","push","italic","yellow","name","gray","cyan","g","arr","get","set","setCommands","client","application","tag","map","guildId","entries","guild","cache","warn","BaseHandler","checkable","break","errored","event","hasChecks","hasErrors","setErrored","shouldBreak","getEvent","getArgs","getArg","index","InteractionHandler","InteractionMiddleware","AutocompleteHandler","focused","options","getFocused","EventHandler","EventMetadataKey","RegisterEvent","eventName","constructor","EventController","eventMap","handlersDir","events","loadHandlers","attachToClient","loadedEventsArray","forEach","handlers","_fullPath","relativePath","imported","val","isEventHandlerClass","registerHandler","handlerClass","debug","user","username","on","processEvent","handlerCtors","HandlerCtor","handler","runChecks","execute","err","error","String","InteractionRoutes","SelectMenuType","InteractionMetadataKey","SlashRoute","routeOrRoutes","storeMetadata","ButtonRoute","ModalRoute","ContextMenuRoute","routeType","AutocompleteRoute","commandRoutes","focusedFields","routes","Array","isArray","fields","route","field","autocompleteKey","SelectMenuRoute","routeMap","symbol","areRoutes","every","r","savedRoutes","existing","toStore","DatabaseError","uuid","setDescription","ErrorHandlingUtils","extractErrorResponse","randomUUID","effects","GenericError","Catchable","_target","_propertyKey","descriptor","log","forceFollowup","originalMethod","value","interaction","apply","console","res","embeds","components","followUp","flags","MessageFlags","Ephemeral","replied","deferred","editReply","reply","UnhandledEvent","content","InteractionController","slashMap","buttonMap","modalMap","stringSelectMap","userSelectMap","roleSelectMap","channelSelectMap","mentionableSelectMap","messageContextMenuMap","userContextMenuMap","autocompleteMap","keysToIgnore","Set","middlewares","interactions","isHandlerClass","routeTypes","Slash","Button","Modal","StringMenu","UserMenu","RoleMenu","ChannelMenu","MentionableMenu","MessageContextMenu","UserContextMenu","Autocomplete","Events","InteractionCreate","handleInteraction","catch","red","stack","parseCustomId","customId","parts","split","argString","handleCustomIdInteraction","getMap","interactionType","processInteraction","extractKey","getHandler","has","MiddlewareCtor","middleware","isChatInputCommand","handleSlashCommand","isButton","handleButton","isModalSubmit","handleModal","isStringSelectMenu","handleStringSelectMenu","isUserSelectMenu","handleUserSelectMenu","isRoleSelectMenu","handleRoleSelectMenu","isChannelSelectMenu","handleChannelSelectMenu","isMentionableSelectMenu","handleMentionableSelectMenu","isMessageContextMenuCommand","handleMessageContextMenu","isUserContextMenuCommand","handleUserContextMenu","isAutocomplete","handleAutocomplete","buildSlashRoute","commandName","getSubcommandGroup","sub","getSubcommand","EmojiInjector","emojis","keys","configEmojis","fetch","foundCount","emojiName","emoji","find","e","identifier","id","Bot","_client","emojiInjector","Client","clientOptions","ShutdownPhase","DiscordCleanup","stop","login","removeAllListeners","logout","botToken","destroy","converter","raw","_fallback","EffectMetadataKey","RegisterEffect","effect","EffectsHandler","data","WebhookLog","UnknownException","webhook","WebhookClient","url","unknownExceptionWebhookUrl","send","avatarURL","UnhandledErrorEmbed","setTimestampsIfAvailable","DiscordAPIError","now","Date","snowflake","match","undefined","interactionTs","Number","SnowflakeUtil","deconstruct","timestamp","diff","seconds","Math","floor","millis","addFields","toISOString","inline","EffectsEmitter","emitter","EventEmitter","listener","once","EffectsRegistry","effectsMap","effectsDir","registerEffect","loadEffects","attachEffects","totalEffects","from","reduce","acc","exportName","isEffectHandler","effectName","Seedcord","isInstantiated","healthCheck","CoordinatedShutdown","CoordinatedStartup","HealthCheck","registerStartupTasks","StartupPhase","Configuration","Instantiation","Ready","start","Checkable","EventCatchable","_prop","original","eventArgs","msg","x","Message","author","throwCustomError","crypto","errorMessage","toString"],"mappings":"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","file":"index.cjs","sourcesContent":["import chalk from 'chalk';\n\nimport type { Core } from './Core';\nimport type { CoordinatedShutdown, CoordinatedStartup, StartupPhase, Logger } from '@seedcord/services';\nimport type { Tail } from '@seedcord/types';\n\n/** Interface for objects that can be initialized asynchronously */\nexport interface Initializeable {\n init(): Promise<void>;\n}\n\n/**\n * Base class for Seedcord plugins\n *\n * Extend this class to create plugins that integrate with the Seedcord lifecycle.\n * Plugins have access to the core instance and must implement initialization logic.\n */\nexport abstract class Plugin implements Initializeable {\n /** Logger instance for this plugin - must be implemented by subclasses */\n public abstract logger: Logger;\n\n constructor(protected pluggable: Core) {}\n\n /**\n * Initialize the plugin - implement setup logic here\n * @virtual Override this method in your plugin classes\n */\n abstract init(): Promise<void>;\n}\n\n/**\n * Constructor type for plugins that can accept additional arguments after Core\n * @param TPlugin - The plugin type being constructed\n */\nexport type PluginCtor<TPlugin extends Plugin = Plugin> = new (core: Core, ...args: any[]) => TPlugin;\n\n/**\n * Extracts the argument types for a plugin constructor (excluding the Core parameter)\n * @param Ctor - The plugin constructor to extract arguments from\n */\nexport type PluginArgs<Ctor extends PluginCtor> = Tail<ConstructorParameters<Ctor>>;\n\n/**\n * Base class for objects that can have plugins attached\n *\n * Provides plugin attachment capabilities and lifecycle management.\n * Plugins are attached during configuration and initialized during startup.\n */\nexport class Pluggable {\n protected isInitialized = false;\n protected readonly shutdown: CoordinatedShutdown;\n protected readonly startup: CoordinatedStartup;\n\n private static readonly PLUGIN_INIT_TIMEOUT_MS = 15000;\n\n constructor(shutdown: CoordinatedShutdown, startup: CoordinatedStartup) {\n this.shutdown = shutdown;\n this.startup = startup;\n }\n\n protected async init(): Promise<this> {\n if (this.isInitialized) return this;\n\n await this.startup.run();\n this.isInitialized = true;\n\n return this;\n }\n\n /**\n * Attaches a plugin to this instance\n *\n * Plugins provide external functionality and are initialized during the specified startup phase.\n * The plugin instance becomes available as a property in `core` wherever it's available.\n *\n * Make sure to augment the {@link Core} interface with the plugin type to ensure TypeScript recognizes it and provides intellisense.\n *\n * @typeParam Key - The property name for accessing the plugin\n * @typeParam Ctor - The plugin constructor type\n * @param key - Property name to access the plugin instance\n * @param Plugin - Plugin constructor class\n * @param startupPhase - When during startup to initialize this plugin ({@link StartupPhase})\n * @param args - Additional arguments to pass to the plugin constructor\n * @returns This instance with the plugin attached as a typed property\n * @throws An {@link Error} When called after initialization or if key already exists\n * @example\n * ```typescript\n * seedcord.attach('db', Mongo, StartupPhase.Configuration, { uri: 'mongodb://...', name: 'seedcord', dir: ... })\n * ```\n */\n public attach<Key extends string, Ctor extends PluginCtor>(\n this: this,\n key: Key,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Plugin: Ctor,\n startupPhase: StartupPhase,\n ...args: PluginArgs<Ctor>\n ): this & Record<Key, InstanceType<Ctor>> {\n if (this.isInitialized) throw new Error('Cannot attach a plugin after initialization.');\n if ((this as Record<string, unknown>)[key]) throw new Error(`Plugin with key \"${key}\" already exists.`);\n\n const instance = new Plugin(this as unknown as Core, ...args);\n\n const entry = {\n [key]: instance\n } as Record<Key, InstanceType<Ctor>>;\n\n this.startup.addTask(\n startupPhase,\n `Plugin:${key}`,\n async () => {\n instance.logger.info(chalk.bold('Initializing'));\n await instance.init();\n instance.logger.info(chalk.bold('Initialized'));\n },\n Pluggable.PLUGIN_INIT_TIMEOUT_MS\n );\n\n return Object.assign(this, entry);\n }\n}\n","import {\n ActionRowBuilder,\n ButtonBuilder,\n ChannelSelectMenuBuilder,\n ContainerBuilder,\n ContextMenuCommandBuilder,\n EmbedBuilder,\n FileBuilder,\n InteractionContextType,\n MediaGalleryBuilder,\n MentionableSelectMenuBuilder,\n ModalBuilder,\n RoleSelectMenuBuilder,\n SectionBuilder,\n SeparatorBuilder,\n SlashCommandBuilder,\n SlashCommandSubcommandBuilder,\n SlashCommandSubcommandGroupBuilder,\n StringSelectMenuBuilder,\n StringSelectMenuOptionBuilder,\n TextDisplayBuilder,\n TextInputBuilder,\n UserSelectMenuBuilder\n} from 'discord.js';\nimport { Envapt } from 'envapt';\n\nimport type { ColorResolvable, ModalActionRowComponentBuilder } from 'discord.js';\n\nconst BuilderTypes = {\n command: SlashCommandBuilder,\n embed: EmbedBuilder,\n button: ButtonBuilder,\n menu_string: StringSelectMenuBuilder,\n menu_option_string: StringSelectMenuOptionBuilder,\n menu_user: UserSelectMenuBuilder,\n menu_channel: ChannelSelectMenuBuilder,\n menu_mentionable: MentionableSelectMenuBuilder,\n menu_role: RoleSelectMenuBuilder,\n modal: ModalBuilder,\n context_menu: ContextMenuCommandBuilder,\n subcommand: SlashCommandSubcommandBuilder,\n group: SlashCommandSubcommandGroupBuilder,\n container: ContainerBuilder,\n text_display: TextDisplayBuilder,\n file: FileBuilder,\n media: MediaGalleryBuilder,\n section: SectionBuilder,\n separator: SeparatorBuilder\n};\n\nconst RowTypes: {\n button: typeof ActionRowBuilder<ButtonBuilder>;\n menu_string: typeof ActionRowBuilder<StringSelectMenuBuilder>;\n menu_user: typeof ActionRowBuilder<UserSelectMenuBuilder>;\n menu_channel: typeof ActionRowBuilder<ChannelSelectMenuBuilder>;\n menu_mentionable: typeof ActionRowBuilder<MentionableSelectMenuBuilder>;\n menu_role: typeof ActionRowBuilder<RoleSelectMenuBuilder>;\n modal: typeof ActionRowBuilder<ModalActionRowComponentBuilder>;\n} = {\n button: ActionRowBuilder<ButtonBuilder>,\n menu_string: ActionRowBuilder<StringSelectMenuBuilder>,\n menu_user: ActionRowBuilder<UserSelectMenuBuilder>,\n menu_channel: ActionRowBuilder<ChannelSelectMenuBuilder>,\n menu_mentionable: ActionRowBuilder<MentionableSelectMenuBuilder>,\n menu_role: ActionRowBuilder<RoleSelectMenuBuilder>,\n modal: ActionRowBuilder<ModalActionRowComponentBuilder>\n};\n\nconst ModalTypes = {\n text: TextInputBuilder\n};\n\ntype BuilderType = keyof typeof BuilderTypes;\ntype InstantiatedBuilder<BuilderKey extends BuilderType> = InstanceType<(typeof BuilderTypes)[BuilderKey]>;\n\ntype ActionRowComponentType = keyof typeof RowTypes;\ntype InstantiatedActionRow<RowKey extends ActionRowComponentType> = InstanceType<(typeof RowTypes)[RowKey]>;\n\ntype ModalFieldTypes = keyof typeof ModalTypes;\ntype InstantiatedModalField<ModalKey extends ModalFieldTypes> = InstanceType<(typeof ModalTypes)[ModalKey]>;\n\n/**\n * Base class for Discord component wrappers\n *\n * Provides common functionality for building Discord components with proper typing.\n *\n * @typeParam TComponent - The Discord.js component type being wrapped\n */\nabstract class BaseComponent<TComponent> {\n private readonly _component: TComponent;\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n protected constructor(ComponentClass: new () => TComponent) {\n this._component = new ComponentClass();\n }\n\n /**\n * Gets the built component (should be considered read-only)\n *\n * Returns the finalized component ready for use in Discord messages.\n *\n * Please do not use for further configuration, use `this.instance` for that.\n * @example new SomeComponent().component\n */\n public abstract get component(): InstantiatedBuilder<BuilderType> | InstantiatedActionRow<ActionRowComponentType>;\n\n /**\n * Gets the component instance for configuration\n *\n * Use this to access Discord.js builder methods like setTitle(), setDescription(), etc.\n *\n * Use this in your component classes to configure the builder\n * @example this.instance.setTitle('My Modal')\n */\n protected get instance(): TComponent {\n return this._component;\n }\n\n /**\n * Builds a customId string for interactive components\n *\n * Creates customIds in the format \"prefix:arg1-arg2-arg3\" for buttons, modals, etc.\n * Arguments are joined with hyphens and separated from prefix with a colon.\n *\n * @param prefix - The route prefix that handlers will match against\n * @param args - Additional arguments to encode in the customId\n * @returns Formatted customId string\n */\n public buildCustomId(prefix: string, ...args: string[]): string {\n if (args.length === 0) return prefix;\n return `${prefix}:${args.join('-')}`;\n }\n}\n\n/**\n * Base class for Discord.js builder components\n *\n * Wraps Discord.js builders (SlashCommandBuilder, EmbedBuilder, etc.) with\n * Seedcord-specific defaults and helper methods.\n *\n * @typeParam BuilderKey - The type of Discord.js builder being wrapped\n */\nexport abstract class BuilderComponent<BuilderKey extends BuilderType> extends BaseComponent<\n InstantiatedBuilder<BuilderKey>\n> {\n @Envapt<ColorResolvable>('DEFAULT_BOT_COLOR', { fallback: 'Default' })\n declare private readonly botColor: ColorResolvable;\n\n protected constructor(type: BuilderKey) {\n const ComponentClass = BuilderTypes[type] as unknown;\n super(ComponentClass as new () => InstantiatedBuilder<BuilderKey>);\n\n // Override in builders\n if (this.instance instanceof EmbedBuilder) this.instance.setColor(this.botColor);\n\n // Override in builders\n if (this.instance instanceof SlashCommandBuilder || this.instance instanceof ContextMenuCommandBuilder) {\n this.instance.setContexts(InteractionContextType.Guild);\n }\n }\n\n get component(): InstantiatedBuilder<BuilderKey> {\n // TODO: Add checks for specific builders that make sure mandatory fields are set\n\n return this.instance;\n }\n}\n\n/**\n * Base class for Discord action row components\n *\n * Wraps Discord.js action row builder with Seedcord-specific defaults and helper methods.\n *\n * @typeParam RowKey - The Discord.js action row type being wrapped\n */\nexport abstract class RowComponent<RowKey extends ActionRowComponentType> extends BaseComponent<\n InstantiatedActionRow<RowKey>\n> {\n protected constructor(type: RowKey) {\n const ComponentClass = RowTypes[type] as unknown;\n super(ComponentClass as new () => InstantiatedActionRow<RowKey>);\n }\n\n get component(): InstantiatedActionRow<RowKey> {\n return this.instance;\n }\n}\n\n/**\n * Action row wrapper for modal components\n *\n * Automatically wraps modal field components in an action row for use in modals.\n *\n * @typeParam ModalKey - The type of modal field component being wrapped\n * @internal\n */\nclass ModalRow<ModalKey extends ModalFieldTypes> extends RowComponent<'modal'> {\n /**\n * Creates a new modal action row with the specified component.\n *\n * @param component - The modal field component to wrap in an action row\n */\n constructor(component: InstantiatedModalField<ModalKey>) {\n super('modal');\n\n this.instance.addComponents(component);\n }\n}\n\n/**\n * Base class for modal field components\n *\n * Wraps Discord.js modal field builders (TextInputBuilder, etc.) and\n * packages them in action rows for use in modals.\n *\n * @typeParam ModalKey - The type of modal field builder being wrapped\n */\nexport abstract class ModalComponent<ModalKey extends ModalFieldTypes> extends BaseComponent<\n InstantiatedModalField<ModalKey>\n> {\n protected constructor(type: ModalKey) {\n const ComponentClass = ModalTypes[type] as unknown;\n super(ComponentClass as new () => InstantiatedModalField<ModalKey>);\n }\n\n get component(): InstantiatedActionRow<'modal'> {\n return new ModalRow<ModalKey>(this.instance).component;\n }\n}\n\n/**\n * Pre-configured error embed with default styling\n *\n * This is bundled in {@link CustomError}s as the response.\n */\nexport class BaseErrorEmbed extends BuilderComponent<'embed'> {\n /**\n * Creates a new error embed with default configuration.\n */\n public constructor() {\n super('embed');\n this.instance.setTitle('Cannot Proceed');\n }\n}\n\n/**\n * Base class for custom error types with Discord embed responses\n *\n * Errors extending CustomError should be used with the `Catchable` decorators to implement a control flow. These errors will be caught and handled by the framework to show the user the configured response.\n */\nexport abstract class CustomError extends Error {\n protected _emit = false;\n public readonly response = new BaseErrorEmbed().component;\n\n protected constructor(public override message: string) {\n super(message);\n Error.captureStackTrace(this, this.constructor);\n }\n\n /**\n * Whether this error should be emitted to logs\n *\n * Controls logging behavior. Errors with emit=true will always be logged,\n * while emit=false errors may be suppressed in production.\n *\n * @returns True if the error should be logged\n */\n public get emit(): boolean {\n return this._emit;\n }\n}\n\n/** Constructor type for custom error classes */\nexport type CustomErrorConstructor = new (message: string, ...args: any[]) => CustomError;\n","import type { BuilderComponent } from '../../interfaces/Components';\n\nexport const CommandMetadataKey = Symbol('command:metadata');\n\ntype CommandCtor = new (...args: any[]) => BuilderComponent<'command' | 'context_menu'>;\n\n/**\n * Metadata for global command registration.\n */\ninterface GlobalMeta {\n scope: 'global';\n}\n\n/**\n * Metadata for guild-specific command registration.\n */\ninterface GuildMeta {\n scope: 'guild';\n guilds: string[];\n}\n\n/**\n * Union type for command registration metadata.\n */\nexport type CommandMeta = GlobalMeta | GuildMeta;\n\n/**\n * Registers a command for global deployment.\n *\n * @param scope - Must be 'global' for global registration\n * @decorator\n * @example\n * ```typescript\n * \\@RegisterCommand('global')\n * class PingCommand extends BuilderComponent {\n * // Global command\n * }\n * ```\n */\nexport function RegisterCommand(scope: 'global'): (ctor: CommandCtor) => void;\n\n/**\n * Registers a command for specific guild deployment.\n *\n * @param scope - Must be 'guild' for guild-specific registration\n * @param guilds - Array of guild IDs where the command should be registered\n * @decorator\n * @example\n * ```typescript\n * \\@RegisterCommand('guild', ['123456789'])\n * class AdminCommand extends BuilderComponent {\n * // Guild-specific command\n * }\n * ```\n */\nexport function RegisterCommand(scope: 'guild', guilds: string[]): (ctor: CommandCtor) => void;\n\n/**\n * Registers a command with Discord's application command system.\n *\n * @param scope - Registration scope: 'global' or 'guild'\n * @param guilds - Guild IDs for guild-scoped registration\n * @decorator\n */\nexport function RegisterCommand(scope: 'global' | 'guild', guilds: string[] = []) {\n return (ctor: CommandCtor): void => {\n const meta: GlobalMeta | GuildMeta = scope === 'global' ? { scope } : { scope, guilds };\n Reflect.defineMetadata(CommandMetadataKey, meta, ctor);\n };\n}\n","import { Logger } from '@seedcord/services';\nimport { traverseDirectory } from '@seedcord/utils';\nimport chalk from 'chalk';\nimport { SlashCommandBuilder } from 'discord.js';\n\nimport { BuilderComponent } from '../../interfaces/Components';\nimport { CommandMetadataKey } from '../decorators/CommandRegisterable';\n\nimport type { Core } from '../../interfaces/Core';\nimport type { Initializeable } from '../../interfaces/Plugin';\nimport type { CommandMeta } from '../decorators/CommandRegisterable';\nimport type { ContextMenuCommandBuilder } from 'discord.js';\n\ntype CommandCtor = new () => BuilderComponent<'command' | 'context_menu'>;\n\n/**\n * Manages Discord application command registration and deployment.\n *\n * Scans command directories, builds command structures, and handles both\n * global and guild-specific command deployment to Discord's API.\n *\n * @internal\n */\nexport class CommandRegistry implements Initializeable {\n private readonly logger = new Logger('Commands');\n private isInitialised = false;\n\n public readonly globalCommands: (SlashCommandBuilder | ContextMenuCommandBuilder)[] = [];\n public readonly guildCommands = new Map<string, (SlashCommandBuilder | ContextMenuCommandBuilder)[]>();\n\n public constructor(private readonly core: Core) {}\n\n public async init(): Promise<void> {\n if (this.isInitialised) return;\n this.isInitialised = true;\n\n this.logger.info(chalk.bold(this.core.config.bot.commands.path));\n\n await this.loadCommands(this.core.config.bot.commands.path);\n\n this.logger.info(\n `${chalk.bold.green('Loaded')}: ${chalk.magenta.bold(\n this.globalCommands.length\n )} global, ${chalk.magenta.bold(this.guildCommands.size)} guild groups`\n );\n }\n\n private async loadCommands(dir: string): Promise<void> {\n await traverseDirectory(\n dir,\n (_full, rel, mod) => {\n for (const exported of Object.values(mod))\n if (this.isCommandClass(exported)) this.registerCommand(exported, rel);\n },\n this.logger\n );\n }\n\n private isCommandClass(obj: unknown): obj is CommandCtor {\n if (typeof obj !== 'function') return false;\n return obj.prototype instanceof BuilderComponent && Reflect.hasMetadata(CommandMetadataKey, obj);\n }\n\n private registerCommand(ctor: CommandCtor, rel: string): void {\n const meta = Reflect.getMetadata(CommandMetadataKey, ctor) as CommandMeta | undefined;\n\n if (!meta) return;\n\n const instance = new ctor();\n const comp = instance.component;\n\n const commandType = comp instanceof SlashCommandBuilder ? 'slash command' : 'context menu command';\n\n if (meta.scope === 'global') {\n this.globalCommands.push(comp);\n this.logger.info(`${chalk.italic('Registered')} ${chalk.bold.yellow(ctor.name)} from ${chalk.gray(rel)}`);\n this.logger.info(` → Global ${commandType}: ${chalk.bold.cyan(comp.name)}`);\n } else {\n for (const g of meta.guilds) {\n const arr = this.guildCommands.get(g) ?? [];\n arr.push(comp);\n this.guildCommands.set(g, arr);\n }\n this.logger.info(`${chalk.italic('Registered')} ${chalk.bold.yellow(ctor.name)} from ${chalk.gray(rel)}`);\n this.logger.info(\n ` → Guild ${commandType}: ${chalk.bold.cyan(comp.name)} for ${chalk.magenta.bold(meta.guilds.length)} guild(s)`\n );\n }\n }\n\n public async setCommands(): Promise<void> {\n if (this.globalCommands.length > 0) {\n await this.core.bot.client.application?.commands.set(this.globalCommands);\n const tag = this.globalCommands.length === 1 ? 'command' : 'commands';\n this.logger.info(\n `${chalk.bold.green('Configured')} ${chalk.magenta.bold(this.globalCommands.length)} global ${tag}`\n );\n this.logger.info(` → ${this.globalCommands.map((command) => chalk.bold.cyan(command.name)).join(', ')}`);\n }\n\n for (const [guildId, commands] of this.guildCommands.entries()) {\n const guild = this.core.bot.client.guilds.cache.get(guildId);\n if (!guild) {\n this.logger.warn(`Guild with ID ${guildId} not found, skipping command registration.`);\n continue;\n }\n\n await guild.commands.set(commands);\n const tag = commands.length === 1 ? 'command' : 'commands';\n this.logger.info(\n `${chalk.bold.green('Configured')} ${chalk.magenta.bold(commands.length)} ${tag} for guild ${chalk.bold.yellow(guild.name)}`\n );\n this.logger.info(` → ${commands.map((command) => chalk.bold.cyan(command.name)).join(', ')}`);\n }\n }\n}\n","import type { Core } from './Core';\nimport type { TypedConstructor } from '@seedcord/types';\nimport type {\n AnySelectMenuInteraction,\n AutocompleteFocusedOption,\n AutocompleteInteraction,\n ButtonInteraction,\n ChatInputCommandInteraction,\n ClientEvents,\n ContextMenuCommandInteraction,\n Events,\n ModalSubmitInteraction\n} from 'discord.js';\n\n/** All valid Discord.js interaction types that can be handled */\nexport type ValidInteractionTypes =\n | ChatInputCommandInteraction\n | ButtonInteraction\n | ModalSubmitInteraction\n | AutocompleteInteraction\n | AnySelectMenuInteraction\n | ContextMenuCommandInteraction;\n\n/** All valid Discord.js client events except interaction events */\nexport type ValidNonInteractionTypes = ClientEvents[Exclude<keyof ClientEvents, Events.InteractionCreate>];\n\n/** All event types that can be handled (interactions and client events) */\nexport type ValidEventTypes = ValidInteractionTypes | ValidNonInteractionTypes;\n\n/** Interaction types that can receive replies (excludes autocomplete) */\nexport type Repliables = Exclude<ValidInteractionTypes, AutocompleteInteraction>;\n\n/** Handler types that can reply to interactions */\nexport type RepliableInteractionHandler = InteractionHandler<Repliables> | InteractionMiddleware<Repliables>;\n\n/** Base interface for event handlers */\nexport interface Handler {\n execute(): Promise<void>;\n}\n\n/**\n * Interface for handlers that can run pre-execution checks\n *\n * Should always accompany the `@Catchable` decorator. Will require the class to implement the `runChecks` method.\n *\n * @see {@link Checkable}\n */\nexport interface WithChecks {\n /**\n * Runs pre-execution checks for the handler.\n *\n * @remarks It'll be called automatically if a class is decorated with {@link Checkable} before the execute method.\n *\n * @virtual Override this method in your handler classes\n */\n runChecks(): Promise<void>;\n}\n\ninterface HandlerWithChecks extends WithChecks, Handler {}\n\nabstract class BaseHandler<ValidEvent extends ValidEventTypes> implements Handler {\n protected checkable = false;\n protected break = false;\n protected errored = false;\n protected event: ValidEvent;\n protected args: string[] = [];\n\n protected constructor(\n event: ValidEvent,\n public core: Core,\n args?: string[]\n ) {\n this.event = event;\n this.args = args ?? [];\n }\n\n /**\n * Main handler logic - implement this method to define behavior\n * @virtual Override this method in your handler classes\n */\n abstract execute(): Promise<void>;\n\n public hasChecks(): this is HandlerWithChecks {\n return this.checkable;\n }\n\n public hasErrors(): boolean {\n return this.errored;\n }\n\n public setErrored(): void {\n this.errored = true;\n }\n\n public shouldBreak(): boolean {\n return this.break;\n }\n\n public getEvent(): ValidEvent {\n return this.event;\n }\n\n /**\n * Gets arguments parsed from interaction customId\n *\n * Arguments are extracted from customId using \":\" and \"-\" separators.\n * For customId \"accept:user123-guild456\", returns [\"user123\", \"guild456\"]\n */\n protected getArgs(): string[] {\n return this.args;\n }\n\n /**\n * Gets a specific argument by index from parsed customId\n * @param index - Zero-based index of the argument to retrieve\n * @returns The argument at the specified index, or undefined if not found\n */\n protected getArg(index: number): string | undefined {\n return this.args[index];\n }\n}\n\n/**\n * Base class for Discord interaction handlers\n *\n * Extend this class to handle slash commands, buttons, modals, and select menus.\n * Use decorators like \\@SlashRoute, \\@ButtonRoute, etc. to define routing.\n *\n * @typeParam Repliable - The interaction type this handler processes\n */\nexport abstract class InteractionHandler<Repliable extends Repliables>\n extends BaseHandler<Repliable>\n implements Handler\n{\n constructor(event: Repliable, core: Core, args?: string[]) {\n super(event, core, args);\n }\n}\n\n/**\n * Base class for interaction middleware\n *\n * Middleware runs before interaction handlers and can modify behavior or block execution.\n * Unlike handlers, middleware should not send responses directly.\n *\n * @typeParam Repliable - The interaction type this middleware processes\n */\nexport abstract class InteractionMiddleware<Repliable extends Repliables>\n extends BaseHandler<Repliable>\n implements Handler\n{\n constructor(event: Repliable, core: Core, args?: string[]) {\n super(event, core, args);\n }\n}\n\n/**\n * Handler for Discord autocomplete interactions\n *\n * Extend this class to provide autocomplete suggestions for slash command options.\n * The focused option is automatically available via the `focused` property.\n */\nexport abstract class AutocompleteHandler extends BaseHandler<AutocompleteInteraction> implements Handler {\n /** The currently focused autocomplete option (Based on what you set in \\@AutocompleteRoute) */\n protected readonly focused: AutocompleteFocusedOption;\n constructor(event: AutocompleteInteraction, core: Core, args?: string[]) {\n super(event, core, args);\n this.focused = this.event.options.getFocused(true);\n }\n}\n\n/**\n * Base class for Discord client event handlers\n *\n * Extend this class to handle Discord events like messageCreate, guildMemberAdd, etc.\n * Use the \\@EventRegisterable decorator to specify which event to listen for.\n *\n * @typeParam Repliable - The Discord event type this handler processes\n */\nexport abstract class EventHandler<Repliable extends keyof ClientEvents>\n extends BaseHandler<ClientEvents[Repliable]>\n implements Handler\n{\n constructor(event: ClientEvents[Repliable], core: Core, args?: string[]) {\n super(event, core, args);\n }\n}\n\n// A generic type alias for a handler constructor\n/** Constructor type for interaction and autocomplete handlers */\nexport type HandlerConstructor = TypedConstructor<typeof InteractionHandler | typeof AutocompleteHandler>;\n\n/** Constructor type for interaction middleware */\nexport type MiddlewareConstructor = TypedConstructor<typeof InteractionMiddleware> &\n (new (event: Repliables, core: Core, args?: string[]) => InteractionMiddleware<Repliables>);\n\n/** Constructor type for autocomplete handlers */\nexport type AutocompleteHandlerConstructor = TypedConstructor<typeof AutocompleteHandler> &\n (new (event: AutocompleteInteraction, core: Core, args?: string[]) => AutocompleteHandler);\n\n/** Constructor type for Discord client event handlers */\nexport type EventHandlerConstructor = TypedConstructor<typeof EventHandler>;\n","import type { ConstructorFunction } from '@seedcord/types';\nimport type { ClientEvents } from 'discord.js';\n\nexport const EventMetadataKey = Symbol('event:metadata');\n\n/**\n * Registers an event handler class with a specific Discord.js event.\n *\n * Associates the decorated class with a Discord client event for automatic\n * registration and execution when the event is emitted.\n *\n * @param eventName - The Discord.js event name to listen for\n * @decorator\n * @example\n * ```typescript\n * \\@RegisterEvent(Events.MessageCreate)\n * class MessageHandler extends EventHandler<Events.MessageCreate> {\n * async execute() {\n * // Handle message creation\n * }\n * }\n * ```\n */\nexport function RegisterEvent<KeyofEvents extends keyof ClientEvents>(eventName: KeyofEvents) {\n return function (constructor: ConstructorFunction): void {\n Reflect.defineMetadata(EventMetadataKey, eventName, constructor);\n };\n}\n","import { Logger } from '@seedcord/services';\nimport { traverseDirectory } from '@seedcord/utils';\nimport chalk from 'chalk';\n\nimport { EventHandler } from '../../interfaces/Handler';\nimport { EventMetadataKey } from '../decorators/EventRegisterable';\n\nimport type { Core } from '../../interfaces/Core';\nimport type { EventHandlerConstructor } from '../../interfaces/Handler';\nimport type { Initializeable } from '../../interfaces/Plugin';\nimport type { ClientEvents } from 'discord.js';\n\n/**\n * Manages Discord event handler registration and execution.\n *\n * Scans event handler directories, registers handlers with Discord client events,\n * and coordinates event execution through the handler system. Does not handle interactions.\n *\n * Multiple handlers can point to one event.\n *\n * @internal\n */\nexport class EventController implements Initializeable {\n private readonly logger = new Logger('Events');\n private isInitialized = false;\n\n private readonly eventMap = new Map<keyof ClientEvents, EventHandlerConstructor[]>();\n\n public constructor(protected core: Core) {}\n\n public async init(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n this.isInitialized = true;\n\n const handlersDir = this.core.config.bot.events.path;\n this.logger.info(chalk.bold(handlersDir));\n\n await this.loadHandlers(handlersDir);\n this.attachToClient();\n\n const loadedEventsArray: string[] = [];\n this.eventMap.forEach((handlers, eventName) => {\n loadedEventsArray.push(`${chalk.magenta.bold(handlers.length)} ${eventName}`);\n });\n this.logger.info(\n `${chalk.bold.green('Loaded')}: ${this.eventMap.size > 0 ? loadedEventsArray.join(', ') : 'none'}`\n );\n }\n\n private async loadHandlers(dir: string): Promise<void> {\n await traverseDirectory(\n dir,\n (_fullPath, relativePath, imported) => {\n for (const val of Object.values(imported)) {\n if (this.isEventHandlerClass(val)) {\n this.registerHandler(val);\n this.logger.info(\n `${chalk.italic('Registered')} ${chalk.bold.yellow(val.name)} from ${chalk.gray(relativePath)}`\n );\n }\n }\n },\n this.logger\n );\n }\n\n private isEventHandlerClass(obj: unknown): obj is EventHandlerConstructor {\n if (typeof obj !== 'function') return false;\n return obj.prototype instanceof EventHandler && Reflect.hasMetadata(EventMetadataKey, obj);\n }\n\n private registerHandler(handlerClass: EventHandlerConstructor): void {\n const eventName = Reflect.getMetadata(EventMetadataKey, handlerClass) as keyof ClientEvents | undefined;\n if (!eventName) return;\n\n let handlers = this.eventMap.get(eventName);\n if (!handlers) {\n handlers = [];\n this.eventMap.set(eventName, handlers);\n }\n handlers.push(handlerClass);\n }\n\n private attachToClient(): void {\n for (const [eventName] of this.eventMap) {\n // For each event type, call all relevant effects in sequence.\n this.logger.debug(\n `Attaching ${chalk.bold.green(eventName)} to ${chalk.bold.yellow(this.core.bot.client.user?.username)}`\n );\n this.core.bot.client.on(eventName, (...args: ClientEvents[typeof eventName]) => {\n void (async () => {\n await this.processEvent(eventName, args);\n })();\n });\n }\n }\n\n private async processEvent<KeyOfEvents extends keyof ClientEvents>(\n eventName: KeyOfEvents,\n args: ClientEvents[KeyOfEvents]\n ): Promise<void> {\n const handlerCtors = this.eventMap.get(eventName);\n if (!handlerCtors || handlerCtors.length === 0) return;\n\n for (const HandlerCtor of handlerCtors) {\n try {\n this.logger.debug(`Processing ${chalk.bold.green(eventName)} with ${chalk.gray(HandlerCtor.name)}`);\n const handler = new HandlerCtor(args, this.core);\n if (handler.hasChecks()) {\n await handler.runChecks();\n }\n\n if (handler.shouldBreak()) return;\n\n // Execute if no errors\n if (!handler.hasErrors()) {\n await handler.execute();\n }\n } catch (err) {\n this.logger.error(`Error in event ${String(eventName)} handler ${HandlerCtor.name}:`, err);\n }\n }\n }\n}\n","import type { ConstructorFunction } from '@seedcord/types';\n\nexport enum InteractionRoutes {\n Slash = 'interaction:slash',\n Button = 'interaction:button',\n Modal = 'interaction:modal',\n StringMenu = 'interaction:stringMenu',\n UserMenu = 'interaction:userMenu',\n RoleMenu = 'interaction:roleMenu',\n ChannelMenu = 'interaction:channelMenu',\n MentionableMenu = 'interaction:mentionableMenu',\n MessageContextMenu = 'interaction:messageContextMenu',\n UserContextMenu = 'interaction:userContextMenu',\n Autocomplete = 'interaction:autocomplete'\n}\n\nexport enum SelectMenuType {\n String = 'string',\n User = 'user',\n Role = 'role',\n Channel = 'channel',\n Mentionable = 'mentionable'\n}\n\nexport const InteractionMetadataKey = Symbol('interaction:metadata');\n\n/**\n * Routes slash commands to handler classes\n *\n * Supports single commands, subcommands, and subcommand groups.\n * Use forward slashes to separate subcommand paths.\n *\n * @param routeOrRoutes - Command path(s) to handle\n * @decorator\n * @example\n * ```typescript\n * \\@SlashRoute('ping')\n * class PingCommand extends InteractionHandler {\n * // handles /ping command\n * }\n *\n * \\@SlashRoute(['ban', 'kick'])\n * class ModerationHandler extends InteractionHandler {\n * // handles /ban and /kick commands\n * }\n *\n * \\@SlashRoute('admin/user/promote')\n * class PromoteHandler extends InteractionHandler {\n * // handles /admin user promote subcommand\n * }\n * ```\n */\nexport function SlashRoute(routeOrRoutes: string | string[]) {\n return function (constructor: ConstructorFunction): void {\n storeMetadata(InteractionRoutes.Slash, routeOrRoutes, constructor);\n };\n}\n\n/**\n * Routes button interactions to handler classes\n *\n * Matches the customId prefix before the first colon.\n * For customId \"accept:user123\", use \\@ButtonRoute(\"accept\").\n *\n * @param routeOrRoutes - CustomId prefix(es) to handle\n * @decorator\n */\nexport function ButtonRoute(routeOrRoutes: string | string[]) {\n return function (constructor: ConstructorFunction): void {\n storeMetadata(InteractionRoutes.Button, routeOrRoutes, constructor);\n };\n}\n\n/**\n * Routes modal submissions to handler classes\n *\n * Matches the customId prefix before the first colon.\n *\n * @param routeOrRoutes - CustomId prefix(es) to handle\n * @decorator\n */\nexport function ModalRoute(routeOrRoutes: string | string[]) {\n return function (constructor: ConstructorFunction): void {\n storeMetadata(InteractionRoutes.Modal, routeOrRoutes, constructor);\n };\n}\n\n/**\n * Routes context menu commands to handler classes\n *\n * @param type - Context menu type: 'message' for message context menus, 'user' for user context menus\n * @param routeOrRoutes - Command name(s) to handle\n * @decorator\n */\nexport function ContextMenuRoute(type: 'message' | 'user', routeOrRoutes: string | string[]) {\n return function (constructor: ConstructorFunction): void {\n const routeType = type === 'message' ? InteractionRoutes.MessageContextMenu : InteractionRoutes.UserContextMenu;\n storeMetadata(routeType, routeOrRoutes, constructor);\n };\n}\n\n/**\n * Routes autocomplete interactions to handler classes\n *\n * Handles autocomplete requests for specific command options.\n * Creates routes for each command-field combination.\n *\n * @param commandRoutes - Command path(s) to handle\n * @param focusedFields - Option name(s) to provide completions for\n * @example \\@AutocompleteRoute('user', 'name') // Single command, single field\n * @example \\@AutocompleteRoute(['user', 'profile'], ['name', 'bio']) // Multiple commands, multiple fields\n * @decorator\n */\nexport function AutocompleteRoute(commandRoutes: string | string[], focusedFields: string | string[]) {\n return function (constructor: ConstructorFunction): void {\n const routes = Array.isArray(commandRoutes) ? commandRoutes : [commandRoutes];\n const fields = Array.isArray(focusedFields) ? focusedFields : [focusedFields];\n\n // Create unique keys for each route-focused combination\n routes.forEach((route) => {\n fields.forEach((field) => {\n const autocompleteKey = `${route}:${field}`;\n storeMetadata(InteractionRoutes.Autocomplete, autocompleteKey, constructor);\n });\n });\n };\n}\n\n/**\n * Routes select menu interactions to handler classes\n *\n * Matches the customId prefix before the first colon.\n *\n * @param type - Select menu type from {@link SelectMenuType}\n * @param routeOrRoutes - CustomId prefix(es) to handle\n * @decorator\n */\nexport function SelectMenuRoute(type: SelectMenuType, routeOrRoutes: string | string[]) {\n return function (constructor: ConstructorFunction): void {\n const routeMap = {\n [SelectMenuType.String]: InteractionRoutes.StringMenu,\n [SelectMenuType.User]: InteractionRoutes.UserMenu,\n [SelectMenuType.Role]: InteractionRoutes.RoleMenu,\n [SelectMenuType.Channel]: InteractionRoutes.ChannelMenu,\n [SelectMenuType.Mentionable]: InteractionRoutes.MentionableMenu\n };\n\n storeMetadata(routeMap[type], routeOrRoutes, constructor);\n };\n}\n\n/**\n * Helper to store route(s) in an array on reflect metadata.\n */\nfunction storeMetadata(symbol: InteractionRoutes, routes: string | string[], constructor: ConstructorFunction): void {\n const areRoutes = (routes: unknown): routes is string[] => {\n return Array.isArray(routes) && routes.every((r) => typeof r === 'string');\n };\n\n const savedRoutes: unknown = Reflect.getMetadata(symbol, constructor);\n const existing: string[] = areRoutes(savedRoutes) ? savedRoutes : [];\n\n const toStore = Array.isArray(routes) ? routes : [routes];\n Reflect.defineMetadata(symbol, [...existing, ...toStore], constructor);\n Reflect.defineMetadata(InteractionMetadataKey, true, constructor);\n}\n","import { CustomError } from '../../interfaces/Components';\n\nimport type { UUID } from 'crypto';\n\n/**\n * Generic database operation error with UUID tracking.\n *\n * Thrown for various database operation failures and includes\n * a UUID for error tracking and debugging purposes.\n */\nexport class DatabaseError extends CustomError {\n protected override _emit = true; // Emit in logs regardless of environment\n\n /**\n * Creates a new DatabaseError.\n *\n * @param message - The error message describing what went wrong\n * @param uuid - A unique identifier for this specific error instance\n */\n constructor(\n message: string,\n public uuid: UUID\n ) {\n super(message);\n this.name = 'DatabaseError';\n\n this.response\n .setTitle('Database Error')\n .setDescription(`An error occurred while interacting with the database.\\n### UUID: \\`${this.uuid}\\``);\n }\n}\n","import * as crypto from 'node:crypto';\n\nimport { Logger } from '@seedcord/services';\n\nimport { CustomError } from '../../interfaces/Components';\nimport { DatabaseError } from '../errors/Database';\n\nimport type { Core } from '../../interfaces/Core';\nimport type { Nullable } from '@seedcord/types';\nimport type { EmbedBuilder, Guild, User } from 'discord.js';\nimport type { UUID } from 'node:crypto';\n\n/**\n * Utility class for standardized error handling and response generation.\n */\nexport class ErrorHandlingUtils {\n private static readonly logger = new Logger('Errors');\n\n /**\n * Processes an error and extracts the standardized response, if available.\n *\n * Handles different error types (CustomError, DatabaseError) with appropriate\n * logging, side effects, and user-facing error messages.\n *\n * @param error - The error to process\n * @param core - The core framework instance\n * @param guild - The guild where the error occurred (if any)\n * @param user - The user who triggered the error (if any)\n * @returns Object containing UUID and formatted error response embed\n */\n public static extractErrorResponse(\n error: Error,\n core: Core,\n guild: Nullable<Guild>,\n user: Nullable<User>\n ): { uuid: UUID; response: EmbedBuilder } {\n const uuid = crypto.randomUUID();\n\n if (error instanceof CustomError) {\n if (error instanceof DatabaseError) {\n core.effects.emit('unknownException', { uuid, error, guild, user });\n\n this.logger.error(`DatabaseError: ${error.uuid}`);\n } else if (error.emit) {\n this.logger.error(`${error.name}: ${error.message}`, error);\n }\n\n return {\n uuid,\n response: error.response\n };\n }\n\n this.logger.error(uuid, error);\n core.effects.emit('unknownException', { uuid, error, guild, user });\n\n return {\n uuid,\n response: new GenericError(uuid).response\n };\n }\n}\n\n// Generic error for non-CustomError instances\nclass GenericError extends CustomError {\n constructor(private readonly uuid: UUID) {\n super('An unknown error occurred');\n\n this.response\n .setTitle('Error')\n .setDescription(\n `An unknown error occurred. Please reach out to the developer with a way to reproduce the error and the following:\\n` +\n `### UUID: \\`${this.uuid}\\``\n );\n }\n}\n","import { MessageFlags } from 'discord.js';\n\nimport { ErrorHandlingUtils } from '../utilities/ErrorHandlingUtils';\n\nimport type { RepliableInteractionHandler } from '../../interfaces/Handler';\n\n/**\n * Configuration options for the Catchable decorator.\n */\ninterface CatchableOptions {\n /** Whether to log errors to console (default: false) */\n log?: boolean;\n /** Always use followUp instead of reply/editReply (default: false) */\n forceFollowup?: boolean;\n}\n\n/**\n * Catches and handles errors in interaction handler methods\n *\n * Automatically sends error responses to users and prevents uncaught exceptions.\n * Should be applied to the execute() or runChecks() methods of interaction handlers.\n *\n * @param options - Configuration for error handling behavior\n * @decorator\n * @example\n * ```typescript\n * class MyHandler extends InteractionHandler {\n * \\@Catchable({ log: true })\n * async execute() {\n * // method implementation\n * }\n * }\n * ```\n */\nexport function Catchable(options?: CatchableOptions) {\n return function (\n _target: RepliableInteractionHandler,\n _propertyKey: string,\n descriptor: TypedPropertyDescriptor<(...args: any[]) => Promise<void>>\n ): void {\n const log = options?.log ?? false;\n const forceFollowup = options?.forceFollowup ?? false;\n\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: RepliableInteractionHandler, ...args: any[]): Promise<void> {\n const interaction = this.getEvent();\n\n if (!originalMethod) throw new Error('Method not found');\n\n try {\n await originalMethod.apply(this, args);\n } catch (error) {\n if (!(error instanceof Error)) throw error;\n\n this.setErrored();\n\n // eslint-disable-next-line no-console\n if (log) console.error(error);\n\n const { response } = ErrorHandlingUtils.extractErrorResponse(\n error,\n this.core,\n interaction.guild,\n interaction.user\n );\n\n const res = {\n embeds: [response],\n components: []\n };\n\n if (forceFollowup) {\n await interaction.followUp({ flags: MessageFlags.Ephemeral, ...res });\n return;\n }\n\n if (interaction.replied) {\n await interaction.followUp({ flags: MessageFlags.Ephemeral, ...res });\n } else if (interaction.deferred) {\n await interaction.editReply(res);\n } else {\n await interaction.reply({ flags: MessageFlags.Ephemeral, ...res });\n }\n }\n };\n };\n}\n","import { MessageFlags } from 'discord.js';\n\nimport { InteractionHandler, Repliables } from '../../interfaces/Handler';\nimport { Catchable } from '../decorators/Catchable';\n\nexport class UnhandledEvent extends InteractionHandler<Repliables> {\n @Catchable()\n async execute(): Promise<void> {\n await this.event.reply({\n content: `Feature not implemented yet.`,\n flags: MessageFlags.Ephemeral\n });\n }\n}\n","import { Logger } from '@seedcord/services';\nimport { traverseDirectory } from '@seedcord/utils';\nimport chalk from 'chalk';\nimport { Events } from 'discord.js';\n\nimport { AutocompleteHandler, InteractionHandler } from '../../interfaces/Handler';\nimport { InteractionMetadataKey, InteractionRoutes } from '../decorators/InteractionConfigurable';\nimport { UnhandledEvent } from '../defaults/UnhandledEvent';\n\nimport type { Core } from '../../interfaces/Core';\nimport type { HandlerConstructor, MiddlewareConstructor, Repliables } from '../../interfaces/Handler';\nimport type { Initializeable } from '../../interfaces/Plugin';\nimport type {\n AutocompleteInteraction,\n ButtonInteraction,\n ChannelSelectMenuInteraction,\n ChatInputCommandInteraction,\n Interaction,\n MentionableSelectMenuInteraction,\n MessageContextMenuCommandInteraction,\n ModalSubmitInteraction,\n RoleSelectMenuInteraction,\n StringSelectMenuInteraction,\n UserContextMenuCommandInteraction,\n UserSelectMenuInteraction\n} from 'discord.js';\n\n/**\n * Manages Discord interaction handling and routing.\n *\n * Scans handler directories, registers handlers with Discord client events,\n * and coordinates event execution through the handler system. Only handles interactions.\n *\n * Enforces that there is only one handler per interaction.\n *\n * @internal\n */\nexport class InteractionController implements Initializeable {\n private readonly logger = new Logger('Interactions');\n private isInitialized = false;\n\n private readonly slashMap = new Map<string, HandlerConstructor>();\n private readonly buttonMap = new Map<string, HandlerConstructor>();\n private readonly modalMap = new Map<string, HandlerConstructor>();\n private readonly stringSelectMap = new Map<string, HandlerConstructor>();\n private readonly userSelectMap = new Map<string, HandlerConstructor>();\n private readonly roleSelectMap = new Map<string, HandlerConstructor>();\n private readonly channelSelectMap = new Map<string, HandlerConstructor>();\n private readonly mentionableSelectMap = new Map<string, HandlerConstructor>();\n private readonly messageContextMenuMap = new Map<string, HandlerConstructor>();\n private readonly userContextMenuMap = new Map<string, HandlerConstructor>();\n private readonly autocompleteMap = new Map<string, HandlerConstructor>();\n\n private readonly keysToIgnore = new Set(['confirm!confirmable', 'cancel!confirmable']);\n\n private readonly middlewares: MiddlewareConstructor[] = [];\n\n constructor(protected core: Core) {}\n\n public async init(): Promise<void> {\n if (this.isInitialized) return;\n\n this.isInitialized = true;\n\n const handlersDir = this.core.config.bot.interactions.path;\n this.logger.info(chalk.bold(handlersDir));\n\n await this.loadHandlers(handlersDir);\n this.attachToClient();\n\n this.logger.info(`${chalk.bold.green('Loaded interaction handlers:')}`);\n this.logger.info(`→ ${chalk.magenta.bold(this.slashMap.size)} slash commands`);\n this.logger.info(`→ ${chalk.magenta.bold(this.buttonMap.size)} buttons`);\n this.logger.info(`→ ${chalk.magenta.bold(this.modalMap.size)} modals`);\n this.logger.info(`→ ${chalk.magenta.bold(this.stringSelectMap.size)} string selects`);\n this.logger.info(`→ ${chalk.magenta.bold(this.userSelectMap.size)} user selects`);\n this.logger.info(`→ ${chalk.magenta.bold(this.roleSelectMap.size)} role selects`);\n this.logger.info(`→ ${chalk.magenta.bold(this.channelSelectMap.size)} channel selects`);\n this.logger.info(`→ ${chalk.magenta.bold(this.mentionableSelectMap.size)} mentionable selects`);\n this.logger.info(`→ ${chalk.magenta.bold(this.messageContextMenuMap.size)} message context menus`);\n this.logger.info(`→ ${chalk.magenta.bold(this.userContextMenuMap.size)} user context menus`);\n this.logger.info(`→ ${chalk.magenta.bold(this.autocompleteMap.size)} autocomplete`);\n }\n\n private async loadHandlers(dir: string): Promise<void> {\n await traverseDirectory(\n dir,\n (_fullPath, relativePath, imported) => {\n for (const val of Object.values(imported)) {\n if (this.isHandlerClass(val)) {\n this.registerHandler(val);\n this.logger.info(\n `${chalk.italic('Registered')} ${chalk.bold.yellow(val.name)} from ${chalk.gray(relativePath)}`\n );\n }\n }\n },\n this.logger\n );\n }\n\n private isHandlerClass(obj: unknown): obj is HandlerConstructor {\n if (typeof obj !== 'function') return false;\n return (\n (obj.prototype instanceof InteractionHandler && Reflect.hasMetadata(InteractionMetadataKey, obj)) ||\n (obj.prototype instanceof AutocompleteHandler && Reflect.hasMetadata(InteractionMetadataKey, obj))\n );\n }\n\n private registerHandler(handlerClass: HandlerConstructor): void {\n const areRoutes = (routes: unknown): routes is string[] => {\n return Array.isArray(routes) && routes.every((r) => typeof r === 'string');\n };\n\n const routeTypes: [InteractionRoutes, Map<string, HandlerConstructor>][] = [\n [InteractionRoutes.Slash, this.slashMap],\n [InteractionRoutes.Button, this.buttonMap],\n [InteractionRoutes.Modal, this.modalMap],\n [InteractionRoutes.StringMenu, this.stringSelectMap],\n [InteractionRoutes.UserMenu, this.userSelectMap],\n [InteractionRoutes.RoleMenu, this.roleSelectMap],\n [InteractionRoutes.ChannelMenu, this.channelSelectMap],\n [InteractionRoutes.MentionableMenu, this.mentionableSelectMap],\n [InteractionRoutes.MessageContextMenu, this.messageContextMenuMap],\n [InteractionRoutes.UserContextMenu, this.userContextMenuMap],\n [InteractionRoutes.Autocomplete, this.autocompleteMap]\n ];\n for (const [routeType, map] of routeTypes) {\n const meta: unknown = Reflect.getMetadata(routeType, handlerClass);\n if (!areRoutes(meta)) continue;\n\n const routes = meta;\n routes.forEach((route) => map.set(route, handlerClass));\n }\n }\n\n private attachToClient(): void {\n this.core.bot.client.on(Events.InteractionCreate, (interaction) => {\n this.handleInteraction(interaction).catch((err: Error) => {\n this.logger.error(`[${chalk.bold.red('UNHANDLED ERROR AT ROOT')}] ${err.name}`, err.stack);\n });\n });\n }\n\n private parseCustomId(customId: string): { prefix: string; args: string[] } {\n const parts = customId.split(':');\n const prefix = parts[0] ?? '';\n const argString = parts[1] ?? '';\n const args = argString ? argString.split('-') : [];\n\n return { prefix, args };\n }\n\n private async handleCustomIdInteraction<TInteraction extends Interaction & { customId: string }>(\n interaction: TInteraction,\n getMap: () => Map<string, HandlerConstructor>,\n interactionType: string\n ): Promise<void> {\n const { prefix, args } = this.parseCustomId(interaction.customId);\n if (!prefix) return this.logger.warn(`${interactionType} has invalid customId: ${interaction.customId}`);\n\n await this.processInteraction(\n interaction,\n () => prefix,\n (key) => getMap().get(key),\n args\n );\n }\n\n public async processInteraction<TInteraction extends Interaction>(\n interaction: TInteraction,\n extractKey: (i: TInteraction) => string,\n getHandler: (key: string) => HandlerConstructor | undefined,\n args?: string[]\n ): Promise<void> {\n const key = extractKey(interaction);\n if (this.keysToIgnore.has(key)) return;\n\n // Run middlewares first\n for (const MiddlewareCtor of this.middlewares) {\n const middleware = new MiddlewareCtor(interaction as Repliables, this.core, args);\n await middleware.execute();\n if (middleware.hasErrors()) return;\n }\n let HandlerCtor = getHandler(key);\n if (!HandlerCtor) {\n // Automatically fallback to UnhandledEvent\n this.logger.warn(`No handler found for key ${chalk.bold.cyan(key)}. Falling back to UnhandledEvent.`);\n HandlerCtor = UnhandledEvent;\n }\n\n this.logger.debug(`Processing ${chalk.bold.green(key)} with ${chalk.gray(HandlerCtor.name)}`);\n // @ts-expect-error TS can't infer the type of interaction here\n const handler = new HandlerCtor(interaction as Repliables, this.core, args);\n if (handler.hasChecks()) await handler.runChecks();\n if (handler.shouldBreak()) return;\n if (!handler.hasErrors()) await handler.execute();\n }\n\n private async handleInteraction(interaction: Interaction): Promise<void> {\n switch (true) {\n case interaction.isChatInputCommand():\n await this.handleSlashCommand(interaction);\n break;\n case interaction.isButton():\n await this.handleButton(interaction);\n break;\n case interaction.isModalSubmit():\n await this.handleModal(interaction);\n break;\n case interaction.isStringSelectMenu():\n await this.handleStringSelectMenu(interaction);\n break;\n case interaction.isUserSelectMenu():\n await this.handleUserSelectMenu(interaction);\n break;\n case interaction.isRoleSelectMenu():\n await this.handleRoleSelectMenu(interaction);\n break;\n case interaction.isChannelSelectMenu():\n await this.handleChannelSelectMenu(interaction);\n break;\n case interaction.isMentionableSelectMenu():\n await this.handleMentionableSelectMenu(interaction);\n break;\n case interaction.isMessageContextMenuCommand():\n await this.handleMessageContextMenu(interaction);\n break;\n case interaction.isUserContextMenuCommand():\n await this.handleUserContextMenu(interaction);\n break;\n case interaction.isAutocomplete():\n await this.handleAutocomplete(interaction);\n break;\n default:\n this.logger.warn(`Unhandled interaction type: ${interaction.type}`);\n break;\n }\n }\n\n private async handleSlashCommand(interaction: ChatInputCommandInteraction): Promise<void> {\n const route = this.buildSlashRoute(interaction);\n await this.processInteraction(\n interaction,\n () => route,\n (key) => this.slashMap.get(key)\n );\n }\n\n private async handleButton(interaction: ButtonInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.buttonMap, 'Button');\n }\n\n private async handleModal(interaction: ModalSubmitInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.modalMap, 'Modal');\n }\n\n private async handleStringSelectMenu(interaction: StringSelectMenuInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.stringSelectMap, 'String select menu');\n }\n\n private async handleUserSelectMenu(interaction: UserSelectMenuInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.userSelectMap, 'User select menu');\n }\n\n private async handleRoleSelectMenu(interaction: RoleSelectMenuInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.roleSelectMap, 'Role select menu');\n }\n\n private async handleChannelSelectMenu(interaction: ChannelSelectMenuInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.channelSelectMap, 'Channel select menu');\n }\n\n private async handleMentionableSelectMenu(interaction: MentionableSelectMenuInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.mentionableSelectMap, 'Mentionable select menu');\n }\n\n private async handleMessageContextMenu(interaction: MessageContextMenuCommandInteraction): Promise<void> {\n await this.processInteraction(\n interaction,\n () => interaction.commandName,\n (key) => this.messageContextMenuMap.get(key)\n );\n }\n\n private async handleUserContextMenu(interaction: UserContextMenuCommandInteraction): Promise<void> {\n await this.processInteraction(\n interaction,\n () => interaction.commandName,\n (key) => this.userContextMenuMap.get(key)\n );\n }\n\n private async handleAutocomplete(interaction: AutocompleteInteraction): Promise<void> {\n const route = this.buildSlashRoute(interaction);\n const focused = interaction.options.getFocused(true);\n const autocompleteKey = `${route}:${focused.name}`;\n\n await this.processInteraction(\n interaction,\n () => autocompleteKey,\n (key) => this.autocompleteMap.get(key)\n );\n }\n\n // Build the route from commandName, subcommandGroup, subcommand\n private buildSlashRoute(interaction: ChatInputCommandInteraction | AutocompleteInteraction): string {\n const command = interaction.commandName;\n const group = interaction.options.getSubcommandGroup(false);\n const sub = interaction.options.getSubcommand(false);\n\n let route = command;\n if (group && sub) {\n route = `${route}/${group}/${sub}`;\n } else if (group) {\n route = `${route}/${group}`;\n } else if (sub) {\n route = `${route}/${sub}`;\n }\n return route;\n }\n}\n","import { Logger } from '@seedcord/services';\nimport chalk from 'chalk';\n\nimport type { Core } from '../../interfaces/Core';\n\nexport class EmojiInjector {\n private readonly logger = new Logger('Emojis');\n\n constructor(private readonly core: Core) {}\n\n public async init(): Promise<void> {\n // Check if we have emoji config\n if (!this.core.config.bot.emojis || Object.keys(this.core.config.bot.emojis).length === 0) {\n this.logger.info(`${chalk.bold.green('Loaded')}: ${chalk.magenta.bold('0')} emojis`);\n return;\n }\n\n const configEmojis = this.core.config.bot.emojis;\n await this.core.bot.client.application?.emojis.fetch();\n\n let foundCount = 0;\n\n Object.entries(configEmojis).forEach(([key, emojiName]) => {\n const emoji = this.core.bot.client.application?.emojis.cache.find((e) => e.name === emojiName);\n\n if (emoji) {\n configEmojis[key] = `<${emoji.identifier}>`;\n\n foundCount++;\n\n this.logger.debug(`${chalk.bold.green('Found')}: ${chalk.magenta.bold(emojiName)} (${emoji.id})`);\n }\n });\n\n this.logger.info(`${chalk.bold.green('Loaded')}: ${chalk.magenta.bold(foundCount)} emojis`);\n }\n}\n","import { Logger, ShutdownPhase } from '@seedcord/services';\nimport chalk from 'chalk';\nimport { Client } from 'discord.js';\nimport { Envapt } from 'envapt';\n\nimport { Plugin } from '../interfaces/Plugin';\nimport { CommandRegistry } from './controllers/CommandRegistry';\nimport { EventController } from './controllers/EventController';\nimport { InteractionController } from './controllers/InteractionController';\nimport { EmojiInjector } from './injectors/EmojiInjector';\n\nimport type { Core } from '../interfaces/Core';\n\n/**\n * Discord bot implementation that manages client and controllers\n * @internal - Accessed via core.bot, not directly instantiated by users\n */\nexport class Bot extends Plugin {\n @Envapt<string>('DISCORD_BOT_TOKEN', {\n converter(raw, _fallback) {\n if (typeof raw !== 'string') throw new Error('Missing DISCORD_BOT_TOKEN');\n return raw;\n }\n })\n declare public readonly botToken: string;\n\n public readonly logger = new Logger('Bot');\n private isInitialized = false;\n\n private readonly _client: Client;\n private readonly interactions: InteractionController;\n private readonly events: EventController;\n private readonly commands: CommandRegistry;\n private readonly emojiInjector: EmojiInjector;\n\n /**\n * @param core - Seedcord core instance\n * @internal\n */\n constructor(protected core: Core) {\n super(core);\n\n this._client = new Client(core.config.bot.clientOptions);\n\n this.interactions = new InteractionController(core);\n this.events = new EventController(core);\n\n this.commands = new CommandRegistry(this.core);\n this.emojiInjector = new EmojiInjector(this.core);\n\n this.core.shutdown.addTask(ShutdownPhase.DiscordCleanup, 'stop-bot', async () => await this.stop());\n }\n\n /**\n * Initializes Discord client and all controllers\n * @internal\n */\n public async init(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n this.isInitialized = true;\n\n await this.login();\n\n await this.interactions.init();\n await this.events.init();\n\n await this.commands.init();\n await this.commands.setCommands();\n\n await this.emojiInjector.init();\n }\n\n /**\n * Stops the bot and cleans up connections\n * @internal\n */\n public async stop(): Promise<void> {\n this._client.removeAllListeners();\n\n await this.logout();\n }\n\n /**\n * Logs the bot into Discord using the configured token\n */\n private async login(): Promise<Bot> {\n await this._client.login(this.botToken);\n this.logger.info(`Logged in as ${chalk.bold.magenta(this._client.user?.username)}!`);\n return this;\n }\n\n /**\n * Logs out and destroys the Discord client connection\n */\n private async logout(): Promise<void> {\n await this._client.destroy();\n this.logger.info(chalk.bold.red('Logged out of Discord!'));\n }\n\n public get client(): Client {\n return this._client;\n }\n}\n","import type { EffectKeys } from '../types/Effects';\nimport type { ConstructorFunction } from '@seedcord/types';\n\nexport const EffectMetadataKey = Symbol('effect:metadata');\n\n/**\n * Registers a side effect handler class with a specific side effect event.\n *\n * Associates the decorated class with a side effect event type for automatic\n * registration and execution when the side effect is emitted.\n *\n * @param effect - The side effect event name to register for\n * @decorator\n * @example\n * ```typescript\n * \\@RegisterEffect('userJoin')\n * class WelcomeHandler extends EffectHandler<'userJoin'> {\n * async execute() {\n * // Handle user join event\n * }\n * }\n * ```\n */\nexport function RegisterEffect<TEffect extends EffectKeys>(effect: TEffect) {\n return function (constructor: ConstructorFunction): void {\n Reflect.defineMetadata(EffectMetadataKey, effect, constructor);\n };\n}\n","import type { Core } from '../../interfaces/Core';\nimport type { AllEffects, EffectKeys } from '../types/Effects';\n\n/**\n * Abstract base class for handling application side effects.\n *\n * Provides type-safe access to effects data and the core framework instance.\n * Extend this class to create custom side effect handlers.\n *\n * @typeParam KeyOfEffects - The specific side effect type this handler processes\n */\nexport abstract class EffectsHandler<KeyOfEffects extends EffectKeys> {\n /**\n * Creates a new effects handler instance.\n *\n * @param data - The effect event data\n * @param core - The core framework instance\n */\n constructor(\n protected readonly data: AllEffects[KeyOfEffects],\n protected readonly core: Core\n ) {\n this.data = data;\n this.core = core;\n }\n\n /**\n * Executes the effect handler logic.\n * @virtual Override this method in your handler classes\n */\n abstract execute(): Promise<void>;\n}\n","import { EffectsHandler } from '../EffectsHandler';\n\nimport type { Core } from '../../../interfaces/Core';\nimport type { AllEffects, EffectKeys } from '../../types/Effects';\nimport type { WebhookClient } from 'discord.js';\n\n/**\n * Abstract webhook logging handler for side effect events.\n *\n * Extends EffectsHandler to provide webhook-based logging capabilities.\n * Implementations must define the webhook client to send messages to.\n *\n * @typeParam KeyOfEffects - The specific side effect type this handler processes\n */\nexport abstract class WebhookLog<KeyOfEffects extends EffectKeys> extends EffectsHandler<KeyOfEffects> {\n /** The Discord webhook client for sending log messages */\n abstract webhook: WebhookClient;\n\n constructor(data: AllEffects[KeyOfEffects], core: Core) {\n super(data, core);\n }\n}\n","import { DiscordAPIError, SnowflakeUtil, WebhookClient } from 'discord.js';\nimport { Envapt } from 'envapt';\n\nimport { BuilderComponent } from '../../interfaces/Components';\nimport { RegisterEffect } from '../decorators/RegisterEffect';\nimport { WebhookLog } from '../interfaces/abstracts/WebhookLog';\nimport { AllEffects } from '../types/Effects';\n\n@RegisterEffect('unknownException')\nexport class UnknownException extends WebhookLog<'unknownException'> {\n @Envapt('UNKNOWN_EXCEPTION_WEBHOOK_URL', {\n converter(raw, _fallback) {\n if (!raw) throw new Error('Missing UNKNOWN_EXCEPTION_WEBHOOK_URL');\n return raw;\n }\n })\n declare static readonly unknownExceptionWebhookUrl: string;\n\n webhook = new WebhookClient({\n url: UnknownException.unknownExceptionWebhookUrl\n });\n\n async execute(): Promise<void> {\n await this.webhook.send({\n username: 'Unknown Exception',\n avatarURL: 'https://cdn.discordapp.com/attachments/1351446034827579466/1351446912947191830/warning-2.png',\n embeds: [new UnhandledErrorEmbed(this.data).component]\n });\n }\n}\n\nclass UnhandledErrorEmbed extends BuilderComponent<'embed'> {\n constructor(data: AllEffects['unknownException']) {\n super('embed');\n\n const { uuid, error, guild, user } = data;\n\n this.instance\n .setTitle(`An unknown exception was thrown`)\n .setColor('#ef4860')\n .setDescription(\n `**Guild ID:** \\`${guild?.id ?? 'Not used in a guild'}\\`\\n` +\n `**Guild Name:** ${guild?.name ?? 'Not used in a guild'}\\n` +\n `**User ID:** \\`${user?.id ?? 'Missing user info'}\\`\\n` +\n `**Username:** ${user?.username ?? 'Missing user info'}\\n` +\n `### UUID: \\`${uuid}\\`\\n` +\n `\\`\\`\\`${error.stack}\\`\\`\\``\n );\n\n this.setTimestampsIfAvailable(error);\n }\n\n private setTimestampsIfAvailable(error: Error): void {\n if (!(error instanceof DiscordAPIError)) return;\n\n const now = Date.now();\n\n // Extract the snowflake ID from `/interactions/{ID}/`\n const snowflake = error.url.match(/\\/interactions\\/(\\d+)\\//)?.[1];\n if (!snowflake) return undefined;\n\n // Discord epoch offset (ms) and timestamp extraction\n const interactionTs = Number(SnowflakeUtil.deconstruct(snowflake).timestamp);\n\n // Time difference\n const diff = now - interactionTs;\n const seconds = Math.floor(diff / 1000);\n const millis = diff % 1000;\n\n this.instance.addFields([\n {\n name: 'Timestamps',\n value:\n `- **\\`Interaction sent\\` :** ${new Date(interactionTs).toISOString()} (${interactionTs})\\n` +\n `- **\\`Error logged \\` :** ${new Date(now).toISOString()} (${now})\\n` +\n `- **\\`Offset \\` :** ${seconds}s ${millis}ms`,\n inline: true\n }\n ]);\n }\n}\n","import { EventEmitter } from 'events';\n\nimport type { AllEffects, EffectKeys } from './types/Effects';\n\n/**\n * Type-safe event emitter for application effects.\n *\n * Provides a strongly-typed wrapper around Node.js EventEmitter\n * for Seedcord's effect system.\n *\n * @typeParam AllEffects - Side effect definitions mapping event names to data types\n */\nexport class EffectsEmitter {\n private readonly emitter = new EventEmitter();\n\n /**\n * Registers a listener for the specified side effect.\n *\n * @typeParam KeyOfEffects - The side effect name type\n * @param event - The side effect name to listen for\n * @param listener - Function to call when the event is emitted\n * @returns This EffectsEmitter instance for chaining\n */\n public on<KeyOfEffects extends EffectKeys>(\n event: KeyOfEffects,\n listener: (data: AllEffects[KeyOfEffects]) => void\n ): this {\n this.emitter.on(event, listener);\n return this;\n }\n\n /**\n * Registers a one-time listener for the specified side effect.\n *\n * @typeParam KeyOfEffects - The side effect name type\n * @param event - The side effect name to listen for once\n * @param listener - Function to call when the event is emitted\n * @returns This EffectsEmitter instance for chaining\n */\n public once<KeyOfEffects extends EffectKeys>(\n event: KeyOfEffects,\n listener: (data: AllEffects[KeyOfEffects]) => void\n ): this {\n this.emitter.once(event, listener);\n return this;\n }\n\n /**\n * Emits a side effect with the provided data.\n *\n * @typeParam KeyOfEffects - The side effect name type\n * @param event - The side effect name to emit\n * @param data - The data to pass to registered listeners\n * @returns True if the event had listeners, false otherwise\n */\n public emit<KeyOfEffects extends EffectKeys>(event: KeyOfEffects, data: AllEffects[KeyOfEffects]): boolean {\n return this.emitter.emit(event, data);\n }\n}\n","import { Logger } from '@seedcord/services';\nimport { traverseDirectory } from '@seedcord/utils';\nimport chalk from 'chalk';\n\nimport { Plugin } from '../interfaces/Plugin';\nimport { EffectMetadataKey } from './decorators/RegisterEffect';\nimport { UnknownException } from './default/UnknownException';\nimport { EffectsEmitter } from './EffectsEmitter';\nimport { EffectsHandler } from './interfaces/EffectsHandler';\n\nimport type { Core } from '../interfaces/Core';\nimport type { AllEffects, EffectKeys } from './types/Effects';\nimport type { TypedConstructor } from '@seedcord/types';\n\ntype EffectConstructor = TypedConstructor<typeof EffectsHandler>;\n\n/**\n * Manages application effects and event handling\n *\n * Provides a centralized system for registering and executing custom effects\n * throughout the application lifecycle. Effects are loaded from configured directories\n * and can be triggered programmatically or by framework events.\n *\n * @internal Accessed via core.effects, not directly instantiated\n */\nexport class EffectsRegistry extends Plugin {\n public readonly logger = new Logger('Effects');\n private isInitialized = false;\n private readonly effectsMap = new Map<EffectKeys, EffectConstructor[]>();\n private readonly emitter = new EffectsEmitter();\n\n constructor(protected core: Core) {\n super(core);\n }\n\n public async init(): Promise<void> {\n if (this.isInitialized) return;\n\n this.isInitialized = true;\n\n const effectsDir = this.core.config.effects.path;\n this.logger.info(chalk.bold(effectsDir));\n\n this.registerEffect('unknownException', UnknownException);\n\n await this.loadEffects(effectsDir);\n\n this.attachEffects();\n\n const totalEffects = Array.from(this.effectsMap.values()).reduce((acc, handlers) => acc + handlers.length, 0);\n this.logger.info(`${chalk.bold.green('Loaded')}: ${chalk.bold.magenta(totalEffects)} side effects`);\n }\n\n private async loadEffects(dir: string): Promise<void> {\n await traverseDirectory(\n dir,\n (_fullPath, relativePath, imported) => {\n for (const exportName of Object.keys(imported)) {\n const val = imported[exportName];\n if (this.isEffectHandler(val)) {\n const effectName = Reflect.getMetadata(EffectMetadataKey, val) as EffectKeys | undefined;\n if (effectName) {\n this.registerEffect(effectName, val);\n this.logger.info(\n `${chalk.italic('Registered')} ${chalk.bold.yellow(val.name)} from ${chalk.gray(relativePath)}`\n );\n }\n }\n }\n },\n this.logger\n );\n }\n\n private registerEffect(effectName: EffectKeys, handler: EffectConstructor): void {\n let handlers = this.effectsMap.get(effectName);\n if (!handlers) {\n handlers = [];\n this.effectsMap.set(effectName, handlers);\n }\n handlers.push(handler);\n }\n\n private isEffectHandler(obj: unknown): obj is EffectConstructor {\n if (typeof obj !== 'function') return false;\n return obj.prototype instanceof EffectsHandler;\n }\n\n private attachEffects(): void {\n for (const [effectName, handlerCtors] of this.effectsMap) {\n this.emitter.on(effectName, (data) => {\n for (const HandlerCtor of handlerCtors) {\n try {\n const instance = new HandlerCtor(data, this.core);\n void instance.execute();\n } catch (err) {\n this.logger.error(`Error in side effect ${String(effectName)} handler ${HandlerCtor.name}:`, err);\n }\n }\n });\n }\n }\n\n public emit<KeyOfEffects extends EffectKeys>(event: KeyOfEffects, data: AllEffects[KeyOfEffects]): boolean {\n return this.emitter.emit(event, data);\n }\n}\n","import { HealthCheck, CoordinatedShutdown, CoordinatedStartup, StartupPhase } from '@seedcord/services';\nimport chalk from 'chalk';\n\nimport { Bot } from './bot/Bot';\nimport { EffectsRegistry } from './effects/EffectsRegistry';\nimport { Pluggable } from './interfaces/Plugin';\n\nimport type { Config } from './interfaces/Config';\nimport type { Core } from './interfaces/Core';\n\n/**\n * Main Seedcord bot framework class\n *\n * Primary entry point for creating Discord bots with Seedcord.\n * Manages component lifecycle and provides plugin support.\n */\nexport class Seedcord extends Pluggable implements Core {\n private static isInstantiated = false;\n /** @see {@link CoordinatedShutdown} */\n public override readonly shutdown: CoordinatedShutdown;\n\n /** @see {@link CoordinatedStartup} */\n public override readonly startup: CoordinatedStartup;\n\n /** @see {@link EffectsRegistry} */\n public readonly effects: EffectsRegistry;\n\n /** @see {@link Bot} */\n public readonly bot: Bot;\n\n /** @see {@link HealthCheck} */\n private readonly healthCheck: HealthCheck;\n\n /**\n * Creates a new Seedcord instance\n *\n * @param config - Bot configuration including paths and Discord client options\n * @throws An {@link Error} When attempting to create multiple instances (singleton)\n */\n constructor(public readonly config: Config) {\n // Create lifecycle instances\n const shutdown = new CoordinatedShutdown();\n const startup = new CoordinatedStartup();\n\n // Pass them to parent constructor\n super(shutdown, startup);\n\n // Store references for public access\n this.shutdown = shutdown;\n this.startup = startup;\n\n if (Seedcord.isInstantiated) {\n throw new Error('Seedcord can only be instantiated once. Use the existing instance instead.');\n }\n Seedcord.isInstantiated = true;\n\n this.effects = new EffectsRegistry(this as unknown as Core);\n this.bot = new Bot(this as unknown as Core);\n this.healthCheck = new HealthCheck(this.shutdown);\n\n this.registerStartupTasks();\n }\n\n /**\n * Registers default startup tasks\n * @internal\n */\n private registerStartupTasks(): void {\n this.startup.addTask(StartupPhase.Configuration, 'Effect Initialization', async () => {\n this.effects.logger.info(chalk.bold('Initializing'));\n await this.effects.init();\n this.effects.logger.info(chalk.bold('Initialized'));\n });\n\n this.startup.addTask(StartupPhase.Instantiation, 'Bot Initialization', async () => {\n this.bot.logger.info(chalk.bold('Initializing'));\n await this.bot.init();\n this.bot.logger.info(chalk.bold('Initialized'));\n });\n\n this.startup.addTask(StartupPhase.Ready, 'Health Check', async () => {\n this.healthCheck.logger.info(chalk.bold('Initializing'));\n await this.healthCheck.init();\n this.healthCheck.logger.info(chalk.bold('Initialized'));\n });\n }\n\n /**\n * Starts the bot and runs all initialization tasks\n *\n * @returns This Seedcord instance when fully initialized\n */\n public async start(): Promise<this> {\n await super.init();\n return this;\n }\n}\n","import type { Handler } from '../../interfaces/Handler';\n\ntype HandlerCtor = new (...args: any[]) => Handler;\n\n/**\n * Marks a handler class as requiring check execution.\n *\n * Enables the runChecks() method to be called before execute()\n * for handlers that need pre-execution validation.\n *\n * @param ctor - The handler to mark as checkable (Do not pass this directly. Just call the decorator without a **()**)\n * @decorator\n * @example\n * ```typescript\n * \\@Checkable\n * class AdminCommand extends InteractionHandler {\n * async runChecks() {\n * // Perform admin permission checks\n * }\n * }\n * ```\n */\nexport function Checkable<TypeHandler extends HandlerCtor>(ctor: TypeHandler): TypeHandler {\n return class extends ctor {\n static override name = ctor.name;\n checkable = true as const;\n };\n}\n","/* decorators/EventCatchable.ts */\nimport { Message } from 'discord.js';\n\nimport { ErrorHandlingUtils } from '../utilities/ErrorHandlingUtils';\n\nimport type { EventHandler } from '../../interfaces/Handler';\nimport type { ClientEvents } from 'discord.js';\n\n/**\n * Catches and handles errors in event handler methods.\n *\n * Automatically handles errors in event handlers and sends error responses\n * if the event contains a Discord message object.\n *\n * @param log - Whether to log errors to console (default: false)\n * @decorator\n * @example\n * ```typescript\n * class MessageHandler extends EventHandler {\n * \\@EventCatchable(true)\n * async execute() {\n * // Event handling logic\n * }\n * }\n * ```\n */\nexport function EventCatchable(log?: boolean) {\n return function (\n _target: EventHandler<keyof ClientEvents>,\n _prop: string,\n descriptor: TypedPropertyDescriptor<(...args: any[]) => Promise<void>>\n ): void {\n const original = descriptor.value;\n\n descriptor.value = async function (this: EventHandler<keyof ClientEvents>, ...args: any[]): Promise<void> {\n if (!original) throw new Error('Method not found');\n\n try {\n await original.apply(this, args);\n } catch (err) {\n if (!(err instanceof Error)) throw err;\n\n this.setErrored();\n // eslint-disable-next-line no-console\n if (log) console.error(err);\n\n const eventArgs = Array.isArray(this.getEvent()) ? (this.getEvent() as unknown[]) : [this.getEvent()];\n const msg = eventArgs.find((x): x is Message => x instanceof Message);\n\n const { response } = ErrorHandlingUtils.extractErrorResponse(\n err,\n this.core,\n msg?.guild ?? null,\n msg?.author ?? null\n );\n\n if (!msg) return;\n\n await msg.reply({ embeds: [response], components: [] });\n }\n };\n };\n}\n","import { Logger } from '@seedcord/services';\n\nimport { DatabaseError } from '../bot/errors/Database';\n\nimport type { CustomErrorConstructor } from '../interfaces/Components';\n\n/**\n * Throws a custom error with a formatted message and optional UUID.\n *\n * Wraps an unknown error in a {@link CustomError} subclass. If the error class\n * is {@link DatabaseError}, a UUID is generated and passed to the constructor.\n *\n * @typeParam T - A constructor for a {@link CustomError} subclass\n * @param error - The original error or value\n * @param message - Custom message to include\n * @param CustomError - Error class to instantiate and throw\n * @throws Instance of the provided {@link CustomError} subclass\n *\n * @example\n * ```typescript\n * try {\n * // risky code\n * } catch (e) {\n * throwCustomError(e, \"Something went wrong\", MyCustomError);\n * }\n * ```\n */\nexport function throwCustomError<Ctor extends CustomErrorConstructor>(\n error: unknown,\n message: string,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n CustomError: Ctor\n): never {\n const uuid = crypto.randomUUID();\n Logger.Error('Throwing Custom Error', (error as Error).name);\n\n if (typeof CustomError === typeof DatabaseError) {\n const errorMessage = error instanceof Error ? error.message : message;\n throw new CustomError(errorMessage, uuid);\n } else {\n if (error instanceof Error) {\n throw new CustomError(`${message}: ${error.message ? error.message : error.toString()}`);\n } else {\n throw new CustomError(message);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/interfaces/Plugin.ts","../src/interfaces/Components.ts","../src/bot/decorators/CommandRegisterable.ts","../src/bot/controllers/CommandRegistry.ts","../src/interfaces/Handler.ts","../src/bot/decorators/EventRegisterable.ts","../src/bot/controllers/EventController.ts","../src/bot/decorators/InteractionConfigurable.ts","../src/bot/errors/Database.ts","../src/bot/utilities/ErrorHandlingUtils.ts","../src/bot/decorators/Catchable.ts","../src/bot/defaults/UnhandledEvent.ts","../src/bot/controllers/InteractionController.ts","../src/bot/injectors/EmojiInjector.ts","../src/bot/Bot.ts","../src/effects/decorators/RegisterEffect.ts","../src/effects/interfaces/EffectsHandler.ts","../src/effects/interfaces/abstracts/WebhookLog.ts","../src/effects/default/UnknownException.ts","../src/effects/EffectsEmitter.ts","../src/effects/EffectsRegistry.ts","../src/Seedcord.ts","../src/bot/decorators/Checkable.ts","../src/bot/decorators/EventCatchable.ts","../src/library/Helpers.ts"],"names":["Plugin","pluggable","Pluggable","isInitialized","shutdown","startup","PLUGIN_INIT_TIMEOUT_MS","init","run","attach","key","startupPhase","args","Error","instance","entry","addTask","logger","info","chalk","bold","Object","assign","BuilderTypes","command","SlashCommandBuilder","embed","EmbedBuilder","button","ButtonBuilder","menu_string","StringSelectMenuBuilder","menu_option_string","StringSelectMenuOptionBuilder","menu_user","UserSelectMenuBuilder","menu_channel","ChannelSelectMenuBuilder","menu_mentionable","MentionableSelectMenuBuilder","menu_role","RoleSelectMenuBuilder","modal","ModalBuilder","context_menu","ContextMenuCommandBuilder","subcommand","SlashCommandSubcommandBuilder","group","SlashCommandSubcommandGroupBuilder","container","ContainerBuilder","text_display","TextDisplayBuilder","file","FileBuilder","media","MediaGalleryBuilder","section","SectionBuilder","separator","SeparatorBuilder","RowTypes","ActionRowBuilder","ModalTypes","text","TextInputBuilder","BaseComponent","_component","ComponentClass","buildCustomId","prefix","length","join","BuilderComponent","type","setColor","botColor","setContexts","InteractionContextType","Guild","component","fallback","RowComponent","ModalRow","addComponents","ModalComponent","BaseErrorEmbed","setTitle","CustomError","_emit","response","message","captureStackTrace","emit","value","CommandMetadataKey","Symbol","RegisterCommand","scope","guilds","ctor","meta","Reflect","defineMetadata","CommandRegistry","Logger","isInitialised","globalCommands","guildCommands","Collection","core","config","bot","commands","path","loadCommands","green","magenta","size","dir","traverseDirectory","_full","rel","mod","exported","values","isCommandClass","registerCommand","obj","prototype","hasMetadata","getMetadata","comp","commandType","push","italic","yellow","name","gray","cyan","g","arr","get","set","setCommands","client","application","tag","map","guildId","entries","guild","cache","warn","BaseHandler","checkable","break","errored","event","hasChecks","hasErrors","setErrored","shouldBreak","getEvent","getArgs","getArg","index","InteractionHandler","InteractionMiddleware","AutocompleteHandler","focused","options","getFocused","EventHandler","EventMetadataKey","RegisterEvent","eventName","constructor","EventController","eventMap","handlersDir","events","loadHandlers","attachToClient","loadedEventsArray","forEach","handlers","_fullPath","relativePath","imported","val","isEventHandlerClass","registerHandler","handlerClass","debug","user","username","on","processEvent","handlerCtors","HandlerCtor","handler","runChecks","execute","err","error","String","InteractionRoutes","SelectMenuType","InteractionMetadataKey","SlashRoute","routeOrRoutes","storeMetadata","ButtonRoute","ModalRoute","ContextMenuRoute","routeType","AutocompleteRoute","commandRoutes","focusedFields","routes","Array","isArray","fields","route","field","autocompleteKey","SelectMenuRoute","routeMap","symbol","areRoutes","every","r","savedRoutes","existing","toStore","DatabaseError","uuid","setDescription","ErrorHandlingUtils","extractErrorResponse","randomUUID","effects","showStack","errorStack","GenericError","Catchable","_target","_propertyKey","descriptor","log","forceFollowup","originalMethod","interaction","apply","console","res","embeds","components","followUp","flags","MessageFlags","Ephemeral","replied","deferred","editReply","reply","UnhandledEvent","content","InteractionController","slashMap","buttonMap","modalMap","stringSelectMap","userSelectMap","roleSelectMap","channelSelectMap","mentionableSelectMap","messageContextMenuMap","userContextMenuMap","autocompleteMap","keysToIgnore","Set","middlewares","ignoredKeysFromConfig","interactions","ignoreCustomIds","ignoredKey","add","isHandlerClass","routeTypes","Slash","Button","Modal","StringMenu","UserMenu","RoleMenu","ChannelMenu","MentionableMenu","MessageContextMenu","UserContextMenu","Autocomplete","Events","InteractionCreate","handleInteraction","catch","red","stack","parseCustomId","customId","parts","split","argString","handleCustomIdInteraction","getMap","interactionType","processInteraction","extractKey","getHandler","has","MiddlewareCtor","middleware","isChatInputCommand","handleSlashCommand","isButton","handleButton","isModalSubmit","handleModal","isStringSelectMenu","handleStringSelectMenu","isUserSelectMenu","handleUserSelectMenu","isRoleSelectMenu","handleRoleSelectMenu","isChannelSelectMenu","handleChannelSelectMenu","isMentionableSelectMenu","handleMentionableSelectMenu","isMessageContextMenuCommand","handleMessageContextMenu","isUserContextMenuCommand","handleUserContextMenu","isAutocomplete","handleAutocomplete","buildSlashRoute","commandName","getSubcommandGroup","sub","getSubcommand","EmojiInjector","emojis","keys","configEmojis","fetch","foundCount","emojiName","emoji","find","e","identifier","id","Bot","_client","emojiInjector","Client","clientOptions","ShutdownPhase","DiscordCleanup","stop","login","removeAllListeners","logout","botToken","destroy","converter","raw","_fallback","EffectMetadataKey","RegisterEffect","effect","EffectsHandler","data","WebhookLog","UnknownException","webhook","WebhookClient","url","unknownExceptionWebhookUrl","send","avatarURL","UnhandledErrorEmbed","URL","canParse","setTimestampsIfAvailable","DiscordAPIError","now","Date","snowflake","match","undefined","interactionTs","Number","SnowflakeUtil","deconstruct","timestamp","diff","seconds","Math","floor","millis","addFields","toISOString","inline","EffectsEmitter","emitter","EventEmitter","listener","once","EffectsRegistry","effectsMap","effectsDir","registerEffect","loadEffects","attachEffects","totalEffects","from","reduce","acc","exportName","isEffectHandler","effectName","Seedcord","isInstantiated","healthCheck","CoordinatedShutdown","CoordinatedStartup","HealthCheck","registerStartupTasks","StartupPhase","Configuration","Instantiation","Ready","start","Checkable","EventCatchable","_prop","original","eventArgs","msg","x","Message","author","throwCustomError","crypto","errorMessage","toString"],"mappings":"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","file":"index.cjs","sourcesContent":["import chalk from 'chalk';\n\nimport type { Core } from './Core';\nimport type { CoordinatedShutdown, CoordinatedStartup, StartupPhase, Logger } from '@seedcord/services';\nimport type { Tail } from '@seedcord/types';\n\n/** Interface for objects that can be initialized asynchronously */\nexport interface Initializeable {\n init(): Promise<void>;\n}\n\n/**\n * Base class for Seedcord plugins\n *\n * Extend this class to create plugins that integrate with the Seedcord lifecycle.\n * Plugins have access to the core instance and must implement initialization logic.\n */\nexport abstract class Plugin implements Initializeable {\n /** Logger instance for this plugin - must be implemented by subclasses */\n public abstract logger: Logger;\n\n constructor(protected pluggable: Core) {}\n\n /**\n * Initialize the plugin - implement setup logic here\n * @virtual Override this method in your plugin classes\n */\n abstract init(): Promise<void>;\n}\n\n/**\n * Constructor type for plugins that can accept additional arguments after Core\n * @param TPlugin - The plugin type being constructed\n */\nexport type PluginCtor<TPlugin extends Plugin = Plugin> = new (core: Core, ...args: any[]) => TPlugin;\n\n/**\n * Extracts the argument types for a plugin constructor (excluding the Core parameter)\n * @param Ctor - The plugin constructor to extract arguments from\n */\nexport type PluginArgs<Ctor extends PluginCtor> = Tail<ConstructorParameters<Ctor>>;\n\n/**\n * Base class for objects that can have plugins attached\n *\n * Provides plugin attachment capabilities and lifecycle management.\n * Plugins are attached during configuration and initialized during startup.\n */\nexport class Pluggable {\n protected isInitialized = false;\n protected readonly shutdown: CoordinatedShutdown;\n protected readonly startup: CoordinatedStartup;\n\n private static readonly PLUGIN_INIT_TIMEOUT_MS = 15000;\n\n constructor(shutdown: CoordinatedShutdown, startup: CoordinatedStartup) {\n this.shutdown = shutdown;\n this.startup = startup;\n }\n\n protected async init(): Promise<this> {\n if (this.isInitialized) return this;\n\n await this.startup.run();\n this.isInitialized = true;\n\n return this;\n }\n\n /**\n * Attaches a plugin to this instance\n *\n * Plugins provide external functionality and are initialized during the specified startup phase.\n * The plugin instance becomes available as a property in `core` wherever it's available.\n *\n * Make sure to augment the {@link Core} interface with the plugin type to ensure TypeScript recognizes it and provides intellisense.\n *\n * @typeParam Key - The property name for accessing the plugin\n * @typeParam Ctor - The plugin constructor type\n * @param key - Property name to access the plugin instance\n * @param Plugin - Plugin constructor class\n * @param startupPhase - When during startup to initialize this plugin ({@link StartupPhase})\n * @param args - Additional arguments to pass to the plugin constructor\n * @returns This instance with the plugin attached as a typed property\n * @throws An {@link Error} When called after initialization or if key already exists\n * @example\n * ```typescript\n * seedcord.attach('db', Mongo, StartupPhase.Configuration, { uri: 'mongodb://...', name: 'seedcord', dir: ... })\n * ```\n */\n public attach<Key extends string, Ctor extends PluginCtor>(\n this: this,\n key: Key,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Plugin: Ctor,\n startupPhase: StartupPhase,\n ...args: PluginArgs<Ctor>\n ): this & Record<Key, InstanceType<Ctor>> {\n if (this.isInitialized) throw new Error('Cannot attach a plugin after initialization.');\n if ((this as Record<string, unknown>)[key]) throw new Error(`Plugin with key \"${key}\" already exists.`);\n\n const instance = new Plugin(this as unknown as Core, ...args);\n\n const entry = {\n [key]: instance\n } as Record<Key, InstanceType<Ctor>>;\n\n this.startup.addTask(\n startupPhase,\n `Plugin:${key}`,\n async () => {\n instance.logger.info(chalk.bold('Initializing'));\n await instance.init();\n instance.logger.info(chalk.bold('Initialized'));\n },\n Pluggable.PLUGIN_INIT_TIMEOUT_MS\n );\n\n return Object.assign(this, entry);\n }\n}\n","import {\n ActionRowBuilder,\n ButtonBuilder,\n ChannelSelectMenuBuilder,\n ContainerBuilder,\n ContextMenuCommandBuilder,\n EmbedBuilder,\n FileBuilder,\n InteractionContextType,\n MediaGalleryBuilder,\n MentionableSelectMenuBuilder,\n ModalBuilder,\n RoleSelectMenuBuilder,\n SectionBuilder,\n SeparatorBuilder,\n SlashCommandBuilder,\n SlashCommandSubcommandBuilder,\n SlashCommandSubcommandGroupBuilder,\n StringSelectMenuBuilder,\n StringSelectMenuOptionBuilder,\n TextDisplayBuilder,\n TextInputBuilder,\n UserSelectMenuBuilder\n} from 'discord.js';\nimport { Envapt } from 'envapt';\n\nimport type { ColorResolvable, ModalActionRowComponentBuilder } from 'discord.js';\n\nconst BuilderTypes = {\n command: SlashCommandBuilder,\n embed: EmbedBuilder,\n button: ButtonBuilder,\n menu_string: StringSelectMenuBuilder,\n menu_option_string: StringSelectMenuOptionBuilder,\n menu_user: UserSelectMenuBuilder,\n menu_channel: ChannelSelectMenuBuilder,\n menu_mentionable: MentionableSelectMenuBuilder,\n menu_role: RoleSelectMenuBuilder,\n modal: ModalBuilder,\n context_menu: ContextMenuCommandBuilder,\n subcommand: SlashCommandSubcommandBuilder,\n group: SlashCommandSubcommandGroupBuilder,\n container: ContainerBuilder,\n text_display: TextDisplayBuilder,\n file: FileBuilder,\n media: MediaGalleryBuilder,\n section: SectionBuilder,\n separator: SeparatorBuilder\n};\n\nconst RowTypes: {\n button: typeof ActionRowBuilder<ButtonBuilder>;\n menu_string: typeof ActionRowBuilder<StringSelectMenuBuilder>;\n menu_user: typeof ActionRowBuilder<UserSelectMenuBuilder>;\n menu_channel: typeof ActionRowBuilder<ChannelSelectMenuBuilder>;\n menu_mentionable: typeof ActionRowBuilder<MentionableSelectMenuBuilder>;\n menu_role: typeof ActionRowBuilder<RoleSelectMenuBuilder>;\n modal: typeof ActionRowBuilder<ModalActionRowComponentBuilder>;\n} = {\n button: ActionRowBuilder<ButtonBuilder>,\n menu_string: ActionRowBuilder<StringSelectMenuBuilder>,\n menu_user: ActionRowBuilder<UserSelectMenuBuilder>,\n menu_channel: ActionRowBuilder<ChannelSelectMenuBuilder>,\n menu_mentionable: ActionRowBuilder<MentionableSelectMenuBuilder>,\n menu_role: ActionRowBuilder<RoleSelectMenuBuilder>,\n modal: ActionRowBuilder<ModalActionRowComponentBuilder>\n};\n\nconst ModalTypes = {\n text: TextInputBuilder\n};\n\ntype BuilderType = keyof typeof BuilderTypes;\ntype InstantiatedBuilder<BuilderKey extends BuilderType> = InstanceType<(typeof BuilderTypes)[BuilderKey]>;\n\ntype ActionRowComponentType = keyof typeof RowTypes;\ntype InstantiatedActionRow<RowKey extends ActionRowComponentType> = InstanceType<(typeof RowTypes)[RowKey]>;\n\ntype ModalFieldTypes = keyof typeof ModalTypes;\ntype InstantiatedModalField<ModalKey extends ModalFieldTypes> = InstanceType<(typeof ModalTypes)[ModalKey]>;\n\n/**\n * Base class for Discord component wrappers\n *\n * Provides common functionality for building Discord components with proper typing.\n *\n * @typeParam TComponent - The Discord.js component type being wrapped\n */\nabstract class BaseComponent<TComponent> {\n private readonly _component: TComponent;\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n protected constructor(ComponentClass: new () => TComponent) {\n this._component = new ComponentClass();\n }\n\n /**\n * Gets the built component (should be considered read-only)\n *\n * Returns the finalized component ready for use in Discord messages.\n *\n * Please do not use for further configuration, use `this.instance` for that.\n * @example new SomeComponent().component\n */\n public abstract get component(): InstantiatedBuilder<BuilderType> | InstantiatedActionRow<ActionRowComponentType>;\n\n /**\n * Gets the component instance for configuration\n *\n * Use this to access Discord.js builder methods like setTitle(), setDescription(), etc.\n *\n * Use this in your component classes to configure the builder\n * @example this.instance.setTitle('My Modal')\n */\n protected get instance(): TComponent {\n return this._component;\n }\n\n /**\n * Builds a customId string for interactive components\n *\n * Creates customIds in the format \"prefix:arg1-arg2-arg3\" for buttons, modals, etc.\n * Arguments are joined with hyphens and separated from prefix with a colon.\n *\n * @param prefix - The route prefix that handlers will match against\n * @param args - Additional arguments to encode in the customId\n * @returns Formatted customId string\n */\n public buildCustomId(prefix: string, ...args: string[]): string {\n if (args.length === 0) return prefix;\n return `${prefix}:${args.join('-')}`;\n }\n}\n\n/**\n * Base class for Discord.js builder components\n *\n * Wraps Discord.js builders (SlashCommandBuilder, EmbedBuilder, etc.) with\n * Seedcord-specific defaults and helper methods.\n *\n * @typeParam BuilderKey - The type of Discord.js builder being wrapped\n */\nexport abstract class BuilderComponent<BuilderKey extends BuilderType> extends BaseComponent<\n InstantiatedBuilder<BuilderKey>\n> {\n @Envapt<ColorResolvable>('DEFAULT_BOT_COLOR', { fallback: 'Default' })\n declare private readonly botColor: ColorResolvable;\n\n protected constructor(type: BuilderKey) {\n const ComponentClass = BuilderTypes[type] as unknown;\n super(ComponentClass as new () => InstantiatedBuilder<BuilderKey>);\n\n // Override in builders\n if (this.instance instanceof EmbedBuilder) this.instance.setColor(this.botColor);\n\n // Override in builders\n if (this.instance instanceof SlashCommandBuilder || this.instance instanceof ContextMenuCommandBuilder) {\n this.instance.setContexts(InteractionContextType.Guild);\n }\n }\n\n get component(): InstantiatedBuilder<BuilderKey> {\n // TODO: Add checks for specific builders that make sure mandatory fields are set\n\n return this.instance;\n }\n}\n\n/**\n * Base class for Discord action row components\n *\n * Wraps Discord.js action row builder with Seedcord-specific defaults and helper methods.\n *\n * @typeParam RowKey - The Discord.js action row type being wrapped\n */\nexport abstract class RowComponent<RowKey extends ActionRowComponentType> extends BaseComponent<\n InstantiatedActionRow<RowKey>\n> {\n protected constructor(type: RowKey) {\n const ComponentClass = RowTypes[type] as unknown;\n super(ComponentClass as new () => InstantiatedActionRow<RowKey>);\n }\n\n get component(): InstantiatedActionRow<RowKey> {\n return this.instance;\n }\n}\n\n/**\n * Action row wrapper for modal components\n *\n * Automatically wraps modal field components in an action row for use in modals.\n *\n * @typeParam ModalKey - The type of modal field component being wrapped\n * @internal\n */\nclass ModalRow<ModalKey extends ModalFieldTypes> extends RowComponent<'modal'> {\n /**\n * Creates a new modal action row with the specified component.\n *\n * @param component - The modal field component to wrap in an action row\n */\n constructor(component: InstantiatedModalField<ModalKey>) {\n super('modal');\n\n this.instance.addComponents(component);\n }\n}\n\n/**\n * Base class for modal field components\n *\n * Wraps Discord.js modal field builders (TextInputBuilder, etc.) and\n * packages them in action rows for use in modals.\n *\n * @typeParam ModalKey - The type of modal field builder being wrapped\n */\nexport abstract class ModalComponent<ModalKey extends ModalFieldTypes> extends BaseComponent<\n InstantiatedModalField<ModalKey>\n> {\n protected constructor(type: ModalKey) {\n const ComponentClass = ModalTypes[type] as unknown;\n super(ComponentClass as new () => InstantiatedModalField<ModalKey>);\n }\n\n get component(): InstantiatedActionRow<'modal'> {\n return new ModalRow<ModalKey>(this.instance).component;\n }\n}\n\n/**\n * Pre-configured error embed with default styling\n *\n * This is bundled in {@link CustomError}s as the response.\n */\nexport class BaseErrorEmbed extends BuilderComponent<'embed'> {\n /**\n * Creates a new error embed with default configuration.\n */\n public constructor() {\n super('embed');\n this.instance.setTitle('Cannot Proceed');\n }\n}\n\n/**\n * Base class for custom error types with Discord embed responses\n *\n * Errors extending CustomError should be used with the `Catchable` decorators to implement a control flow. These errors will be caught and handled by the framework to show the user the configured response.\n */\nexport abstract class CustomError extends Error {\n private _emit = false;\n public readonly response = new BaseErrorEmbed().component;\n\n protected constructor(public override message: string) {\n super(message);\n\n // TODO: Is this line even needed?\n Error.captureStackTrace(this, this.constructor);\n }\n\n /**\n * Whether this error should be emitted to logs\n *\n * Controls logging behavior. Errors with emit=true will always be logged,\n * while emit=false errors may be suppressed in production.\n *\n * @returns True if the error should be logged\n */\n public get emit(): boolean {\n return this._emit;\n }\n\n /**\n * Sets whether this error should be emitted to logs\n *\n * @see {@link emit}\n */\n public set emit(value: boolean) {\n this._emit = value;\n }\n}\n\n/** Constructor type for custom error classes */\nexport type CustomErrorConstructor = new (message: string, ...args: any[]) => CustomError;\n","import type { BuilderComponent } from '../../interfaces/Components';\n\nexport const CommandMetadataKey = Symbol('command:metadata');\n\ntype CommandCtor = new (...args: any[]) => BuilderComponent<'command' | 'context_menu'>;\n\n/**\n * Metadata for global command registration.\n */\ninterface GlobalMeta {\n scope: 'global';\n}\n\n/**\n * Metadata for guild-specific command registration.\n */\ninterface GuildMeta {\n scope: 'guild';\n guilds: string[];\n}\n\n/**\n * Union type for command registration metadata.\n */\nexport type CommandMeta = GlobalMeta | GuildMeta;\n\n/**\n * Registers a command for global deployment.\n *\n * @param scope - Must be 'global' for global registration\n * @decorator\n * @example\n * ```typescript\n * \\@RegisterCommand('global')\n * class PingCommand extends BuilderComponent {\n * // Global command\n * }\n * ```\n */\nexport function RegisterCommand(scope: 'global'): (ctor: CommandCtor) => void;\n\n/**\n * Registers a command for specific guild deployment.\n *\n * @param scope - Must be 'guild' for guild-specific registration\n * @param guilds - Array of guild IDs where the command should be registered\n * @decorator\n * @example\n * ```typescript\n * \\@RegisterCommand('guild', ['123456789'])\n * class AdminCommand extends BuilderComponent {\n * // Guild-specific command\n * }\n * ```\n */\nexport function RegisterCommand(scope: 'guild', guilds: string[]): (ctor: CommandCtor) => void;\n\n/**\n * Registers a command with Discord's application command system.\n *\n * @param scope - Registration scope: 'global' or 'guild'\n * @param guilds - Guild IDs for guild-scoped registration\n * @decorator\n */\nexport function RegisterCommand(scope: 'global' | 'guild', guilds: string[] = []) {\n return (ctor: CommandCtor): void => {\n const meta: GlobalMeta | GuildMeta = scope === 'global' ? { scope } : { scope, guilds };\n Reflect.defineMetadata(CommandMetadataKey, meta, ctor);\n };\n}\n","import { Logger } from '@seedcord/services';\nimport { traverseDirectory } from '@seedcord/utils';\nimport chalk from 'chalk';\nimport { Collection, SlashCommandBuilder } from 'discord.js';\n\nimport { BuilderComponent } from '../../interfaces/Components';\nimport { CommandMetadataKey } from '../decorators/CommandRegisterable';\n\nimport type { Core } from '../../interfaces/Core';\nimport type { Initializeable } from '../../interfaces/Plugin';\nimport type { CommandMeta } from '../decorators/CommandRegisterable';\nimport type { ContextMenuCommandBuilder } from 'discord.js';\n\ntype CommandCtor = new () => BuilderComponent<'command' | 'context_menu'>;\n\n/**\n * Manages Discord application command registration and deployment.\n *\n * Scans command directories, builds command structures, and handles both\n * global and guild-specific command deployment to Discord's API.\n *\n * @internal\n */\nexport class CommandRegistry implements Initializeable {\n private readonly logger = new Logger('Commands');\n private isInitialised = false;\n\n public readonly globalCommands: (SlashCommandBuilder | ContextMenuCommandBuilder)[] = [];\n public readonly guildCommands = new Collection<string, (SlashCommandBuilder | ContextMenuCommandBuilder)[]>();\n\n public constructor(private readonly core: Core) {}\n\n public async init(): Promise<void> {\n if (this.isInitialised) return;\n this.isInitialised = true;\n\n this.logger.info(chalk.bold(this.core.config.bot.commands.path));\n\n await this.loadCommands(this.core.config.bot.commands.path);\n\n this.logger.info(\n `${chalk.bold.green('Loaded')}: ${chalk.magenta.bold(\n this.globalCommands.length\n )} global, ${chalk.magenta.bold(this.guildCommands.size)} guild groups`\n );\n }\n\n private async loadCommands(dir: string): Promise<void> {\n await traverseDirectory(\n dir,\n (_full, rel, mod) => {\n for (const exported of Object.values(mod))\n if (this.isCommandClass(exported)) this.registerCommand(exported, rel);\n },\n this.logger\n );\n }\n\n private isCommandClass(obj: unknown): obj is CommandCtor {\n if (typeof obj !== 'function') return false;\n return obj.prototype instanceof BuilderComponent && Reflect.hasMetadata(CommandMetadataKey, obj);\n }\n\n private registerCommand(ctor: CommandCtor, rel: string): void {\n const meta = Reflect.getMetadata(CommandMetadataKey, ctor) as CommandMeta | undefined;\n\n if (!meta) return;\n\n const instance = new ctor();\n const comp = instance.component;\n\n const commandType = comp instanceof SlashCommandBuilder ? 'slash command' : 'context menu command';\n\n if (meta.scope === 'global') {\n this.globalCommands.push(comp);\n this.logger.info(`${chalk.italic('Registered')} ${chalk.bold.yellow(ctor.name)} from ${chalk.gray(rel)}`);\n this.logger.info(` → Global ${commandType}: ${chalk.bold.cyan(comp.name)}`);\n } else {\n for (const g of meta.guilds) {\n const arr = this.guildCommands.get(g) ?? [];\n arr.push(comp);\n this.guildCommands.set(g, arr);\n }\n this.logger.info(`${chalk.italic('Registered')} ${chalk.bold.yellow(ctor.name)} from ${chalk.gray(rel)}`);\n this.logger.info(\n ` → Guild ${commandType}: ${chalk.bold.cyan(comp.name)} for ${chalk.magenta.bold(meta.guilds.length)} guild(s)`\n );\n }\n }\n\n public async setCommands(): Promise<void> {\n if (this.globalCommands.length > 0) {\n await this.core.bot.client.application?.commands.set(this.globalCommands);\n const tag = this.globalCommands.length === 1 ? 'command' : 'commands';\n this.logger.info(\n `${chalk.bold.green('Configured')} ${chalk.magenta.bold(this.globalCommands.length)} global ${tag}`\n );\n this.logger.info(` → ${this.globalCommands.map((command) => chalk.bold.cyan(command.name)).join(', ')}`);\n }\n\n for (const [guildId, commands] of this.guildCommands.entries()) {\n const guild = this.core.bot.client.guilds.cache.get(guildId);\n if (!guild) {\n this.logger.warn(`Guild with ID ${guildId} not found, skipping command registration.`);\n continue;\n }\n\n await guild.commands.set(commands);\n const tag = commands.length === 1 ? 'command' : 'commands';\n this.logger.info(\n `${chalk.bold.green('Configured')} ${chalk.magenta.bold(commands.length)} ${tag} for guild ${chalk.bold.yellow(guild.name)}`\n );\n this.logger.info(` → ${commands.map((command) => chalk.bold.cyan(command.name)).join(', ')}`);\n }\n }\n}\n","import type { Core } from './Core';\nimport type { TypedConstructor } from '@seedcord/types';\nimport type {\n AnySelectMenuInteraction,\n AutocompleteFocusedOption,\n AutocompleteInteraction,\n ButtonInteraction,\n ChatInputCommandInteraction,\n ClientEvents,\n ContextMenuCommandInteraction,\n Events,\n ModalSubmitInteraction\n} from 'discord.js';\n\n/** All valid Discord.js interaction types that can be handled */\nexport type ValidInteractionTypes =\n | ChatInputCommandInteraction\n | ButtonInteraction\n | ModalSubmitInteraction\n | AutocompleteInteraction\n | AnySelectMenuInteraction\n | ContextMenuCommandInteraction;\n\n/** All valid Discord.js client events except interaction events */\nexport type ValidNonInteractionTypes = ClientEvents[Exclude<keyof ClientEvents, Events.InteractionCreate>];\n\n/** All event types that can be handled (interactions and client events) */\nexport type ValidEventTypes = ValidInteractionTypes | ValidNonInteractionTypes;\n\n/** Interaction types that can receive replies (excludes autocomplete) */\nexport type Repliables = Exclude<ValidInteractionTypes, AutocompleteInteraction>;\n\n/** Handler types that can reply to interactions */\nexport type RepliableInteractionHandler = InteractionHandler<Repliables> | InteractionMiddleware<Repliables>;\n\n/** Base interface for event handlers */\nexport interface Handler {\n execute(): Promise<void>;\n}\n\n/**\n * Interface for handlers that can run pre-execution checks\n *\n * Should always accompany the `@Catchable` decorator. Will require the class to implement the `runChecks` method.\n *\n * @see {@link Checkable}\n */\nexport interface WithChecks {\n /**\n * Runs pre-execution checks for the handler.\n *\n * @remarks It'll be called automatically if a class is decorated with {@link Checkable} before the execute method.\n *\n * @virtual Override this method in your handler classes\n */\n runChecks(): Promise<void>;\n}\n\ninterface HandlerWithChecks extends WithChecks, Handler {}\n\nabstract class BaseHandler<ValidEvent extends ValidEventTypes> implements Handler {\n protected checkable = false;\n protected break = false;\n protected errored = false;\n protected event: ValidEvent;\n protected args: string[] = [];\n\n protected constructor(\n event: ValidEvent,\n public core: Core,\n args?: string[]\n ) {\n this.event = event;\n this.args = args ?? [];\n }\n\n /**\n * Main handler logic - implement this method to define behavior\n * @virtual Override this method in your handler classes\n */\n abstract execute(): Promise<void>;\n\n public hasChecks(): this is HandlerWithChecks {\n return this.checkable;\n }\n\n public hasErrors(): boolean {\n return this.errored;\n }\n\n public setErrored(): void {\n this.errored = true;\n }\n\n public shouldBreak(): boolean {\n return this.break;\n }\n\n public getEvent(): ValidEvent {\n return this.event;\n }\n\n /**\n * Gets arguments parsed from interaction customId\n *\n * Arguments are extracted from customId using \":\" and \"-\" separators.\n * For customId \"accept:user123-guild456\", returns [\"user123\", \"guild456\"]\n */\n protected getArgs(): string[] {\n return this.args;\n }\n\n /**\n * Gets a specific argument by index from parsed customId\n * @param index - Zero-based index of the argument to retrieve\n * @returns The argument at the specified index, or undefined if not found\n */\n protected getArg(index: number): string | undefined {\n return this.args[index];\n }\n}\n\n/**\n * Base class for Discord interaction handlers\n *\n * Extend this class to handle slash commands, buttons, modals, and select menus.\n * Use decorators like \\@SlashRoute, \\@ButtonRoute, etc. to define routing.\n *\n * @typeParam Repliable - The interaction type this handler processes\n */\nexport abstract class InteractionHandler<Repliable extends Repliables>\n extends BaseHandler<Repliable>\n implements Handler\n{\n constructor(event: Repliable, core: Core, args?: string[]) {\n super(event, core, args);\n }\n}\n\n/**\n * Base class for interaction middleware\n *\n * Middleware runs before interaction handlers and can modify behavior or block execution.\n * Unlike handlers, middleware should not send responses directly.\n *\n * @typeParam Repliable - The interaction type this middleware processes\n */\nexport abstract class InteractionMiddleware<Repliable extends Repliables>\n extends BaseHandler<Repliable>\n implements Handler\n{\n constructor(event: Repliable, core: Core, args?: string[]) {\n super(event, core, args);\n }\n}\n\n/**\n * Handler for Discord autocomplete interactions\n *\n * Extend this class to provide autocomplete suggestions for slash command options.\n * The focused option is automatically available via the `focused` property.\n */\nexport abstract class AutocompleteHandler extends BaseHandler<AutocompleteInteraction> implements Handler {\n /** The currently focused autocomplete option (Based on what you set in \\@AutocompleteRoute) */\n protected readonly focused: AutocompleteFocusedOption;\n constructor(event: AutocompleteInteraction, core: Core, args?: string[]) {\n super(event, core, args);\n this.focused = this.event.options.getFocused(true);\n }\n}\n\n/**\n * Base class for Discord client event handlers\n *\n * Extend this class to handle Discord events like messageCreate, guildMemberAdd, etc.\n * Use the \\@EventRegisterable decorator to specify which event to listen for.\n *\n * @typeParam Repliable - The Discord event type this handler processes\n */\nexport abstract class EventHandler<Repliable extends keyof ClientEvents>\n extends BaseHandler<ClientEvents[Repliable]>\n implements Handler\n{\n constructor(event: ClientEvents[Repliable], core: Core, args?: string[]) {\n super(event, core, args);\n }\n}\n\n// A generic type alias for a handler constructor\n/** Constructor type for interaction and autocomplete handlers */\nexport type HandlerConstructor = TypedConstructor<typeof InteractionHandler | typeof AutocompleteHandler>;\n\n/** Constructor type for interaction middleware */\nexport type MiddlewareConstructor = TypedConstructor<typeof InteractionMiddleware> &\n (new (event: Repliables, core: Core, args?: string[]) => InteractionMiddleware<Repliables>);\n\n/** Constructor type for autocomplete handlers */\nexport type AutocompleteHandlerConstructor = TypedConstructor<typeof AutocompleteHandler> &\n (new (event: AutocompleteInteraction, core: Core, args?: string[]) => AutocompleteHandler);\n\n/** Constructor type for Discord client event handlers */\nexport type EventHandlerConstructor = TypedConstructor<typeof EventHandler>;\n","import type { ConstructorFunction } from '@seedcord/types';\nimport type { ClientEvents } from 'discord.js';\n\nexport const EventMetadataKey = Symbol('event:metadata');\n\n/**\n * Registers an event handler class with a specific Discord.js event.\n *\n * Associates the decorated class with a Discord client event for automatic\n * registration and execution when the event is emitted.\n *\n * @param eventName - The Discord.js event name to listen for\n * @decorator\n * @example\n * ```typescript\n * \\@RegisterEvent(Events.MessageCreate)\n * class MessageHandler extends EventHandler<Events.MessageCreate> {\n * async execute() {\n * // Handle message creation\n * }\n * }\n * ```\n */\nexport function RegisterEvent<KeyofEvents extends keyof ClientEvents>(eventName: KeyofEvents) {\n return function (constructor: ConstructorFunction): void {\n Reflect.defineMetadata(EventMetadataKey, eventName, constructor);\n };\n}\n","import { Logger } from '@seedcord/services';\nimport { traverseDirectory } from '@seedcord/utils';\nimport chalk from 'chalk';\nimport { Collection, type ClientEvents } from 'discord.js';\n\nimport { EventHandler } from '../../interfaces/Handler';\nimport { EventMetadataKey } from '../decorators/EventRegisterable';\n\nimport type { Core } from '../../interfaces/Core';\nimport type { EventHandlerConstructor } from '../../interfaces/Handler';\nimport type { Initializeable } from '../../interfaces/Plugin';\n\n/**\n * Manages Discord event handler registration and execution.\n *\n * Scans event handler directories, registers handlers with Discord client events,\n * and coordinates event execution through the handler system. Does not handle interactions.\n *\n * Multiple handlers can point to one event.\n *\n * @internal\n */\nexport class EventController implements Initializeable {\n private readonly logger = new Logger('Events');\n private isInitialized = false;\n\n private readonly eventMap = new Collection<keyof ClientEvents, EventHandlerConstructor[]>();\n\n public constructor(protected core: Core) {}\n\n public async init(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n this.isInitialized = true;\n\n const handlersDir = this.core.config.bot.events.path;\n this.logger.info(chalk.bold(handlersDir));\n\n await this.loadHandlers(handlersDir);\n this.attachToClient();\n\n const loadedEventsArray: string[] = [];\n this.eventMap.forEach((handlers, eventName) => {\n loadedEventsArray.push(`${chalk.magenta.bold(handlers.length)} ${eventName}`);\n });\n this.logger.info(\n `${chalk.bold.green('Loaded')}: ${this.eventMap.size > 0 ? loadedEventsArray.join(', ') : 'none'}`\n );\n }\n\n private async loadHandlers(dir: string): Promise<void> {\n await traverseDirectory(\n dir,\n (_fullPath, relativePath, imported) => {\n for (const val of Object.values(imported)) {\n if (this.isEventHandlerClass(val)) {\n this.registerHandler(val);\n this.logger.info(\n `${chalk.italic('Registered')} ${chalk.bold.yellow(val.name)} from ${chalk.gray(relativePath)}`\n );\n }\n }\n },\n this.logger\n );\n }\n\n private isEventHandlerClass(obj: unknown): obj is EventHandlerConstructor {\n if (typeof obj !== 'function') return false;\n return obj.prototype instanceof EventHandler && Reflect.hasMetadata(EventMetadataKey, obj);\n }\n\n private registerHandler(handlerClass: EventHandlerConstructor): void {\n const eventName = Reflect.getMetadata(EventMetadataKey, handlerClass) as keyof ClientEvents | undefined;\n if (!eventName) return;\n\n let handlers = this.eventMap.get(eventName);\n if (!handlers) {\n handlers = [];\n this.eventMap.set(eventName, handlers);\n }\n handlers.push(handlerClass);\n }\n\n private attachToClient(): void {\n for (const [eventName] of this.eventMap) {\n // For each event type, call all relevant effects in sequence.\n this.logger.debug(\n `Attaching ${chalk.bold.green(eventName)} to ${chalk.bold.yellow(this.core.bot.client.user?.username)}`\n );\n this.core.bot.client.on(eventName, (...args: ClientEvents[typeof eventName]) => {\n void (async () => {\n await this.processEvent(eventName, args);\n })();\n });\n }\n }\n\n private async processEvent<KeyOfEvents extends keyof ClientEvents>(\n eventName: KeyOfEvents,\n args: ClientEvents[KeyOfEvents]\n ): Promise<void> {\n const handlerCtors = this.eventMap.get(eventName);\n if (!handlerCtors || handlerCtors.length === 0) return;\n\n for (const HandlerCtor of handlerCtors) {\n try {\n this.logger.debug(`Processing ${chalk.bold.green(eventName)} with ${chalk.gray(HandlerCtor.name)}`);\n const handler = new HandlerCtor(args, this.core);\n if (handler.hasChecks()) {\n await handler.runChecks();\n }\n\n if (handler.shouldBreak()) return;\n\n // Execute if no errors\n if (!handler.hasErrors()) {\n await handler.execute();\n }\n } catch (err) {\n this.logger.error(`Error in event ${String(eventName)} handler ${HandlerCtor.name}:`, err);\n }\n }\n }\n}\n","import type { ConstructorFunction } from '@seedcord/types';\n\nexport enum InteractionRoutes {\n Slash = 'interaction:slash',\n Button = 'interaction:button',\n Modal = 'interaction:modal',\n StringMenu = 'interaction:stringMenu',\n UserMenu = 'interaction:userMenu',\n RoleMenu = 'interaction:roleMenu',\n ChannelMenu = 'interaction:channelMenu',\n MentionableMenu = 'interaction:mentionableMenu',\n MessageContextMenu = 'interaction:messageContextMenu',\n UserContextMenu = 'interaction:userContextMenu',\n Autocomplete = 'interaction:autocomplete'\n}\n\nexport enum SelectMenuType {\n String = 'string',\n User = 'user',\n Role = 'role',\n Channel = 'channel',\n Mentionable = 'mentionable'\n}\n\nexport const InteractionMetadataKey = Symbol('interaction:metadata');\n\n/**\n * Routes slash commands to handler classes\n *\n * Supports single commands, subcommands, and subcommand groups.\n * Use forward slashes to separate subcommand paths.\n *\n * @param routeOrRoutes - Command path(s) to handle\n * @decorator\n * @example\n * ```typescript\n * \\@SlashRoute('ping')\n * class PingCommand extends InteractionHandler {\n * // handles /ping command\n * }\n *\n * \\@SlashRoute(['ban', 'kick'])\n * class ModerationHandler extends InteractionHandler {\n * // handles /ban and /kick commands\n * }\n *\n * \\@SlashRoute('admin/user/promote')\n * class PromoteHandler extends InteractionHandler {\n * // handles /admin user promote subcommand\n * }\n * ```\n */\nexport function SlashRoute(routeOrRoutes: string | string[]) {\n return function (constructor: ConstructorFunction): void {\n storeMetadata(InteractionRoutes.Slash, routeOrRoutes, constructor);\n };\n}\n\n/**\n * Routes button interactions to handler classes\n *\n * Matches the customId prefix before the first colon.\n * For customId \"accept:user123\", use \\@ButtonRoute(\"accept\").\n *\n * @param routeOrRoutes - CustomId prefix(es) to handle\n * @decorator\n */\nexport function ButtonRoute(routeOrRoutes: string | string[]) {\n return function (constructor: ConstructorFunction): void {\n storeMetadata(InteractionRoutes.Button, routeOrRoutes, constructor);\n };\n}\n\n/**\n * Routes modal submissions to handler classes\n *\n * Matches the customId prefix before the first colon.\n *\n * @param routeOrRoutes - CustomId prefix(es) to handle\n * @decorator\n */\nexport function ModalRoute(routeOrRoutes: string | string[]) {\n return function (constructor: ConstructorFunction): void {\n storeMetadata(InteractionRoutes.Modal, routeOrRoutes, constructor);\n };\n}\n\n/**\n * Routes context menu commands to handler classes\n *\n * @param type - Context menu type: 'message' for message context menus, 'user' for user context menus\n * @param routeOrRoutes - Command name(s) to handle\n * @decorator\n */\nexport function ContextMenuRoute(type: 'message' | 'user', routeOrRoutes: string | string[]) {\n return function (constructor: ConstructorFunction): void {\n const routeType = type === 'message' ? InteractionRoutes.MessageContextMenu : InteractionRoutes.UserContextMenu;\n storeMetadata(routeType, routeOrRoutes, constructor);\n };\n}\n\n/**\n * Routes autocomplete interactions to handler classes\n *\n * Handles autocomplete requests for specific command options.\n * Creates routes for each command-field combination.\n *\n * @param commandRoutes - Command path(s) to handle\n * @param focusedFields - Option name(s) to provide completions for\n * @example \\@AutocompleteRoute('user', 'name') // Single command, single field\n * @example \\@AutocompleteRoute(['user', 'profile'], ['name', 'bio']) // Multiple commands, multiple fields\n * @decorator\n */\nexport function AutocompleteRoute(commandRoutes: string | string[], focusedFields: string | string[]) {\n return function (constructor: ConstructorFunction): void {\n const routes = Array.isArray(commandRoutes) ? commandRoutes : [commandRoutes];\n const fields = Array.isArray(focusedFields) ? focusedFields : [focusedFields];\n\n // Create unique keys for each route-focused combination\n routes.forEach((route) => {\n fields.forEach((field) => {\n const autocompleteKey = `${route}:${field}`;\n storeMetadata(InteractionRoutes.Autocomplete, autocompleteKey, constructor);\n });\n });\n };\n}\n\n/**\n * Routes select menu interactions to handler classes\n *\n * Matches the customId prefix before the first colon.\n *\n * @param type - Select menu type from {@link SelectMenuType}\n * @param routeOrRoutes - CustomId prefix(es) to handle\n * @decorator\n */\nexport function SelectMenuRoute(type: SelectMenuType, routeOrRoutes: string | string[]) {\n return function (constructor: ConstructorFunction): void {\n const routeMap = {\n [SelectMenuType.String]: InteractionRoutes.StringMenu,\n [SelectMenuType.User]: InteractionRoutes.UserMenu,\n [SelectMenuType.Role]: InteractionRoutes.RoleMenu,\n [SelectMenuType.Channel]: InteractionRoutes.ChannelMenu,\n [SelectMenuType.Mentionable]: InteractionRoutes.MentionableMenu\n };\n\n storeMetadata(routeMap[type], routeOrRoutes, constructor);\n };\n}\n\n/**\n * Helper to store route(s) in an array on reflect metadata.\n */\nfunction storeMetadata(symbol: InteractionRoutes, routes: string | string[], constructor: ConstructorFunction): void {\n const areRoutes = (routes: unknown): routes is string[] => {\n return Array.isArray(routes) && routes.every((r) => typeof r === 'string');\n };\n\n const savedRoutes: unknown = Reflect.getMetadata(symbol, constructor);\n const existing: string[] = areRoutes(savedRoutes) ? savedRoutes : [];\n\n const toStore = Array.isArray(routes) ? routes : [routes];\n Reflect.defineMetadata(symbol, [...existing, ...toStore], constructor);\n Reflect.defineMetadata(InteractionMetadataKey, true, constructor);\n}\n","import { CustomError } from '../../interfaces/Components';\n\nimport type { UUID } from 'crypto';\n\n/**\n * Generic database operation error with UUID tracking.\n *\n * Thrown for various database operation failures and includes\n * a UUID for error tracking and debugging purposes.\n */\nexport class DatabaseError extends CustomError {\n /**\n * Creates a new DatabaseError.\n *\n * @param message - The error message describing what went wrong\n * @param uuid - A unique identifier for this specific error instance\n */\n constructor(\n message: string,\n public uuid: UUID\n ) {\n super(message);\n this.emit = true; // Emit in logs regardless of environment\n this.name = 'DatabaseError';\n\n this.response\n .setTitle('Database Error')\n .setDescription(`An error occurred while interacting with the database.\\n### UUID: \\`${this.uuid}\\``);\n }\n}\n","import * as crypto from 'node:crypto';\n\nimport { Logger } from '@seedcord/services';\n\nimport { CustomError } from '../../interfaces/Components';\nimport { DatabaseError } from '../errors/Database';\n\nimport type { Core } from '../../interfaces/Core';\nimport type { Nullable } from '@seedcord/types';\nimport type { EmbedBuilder, Guild, User } from 'discord.js';\nimport type { UUID } from 'node:crypto';\n\n/**\n * Utility class for standardized error handling and response generation.\n */\nexport class ErrorHandlingUtils {\n private static readonly logger = new Logger('Errors');\n\n /**\n * Processes an error and extracts the standardized response, if available.\n *\n * Handles different error types (CustomError, DatabaseError) with appropriate\n * logging, side effects, and user-facing error messages.\n *\n * @param error - The error to process\n * @param core - The core framework instance\n * @param guild - The guild where the error occurred (if any)\n * @param user - The user who triggered the error (if any)\n * @returns Object containing UUID and formatted error response embed\n */\n public static extractErrorResponse(\n error: Error,\n core: Core,\n guild: Nullable<Guild>,\n user: Nullable<User>\n ): { uuid: UUID; response: EmbedBuilder } {\n const uuid = crypto.randomUUID();\n\n if (error instanceof CustomError) {\n if (error instanceof DatabaseError) {\n core.effects.emit('unknownException', { uuid, error, guild, user });\n\n this.logger.error(`DatabaseError: ${error.uuid}`);\n } else if (error.emit) {\n this.logger.error(`${error.name}: ${error.message}`, error);\n }\n\n return {\n uuid,\n response: error.response\n };\n }\n\n const showStack = core.config.bot.errorStack;\n if (showStack) this.logger.error(uuid, error);\n else this.logger.error(`${uuid} | ${error.message}`);\n\n core.effects.emit('unknownException', { uuid, error, guild, user });\n\n return {\n uuid,\n response: new GenericError(uuid).response\n };\n }\n}\n\n// Generic error for non-CustomError instances\nclass GenericError extends CustomError {\n constructor(private readonly uuid: UUID) {\n super('An unknown error occurred');\n\n this.response\n .setTitle('Error')\n .setDescription(\n `An unknown error occurred. Please reach out to the developer with a way to reproduce the error and the following:\\n` +\n `### UUID: \\`${this.uuid}\\``\n );\n }\n}\n","import { MessageFlags } from 'discord.js';\n\nimport { ErrorHandlingUtils } from '../utilities/ErrorHandlingUtils';\n\nimport type { RepliableInteractionHandler } from '../../interfaces/Handler';\n\n/**\n * Configuration options for the Catchable decorator.\n */\ninterface CatchableOptions {\n /** Whether to log errors to console (default: false) */\n log?: boolean;\n /** Always use followUp instead of reply/editReply (default: false) */\n forceFollowup?: boolean;\n}\n\n/**\n * Catches and handles errors in interaction handler methods\n *\n * Automatically sends error responses to users and prevents uncaught exceptions.\n * Should be applied to the execute() or runChecks() methods of interaction handlers.\n *\n * @param options - Configuration for error handling behavior\n * @decorator\n * @example\n * ```typescript\n * class MyHandler extends InteractionHandler {\n * \\@Catchable({ log: true })\n * async execute() {\n * // method implementation\n * }\n * }\n * ```\n */\nexport function Catchable(options?: CatchableOptions) {\n return function (\n _target: RepliableInteractionHandler,\n _propertyKey: string,\n descriptor: TypedPropertyDescriptor<(...args: any[]) => Promise<void>>\n ): void {\n const log = options?.log ?? false;\n const forceFollowup = options?.forceFollowup ?? false;\n\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: RepliableInteractionHandler, ...args: any[]): Promise<void> {\n const interaction = this.getEvent();\n\n if (!originalMethod) throw new Error('Method not found');\n\n try {\n await originalMethod.apply(this, args);\n } catch (error) {\n if (!(error instanceof Error)) throw error;\n\n this.setErrored();\n\n // eslint-disable-next-line no-console\n if (log) console.error(error);\n\n const { response } = ErrorHandlingUtils.extractErrorResponse(\n error,\n this.core,\n interaction.guild,\n interaction.user\n );\n\n const res = {\n embeds: [response],\n components: []\n };\n\n if (forceFollowup) {\n await interaction.followUp({ flags: MessageFlags.Ephemeral, ...res });\n return;\n }\n\n if (interaction.replied) {\n await interaction.followUp({ flags: MessageFlags.Ephemeral, ...res });\n } else if (interaction.deferred) {\n await interaction.editReply(res);\n } else {\n await interaction.reply({ flags: MessageFlags.Ephemeral, ...res });\n }\n }\n };\n };\n}\n","import { MessageFlags } from 'discord.js';\n\nimport { InteractionHandler, Repliables } from '../../interfaces/Handler';\nimport { Catchable } from '../decorators/Catchable';\n\nexport class UnhandledEvent extends InteractionHandler<Repliables> {\n @Catchable()\n async execute(): Promise<void> {\n await this.event.reply({\n content: `Feature not implemented yet.`,\n flags: MessageFlags.Ephemeral\n });\n }\n}\n","import { Logger } from '@seedcord/services';\nimport { traverseDirectory } from '@seedcord/utils';\nimport chalk from 'chalk';\nimport { Collection, Events } from 'discord.js';\n\nimport { AutocompleteHandler, InteractionHandler } from '../../interfaces/Handler';\nimport { InteractionMetadataKey, InteractionRoutes } from '../decorators/InteractionConfigurable';\nimport { UnhandledEvent } from '../defaults/UnhandledEvent';\n\nimport type { Core } from '../../interfaces/Core';\nimport type { HandlerConstructor, MiddlewareConstructor, Repliables } from '../../interfaces/Handler';\nimport type { Initializeable } from '../../interfaces/Plugin';\nimport type {\n AutocompleteInteraction,\n ButtonInteraction,\n ChannelSelectMenuInteraction,\n ChatInputCommandInteraction,\n Interaction,\n MentionableSelectMenuInteraction,\n MessageContextMenuCommandInteraction,\n ModalSubmitInteraction,\n RoleSelectMenuInteraction,\n StringSelectMenuInteraction,\n UserContextMenuCommandInteraction,\n UserSelectMenuInteraction\n} from 'discord.js';\n\n/**\n * Manages Discord interaction handling and routing.\n *\n * Scans handler directories, registers handlers with Discord client events,\n * and coordinates event execution through the handler system. Only handles interactions.\n *\n * Enforces that there is only one handler per interaction.\n *\n * @internal\n */\nexport class InteractionController implements Initializeable {\n private readonly logger = new Logger('Interactions');\n private isInitialized = false;\n\n private readonly slashMap = new Collection<string, HandlerConstructor>();\n private readonly buttonMap = new Collection<string, HandlerConstructor>();\n private readonly modalMap = new Collection<string, HandlerConstructor>();\n private readonly stringSelectMap = new Collection<string, HandlerConstructor>();\n private readonly userSelectMap = new Collection<string, HandlerConstructor>();\n private readonly roleSelectMap = new Collection<string, HandlerConstructor>();\n private readonly channelSelectMap = new Collection<string, HandlerConstructor>();\n private readonly mentionableSelectMap = new Collection<string, HandlerConstructor>();\n private readonly messageContextMenuMap = new Collection<string, HandlerConstructor>();\n private readonly userContextMenuMap = new Collection<string, HandlerConstructor>();\n private readonly autocompleteMap = new Collection<string, HandlerConstructor>();\n\n private readonly keysToIgnore = new Set<string>();\n\n private readonly middlewares: MiddlewareConstructor[] = [];\n\n constructor(protected core: Core) {\n // Add ignored keys from config\n const ignoredKeysFromConfig = this.core.config.bot.interactions.ignoreCustomIds;\n if (ignoredKeysFromConfig) {\n for (const ignoredKey of ignoredKeysFromConfig) this.keysToIgnore.add(ignoredKey);\n }\n }\n\n public async init(): Promise<void> {\n if (this.isInitialized) return;\n\n this.isInitialized = true;\n\n const handlersDir = this.core.config.bot.interactions.path;\n this.logger.info(chalk.bold(handlersDir));\n\n await this.loadHandlers(handlersDir);\n this.attachToClient();\n\n this.logger.info(`${chalk.bold.green('Loaded interaction handlers:')}`);\n this.logger.info(`→ ${chalk.magenta.bold(this.slashMap.size)} slash commands`);\n this.logger.info(`→ ${chalk.magenta.bold(this.buttonMap.size)} buttons`);\n this.logger.info(`→ ${chalk.magenta.bold(this.modalMap.size)} modals`);\n this.logger.info(`→ ${chalk.magenta.bold(this.stringSelectMap.size)} string selects`);\n this.logger.info(`→ ${chalk.magenta.bold(this.userSelectMap.size)} user selects`);\n this.logger.info(`→ ${chalk.magenta.bold(this.roleSelectMap.size)} role selects`);\n this.logger.info(`→ ${chalk.magenta.bold(this.channelSelectMap.size)} channel selects`);\n this.logger.info(`→ ${chalk.magenta.bold(this.mentionableSelectMap.size)} mentionable selects`);\n this.logger.info(`→ ${chalk.magenta.bold(this.messageContextMenuMap.size)} message context menus`);\n this.logger.info(`→ ${chalk.magenta.bold(this.userContextMenuMap.size)} user context menus`);\n this.logger.info(`→ ${chalk.magenta.bold(this.autocompleteMap.size)} autocomplete`);\n }\n\n private async loadHandlers(dir: string): Promise<void> {\n await traverseDirectory(\n dir,\n (_fullPath, relativePath, imported) => {\n for (const val of Object.values(imported)) {\n if (this.isHandlerClass(val)) {\n this.registerHandler(val);\n this.logger.info(\n `${chalk.italic('Registered')} ${chalk.bold.yellow(val.name)} from ${chalk.gray(relativePath)}`\n );\n }\n }\n },\n this.logger\n );\n }\n\n private isHandlerClass(obj: unknown): obj is HandlerConstructor {\n if (typeof obj !== 'function') return false;\n return (\n (obj.prototype instanceof InteractionHandler && Reflect.hasMetadata(InteractionMetadataKey, obj)) ||\n (obj.prototype instanceof AutocompleteHandler && Reflect.hasMetadata(InteractionMetadataKey, obj))\n );\n }\n\n private registerHandler(handlerClass: HandlerConstructor): void {\n const areRoutes = (routes: unknown): routes is string[] => {\n return Array.isArray(routes) && routes.every((r) => typeof r === 'string');\n };\n\n const routeTypes: [InteractionRoutes, Collection<string, HandlerConstructor>][] = [\n [InteractionRoutes.Slash, this.slashMap],\n [InteractionRoutes.Button, this.buttonMap],\n [InteractionRoutes.Modal, this.modalMap],\n [InteractionRoutes.StringMenu, this.stringSelectMap],\n [InteractionRoutes.UserMenu, this.userSelectMap],\n [InteractionRoutes.RoleMenu, this.roleSelectMap],\n [InteractionRoutes.ChannelMenu, this.channelSelectMap],\n [InteractionRoutes.MentionableMenu, this.mentionableSelectMap],\n [InteractionRoutes.MessageContextMenu, this.messageContextMenuMap],\n [InteractionRoutes.UserContextMenu, this.userContextMenuMap],\n [InteractionRoutes.Autocomplete, this.autocompleteMap]\n ];\n for (const [routeType, map] of routeTypes) {\n const meta: unknown = Reflect.getMetadata(routeType, handlerClass);\n if (!areRoutes(meta)) continue;\n\n const routes = meta;\n routes.forEach((route) => map.set(route, handlerClass));\n }\n }\n\n private attachToClient(): void {\n this.core.bot.client.on(Events.InteractionCreate, (interaction) => {\n this.handleInteraction(interaction).catch((err: Error) => {\n this.logger.error(`[${chalk.bold.red('UNHANDLED ERROR AT ROOT')}] ${err.name}`, err.stack);\n });\n });\n }\n\n private parseCustomId(customId: string): { prefix: string; args: string[] } {\n const parts = customId.split(':');\n const prefix = parts[0] ?? '';\n const argString = parts[1] ?? '';\n const args = argString ? argString.split('-') : [];\n\n return { prefix, args };\n }\n\n private async handleCustomIdInteraction<TInteraction extends Interaction & { customId: string }>(\n interaction: TInteraction,\n getMap: () => Collection<string, HandlerConstructor>,\n interactionType: string\n ): Promise<void> {\n const { prefix, args } = this.parseCustomId(interaction.customId);\n if (!prefix) return this.logger.warn(`${interactionType} has invalid customId: ${interaction.customId}`);\n\n await this.processInteraction(\n interaction,\n () => prefix,\n (key) => getMap().get(key),\n args\n );\n }\n\n public async processInteraction<TInteraction extends Interaction>(\n interaction: TInteraction,\n extractKey: (i: TInteraction) => string,\n getHandler: (key: string) => HandlerConstructor | undefined,\n args?: string[]\n ): Promise<void> {\n const key = extractKey(interaction);\n if (this.keysToIgnore.has(key)) return;\n\n // Run middlewares first\n for (const MiddlewareCtor of this.middlewares) {\n const middleware = new MiddlewareCtor(interaction as Repliables, this.core, args);\n await middleware.execute();\n if (middleware.hasErrors()) return;\n }\n let HandlerCtor = getHandler(key);\n if (!HandlerCtor) {\n // Automatically fallback to UnhandledEvent\n this.logger.warn(`No handler found for key ${chalk.bold.cyan(key)}. Falling back to UnhandledEvent.`);\n HandlerCtor = UnhandledEvent;\n }\n\n this.logger.debug(`Processing ${chalk.bold.green(key)} with ${chalk.gray(HandlerCtor.name)}`);\n // @ts-expect-error TS can't infer the type of interaction here\n const handler = new HandlerCtor(interaction as Repliables, this.core, args);\n if (handler.hasChecks()) await handler.runChecks();\n if (handler.shouldBreak()) return;\n if (!handler.hasErrors()) await handler.execute();\n }\n\n private async handleInteraction(interaction: Interaction): Promise<void> {\n switch (true) {\n case interaction.isChatInputCommand():\n await this.handleSlashCommand(interaction);\n break;\n case interaction.isButton():\n await this.handleButton(interaction);\n break;\n case interaction.isModalSubmit():\n await this.handleModal(interaction);\n break;\n case interaction.isStringSelectMenu():\n await this.handleStringSelectMenu(interaction);\n break;\n case interaction.isUserSelectMenu():\n await this.handleUserSelectMenu(interaction);\n break;\n case interaction.isRoleSelectMenu():\n await this.handleRoleSelectMenu(interaction);\n break;\n case interaction.isChannelSelectMenu():\n await this.handleChannelSelectMenu(interaction);\n break;\n case interaction.isMentionableSelectMenu():\n await this.handleMentionableSelectMenu(interaction);\n break;\n case interaction.isMessageContextMenuCommand():\n await this.handleMessageContextMenu(interaction);\n break;\n case interaction.isUserContextMenuCommand():\n await this.handleUserContextMenu(interaction);\n break;\n case interaction.isAutocomplete():\n await this.handleAutocomplete(interaction);\n break;\n default:\n this.logger.warn(`Unhandled interaction type: ${interaction.type}`);\n break;\n }\n }\n\n private async handleSlashCommand(interaction: ChatInputCommandInteraction): Promise<void> {\n const route = this.buildSlashRoute(interaction);\n await this.processInteraction(\n interaction,\n () => route,\n (key) => this.slashMap.get(key)\n );\n }\n\n private async handleButton(interaction: ButtonInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.buttonMap, 'Button');\n }\n\n private async handleModal(interaction: ModalSubmitInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.modalMap, 'Modal');\n }\n\n private async handleStringSelectMenu(interaction: StringSelectMenuInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.stringSelectMap, 'String select menu');\n }\n\n private async handleUserSelectMenu(interaction: UserSelectMenuInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.userSelectMap, 'User select menu');\n }\n\n private async handleRoleSelectMenu(interaction: RoleSelectMenuInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.roleSelectMap, 'Role select menu');\n }\n\n private async handleChannelSelectMenu(interaction: ChannelSelectMenuInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.channelSelectMap, 'Channel select menu');\n }\n\n private async handleMentionableSelectMenu(interaction: MentionableSelectMenuInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.mentionableSelectMap, 'Mentionable select menu');\n }\n\n private async handleMessageContextMenu(interaction: MessageContextMenuCommandInteraction): Promise<void> {\n await this.processInteraction(\n interaction,\n () => interaction.commandName,\n (key) => this.messageContextMenuMap.get(key)\n );\n }\n\n private async handleUserContextMenu(interaction: UserContextMenuCommandInteraction): Promise<void> {\n await this.processInteraction(\n interaction,\n () => interaction.commandName,\n (key) => this.userContextMenuMap.get(key)\n );\n }\n\n private async handleAutocomplete(interaction: AutocompleteInteraction): Promise<void> {\n const route = this.buildSlashRoute(interaction);\n const focused = interaction.options.getFocused(true);\n const autocompleteKey = `${route}:${focused.name}`;\n\n await this.processInteraction(\n interaction,\n () => autocompleteKey,\n (key) => this.autocompleteMap.get(key)\n );\n }\n\n // Build the route from commandName, subcommandGroup, subcommand\n private buildSlashRoute(interaction: ChatInputCommandInteraction | AutocompleteInteraction): string {\n const command = interaction.commandName;\n const group = interaction.options.getSubcommandGroup(false);\n const sub = interaction.options.getSubcommand(false);\n\n let route = command;\n if (group && sub) {\n route = `${route}/${group}/${sub}`;\n } else if (group) {\n route = `${route}/${group}`;\n } else if (sub) {\n route = `${route}/${sub}`;\n }\n return route;\n }\n}\n","import { Logger } from '@seedcord/services';\nimport chalk from 'chalk';\n\nimport type { Core } from '../../interfaces/Core';\n\nexport class EmojiInjector {\n private readonly logger = new Logger('Emojis');\n\n constructor(private readonly core: Core) {}\n\n public async init(): Promise<void> {\n // Check if we have emoji config\n if (!this.core.config.bot.emojis || Object.keys(this.core.config.bot.emojis).length === 0) {\n this.logger.info(`${chalk.bold.green('Loaded')}: ${chalk.magenta.bold('0')} emojis`);\n return;\n }\n\n const configEmojis = this.core.config.bot.emojis;\n await this.core.bot.client.application?.emojis.fetch();\n\n let foundCount = 0;\n\n Object.entries(configEmojis).forEach(([key, emojiName]) => {\n const emoji = this.core.bot.client.application?.emojis.cache.find((e) => e.name === emojiName);\n\n if (emoji) {\n configEmojis[key] = `<${emoji.identifier}>`;\n\n foundCount++;\n\n this.logger.debug(`${chalk.bold.green('Found')}: ${chalk.magenta.bold(emojiName)} (${emoji.id})`);\n }\n });\n\n this.logger.info(`${chalk.bold.green('Loaded')}: ${chalk.magenta.bold(foundCount)} emojis`);\n }\n}\n","import { Logger, ShutdownPhase } from '@seedcord/services';\nimport chalk from 'chalk';\nimport { Client } from 'discord.js';\nimport { Envapt } from 'envapt';\n\nimport { Plugin } from '../interfaces/Plugin';\nimport { CommandRegistry } from './controllers/CommandRegistry';\nimport { EventController } from './controllers/EventController';\nimport { InteractionController } from './controllers/InteractionController';\nimport { EmojiInjector } from './injectors/EmojiInjector';\n\nimport type { Core } from '../interfaces/Core';\n\n/**\n * Discord bot implementation that manages client and controllers\n * @internal - Accessed via core.bot, not directly instantiated by users\n */\nexport class Bot extends Plugin {\n @Envapt<string>('DISCORD_BOT_TOKEN', {\n converter(raw, _fallback) {\n if (typeof raw !== 'string') throw new Error('Missing DISCORD_BOT_TOKEN');\n return raw;\n }\n })\n declare public readonly botToken: string;\n\n public readonly logger = new Logger('Bot');\n private isInitialized = false;\n\n private readonly _client: Client;\n private readonly interactions: InteractionController;\n private readonly events: EventController;\n public readonly commands: CommandRegistry;\n private readonly emojiInjector: EmojiInjector;\n\n /**\n * @param core - Seedcord core instance\n * @internal\n */\n constructor(protected core: Core) {\n super(core);\n\n this._client = new Client(core.config.bot.clientOptions);\n\n this.interactions = new InteractionController(core);\n this.events = new EventController(core);\n\n this.commands = new CommandRegistry(this.core);\n this.emojiInjector = new EmojiInjector(this.core);\n\n this.core.shutdown.addTask(ShutdownPhase.DiscordCleanup, 'stop-bot', async () => await this.stop());\n }\n\n /**\n * Initializes Discord client and all controllers\n * @internal\n */\n public async init(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n this.isInitialized = true;\n\n await this.login();\n\n await this.interactions.init();\n await this.events.init();\n\n await this.commands.init();\n await this.commands.setCommands();\n\n await this.emojiInjector.init();\n }\n\n /**\n * Stops the bot and cleans up connections\n * @internal\n */\n public async stop(): Promise<void> {\n this._client.removeAllListeners();\n\n await this.logout();\n }\n\n /**\n * Logs the bot into Discord using the configured token\n */\n private async login(): Promise<Bot> {\n await this._client.login(this.botToken);\n this.logger.info(`Logged in as ${chalk.bold.magenta(this._client.user?.username)}!`);\n return this;\n }\n\n /**\n * Logs out and destroys the Discord client connection\n */\n private async logout(): Promise<void> {\n await this._client.destroy();\n this.logger.info(chalk.bold.red('Logged out of Discord!'));\n }\n\n public get client(): Client {\n return this._client;\n }\n}\n","import type { EffectKeys } from '../types/Effects';\nimport type { ConstructorFunction } from '@seedcord/types';\n\nexport const EffectMetadataKey = Symbol('effect:metadata');\n\n/**\n * Registers a side effect handler class with a specific side effect event.\n *\n * Associates the decorated class with a side effect event type for automatic\n * registration and execution when the side effect is emitted.\n *\n * @param effect - The side effect event name to register for\n * @decorator\n * @example\n * ```typescript\n * \\@RegisterEffect('userJoin')\n * class WelcomeHandler extends EffectHandler<'userJoin'> {\n * async execute() {\n * // Handle user join event\n * }\n * }\n * ```\n */\nexport function RegisterEffect<TEffect extends EffectKeys>(effect: TEffect) {\n return function (constructor: ConstructorFunction): void {\n Reflect.defineMetadata(EffectMetadataKey, effect, constructor);\n };\n}\n","import type { Core } from '../../interfaces/Core';\nimport type { AllEffects, EffectKeys } from '../types/Effects';\n\n/**\n * Abstract base class for handling application side effects.\n *\n * Provides type-safe access to effects data and the core framework instance.\n * Extend this class to create custom side effect handlers.\n *\n * @typeParam KeyOfEffects - The specific side effect type this handler processes\n */\nexport abstract class EffectsHandler<KeyOfEffects extends EffectKeys> {\n /**\n * Creates a new effects handler instance.\n *\n * @param data - The effect event data\n * @param core - The core framework instance\n */\n constructor(\n protected readonly data: AllEffects[KeyOfEffects],\n protected readonly core: Core\n ) {\n this.data = data;\n this.core = core;\n }\n\n /**\n * Executes the effect handler logic.\n * @virtual Override this method in your handler classes\n */\n abstract execute(): Promise<void>;\n}\n","import { EffectsHandler } from '../EffectsHandler';\n\nimport type { Core } from '../../../interfaces/Core';\nimport type { AllEffects, EffectKeys } from '../../types/Effects';\nimport type { WebhookClient } from 'discord.js';\n\n/**\n * Abstract webhook logging handler for side effect events.\n *\n * Extends EffectsHandler to provide webhook-based logging capabilities.\n * Implementations must define the webhook client to send messages to.\n *\n * @typeParam KeyOfEffects - The specific side effect type this handler processes\n */\nexport abstract class WebhookLog<KeyOfEffects extends EffectKeys> extends EffectsHandler<KeyOfEffects> {\n /** The Discord webhook client for sending log messages */\n abstract webhook: WebhookClient;\n\n constructor(data: AllEffects[KeyOfEffects], core: Core) {\n super(data, core);\n }\n}\n","import { DiscordAPIError, SnowflakeUtil, WebhookClient } from 'discord.js';\nimport { Envapt } from 'envapt';\n\nimport { BuilderComponent } from '../../interfaces/Components';\nimport { RegisterEffect } from '../decorators/RegisterEffect';\nimport { WebhookLog } from '../interfaces/abstracts/WebhookLog';\nimport { AllEffects } from '../types/Effects';\n\n@RegisterEffect('unknownException')\nexport class UnknownException extends WebhookLog<'unknownException'> {\n @Envapt('UNKNOWN_EXCEPTION_WEBHOOK_URL', {\n converter(raw, _fallback) {\n if (!raw) throw new Error('Missing UNKNOWN_EXCEPTION_WEBHOOK_URL');\n if (!URL.canParse(String(raw))) throw new Error('Invalid UNKNOWN_EXCEPTION_WEBHOOK_URL');\n\n return raw;\n }\n })\n declare static readonly unknownExceptionWebhookUrl: string;\n\n webhook = new WebhookClient({\n url: UnknownException.unknownExceptionWebhookUrl\n });\n\n async execute(): Promise<void> {\n await this.webhook.send({\n username: 'Unknown Exception',\n avatarURL: 'https://cdn.discordapp.com/attachments/1351446034827579466/1351446912947191830/warning-2.png',\n embeds: [new UnhandledErrorEmbed(this.data).component]\n });\n }\n}\n\nclass UnhandledErrorEmbed extends BuilderComponent<'embed'> {\n constructor(data: AllEffects['unknownException']) {\n super('embed');\n\n const { uuid, error, guild, user } = data;\n\n this.instance\n .setTitle(`An unknown exception was thrown`)\n .setColor('#ef4860')\n .setDescription(\n `**Guild ID:** \\`${guild?.id ?? 'Not used in a guild'}\\`\\n` +\n `**Guild Name:** ${guild?.name ?? 'Not used in a guild'}\\n` +\n `**User ID:** \\`${user?.id ?? 'Missing user info'}\\`\\n` +\n `**Username:** ${user?.username ?? 'Missing user info'}\\n` +\n `### UUID: \\`${uuid}\\`\\n` +\n `\\`\\`\\`${error.stack}\\`\\`\\``\n );\n\n this.setTimestampsIfAvailable(error);\n }\n\n private setTimestampsIfAvailable(error: Error): void {\n if (!(error instanceof DiscordAPIError)) return;\n\n const now = Date.now();\n\n // Extract the snowflake ID from `/interactions/{ID}/`\n const snowflake = error.url.match(/\\/interactions\\/(\\d+)\\//)?.[1];\n if (!snowflake) return undefined;\n\n // Discord epoch offset (ms) and timestamp extraction\n const interactionTs = Number(SnowflakeUtil.deconstruct(snowflake).timestamp);\n\n // Time difference\n const diff = now - interactionTs;\n const seconds = Math.floor(diff / 1000);\n const millis = diff % 1000;\n\n this.instance.addFields([\n {\n name: 'Timestamps',\n value:\n `- **\\`Interaction sent\\` :** ${new Date(interactionTs).toISOString()} (${interactionTs})\\n` +\n `- **\\`Error logged \\` :** ${new Date(now).toISOString()} (${now})\\n` +\n `- **\\`Offset \\` :** ${seconds}s ${millis}ms`,\n inline: true\n }\n ]);\n }\n}\n","import { EventEmitter } from 'events';\n\nimport type { AllEffects, EffectKeys } from './types/Effects';\n\n/**\n * Type-safe event emitter for application effects.\n *\n * Provides a strongly-typed wrapper around Node.js EventEmitter\n * for Seedcord's effect system.\n *\n * @typeParam AllEffects - Side effect definitions mapping event names to data types\n */\nexport class EffectsEmitter {\n private readonly emitter = new EventEmitter();\n\n /**\n * Registers a listener for the specified side effect.\n *\n * @typeParam KeyOfEffects - The side effect name type\n * @param event - The side effect name to listen for\n * @param listener - Function to call when the event is emitted\n * @returns This EffectsEmitter instance for chaining\n */\n public on<KeyOfEffects extends EffectKeys>(\n event: KeyOfEffects,\n listener: (data: AllEffects[KeyOfEffects]) => void\n ): this {\n this.emitter.on(event, listener);\n return this;\n }\n\n /**\n * Registers a one-time listener for the specified side effect.\n *\n * @typeParam KeyOfEffects - The side effect name type\n * @param event - The side effect name to listen for once\n * @param listener - Function to call when the event is emitted\n * @returns This EffectsEmitter instance for chaining\n */\n public once<KeyOfEffects extends EffectKeys>(\n event: KeyOfEffects,\n listener: (data: AllEffects[KeyOfEffects]) => void\n ): this {\n this.emitter.once(event, listener);\n return this;\n }\n\n /**\n * Emits a side effect with the provided data.\n *\n * @typeParam KeyOfEffects - The side effect name type\n * @param event - The side effect name to emit\n * @param data - The data to pass to registered listeners\n * @returns True if the event had listeners, false otherwise\n */\n public emit<KeyOfEffects extends EffectKeys>(event: KeyOfEffects, data: AllEffects[KeyOfEffects]): boolean {\n return this.emitter.emit(event, data);\n }\n}\n","import { Logger } from '@seedcord/services';\nimport { traverseDirectory } from '@seedcord/utils';\nimport chalk from 'chalk';\nimport { Collection } from 'discord.js';\n\nimport { Plugin } from '../interfaces/Plugin';\nimport { EffectMetadataKey } from './decorators/RegisterEffect';\nimport { UnknownException } from './default/UnknownException';\nimport { EffectsEmitter } from './EffectsEmitter';\nimport { EffectsHandler } from './interfaces/EffectsHandler';\n\nimport type { Core } from '../interfaces/Core';\nimport type { AllEffects, EffectKeys } from './types/Effects';\nimport type { TypedConstructor } from '@seedcord/types';\n\ntype EffectConstructor = TypedConstructor<typeof EffectsHandler>;\n\n/**\n * Manages application effects and event handling\n *\n * Provides a centralized system for registering and executing custom effects\n * throughout the application lifecycle. Effects are loaded from configured directories\n * and can be triggered programmatically or by framework events.\n *\n * @internal Accessed via core.effects, not directly instantiated\n */\nexport class EffectsRegistry extends Plugin {\n public readonly logger = new Logger('Effects');\n private isInitialized = false;\n private readonly effectsMap = new Collection<EffectKeys, EffectConstructor[]>();\n private readonly emitter = new EffectsEmitter();\n\n constructor(protected core: Core) {\n super(core);\n }\n\n public async init(): Promise<void> {\n if (this.isInitialized) return;\n\n this.isInitialized = true;\n\n const effectsDir = this.core.config.effects.path;\n this.logger.info(chalk.bold(effectsDir));\n\n this.registerEffect('unknownException', UnknownException);\n\n await this.loadEffects(effectsDir);\n\n this.attachEffects();\n\n const totalEffects = Array.from(this.effectsMap.values()).reduce((acc, handlers) => acc + handlers.length, 0);\n this.logger.info(`${chalk.bold.green('Loaded')}: ${chalk.bold.magenta(totalEffects)} side effects`);\n }\n\n private async loadEffects(dir: string): Promise<void> {\n await traverseDirectory(\n dir,\n (_fullPath, relativePath, imported) => {\n for (const exportName of Object.keys(imported)) {\n const val = imported[exportName];\n if (this.isEffectHandler(val)) {\n const effectName = Reflect.getMetadata(EffectMetadataKey, val) as EffectKeys | undefined;\n if (effectName) {\n this.registerEffect(effectName, val);\n this.logger.info(\n `${chalk.italic('Registered')} ${chalk.bold.yellow(val.name)} from ${chalk.gray(relativePath)}`\n );\n }\n }\n }\n },\n this.logger\n );\n }\n\n private registerEffect(effectName: EffectKeys, handler: EffectConstructor): void {\n let handlers = this.effectsMap.get(effectName);\n if (!handlers) {\n handlers = [];\n this.effectsMap.set(effectName, handlers);\n }\n handlers.push(handler);\n }\n\n private isEffectHandler(obj: unknown): obj is EffectConstructor {\n if (typeof obj !== 'function') return false;\n return obj.prototype instanceof EffectsHandler;\n }\n\n private attachEffects(): void {\n for (const [effectName, handlerCtors] of this.effectsMap) {\n this.emitter.on(effectName, (data) => {\n for (const HandlerCtor of handlerCtors) {\n try {\n const instance = new HandlerCtor(data, this.core);\n void instance.execute();\n } catch (err) {\n this.logger.error(`Error in side effect ${String(effectName)} handler ${HandlerCtor.name}:`, err);\n }\n }\n });\n }\n }\n\n public emit<KeyOfEffects extends EffectKeys>(event: KeyOfEffects, data: AllEffects[KeyOfEffects]): boolean {\n return this.emitter.emit(event, data);\n }\n}\n","import { HealthCheck, CoordinatedShutdown, CoordinatedStartup, StartupPhase } from '@seedcord/services';\nimport chalk from 'chalk';\n\nimport { Bot } from './bot/Bot';\nimport { EffectsRegistry } from './effects/EffectsRegistry';\nimport { Pluggable } from './interfaces/Plugin';\n\nimport type { Config } from './interfaces/Config';\nimport type { Core } from './interfaces/Core';\n\n/**\n * Main Seedcord bot framework class\n *\n * Primary entry point for creating Discord bots with Seedcord.\n * Manages component lifecycle and provides plugin support.\n */\nexport class Seedcord extends Pluggable implements Core {\n private static isInstantiated = false;\n /** @see {@link CoordinatedShutdown} */\n public override readonly shutdown: CoordinatedShutdown;\n\n /** @see {@link CoordinatedStartup} */\n public override readonly startup: CoordinatedStartup;\n\n /** @see {@link EffectsRegistry} */\n public readonly effects: EffectsRegistry;\n\n /** @see {@link Bot} */\n public readonly bot: Bot;\n\n /** @see {@link HealthCheck} */\n private readonly healthCheck: HealthCheck;\n\n /**\n * Creates a new Seedcord instance\n *\n * @param config - Bot configuration including paths and Discord client options\n * @throws An {@link Error} When attempting to create multiple instances (singleton)\n */\n constructor(public readonly config: Config) {\n // Create lifecycle instances\n const shutdown = new CoordinatedShutdown();\n const startup = new CoordinatedStartup();\n\n // Pass them to parent constructor\n super(shutdown, startup);\n\n // Store references for public access\n this.shutdown = shutdown;\n this.startup = startup;\n\n if (Seedcord.isInstantiated) {\n throw new Error('Seedcord can only be instantiated once. Use the existing instance instead.');\n }\n Seedcord.isInstantiated = true;\n\n this.effects = new EffectsRegistry(this as unknown as Core);\n this.bot = new Bot(this as unknown as Core);\n this.healthCheck = new HealthCheck(this.shutdown);\n\n this.registerStartupTasks();\n }\n\n /**\n * Registers default startup tasks\n * @internal\n */\n private registerStartupTasks(): void {\n this.startup.addTask(StartupPhase.Configuration, 'Effect Initialization', async () => {\n this.effects.logger.info(chalk.bold('Initializing'));\n await this.effects.init();\n this.effects.logger.info(chalk.bold('Initialized'));\n });\n\n this.startup.addTask(StartupPhase.Instantiation, 'Bot Initialization', async () => {\n this.bot.logger.info(chalk.bold('Initializing'));\n await this.bot.init();\n this.bot.logger.info(chalk.bold('Initialized'));\n });\n\n this.startup.addTask(StartupPhase.Ready, 'Health Check', async () => {\n this.healthCheck.logger.info(chalk.bold('Initializing'));\n await this.healthCheck.init();\n this.healthCheck.logger.info(chalk.bold('Initialized'));\n });\n }\n\n /**\n * Starts the bot and runs all initialization tasks\n *\n * @returns This Seedcord instance when fully initialized\n */\n public async start(): Promise<this> {\n await super.init();\n return this;\n }\n}\n","import type { Handler } from '../../interfaces/Handler';\n\ntype HandlerCtor = new (...args: any[]) => Handler;\n\n/**\n * Marks a handler class as requiring check execution.\n *\n * Enables the runChecks() method to be called before execute()\n * for handlers that need pre-execution validation.\n *\n * @param ctor - The handler to mark as checkable (Do not pass this directly. Just call the decorator without a **()**)\n * @decorator\n * @example\n * ```typescript\n * \\@Checkable\n * class AdminCommand extends InteractionHandler {\n * async runChecks() {\n * // Perform admin permission checks\n * }\n * }\n * ```\n */\nexport function Checkable<TypeHandler extends HandlerCtor>(ctor: TypeHandler): TypeHandler {\n return class extends ctor {\n static override name = ctor.name;\n checkable = true as const;\n };\n}\n","/* decorators/EventCatchable.ts */\nimport { Message } from 'discord.js';\n\nimport { ErrorHandlingUtils } from '../utilities/ErrorHandlingUtils';\n\nimport type { EventHandler } from '../../interfaces/Handler';\nimport type { ClientEvents } from 'discord.js';\n\n/**\n * Catches and handles errors in event handler methods.\n *\n * Automatically handles errors in event handlers and sends error responses\n * if the event contains a Discord message object.\n *\n * @param log - Whether to log errors to console (default: false)\n * @decorator\n * @example\n * ```typescript\n * class MessageHandler extends EventHandler {\n * \\@EventCatchable(true)\n * async execute() {\n * // Event handling logic\n * }\n * }\n * ```\n */\nexport function EventCatchable(log?: boolean) {\n return function (\n _target: EventHandler<keyof ClientEvents>,\n _prop: string,\n descriptor: TypedPropertyDescriptor<(...args: any[]) => Promise<void>>\n ): void {\n const original = descriptor.value;\n\n descriptor.value = async function (this: EventHandler<keyof ClientEvents>, ...args: any[]): Promise<void> {\n if (!original) throw new Error('Method not found');\n\n try {\n await original.apply(this, args);\n } catch (err) {\n if (!(err instanceof Error)) throw err;\n\n this.setErrored();\n // eslint-disable-next-line no-console\n if (log) console.error(err);\n\n const eventArgs = Array.isArray(this.getEvent()) ? (this.getEvent() as unknown[]) : [this.getEvent()];\n const msg = eventArgs.find((x): x is Message => x instanceof Message);\n\n const { response } = ErrorHandlingUtils.extractErrorResponse(\n err,\n this.core,\n msg?.guild ?? null,\n msg?.author ?? null\n );\n\n if (!msg) return;\n\n await msg.reply({ embeds: [response], components: [] });\n }\n };\n };\n}\n","import { Logger } from '@seedcord/services';\n\nimport { DatabaseError } from '../bot/errors/Database';\n\nimport type { CustomErrorConstructor } from '../interfaces/Components';\n\n/**\n * Throws a custom error with a formatted message and optional UUID.\n *\n * Wraps an unknown error in a {@link CustomError} subclass. If the error class\n * is {@link DatabaseError}, a UUID is generated and passed to the constructor.\n *\n * @typeParam T - A constructor for a {@link CustomError} subclass\n * @param error - The original error or value\n * @param message - Custom message to include\n * @param CustomError - Error class to instantiate and throw\n * @throws Instance of the provided {@link CustomError} subclass\n *\n * @example\n * ```typescript\n * try {\n * // risky code\n * } catch (e) {\n * throwCustomError(e, \"Something went wrong\", MyCustomError);\n * }\n * ```\n */\nexport function throwCustomError<Ctor extends CustomErrorConstructor>(\n error: unknown,\n message: string,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n CustomError: Ctor\n): never {\n const uuid = crypto.randomUUID();\n Logger.Error('Throwing Custom Error', (error as Error).name);\n\n if (typeof CustomError === typeof DatabaseError) {\n const errorMessage = error instanceof Error ? error.message : message;\n throw new CustomError(errorMessage, uuid);\n } else {\n if (error instanceof Error) {\n throw new CustomError(`${message}: ${error.message ? error.message : error.toString()}`);\n } else {\n throw new CustomError(message);\n }\n }\n}\n"]}
|