seedcord 0.9.0 → 0.9.1
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 +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bot/decorators/Command.ts","../src/miscellaneous/parseEnvColor.ts","../src/interfaces/Components.ts","../src/bot/controllers/CommandRegistry.ts","../src/bot/decorators/Events.ts","../src/bot/decorators/Middlewares.ts","../src/interfaces/Handler.ts","../src/miscellaneous/areRoutes.ts","../src/bot/controllers/EventController.ts","../src/bot/decorators/Interactions.ts","../src/bot/utilities/miscellaneous/buildSlashRoute.ts","../src/bot/errors/Database.ts","../src/bot/utilities/errors/extractErrorResponse.ts","../src/bot/decorators/Catchable.ts","../src/bot/defaults/UnhandledEvent.ts","../src/bot/controllers/InteractionController.ts","../src/interfaces/Plugin.ts","../src/bot/injectors/EmojiInjector.ts","../src/bot/Bot.ts","../src/effects/decorators/RegisterEffect.ts","../src/effects/EffectsHandler.ts","../src/effects/bases/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/bot/decorators/Confirmable/Confirmable.ts","../src/bot/errors/Channels.ts","../src/bot/errors/Roles.ts","../src/bot/errors/User.ts","../src/bot/utilities/channels/fetchText.ts","../src/bot/utilities/channels/sendInText.ts","../src/bot/utilities/errors/throwCustomError.ts","../src/bot/utilities/messages/attemptSendDM.ts","../src/bot/utilities/roles/checkPermissions.ts","../src/bot/utilities/roles/getBotRole.ts","../src/bot/utilities/roles/checkBotPermissions.ts","../src/bot/utilities/roles/fetchRole.ts","../src/bot/utilities/roles/hasPermsToAssign.ts","../src/bot/utilities/users/fetchGuildMember.ts","../src/bot/utilities/users/fetchManyGuildMembers.ts","../src/bot/utilities/users/fetchUser.ts","../src/bot/utilities/users/fetchManyUsers.ts","../src/bot/utilities/users/updateMemberRoles.ts"],"names":["CommandMetadataKey","Symbol","RegisterCommand","scope","guilds","ctor","meta","existingMeta","Reflect","getOwnMetadata","SeedcordError","SeedcordErrorCode","DecoratorCommandAlreadyRegistered","name","length","DecoratorCommandGlobalWithGuilds","Array","isArray","DecoratorCommandGuildWithoutGuilds","defineMetadata","parseEnvColor","raw","fallback","toHex","n","toString","padStart","num","Number","isNaN","startsWith","test","colorKey","Object","keys","Colors","find","key","toLowerCase","BuilderTypes","command","SlashCommandBuilder","context_menu","ContextMenuCommandBuilder","subcommand","SlashCommandSubcommandBuilder","group","SlashCommandSubcommandGroupBuilder","embed","EmbedBuilder","modal","ModalBuilder","label","LabelBuilder","text_input","TextInputBuilder","file_upload","FileUploadBuilder","button","ButtonBuilder","menu_string","StringSelectMenuBuilder","menu_option_string","StringSelectMenuOptionBuilder","menu_user","UserSelectMenuBuilder","menu_channel","ChannelSelectMenuBuilder","menu_mentionable","MentionableSelectMenuBuilder","menu_role","RoleSelectMenuBuilder","container","ContainerBuilder","text_display","TextDisplayBuilder","file","FileBuilder","media","MediaGalleryBuilder","section","SectionBuilder","separator","SeparatorBuilder","RowTypes","ActionRowBuilder","BaseComponent","_component","ComponentClass","instance","buildCustomId","prefix","args","join","BuilderComponent","type","setColor","botColor","setAccentColor","undefined","hexToNumber","setContexts","InteractionContextType","Guild","component","converter","RowComponent","BaseErrorEmbed","setTitle","CustomError","Error","_emit","response","message","captureStackTrace","emit","value","CommandRegistry","logger","Logger","isInitialised","globalCommands","guildCommands","Collection","core","init","info","chalk","bold","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","gray","cyan","g","arr","get","set","setCommands","client","application","tag","map","guildId","entries","guild","cache","warn","EventMetadataKey","RegisterEvent","defs","constructor","saved","existing","event","options","frequency","MiddlewareType","MiddlewareMetadataKey","Middleware","priority","normalizedPriority","isFinite","SeedcordTypeError","DecoratorInvalidMiddlewarePriority","events","DecoratorInteractionEventFilter","metadata","BaseHandler","checkable","break","errored","populate","hasChecks","hasErrors","setErrored","shouldBreak","getEvent","getArgs","getArg","index","InteractionHandler","InteractionMiddleware","EventMiddleware","AutocompleteHandler","focused","getFocused","EventHandler","areRoutes","routes","every","r","EventController","isInitialized","eventMap","middlewares","handlersDir","middlewareDir","loadMiddlewares","loadHandlers","attachToClient","loadedEventsArray","forEach","handlers","eventName","_fullPath","relativePath","imported","val","isEventHandlerClass","registerHandler","isMiddlewareClass","Event","registerMiddleware","middlewareCtor","alreadyRegistered","some","entry","sort","a","b","runMiddlewares","includes","middleware","runChecks","execute","err","error","String","handlerClass","names","handlerEntries","debug","register","once","bind","on","processEvent","catch","red","stack","specificHandler","shouldContinue","processHandler","handler","InteractionRoutes","SelectMenuType","InteractionMetadataKey","SlashRoute","routeOrRoutes","storeMetadata","ButtonRoute","ModalRoute","ContextMenuRoute","routeType","AutocompleteRoute","commandRoutes","focusedFields","fields","route","field","autocompleteKey","SelectMenuRoute","routeMap","symbol","savedRoutes","toStore","buildSlashRoute","arg1","arg2","arg3","sub","ChatInputCommandInteraction","AutocompleteInteraction","commandName","getSubcommandGroup","getSubcommand","UtilInvalidSlashRouteArgument","DatabaseError","uuid","setDescription","extractErrorResponse","user","randomUUID","effects","showStack","errorStack","GenericError","developerUsername","Catchable","_target","_propertyKey","descriptor","log","forceFollowup","originalMethod","interaction","DecoratorMethodNotFound","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","ignoredKeysFromConfig","interactions","ignoreCustomIds","ignoredKey","add","isHandlerClass","Interaction","routeTypes","Slash","Button","Modal","StringMenu","UserMenu","RoleMenu","ChannelMenu","MentionableMenu","MessageContextMenu","UserContextMenu","Autocomplete","Events","InteractionCreate","handleInteraction","parseCustomId","customId","parts","split","argString","handleCustomIdInteraction","getMap","interactionType","processInteraction","extractKey","getHandler","pattern","HandlerCtor","isChatInputCommand","handleSlashCommand","isButton","handleButton","isModalSubmit","handleModal","isStringSelectMenu","handleStringSelectMenu","isUserSelectMenu","handleUserSelectMenu","isRoleSelectMenu","handleRoleSelectMenu","isChannelSelectMenu","handleChannelSelectMenu","isMentionableSelectMenu","handleMentionableSelectMenu","isMessageContextMenuCommand","handleMessageContextMenu","isUserContextMenuCommand","handleUserContextMenu","isAutocomplete","handleAutocomplete","Plugin","StrictEventEmitter","pluggable","Pluggable","shutdown","startup","PLUGIN_INIT_TIMEOUT_MS","run","attach","startupPhase","CorePluginAfterInit","CorePluginKeyExists","addTask","assign","emojiStorage","Emojis","EmojiInjector","clearEmojis","emojis","configEmojis","fetch","foundCount","emojiName","emoji","e","identifier","id","deleteProperty","Bot","_client","emojiInjector","Client","clientOptions","ShutdownPhase","DiscordCleanup","stop","login","removeAllListeners","logout","botToken","username","destroy","_fallback","ConfigMissingDiscordToken","EffectMetadataKey","RegisterEffect","effect","EffectsHandler","data","WebhookLog","webhookUrlValidator","ConfigUnknownExceptionWebhookMissing","ConfigUnknownExceptionWebhookInvalid","trim","discordWebhookRegex","RegExp","URL","canParse","UnknownException","webhook","WebhookClient","url","unknownExceptionWebhookUrl","metadataFile","prepareMetadataFile","send","withComponents","avatarURL","UnhandledErrorContainer","files","filterCirculars","AttachmentBuilder","Buffer","from","JSON","stringify","description","DefaultSeparator","setSpacing","SeparatorSpacingSize","Small","setDivider","addTextDisplayComponents","text","setContent","addSeparatorComponents","addTimestampsIfAvailable","addMetadataIfAvailable","DiscordAPIError","now","Date","snowflake","match","interactionTs","SnowflakeUtil","deconstruct","timestamp","diff","seconds","Math","floor","millis","toISOString","addFileComponents","setURL","EffectsEmitter","emitter","EventEmitter","listener","EffectsRegistry","effectsMap","effectsDir","registerEffect","loadEffects","attachEffects","totalEffects","reduce","acc","exportName","isEffectHandler","effectName","Seedcord","isInstantiated","healthCheck","CoordinatedShutdown","CoordinatedStartup","CoreSingletonViolation","HealthCheck","registerStartupTasks","StartupPhase","Configuration","Instantiation","Ready","start","Checkable","EventCatchable","_prop","silent","original","errorType","eventArgs","msg","x","Message","author","resolveFactory","input","ctx","isV2","opts","usesResolver","usesCustomIds","isMessageComponentIx","ix","buildPrompt","prompt","rows","payload","clearedPayload","decide","i","resolveDecision","confirmCustomIds","cancelCustomIds","shouldDefer","isSlash","isContext","defer","maybeDefer","ephemeral","deferReply","deferUpdate","sendPrompt","fetchReply","follow","awaitComponent","componentType","ComponentType","timeoutMs","awaitMessageComponent","time","filter","c","timedOut","clearUi","edit","deleteReply","normalizeClassicOutcome","outcomeReplacement","confirmed","outcomes","outcomeUi","v2Outcomes","onTimeout","onCancel","onConfirm","classicOutcomes","Confirmable","question","isContextMenuCommand","q","promptMsg","replacement","onResolved","ChannelNotFoundError","channelId","CannotSendEmbedsError","CouldNotFindChannel","ChannelNotTextChannel","MissingPermissions","missingPerms","roleOrChannel","missing","perm","errorSubtext","Role","RoleHigherThanMe","role","botRole","CannotAssignBotRole","RoleDoesNotExist","roleId","HasDangerousPermissions","dangerousPerms","dangerous","UserNotInGuild","UserNotFound","userArg","fetchText","TextChannel","channel","channels","isTextBased","sendInText","throwCustomError","crypto","errorMessage","attemptSendDM","PermissionNames","Map","PermissionFlagsBits","bit","prettify","PERM_GROUPS","manage","ManageChannels","ManageRoles","ManageWebhooks","ManageMessages","ManageNicknames","ViewChannel","SendMessages","EmbedLinks","AttachFiles","UseExternalEmojis","ReadMessageHistory","others","AddReactions","UseApplicationCommands","checkPermissions","inverse","required","permissions","CoreClientUserUnavailable","permissionsFor","has","getBotRole","roles","botRoleFor","CoreBotRoleMissing","checkBotPermissions","guildOrChannel","fetchRole","clientOrGuild","hasPermsToAssign","targetRole","comparePositionTo","managed","fetchGuildMember","userId","members","fetchManyGuildMembers","userIds","results","Promise","allSettled","result","status","fetchUser","users","code","RESTJSONErrorCodes","UnknownUser","fetchManyUsers","updateMemberRoles","rolesToAdd","rolesToRemove","member","current","toAdd","toRemove","updated","union","difference"],"mappings":"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","file":"index.cjs","sourcesContent":["import { SeedcordError, SeedcordErrorCode } from '@seedcord/services';\n\nimport type { BuilderComponent } from '@interfaces/Components';\n\n/**\n * Metadata key for command registration information.\n *\n * @internal\n */\nexport const CommandMetadataKey = Symbol('command:metadata');\n\n/**\n * Constructor type for command classes.\n *\n * @internal\n */\nexport type CommandCtor = new (...args: any[]) => BuilderComponent<'command' | 'context_menu'>;\n\n/**\n * Metadata for global command registration.\n *\n * @internal\n */\nexport interface GlobalMeta {\n scope: 'global';\n}\n\n/**\n * Metadata for guild-specific command registration.\n *\n * @internal\n */\nexport interface GuildMeta {\n scope: 'guild';\n guilds: string[];\n}\n\n/**\n * Union type for command registration metadata.\n *\n * @internal\n */\nexport type CommandMeta = GlobalMeta | GuildMeta;\n\n/**\n * Type representing command registration scope.\n *\n * @internal\n */\nexport type CommandScope = CommandMeta['scope'];\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 if applicable\n * @decorator\n */\nexport function RegisterCommand(scope: CommandScope, guilds: string[] = []) {\n return (ctor: CommandCtor): void => {\n const meta: GlobalMeta | GuildMeta = scope === 'global' ? { scope } : { scope, guilds };\n\n // Make sure command is EITHER global or guild-scoped.\n const existingMeta = Reflect.getOwnMetadata(CommandMetadataKey, ctor) as CommandMeta | undefined;\n if (existingMeta) {\n throw new SeedcordError(SeedcordErrorCode.DecoratorCommandAlreadyRegistered, [\n ctor.name,\n existingMeta.scope,\n scope\n ]);\n }\n\n // Also make sure guilds aren't provided for global scope\n if (scope === 'global' && guilds.length > 0) {\n throw new SeedcordError(SeedcordErrorCode.DecoratorCommandGlobalWithGuilds);\n }\n\n // Also make sure guilds are provided for guild scope\n if (scope === 'guild' && (!Array.isArray(guilds) || guilds.length === 0)) {\n throw new SeedcordError(SeedcordErrorCode.DecoratorCommandGuildWithoutGuilds);\n }\n\n Reflect.defineMetadata(CommandMetadataKey, meta, ctor);\n };\n}\n","import { type ColorResolvable, Colors } from 'discord.js';\n\n/**\n * Converts a color to ColorResolvable if possible.\n *\n * @internal\n */\nexport function parseEnvColor(raw: string | undefined | null, fallback: ColorResolvable): ColorResolvable {\n if (!raw) return fallback;\n\n // eslint-disable-next-line no-magic-numbers\n const toHex = (n: number): ColorResolvable => `#${n.toString(16).padStart(6, '0')}` as ColorResolvable;\n\n // try numeric parse first\n const num = Number(raw);\n if (!Number.isNaN(num) && num >= 0) return toHex(num);\n\n // hex with #\n if (raw.startsWith('#')) return raw as ColorResolvable;\n\n // hex without #\n if (/^[0-9A-Fa-f]{6}$/.test(raw)) return `#${raw}` as ColorResolvable;\n\n // Discord named colors\n const colorKey = Object.keys(Colors).find((key) => key.toLowerCase() === raw.toLowerCase()) as\n | keyof typeof Colors\n | undefined;\n\n if (colorKey) return toHex(Colors[colorKey]);\n\n return fallback;\n}\n","import { hexToNumber } from '@seedcord/utils';\nimport {\n ActionRowBuilder,\n ButtonBuilder,\n ChannelSelectMenuBuilder,\n ContainerBuilder,\n ContextMenuCommandBuilder,\n EmbedBuilder,\n FileBuilder,\n FileUploadBuilder,\n InteractionContextType,\n LabelBuilder,\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 { parseEnvColor } from '@miscellaneous/parseEnvColor';\n\nimport type { ColorResolvable } from 'discord.js';\n\n/**\n * Available Discord.js builder classes for use with BuilderComponent\n *\n * @internal\n */\nexport const BuilderTypes = {\n // Command Components\n command: SlashCommandBuilder,\n context_menu: ContextMenuCommandBuilder,\n subcommand: SlashCommandSubcommandBuilder,\n group: SlashCommandSubcommandGroupBuilder,\n\n // Embed Components\n embed: EmbedBuilder,\n\n // Modal Components\n modal: ModalBuilder,\n label: LabelBuilder,\n text_input: TextInputBuilder,\n file_upload: FileUploadBuilder,\n\n // Action Row Components\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\n // ComponentsV2\n container: ContainerBuilder,\n text_display: TextDisplayBuilder,\n file: FileBuilder,\n media: MediaGalleryBuilder,\n section: SectionBuilder,\n separator: SeparatorBuilder\n};\n\n/**\n * Available Discord.js action row classes for use with RowComponent\n *\n * @internal\n */\nexport const 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} = {\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};\n\n/**\n * Available Discord.js builder types for use with BuilderComponent\n */\nexport type BuilderType = keyof typeof BuilderTypes;\n\n/**\n * @internal\n */\nexport type InstantiatedBuilder<BuilderKey extends BuilderType> = InstanceType<(typeof BuilderTypes)[BuilderKey]>;\n\n/**\n * Available Discord.js action row types for use with RowComponent\n */\nexport type ActionRowComponentType = keyof typeof RowTypes;\n\n/**\n * @internal\n */\nexport type InstantiatedActionRow<RowKey extends ActionRowComponentType> = InstanceType<(typeof RowTypes)[RowKey]>;\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 *\n * @internal\n */\nexport abstract 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 /**\n * Bot color for the component\n * Uses the DEFAULT_BOT_COLOR environment variable or falls back to 'Default' set by Discord.js.\n *\n * Set DEFAULT_BOT_COLOR to a hex code in your `.env` file to customize.\n */\n @Envapt<ColorResolvable>('DEFAULT_BOT_COLOR', {\n fallback: 'Default',\n converter: (raw, fallback) => parseEnvColor(raw, fallback)\n })\n declare public 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 ContainerBuilder) {\n this.instance.setAccentColor(\n this.botColor === 'Default' ? undefined : hexToNumber(this.botColor.toString())\n );\n }\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 * 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 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 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 { Logger } from '@seedcord/services';\nimport { traverseDirectory } from '@seedcord/utils';\nimport chalk from 'chalk';\nimport { Collection, SlashCommandBuilder } from 'discord.js';\n\nimport { CommandMetadataKey } from '@bDecorators/Command';\nimport { BuilderComponent } from '@interfaces/Components';\n\nimport type { CommandMeta } from '@bDecorators/Command';\nimport type { Core } from '@interfaces/Core';\nimport type { Initializeable } from '@interfaces/Plugin';\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 { EventHandler, ValidNonInteractionKeys } from '@interfaces/Handler';\nimport type { EventFrequency } from '@miscellaneous/types';\nimport type { ClientEvents } from 'discord.js';\nimport type { Constructor } from 'type-fest';\n\n/**\n * Metadata key used to store event handler information\n *\n * @internal\n */\nexport const EventMetadataKey = Symbol('event:metadata');\n\n/** Options accepted by the event registration decorator. */\nexport interface RegisterEventOptions {\n /** Frequency: 'once' or 'on'. Defaults to 'on'. */\n readonly frequency?: EventFrequency | undefined;\n}\n\n/**\n * Metadata entry representing a registered event handler.\n *\n * @internal\n */\nexport interface RegisterEventMetadataEntry<EventKey extends keyof ClientEvents> {\n readonly event: EventKey;\n readonly frequency: EventFrequency;\n}\n\n/** Tuple describing a single event and optional options. */\nexport type EventSpec<EventKey extends ValidNonInteractionKeys> = readonly [\n event: EventKey,\n options?: RegisterEventOptions\n];\n\n/**\n * Registers an event handler class with one or more Discord.js events.\n *\n * Associates the decorated class with the provided Discord client events for automatic registration and execution when those events are emitted.\n *\n * Supply any number of event tuples. Each tuple can include per event options.\n *\n * @typeParam EventKey - Union of Discord.js ClientEvents keys to register for\n * @param defs - One or more tuples of [event, options]\n * @decorator\n * @example\n * ```ts\n * \\@RegisterEvent([Events.MessageCreate])\n * class MessageHandler extends EventHandler<Events.MessageCreate> {\n * async execute() {\n * // Handle message creation\n * }\n * }\n * ```\n *\n * @example\n * ```ts\n * \\@RegisterEvent([Events.MessageCreate], [Events.MessageUpdate])\n * class MessageHandler extends EventHandler<Events.MessageCreate | Events.MessageUpdate> {\n * async execute() {\n * // Handle message creation or update\n * }\n * }\n * ```\n *\n * @example\n * ```ts\n * \\@RegisterEvent([Events.MessageCreate, { frequency: 'once' }], [Events.MessageUpdate])\n * class OneTimeMessageHandler extends EventHandler<Events.MessageCreate | Events.MessageUpdate> {\n * async execute() {\n * // Handle only the first message creation, and message update normally\n * }\n * }\n * ```\n */\nexport function RegisterEvent<const Defs extends readonly EventSpec<ValidNonInteractionKeys>[]>(...defs: Defs) {\n type EventKey = Defs[number][0];\n\n return function <HandlerCtor extends Constructor<EventHandler<EventKey>>>(constructor: HandlerCtor): void {\n const saved = Reflect.getMetadata(EventMetadataKey, constructor) as\n | RegisterEventMetadataEntry<EventKey>[]\n | undefined;\n const existing = saved ?? [];\n\n const entries = defs.map<RegisterEventMetadataEntry<EventKey>>(([event, options]) => ({\n event,\n frequency: options?.frequency ?? 'on'\n }));\n\n Reflect.defineMetadata(EventMetadataKey, [...existing, ...entries], constructor);\n };\n}\n","import { SeedcordError, SeedcordErrorCode, SeedcordTypeError } from '@seedcord/services';\n\nimport type { EventMiddleware, InteractionMiddleware, Repliables, ValidNonInteractionKeys } from '@interfaces/Handler';\nimport type { Constructor } from 'type-fest';\n\n/**\n * Middleware types supported by Seedcord\n */\nexport enum MiddlewareType {\n Interaction = 'middleware:interaction',\n Event = 'middleware:event'\n}\n\n/**\n * Metadata key for middleware configuration\n *\n * @internal\n */\nexport const MiddlewareMetadataKey = Symbol('middleware:metadata');\n\n/**\n * Additional middleware registration options\n *\n * @typeParam MType - The type of middleware being registered\n */\nexport interface MiddlewareOptions<MType extends MiddlewareType> {\n /**\n * Restrict event middleware execution to specific Discord client events\n */\n readonly events?: MType extends MiddlewareType.Event ? readonly ValidNonInteractionKeys[] : never;\n}\n\n/**\n * Metadata stored for middleware registration\n */\nexport interface MiddlewareMetadata {\n /**\n * Priority number used to order middleware\n */\n priority: number;\n /**\n * Middleware kind from {@link MiddlewareType}\n */\n type: MiddlewareType;\n /**\n * Optional list of Discord client events to target\n */\n events?: readonly ValidNonInteractionKeys[];\n}\n\n/**\n * Decorator used to register middleware with priority ordering. The lower the priority number, the earlier it runs.\n *\n * Interaction middleware cannot specify event filters.\n *\n * @param type - Middleware kind from {@link MiddlewareType}\n * @param priority - Ordering value where lower runs earlier. Default is 0\n * @param options - Additional registration options\n *\n * @decorator\n *\n * @example\n * ```ts\n * \\@Middleware(MiddlewareType.Event, 10, { events: [Events.MessageCreate, Events.MessageUpdate] })\n * class MyEventMiddleware extends EventMiddleware {}\n * ```\n * @throws A {@link SeedcordTypeError} If priority is not a finite number\n * @throws A {@link SeedcordError} If interaction middleware specifies event filters\n */\nexport function Middleware<MType extends MiddlewareType>(\n type: MType,\n priority = 0,\n options: MiddlewareOptions<MType> = {}\n) {\n return (\n ctor: Constructor<\n MType extends MiddlewareType.Interaction\n ? InteractionMiddleware<Repliables>\n : EventMiddleware<ValidNonInteractionKeys>\n >\n ): void => {\n const normalizedPriority = Number(priority);\n if (!Number.isFinite(normalizedPriority)) {\n throw new SeedcordTypeError(SeedcordErrorCode.DecoratorInvalidMiddlewarePriority);\n }\n\n if (type === MiddlewareType.Interaction && Array.isArray(options.events) && options.events.length > 0) {\n throw new SeedcordError(SeedcordErrorCode.DecoratorInteractionEventFilter);\n }\n\n const metadata: MiddlewareMetadata = {\n priority: normalizedPriority,\n type,\n ...(options.events ? { events: options.events } : {})\n };\n\n Reflect.defineMetadata(MiddlewareMetadataKey, metadata, ctor);\n };\n}\n","import { Logger } from '@seedcord/services';\n\nimport 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\nexport type ValidNonInteractionKeys = Exclude<keyof ClientEvents, Events.InteractionCreate>;\n\n/** All valid Discord.js client events except interaction events */\nexport type ValidNonInteractionTypes = ClientEvents[ValidNonInteractionKeys];\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/** Event handler types that can reply to events */\nexport type RepliableEventHandler = EventHandler<ValidNonInteractionKeys> | EventMiddleware<ValidNonInteractionKeys>;\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 * @see {@link Catchable}\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\n/**\n * Interface for handlers that implement pre-execution checks\n *\n * @internal\n */\nexport interface HandlerWithChecks extends WithChecks, Handler {}\n\n/**\n * Base class for all handlers. Not meant to be used directly.\n *\n * @internal\n */\nexport abstract 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 protected logger: Logger;\n\n protected constructor(\n event: ValidEvent,\n public core: Core,\n args?: string[]\n ) {\n this.event = event;\n this.args = args ?? [];\n this.logger = new Logger(this.constructor.name);\n\n this.populate();\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 /**\n * Populates the handler with necessary data before execution. Override this method in your handler classes to customize population logic. This method is called at the end of the constructor before all async operations.\n */\n protected populate(): 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 * Base class for Discord event middleware\n *\n * Middleware runs before event handlers and can modify behavior or block execution.\n */\nexport abstract class EventMiddleware<EventName extends ValidNonInteractionKeys>\n extends BaseHandler<ClientEvents[EventName]>\n implements Handler\n{\n constructor(event: ClientEvents[EventName], 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 ValidNonInteractionKeys>\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 InteractionMiddlewareConstructor = TypedConstructor<typeof InteractionMiddleware> &\n (new (event: Repliables, core: Core, args?: string[]) => InteractionMiddleware<Repliables>);\n\n/** Constructor type for legacy interaction middleware */\nexport type MiddlewareConstructor = InteractionMiddlewareConstructor;\n\n/** Constructor type for event middleware */\nexport type EventMiddlewareConstructor = TypedConstructor<typeof EventMiddleware> &\n (new <EventName extends ValidNonInteractionKeys>(\n event: ClientEvents[EventName],\n core: Core,\n args?: string[]\n ) => EventMiddleware<EventName>);\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","/**\n * Checks if the provided value is an array of strings.\n *\n * @internal\n */\nexport function areRoutes(routes: unknown): routes is string[] {\n return Array.isArray(routes) && routes.every((r) => typeof r === 'string');\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 { EventMetadataKey } from '@bDecorators/Events';\nimport { MiddlewareMetadataKey, MiddlewareType } from '@bDecorators/Middlewares';\nimport { EventHandler, EventMiddleware } from '@interfaces/Handler';\nimport { areRoutes } from '@miscellaneous/areRoutes';\n\nimport type { RegisterEventMetadataEntry } from '@bDecorators/Events';\nimport type { MiddlewareMetadata } from '@bDecorators/Middlewares';\nimport type { Core } from '@interfaces/Core';\nimport type { EventHandlerConstructor, EventMiddlewareConstructor, ValidNonInteractionKeys } from '@interfaces/Handler';\nimport type { Initializeable } from '@interfaces/Plugin';\nimport type { EventFrequency } from '@miscellaneous/types';\n\ninterface RegisteredEventMiddleware {\n readonly ctor: EventMiddlewareConstructor;\n readonly priority: number;\n readonly events?: readonly ValidNonInteractionKeys[];\n}\n\ninterface RegisteredEventHandlerEntry {\n readonly ctor: EventHandlerConstructor;\n readonly frequency: EventFrequency;\n}\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, RegisteredEventHandlerEntry[]>();\n private readonly middlewares: RegisteredEventMiddleware[] = [];\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 const middlewareDir = this.core.config.bot.events.middlewares;\n if (middlewareDir) {\n this.logger.info(`${chalk.bold(middlewareDir)} ${chalk.gray('(middlewares)')}`);\n await this.loadMiddlewares(middlewareDir);\n }\n\n await this.loadHandlers(handlersDir);\n this.attachToClient();\n\n this.logger.info(`→ ${chalk.magenta.bold(this.middlewares.length)} middlewares`);\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)) continue;\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 this.logger\n );\n }\n\n private async loadMiddlewares(dir: string): Promise<void> {\n await traverseDirectory(\n dir,\n (_fullPath, relativePath, imported) => {\n for (const val of Object.values(imported)) {\n if (!this.isMiddlewareClass(val)) continue;\n const metadata = Reflect.getMetadata(MiddlewareMetadataKey, val) as MiddlewareMetadata | undefined;\n if (metadata?.type !== MiddlewareType.Event) continue;\n\n this.registerMiddleware(val, metadata, relativePath);\n }\n },\n this.logger\n );\n }\n\n private registerMiddleware(\n middlewareCtor: EventMiddlewareConstructor,\n metadata: MiddlewareMetadata,\n relativePath: string\n ): void {\n const alreadyRegistered = this.middlewares.some((entry) => entry.ctor === middlewareCtor);\n if (alreadyRegistered) return;\n\n this.middlewares.push({\n ctor: middlewareCtor,\n priority: metadata.priority,\n ...(metadata.events ? { events: metadata.events } : {})\n });\n this.middlewares.sort((a, b) => a.priority - b.priority);\n\n this.logger.info(\n `${chalk.italic('Registered event middleware')} ${chalk.bold.yellow(middlewareCtor.name)} ${chalk.gray(`(priority ${metadata.priority})`)} from ${chalk.gray(relativePath)}`\n );\n }\n\n private async runMiddlewares<KeyOfEvents extends keyof ClientEvents>(\n eventName: KeyOfEvents,\n args: ClientEvents[KeyOfEvents]\n ): Promise<boolean> {\n for (const { ctor, events } of this.middlewares) {\n if (events && !events.includes(eventName)) continue;\n\n try {\n const middleware = new ctor(args, this.core);\n if (middleware.hasChecks()) await middleware.runChecks();\n\n if (middleware.shouldBreak() || middleware.hasErrors()) return false;\n\n await middleware.execute();\n\n if (middleware.shouldBreak() || middleware.hasErrors()) return false;\n } catch (err) {\n this.logger.error(`Error in event middleware ${ctor.name} for event ${String(eventName)}:`, err);\n return false;\n }\n }\n\n return true;\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 isMiddlewareClass(obj: unknown): obj is EventMiddlewareConstructor {\n if (typeof obj !== 'function') return false;\n return obj.prototype instanceof EventMiddleware && Reflect.hasMetadata(MiddlewareMetadataKey, obj);\n }\n\n private registerHandler(handlerClass: EventHandlerConstructor): void {\n const raw = Reflect.getMetadata(EventMetadataKey, handlerClass) as unknown;\n\n if (Array.isArray(raw)) {\n for (const entry of raw as RegisterEventMetadataEntry<keyof ClientEvents>[]) {\n const key = entry.event;\n\n let handlers = this.eventMap.get(key);\n if (!handlers) {\n handlers = [];\n this.eventMap.set(key, handlers);\n }\n\n handlers.push({\n ctor: handlerClass,\n frequency: entry.frequency\n });\n }\n return;\n }\n\n const names = areRoutes(raw) ? raw : typeof raw === 'string' ? [raw] : [];\n\n if (names.length === 0) return;\n\n for (const name of names) {\n const key = name as keyof ClientEvents;\n\n let handlers = this.eventMap.get(key);\n if (!handlers) {\n handlers = [];\n this.eventMap.set(key, handlers);\n }\n handlers.push({\n ctor: handlerClass,\n frequency: 'on'\n });\n }\n }\n\n private attachToClient(): void {\n for (const [eventName, handlerEntries] of this.eventMap) {\n this.logger.debug(\n `Attaching ${chalk.bold.green(eventName)} to the client with ${chalk.gray(handlerEntries.length)} handler(s)`\n );\n\n for (const entry of handlerEntries) {\n const register =\n entry.frequency === 'once'\n ? this.core.bot.client.once.bind(this.core.bot.client)\n : this.core.bot.client.on.bind(this.core.bot.client);\n\n register(eventName, (...args: ClientEvents[typeof eventName]) => {\n this.core.bot.emit('any:event', eventName, ...args);\n void (async () => {\n await this.processEvent(eventName, args, entry.ctor).catch((err: Error) => {\n this.logger.error(`[${chalk.bold.red('UNHANDLED ERROR AT ROOT')}] ${err.name}`, err.stack);\n this.core.bot.emit('error:unhandled:event', err);\n });\n })();\n });\n }\n }\n }\n\n private async processEvent<KeyOfEvents extends keyof ClientEvents>(\n eventName: KeyOfEvents,\n args: ClientEvents[KeyOfEvents],\n specificHandler?: EventHandlerConstructor\n ): Promise<void> {\n const shouldContinue = await this.runMiddlewares(eventName, args);\n if (!shouldContinue) return;\n\n if (specificHandler) {\n await this.processHandler(eventName, specificHandler, args);\n return;\n }\n\n const handlerEntries = this.eventMap.get(eventName);\n if (!handlerEntries || handlerEntries.length === 0) return;\n\n for (const entry of handlerEntries) {\n await this.processHandler(eventName, entry.ctor, args);\n }\n }\n\n private async processHandler<KeyOfEvents extends keyof ClientEvents>(\n eventName: KeyOfEvents,\n ctor: EventHandlerConstructor,\n args: ClientEvents[KeyOfEvents]\n ): Promise<void> {\n try {\n this.logger.debug(`Processing ${chalk.bold.green(eventName)} with ${chalk.gray(ctor.name)}`);\n const handler = new ctor(args, this.core);\n if (handler.hasChecks()) await handler.runChecks();\n\n if (handler.shouldBreak()) return;\n\n if (!handler.hasErrors()) await handler.execute();\n } catch (err) {\n this.logger.error(`Error in event ${String(eventName)} handler ${ctor.name}:`, err);\n }\n }\n}\n","import { areRoutes } from '@miscellaneous/areRoutes';\n\nimport type { AutocompleteHandler, InteractionHandler, Repliables } from '@interfaces/Handler';\nimport type {\n AnySelectMenuInteraction,\n ButtonInteraction,\n ChatInputCommandInteraction,\n ContextMenuCommandInteraction,\n ModalSubmitInteraction\n} from 'discord.js';\nimport type { Constructor } from 'type-fest';\n\n/**\n * Enum defining interaction route types for decorators\n *\n * @internal\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\n/**\n * Types of select menus supported for routing\n */\nexport enum SelectMenuType {\n String = 'string',\n User = 'user',\n Role = 'role',\n Channel = 'channel',\n Mentionable = 'mentionable'\n}\n\n/**\n * Metadata key used to mark classes as interaction handlers\n *\n * @internal\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 *\n * @example\n * ```\n * \\@SlashRoute(['ban', 'kick'])\n * class ModerationHandler extends InteractionHandler {\n * // handles /ban and /kick commands\n * }\n * ```\n *\n * @example\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: Constructor<InteractionHandler<ChatInputCommandInteraction>>): 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 *\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: Constructor<InteractionHandler<ButtonInteraction>>): 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: Constructor<InteractionHandler<ModalSubmitInteraction>>): 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: Constructor<InteractionHandler<ContextMenuCommandInteraction>>): 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: Constructor<AutocompleteHandler>): 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 *\n * @decorator\n *\n * @example\n * ```typescript\n * \\@SelectMenuRoute(SelectMenuType.String, 'fruits')\n * class RoleSelectHandler extends InteractionHandler {\n * // handles string select menus with customId starting with 'fruits'\n * }\n * ```\n */\nexport function SelectMenuRoute(type: SelectMenuType, routeOrRoutes: string | string[]) {\n return function (constructor: Constructor<InteractionHandler<AnySelectMenuInteraction>>): 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(\n symbol: InteractionRoutes,\n routes: string | string[],\n constructor: Constructor<InteractionHandler<Repliables> | AutocompleteHandler>\n): void {\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 { SeedcordErrorCode, SeedcordTypeError } from '@seedcord/services';\nimport { ChatInputCommandInteraction, AutocompleteInteraction } from 'discord.js';\n/**\n * Route string computed from provided parts.\n *\n * @typeParam Cmmd - Main command name\n * @typeParam Subc - Subcommand name\n * @typeParam Grp - Group name (will be ignored if subcommand is not provided with it)\n */\nexport type CommandRouteString<\n Cmmd extends string,\n Subc extends string | undefined,\n Grp extends string | undefined\n> = Subc extends string ? (Grp extends string ? `${Cmmd}/${Grp}/${Subc}` : `${Cmmd}/${Subc}`) : Cmmd;\n\n/**\n * From provided positional arguments. Either provide the route to either {@link SlashRoute} or {@link AutocompleteRoute} manually, or use this utility to build it.\n *\n * @param command - Main command name\n * @param subcommand - Optional subcommand name\n * @param group - Optional group name (will be ignored if subcommand is not provided with it)\n */\nexport function buildSlashRoute<\n Cmmd extends string,\n Subc extends string | undefined = undefined,\n Grp extends string | undefined = undefined\n>(command: Cmmd, subcommand?: Subc, group?: Grp): CommandRouteString<Cmmd, Subc, Grp>;\n\n/**\n * From a Discord interaction. The {@link InteractionController} uses this internally to build the route string to then route the correct handler.\n *\n * @internal\n */\nexport function buildSlashRoute(interaction: ChatInputCommandInteraction | AutocompleteInteraction): string;\n\n// Implementation\nexport function buildSlashRoute(\n arg1: ChatInputCommandInteraction | AutocompleteInteraction | string,\n arg2?: string,\n arg3?: string\n): string {\n let command: string;\n let sub: string | undefined;\n let group: string | undefined;\n\n if (typeof arg1 === 'string') {\n command = arg1;\n sub = arg2;\n group = arg3;\n } else if (arg1 instanceof ChatInputCommandInteraction || arg1 instanceof AutocompleteInteraction) {\n command = arg1.commandName;\n group = arg1.options.getSubcommandGroup(false) ?? undefined;\n sub = arg1.options.getSubcommand(false) ?? undefined;\n } else {\n throw new SeedcordTypeError(SeedcordErrorCode.UtilInvalidSlashRouteArgument);\n }\n\n if (sub && group) return `${command}/${group}/${sub}`;\n if (sub) return `${command}/${sub}`;\n return command;\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';\nimport { Envapt } from 'envapt';\n\nimport { DatabaseError } from '@bErrors/Database';\nimport { CustomError } from '@interfaces/Components';\nimport { Core } from '@interfaces/Core';\n\nimport type { Nullable } from '@seedcord/types';\nimport type { EmbedBuilder, Guild, User } from 'discord.js';\nimport type { UUID } from 'node:crypto';\n\nconst logger = new Logger('ErrorsHandling');\n\n/**\n * Structure representing the extracted error response.\n */\nexport interface ExtractedErrorResponse {\n /** The unique identifier for the error instance */\n uuid: UUID;\n /** The formatted error response to be sent to the user */\n response: EmbedBuilder;\n}\n\n/**\n * Processes an error and extracts the standardized response, if available (else returns a {@link GenericError}).\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 */\nexport function extractErrorResponse(\n error: Error,\n core: Core,\n guild: Nullable<Guild>,\n user: Nullable<User>,\n metadata?: unknown\n): ExtractedErrorResponse {\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, metadata });\n\n logger.error(`DatabaseError: ${error.uuid}`);\n } else if (error.emit) {\n 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) logger.error(uuid, error);\n else logger.error(`${uuid} | ${error.message}`);\n\n core.effects.emit('unknownException', { uuid, error, guild, user, metadata });\n\n return {\n uuid,\n response: new GenericError(uuid).response\n };\n}\n\n/**\n * Generic error shown to users when an unknown error occurs\n *\n * Set an environment variable called `DEVELOPER_DISCORD_USERNAME` in your `.env` file to customize the contact name.\n */\nexport class GenericError extends CustomError {\n @Envapt('DEVELOPER_DISCORD_USERNAME')\n private readonly developerUsername: string = 'the developer';\n\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 ${this.developerUsername} with a way to reproduce the error and the following:\\n` +\n `### UUID: \\`${this.uuid}\\``\n );\n }\n}\n","import { SeedcordError, SeedcordErrorCode } from '@seedcord/services';\nimport { MessageFlags } from 'discord.js';\n\nimport { extractErrorResponse } from '@bUtilities/errors/extractErrorResponse';\n\nimport type { RepliableInteractionHandler } from '@interfaces/Handler';\n\n/**\n * Configuration options for the Catchable decorator.\n */\nexport interface CatchableOptions {\n /** Whether to log errors to console using console.error (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 SeedcordError(SeedcordErrorCode.DecoratorMethodNotFound);\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 } = extractErrorResponse(\n error,\n this.core,\n interaction.guild,\n interaction.user,\n interaction\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 { Catchable } from '@bDecorators/Catchable';\nimport { InteractionHandler, Repliables } from '@interfaces/Handler';\n\n/**\n * Default handler for unhandled interaction.\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 { InteractionMetadataKey, InteractionRoutes } from '@bDecorators/Interactions';\nimport { MiddlewareMetadataKey, MiddlewareType } from '@bDecorators/Middlewares';\nimport { buildSlashRoute } from '@bUtilities/miscellaneous/buildSlashRoute';\nimport { AutocompleteHandler, InteractionHandler, InteractionMiddleware } from '@interfaces/Handler';\nimport { areRoutes } from '@miscellaneous/areRoutes';\n\nimport { UnhandledEvent } from '../defaults/UnhandledEvent';\n\nimport type { MiddlewareMetadata } from '@bDecorators/Middlewares';\nimport type { Core } from '@interfaces/Core';\nimport type { HandlerConstructor, InteractionMiddlewareConstructor, 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\ninterface RegisteredMiddleware {\n readonly ctor: InteractionMiddlewareConstructor;\n readonly priority: number;\n}\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 | RegExp>();\n\n private readonly middlewares: RegisteredMiddleware[] = [];\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 const middlewareDir = this.core.config.bot.interactions.middlewares;\n if (middlewareDir) {\n this.logger.info(`${chalk.bold(middlewareDir)} ${chalk.gray('(middlewares)')}`);\n await this.loadMiddlewares(middlewareDir);\n }\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.middlewares.length)} middlewares`);\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)) continue;\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 this.logger\n );\n }\n\n private async loadMiddlewares(dir: string): Promise<void> {\n await traverseDirectory(\n dir,\n (_fullPath, relativePath, imported) => {\n for (const val of Object.values(imported)) {\n if (!this.isMiddlewareClass(val)) continue;\n const metadata = Reflect.getMetadata(MiddlewareMetadataKey, val) as MiddlewareMetadata | undefined;\n if (metadata?.type !== MiddlewareType.Interaction) continue;\n\n this.registerMiddleware(val, metadata, relativePath);\n }\n },\n this.logger\n );\n }\n\n private registerMiddleware(\n middlewareCtor: InteractionMiddlewareConstructor,\n metadata: MiddlewareMetadata,\n relativePath: string\n ): void {\n const alreadyRegistered = this.middlewares.some((entry) => entry.ctor === middlewareCtor);\n if (alreadyRegistered) return;\n\n this.middlewares.push({ ctor: middlewareCtor, priority: metadata.priority });\n this.middlewares.sort((a, b) => a.priority - b.priority);\n\n this.logger.info(\n `${chalk.italic('Registered middleware')} ${chalk.bold.yellow(middlewareCtor.name)} ${chalk.gray(`(priority ${metadata.priority})`)} from ${chalk.gray(relativePath)}`\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 isMiddlewareClass(obj: unknown): obj is InteractionMiddlewareConstructor {\n if (typeof obj !== 'function') return false;\n return obj.prototype instanceof InteractionMiddleware && Reflect.hasMetadata(MiddlewareMetadataKey, obj);\n }\n\n private registerHandler(handlerClass: HandlerConstructor): void {\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.core.bot.emit('any:interaction', interaction);\n this.handleInteraction(interaction).catch((err: Error) => {\n this.logger.error(`[${chalk.bold.red('UNHANDLED ERROR AT ROOT')}] ${err.name}`, err.stack);\n this.core.bot.emit('error:unhandled:interaction', err);\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 // Check if the key is in the ignore list\n if (\n [...this.keysToIgnore].some((pattern) =>\n typeof pattern === 'string' ? pattern === key : pattern.test(key)\n )\n ) {\n return;\n }\n\n // Run middlewares first\n for (const { ctor } of this.middlewares) {\n const middleware = new ctor(interaction as Repliables, this.core, args);\n if (middleware.hasChecks()) await middleware.runChecks();\n if (middleware.shouldBreak() || middleware.hasErrors()) return;\n\n await middleware.execute();\n if (middleware.shouldBreak() || 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 = 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 = 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","import { SeedcordError, SeedcordErrorCode, StrictEventEmitter } from '@seedcord/services';\nimport chalk from 'chalk';\n\nimport type { Core } from './Core';\nimport type {\n SENoEvents,\n CoordinatedShutdown,\n CoordinatedStartup,\n Logger,\n StartupPhase,\n SEEventMapLike\n} 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<TPluginEvents extends SEEventMapLike<TPluginEvents> = SENoEvents>\n extends StrictEventEmitter<TPluginEvents>\n implements Initializeable\n{\n /** Logger instance for this plugin - must be implemented by subclasses */\n public abstract logger: Logger;\n\n constructor(protected pluggable: Core) {\n super();\n }\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 * @typeParam 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 * @typeParam 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 TPluggableEvents extends SEEventMapLike<TPluggableEvents> = SENoEvents\n> extends StrictEventEmitter<TPluggableEvents> {\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 super();\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 A {@link SeedcordError} 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) {\n throw new SeedcordError(SeedcordErrorCode.CorePluginAfterInit);\n }\n if ((this as Record<string, unknown>)[key]) {\n throw new SeedcordError(SeedcordErrorCode.CorePluginKeyExists, [key]);\n }\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 { Logger } from '@seedcord/services';\nimport chalk from 'chalk';\n\nimport type { Core } from '@interfaces/Core';\n\nconst emojiStorage: Record<string, string> = {};\n\n/**\n * Emoji mapping interface. Augment this to add your project's emoji keys. Make sure to provide the same keys when configuring emojis in your bot config.\n *\n * @example\n * ```ts\n * declare module 'seedcord' {\n * interface EmojiMap {\n * ThumbsUp: string;\n * ThumbsDown: string;\n * Lol: string;\n * Kek: string;\n * }\n * }\n * ```\n *\n * @example\n * ```ts\n * // Or extend it directly\n * declare module 'seedcord' {\n * export interface EmojiMap extends MyEmojiMap {}\n * }\n * ```\n *\n * @example\n * ```ts\n * // Then, import and use it anywhere in your app\n * import { Emojis } from 'seedcord';\n *\n * console.log(Emojis.ThumbsUp); // '<:thumbsup:1872389747982323423>'\n * ```\n */\nexport interface EmojiMap {}\n\n/**\n * Global emoji mappings object\n *\n * @see {@link EmojiMap}\n */\nexport const Emojis = emojiStorage as EmojiMap;\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 this.clearEmojis();\n\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 if (typeof emojiName !== 'string') {\n this.logger.warn(\n `${chalk.bold.yellow('Invalid')}: ${chalk.magenta.bold(String(key))} (expected string, received ${typeof emojiName})`\n );\n return;\n }\n\n const emoji = this.core.bot.client.application?.emojis.cache.find((e) => e.name === emojiName);\n\n if (emoji) {\n emojiStorage[key] = `<${emoji.identifier}>`;\n foundCount++;\n\n this.logger.debug(`${chalk.bold.green('Found')}: ${chalk.magenta.bold(emojiName)} (${emoji.id})`);\n\n return;\n }\n\n emojiStorage[key] = emojiName;\n this.logger.warn(\n `${chalk.bold.yellow('Missing')}: ${chalk.magenta.bold(emojiName)} (using configured value)`\n );\n });\n\n this.logger.info(`${chalk.bold.green('Loaded')}: ${chalk.magenta.bold(foundCount)} emoji(s)`);\n }\n\n private clearEmojis(): void {\n for (const key of Object.keys(emojiStorage)) Reflect.deleteProperty(emojiStorage, key);\n }\n}\n","import { Logger, SeedcordError, SeedcordErrorCode, ShutdownPhase } from '@seedcord/services';\nimport chalk from 'chalk';\nimport { Client, ClientEvents, Interaction } from 'discord.js';\nimport { Envapt } from 'envapt';\n\nimport { CommandRegistry } from '@bControllers/CommandRegistry';\nimport { EventController } from '@bControllers/EventController';\nimport { InteractionController } from '@bControllers/InteractionController';\nimport { Plugin } from '@interfaces/Plugin';\n\nimport { EmojiInjector, Emojis, type EmojiMap } from './injectors/EmojiInjector';\n\nimport type { Core } from '@interfaces/Core';\n\n/**\n * Bot event types\n */\nexport interface BotEvents {\n 'error:unhandled:interaction': [error: Error];\n 'error:unhandled:event': [error: Error];\n 'any:event': { [K in keyof ClientEvents]: [K, ...ClientEvents[K]] }[keyof ClientEvents];\n 'any:interaction': [interaction: Interaction];\n}\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<BotEvents> {\n @Envapt<string>('DISCORD_BOT_TOKEN', {\n converter(raw, _fallback) {\n if (typeof raw !== 'string') {\n throw new SeedcordError(SeedcordErrorCode.ConfigMissingDiscordToken);\n }\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 public readonly emojis: EmojiMap = Emojis;\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(core);\n this.emojiInjector = new EmojiInjector(core);\n\n 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.interactions.init();\n await this.events.init();\n\n await this.login();\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 /**\n * Emits with correlation between a Discord event key and its exact arg tuple.\n *\n * @typeParam TKey - Discord event name\n * @param event - Must be the literal `any:event`\n * @param name - Concrete Discord event name\n * @param args - Exact tuple for that Discord event\n */\n override emit<TKey extends keyof ClientEvents>(\n event: 'any:event',\n name: TKey,\n ...args: ClientEvents[TKey]\n ): boolean;\n\n /**\n * Fallback for other BotEvents keys.\n *\n * @typeParam TEventKey - Bot event key\n * @param event - Bot event key\n * @param args - Tuple payload for the key\n */\n override emit<TEventKey extends keyof BotEvents>(event: TEventKey, ...args: BotEvents[TEventKey]): boolean;\n\n override emit(event: string, ...args: unknown[]): boolean {\n return super.emit(event as never, ...(args as never));\n }\n}\n","import type { EffectKeys } from '../types/Effects';\nimport type { EventFrequency } from '@miscellaneous/types';\nimport type { Constructor } from 'type-fest';\n\n/**\n * Metadata key used to store effect handler information\n *\n * @internal\n */\nexport const EffectMetadataKey = Symbol('effect:metadata');\n\n/**\n * Options accepted by the `@RegisterEffect` decorator.\n */\nexport interface RegisterEffectOptions {\n /** Frequency: `'once'` or `'on'`. Defaults to `'on'`. */\n readonly frequency?: EventFrequency | undefined;\n}\n\n/**\n * Metadata entry representing a registered effect handler.\n *\n * @internal\n */\nexport interface RegisterEffectMetadataEntry {\n /** The effect event name to register for. */\n readonly effect: EffectKeys;\n /** Frequency: `'once'` or `'on'`. Defaults to `'on'`. */\n readonly frequency?: EventFrequency | undefined;\n}\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 * @typeParam TEffect - The side effect event name to register for\n * @param effect - The side effect event name to register for\n * @param options - Options to configure the effect handler registration.\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 * @example\n * ```ts\n * \\@RegisterEffect('userJoin', { frequency: 'once' })\n * // or\n * \\@RegisterEffect('userJoin')\n * ```\n */\nexport function RegisterEffect<TEffect extends EffectKeys>(effect: TEffect, options?: RegisterEffectOptions) {\n return function (constructor: Constructor<unknown>): void {\n const meta: RegisterEffectMetadataEntry = {\n effect,\n frequency: options?.frequency\n };\n\n Reflect.defineMetadata(EffectMetadataKey, meta, constructor);\n };\n}\n","import type { EffectKeys, AllEffects } from './types/Effects';\nimport type { Core } from '@interfaces/Core';\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 { EffectKeys, AllEffects } from '../types/Effects';\nimport type { Core } from '@interfaces/Core';\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 by implementing the webhook property.\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 { Logger, SeedcordError, SeedcordErrorCode } from '@seedcord/services';\nimport { filterCirculars } from '@seedcord/utils';\nimport { WebhookClient, AttachmentBuilder, SeparatorSpacingSize, DiscordAPIError, SnowflakeUtil } from 'discord.js';\nimport { Envapt } from 'envapt';\n\nimport { BuilderComponent } from '@interfaces/Components';\n\nimport { WebhookLog } from '../bases/WebhookLog';\nimport { RegisterEffect } from '../decorators/RegisterEffect';\nimport { AllEffects } from '../types/Effects';\n\nfunction webhookUrlValidator(raw: unknown, _fallback: unknown): string {\n if (raw === null) {\n throw new SeedcordError(SeedcordErrorCode.ConfigUnknownExceptionWebhookMissing);\n }\n if (typeof raw !== 'string') {\n throw new SeedcordError(SeedcordErrorCode.ConfigUnknownExceptionWebhookInvalid);\n }\n\n const value = raw.trim();\n if (value === '') {\n throw new SeedcordError(SeedcordErrorCode.ConfigUnknownExceptionWebhookMissing);\n }\n\n const pattern = String.raw`^https?:\\/\\/(?:canary\\.|ptb\\.)?discord(?:app)?\\.com\\/api\\/webhooks\\/\\d+\\/[\\w$-]+$`;\n const discordWebhookRegex = new RegExp(pattern);\n\n if (!URL.canParse(value) || !discordWebhookRegex.test(value)) {\n throw new SeedcordError(SeedcordErrorCode.ConfigUnknownExceptionWebhookInvalid);\n }\n\n return value;\n}\n\n/**\n * Default effect to log unhandled exceptions via webhook. It provides basic information about the error:\n * - Error stack trace\n * - Guild ID and name (if applicable)\n * - User ID and username (if applicable)\n * - A unique UUID for tracking\n * - Timestamps comparing interaction time and error log time (if applicable)\n * - Metadata associated with the error (if provided)\n *\n * Developers need to set the UNKNOWN_EXCEPTION_WEBHOOK_URL environment variable in their .env file otherwise this effect will throw an error during initialization.\n *\n * @throws A {@link SeedcordError} if UNKNOWN_EXCEPTION_WEBHOOK_URL is not set or is invalid\n */\n@RegisterEffect('unknownException')\nexport class UnknownException extends WebhookLog<'unknownException'> {\n private static readonly logger = new Logger('Effect: UnknownException');\n\n @Envapt('UNKNOWN_EXCEPTION_WEBHOOK_URL', {\n converter: (raw, fallback) => webhookUrlValidator(raw, fallback)\n })\n declare static readonly unknownExceptionWebhookUrl: string;\n\n webhook = new WebhookClient({\n url: UnknownException.unknownExceptionWebhookUrl\n });\n\n async execute(): Promise<void> {\n const metadataFile = this.prepareMetadataFile();\n\n try {\n await this.webhook.send({\n flags: 'IsComponentsV2',\n withComponents: true,\n username: 'Unknown Exception',\n avatarURL:\n 'https://cdn.discordapp.com/attachments/1351446034827579466/1351446912947191830/warning-2.png',\n components: [new UnhandledErrorContainer(this.data).component],\n files: metadataFile ? [metadataFile] : []\n });\n } catch (error) {\n UnknownException.logger.error('Failed to send unknown exception webhook', error);\n }\n }\n\n private prepareMetadataFile(): AttachmentBuilder | null {\n const { metadata } = this.data;\n if (!metadata) return null;\n\n const content = filterCirculars(metadata);\n return new AttachmentBuilder(Buffer.from(JSON.stringify(content, undefined, 2), 'utf-8'), {\n name: 'metadata.json',\n description: 'Metadata associated with the error'\n });\n }\n}\n\nclass DefaultSeparator extends BuilderComponent<'separator'> {\n constructor() {\n super('separator');\n\n this.instance.setSpacing(SeparatorSpacingSize.Small).setDivider(true);\n }\n}\nclass UnhandledErrorContainer extends BuilderComponent<'container'> {\n constructor(data: AllEffects['unknownException']) {\n super('container');\n\n const { uuid, error, guild, user, metadata } = data;\n\n this.instance\n .addTextDisplayComponents((text) =>\n text.setContent(\n `### An unknown exception was thrown\\n` +\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 )\n )\n .addSeparatorComponents(new DefaultSeparator().component)\n .addTextDisplayComponents((text) => text.setContent(`### UUID \\`${uuid}\\`\\n\\`\\`\\`${error.stack}\\`\\`\\``));\n\n this.addTimestampsIfAvailable(error);\n this.addMetadataIfAvailable(metadata);\n }\n\n private addTimestampsIfAvailable(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\n .addSeparatorComponents(new DefaultSeparator().component)\n .addTextDisplayComponents((text) =>\n text.setContent(\n `### Timestamps\\n` +\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 )\n );\n }\n\n private addMetadataIfAvailable(metadata: unknown): void {\n if (!metadata) return;\n\n this.instance\n .addSeparatorComponents(new DefaultSeparator().component)\n .addTextDisplayComponents((text) => text.setContent('### Metadata'))\n .addFileComponents((file) => file.setURL('attachment://metadata.json'));\n }\n}\n","import { EventEmitter } from 'node: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 *\n * @internal\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';\n\nimport { EffectMetadataKey } from './decorators/RegisterEffect';\nimport { UnknownException } from './default/UnknownException';\nimport { EffectsEmitter } from './EffectsEmitter';\nimport { EffectsHandler } from './EffectsHandler';\n\nimport type { RegisterEffectMetadataEntry } from './decorators/RegisterEffect';\nimport type { AllEffects, EffectKeys } from './types/Effects';\nimport type { Core } from '@interfaces/Core';\nimport type { EventFrequency } from '@miscellaneous/types';\nimport type { TypedConstructor } from '@seedcord/types';\n\ntype EffectConstructor = TypedConstructor<typeof EffectsHandler>;\ninterface RegisteredEffectHandlerEntry {\n ctor: EffectConstructor;\n frequency: EventFrequency;\n}\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, RegisteredEffectHandlerEntry[]>();\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, { effect: 'unknownException', frequency: 'on' });\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 meta = Reflect.getMetadata(EffectMetadataKey, val) as RegisterEffectMetadataEntry;\n this.registerEffect(val, meta);\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 registerEffect(handler: EffectConstructor, options: RegisterEffectMetadataEntry): void {\n let handlers = this.effectsMap.get(options.effect);\n if (!handlers) {\n handlers = [];\n this.effectsMap.set(options.effect, handlers);\n }\n handlers.push({ ctor: handler, frequency: options.frequency ?? 'on' });\n }\n\n private isEffectHandler(obj: unknown): obj is EffectConstructor {\n if (typeof obj !== 'function') return false;\n return obj.prototype instanceof EffectsHandler && Reflect.hasMetadata(EffectMetadataKey, obj);\n }\n\n private attachEffects(): void {\n for (const [effectName, handlerEntries] of this.effectsMap) {\n for (const entry of handlerEntries) {\n const register =\n entry.frequency === 'once'\n ? this.emitter.once.bind(this.emitter)\n : this.emitter.on.bind(this.emitter);\n register(effectName, (data) => {\n try {\n const instance = new entry.ctor(data, this.core);\n void instance.execute();\n } catch (err) {\n this.logger.error(\n `Error in side effect ${String(effectName)} handler ${entry.ctor.name}:`,\n err\n );\n }\n });\n }\n }\n }\n\n public override emit<KeyOfEffects extends EffectKeys>(\n event: KeyOfEffects,\n data: AllEffects[KeyOfEffects]\n ): boolean {\n return this.emitter.emit(event, data);\n }\n}\n","import {\n HealthCheck,\n CoordinatedShutdown,\n CoordinatedStartup,\n SeedcordError,\n SeedcordErrorCode,\n StartupPhase\n} 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 SeedcordError} 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 SeedcordError(SeedcordErrorCode.CoreSingletonViolation);\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\n/**\n * Constructor type for handler classes.\n *\n * @internal\n */\nexport type 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 * @typeParam TypeHandler - The type of the handler class being decorated\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 implements WithChecks {\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","import { SeedcordError, SeedcordErrorCode } from '@seedcord/services';\nimport { Message } from 'discord.js';\n\nimport { extractErrorResponse } from '@bUtilities/errors/extractErrorResponse';\n\nimport type { CustomError } from '@interfaces/Components';\nimport type { EventHandler, RepliableEventHandler } from '@interfaces/Handler';\nimport type { ClientEvents } from 'discord.js';\nimport type { NonEmptyTuple } from 'type-fest';\n\n/**\n * Configuration options for the EventCatchable decorator.\n */\nexport interface EventCatchableOptions {\n /** Whether to log errors to console using console.error (default: `false`) */\n log?: boolean;\n /**\n * Whether to fail silently without trying to send a message (default: `false`).\n *\n * Can pass a list of {@link CustomError} types to only silence those specific errors.\n */\n silent?: boolean | NonEmptyTuple<typeof CustomError>;\n}\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 options - Configuration for error handling behavior\n * @see {@link EventCatchableOptions}\n * @decorator\n * @example\n * ```typescript\n * class MessageHandler extends EventHandler {\n * \\@EventCatchable({ log: true, silent: [MyCustomError] })\n * async execute() {\n * // Event handling logic\n * }\n * }\n * ```\n */\nexport function EventCatchable(options?: EventCatchableOptions) {\n return function (\n _target: RepliableEventHandler,\n _prop: string,\n descriptor: TypedPropertyDescriptor<(...args: any[]) => Promise<void>>\n ): void {\n const log = options?.log ?? false;\n const silent = options?.silent ?? false;\n const original = descriptor.value;\n\n descriptor.value = async function (this: EventHandler<keyof ClientEvents>, ...args: any[]): Promise<void> {\n if (!original) throw new SeedcordError(SeedcordErrorCode.DecoratorMethodNotFound);\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 if (typeof silent === 'boolean' && silent) return;\n if (typeof silent !== 'boolean' && silent.some((errorType) => err instanceof errorType)) {\n return;\n }\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 } = extractErrorResponse(\n err,\n this.core,\n msg?.guild ?? null,\n msg?.author ?? null,\n eventArgs\n );\n\n if (!msg) return;\n\n await msg.reply({ embeds: [response], components: [] });\n }\n };\n };\n}\n","import { SeedcordError, SeedcordErrorCode } from '@seedcord/services';\nimport { ComponentType } from 'discord.js';\n\nimport type {\n ConfirmableFactory,\n ConfirmableContext,\n ConfirmableOptions,\n ConfirmableComponentsV2Options,\n ConfirmableClassicOptions,\n ResolverSource,\n CustomIdSource,\n ConfirmablePayload,\n RowLike,\n ClassicPayload,\n OutcomeUiV2,\n OutcomeUiClassic,\n QuestionInput,\n ComponentInteractionFor,\n MaybeClearedClassic\n} from './types';\nimport type { Repliables, RepliableInteractionHandler } from '@interfaces/Handler';\nimport type { MessageComponentType, MessageComponentInteraction, Message } from 'discord.js';\nimport type { Promisable, NonEmptyTuple } from 'type-fest';\n\n/* utils */\n\nconst resolveFactory = async <TValue>(input: ConfirmableFactory<TValue>, ctx: ConfirmableContext): Promise<TValue> =>\n typeof input === 'function' ? await (input as (c: ConfirmableContext) => Promisable<TValue>)(ctx) : input;\n\nconst isV2 = <TComponentType extends MessageComponentType>(\n opts: ConfirmableOptions<TComponentType>\n): opts is ConfirmableComponentsV2Options<TComponentType> => 'container' in opts;\n\nconst usesResolver = <TComponentType extends MessageComponentType>(\n opts: ConfirmableOptions<TComponentType>\n): opts is\n | (ConfirmableClassicOptions<TComponentType> & ResolverSource<TComponentType>)\n | (ConfirmableComponentsV2Options<TComponentType> & ResolverSource<TComponentType>) => 'resolveDecision' in opts;\n\nconst usesCustomIds = <TComponentType extends MessageComponentType>(\n opts: ConfirmableOptions<TComponentType>\n): opts is ConfirmableOptions<TComponentType> & CustomIdSource => 'confirmCustomIds' in opts;\n\nconst isMessageComponentIx = (ix: Repliables): ix is Repliables & MessageComponentInteraction =>\n 'deferUpdate' in ix && 'customId' in ix;\n\n/* payload builders */\n\nconst buildPrompt = async <TComponentType extends MessageComponentType>(\n opts: ConfirmableOptions<TComponentType>,\n ctx: ConfirmableContext\n): Promise<ConfirmablePayload> => {\n if (isV2(opts)) {\n const container = await resolveFactory(opts.container, ctx);\n return { flags: 'IsComponentsV2', components: [container.component] };\n }\n\n const prompt = await resolveFactory(opts.prompt, ctx);\n const rows = await resolveFactory(opts.rows, ctx);\n const components = [...rows] as NonEmptyTuple<RowLike>;\n\n const payload: ClassicPayload = { components };\n\n if (typeof prompt === 'string') payload.content = prompt;\n else payload.embeds = [prompt.component];\n\n return payload;\n};\n\nconst clearedPayload = <TComponentType extends MessageComponentType>(\n opts: ConfirmableOptions<TComponentType>\n): ConfirmablePayload =>\n isV2(opts) ? { flags: 'IsComponentsV2', components: [] } : { components: [] as readonly RowLike[] };\n\n/* decision */\n\nconst decide = async <TComponentType extends MessageComponentType>(\n opts: ConfirmableOptions<TComponentType>,\n i: MessageComponentInteraction\n): Promise<boolean> => {\n if (usesResolver(opts)) return opts.resolveDecision(i as ComponentInteractionFor<TComponentType>);\n if (usesCustomIds(opts)) {\n const { confirmCustomIds, cancelCustomIds = [] } = opts;\n if (confirmCustomIds.includes(i.customId)) return true;\n if (cancelCustomIds.includes(i.customId)) return false;\n }\n return false;\n};\n\n/* flow helpers */\n\nconst shouldDefer = <TComponentType extends MessageComponentType>(\n ix: Repliables,\n opts: ConfirmableOptions<TComponentType>,\n isSlash: boolean,\n isContext: boolean\n): boolean => {\n if (ix.deferred) return false;\n if (opts.defer === false) return false;\n return isSlash || isContext;\n};\n\nconst maybeDefer = async <TComponentType extends MessageComponentType>(\n ix: Repliables,\n opts: ConfirmableOptions<TComponentType>,\n isSlash: boolean,\n isContext: boolean\n): Promise<void> => {\n if (!shouldDefer(ix, opts, isSlash, isContext)) return;\n\n if (isSlash || isContext) {\n const { ephemeral = true } = opts;\n const flags = ephemeral ? { flags: 'Ephemeral' as const } : undefined;\n if (flags) await ix.deferReply(flags);\n else await ix.deferReply();\n } else if (isMessageComponentIx(ix)) {\n await ix.deferUpdate();\n } else {\n await ix.deferReply().catch(() => undefined);\n }\n};\n\nconst sendPrompt = async (\n ix: Repliables,\n payload: ConfirmablePayload,\n ephemeral: boolean,\n isSlash: boolean,\n isContext: boolean\n): Promise<Message> => {\n if (isSlash || isContext) {\n if (ix.deferred) return ix.editReply(payload as Parameters<typeof ix.editReply>[0]);\n const reply = { ...payload, ...(ephemeral ? { flags: 'Ephemeral' } : {}) } as Parameters<typeof ix.reply>[0];\n await ix.reply(reply);\n return ix.fetchReply();\n }\n\n const follow = { ...payload, ...(ephemeral ? { flags: 'Ephemeral' } : {}) } as Parameters<typeof ix.followUp>[0];\n return ix.followUp(follow);\n};\n\nconst awaitComponent = async <TComponentType extends MessageComponentType>(\n msg: Message,\n original: Repliables,\n opts: ConfirmableOptions<TComponentType>\n): Promise<{ button: MessageComponentInteraction | null; timedOut: boolean }> => {\n const componentType = opts.componentType ?? ComponentType.Button;\n const timeoutMs = opts.timeoutMs ?? 10_000;\n\n try {\n const button = await msg.awaitMessageComponent({\n componentType,\n time: timeoutMs,\n filter: (c) => {\n if (c.user.id !== original.user.id) return false;\n if (usesCustomIds(opts)) {\n const { confirmCustomIds, cancelCustomIds = [] } = opts;\n return confirmCustomIds.includes(c.customId) || cancelCustomIds.includes(c.customId);\n }\n return true;\n }\n });\n return { button, timedOut: false };\n } catch {\n return { button: null, timedOut: true };\n }\n};\n\nconst clearUi = async <TComponentType extends MessageComponentType>(\n ix: Repliables,\n msg: Message,\n opts: ConfirmableOptions<TComponentType>,\n isSlash: boolean\n): Promise<void> => {\n if (!isSlash) {\n try {\n await msg.edit(clearedPayload(opts) as Parameters<typeof msg.edit>[0]);\n } catch {\n await ix.deleteReply(msg).catch(() => undefined);\n }\n return;\n }\n await ix.editReply(clearedPayload(opts) as Parameters<typeof ix.editReply>[0]).catch(() => undefined);\n};\n\nconst normalizeClassicOutcome = (payload: MaybeClearedClassic): ClassicPayload => ({\n ...payload,\n components: payload.components ?? []\n});\n\nconst outcomeReplacement = async <TComponentType extends MessageComponentType>(\n opts: ConfirmableOptions<TComponentType>,\n ctx: ConfirmableContext,\n confirmed: boolean,\n timedOut: boolean\n): Promise<ConfirmablePayload | null> => {\n const outcomes = opts.outcomeUi;\n\n if (isV2(opts)) {\n const v2Outcomes = outcomes as OutcomeUiV2;\n if (timedOut) return await resolveFactory(v2Outcomes.onTimeout, ctx);\n if (!confirmed) return await resolveFactory(v2Outcomes.onCancel, ctx);\n if (v2Outcomes.onConfirm) return await resolveFactory(v2Outcomes.onConfirm, ctx);\n return null;\n }\n\n const classicOutcomes = outcomes as OutcomeUiClassic;\n if (timedOut) return normalizeClassicOutcome(await resolveFactory(classicOutcomes.onTimeout, ctx));\n if (!confirmed) return normalizeClassicOutcome(await resolveFactory(classicOutcomes.onCancel, ctx));\n if (classicOutcomes.onConfirm) {\n return normalizeClassicOutcome(await resolveFactory(classicOutcomes.onConfirm, ctx));\n }\n return null;\n};\n\n/* decorator */\n\n/**\n * Wraps a repliable handler method with an interactive confirmation flow.\n *\n * Displays a prompt, waits for a follow-up component interaction, and conditionally executes the original method\n * based on the user's decision. The decorator supports both classic action rows + embed/content and ComponentV2 containers.\n *\n * @typeParam TComp - Message component type that should resolve the confirmation.\n * @param question - Static string or lazy factory that resolves the prompt question.\n * @param options - Confirmation flow configuration.\n * @decorator\n */\nexport function Confirmable<TComponent extends MessageComponentType = ComponentType.Button>(\n question: QuestionInput,\n options: ConfirmableOptions<TComponent>\n) {\n type HandlerMethod = (...args: unknown[]) => Promise<void>;\n\n return function (\n _target: RepliableInteractionHandler,\n _propertyKey: string,\n descriptor: TypedPropertyDescriptor<HandlerMethod>\n ): TypedPropertyDescriptor<HandlerMethod> {\n const original = descriptor.value;\n\n descriptor.value = async function (this: RepliableInteractionHandler, ...args: unknown[]): Promise<void> {\n if (!original) throw new SeedcordError(SeedcordErrorCode.DecoratorMethodNotFound);\n\n const ix = this.getEvent();\n const isSlash = ix.isChatInputCommand();\n const isContext = ix.isContextMenuCommand();\n const { ephemeral = true } = options;\n\n await maybeDefer(ix, options, isSlash, isContext);\n\n const q = typeof question === 'function' ? await question.apply(this) : question;\n\n const ctx: ConfirmableContext = { handler: this, interaction: ix, question: q };\n\n const prompt = await buildPrompt(options, ctx);\n\n const promptMsg = await sendPrompt(ix, prompt, ephemeral, isSlash, isContext);\n\n const { button, timedOut } = await awaitComponent(promptMsg, ix, options);\n\n let confirmed = false;\n if (button) {\n await button.deferUpdate().catch(() => undefined);\n confirmed = await decide(options, button);\n }\n\n const replacement = await outcomeReplacement(options, ctx, confirmed, timedOut);\n\n if (replacement) {\n if (isSlash || isContext) {\n await ix.editReply(replacement as Parameters<typeof ix.editReply>[0]).catch(() => undefined);\n } else {\n await promptMsg.edit(replacement as Parameters<typeof promptMsg.edit>[0]).catch(async () => {\n await ix.deleteReply(promptMsg).catch(() => undefined);\n await ix.followUp(replacement as Parameters<typeof ix.followUp>[0]).catch(() => undefined);\n });\n }\n } else {\n await clearUi(ix, promptMsg, options, isSlash);\n }\n\n if (options.onResolved) {\n await options.onResolved({\n confirmed,\n timedOut,\n handler: this,\n interaction: ix,\n question: q,\n ...(button ? { button } : {})\n });\n }\n\n if (confirmed) {\n await original.apply(this, args);\n }\n };\n\n return descriptor;\n };\n}\n","import { CustomError } from '@interfaces/Components';\n\n/**\n * Error thrown when a requested channel cannot be found.\n */\nexport class ChannelNotFoundError extends CustomError {\n /**\n * Creates a new ChannelNotFoundError.\n *\n * @param message - The error message\n * @param channelId - The ID of the channel that could not be found\n */\n constructor(\n message: string,\n public readonly channelId: string\n ) {\n super(message);\n\n this.response.setDescription(`Channel with ID \\`${this.channelId}\\` not found.`);\n }\n}\n\n/**\n * Error thrown when the bot cannot send embeds in a channel.\n */\nexport class CannotSendEmbedsError extends CustomError {\n /**\n * Creates a new CannotSendEmbedsError.\n *\n * @param message - The error message\n * @param channelId - The ID of the channel where embeds cannot be sent\n */\n constructor(\n message: string,\n public readonly channelId: string\n ) {\n super(message);\n\n this.response.setDescription(\n `Cannot send embeds in <#${this.channelId}>.\\n\\n` +\n `Please ensure I have the following permissions:\\n` +\n `• View Channel\\n` +\n `• Send Messages\\n` +\n `• Embed Links\\n` +\n `• Attach Files\\n` +\n `• Read Message History\\n` +\n `• Use External Emojis\\n`\n );\n }\n}\n\n/**\n * Error thrown when a channel could not be found or accessed.\n */\nexport class CouldNotFindChannel extends CustomError {\n /**\n * Creates a new CouldNotFindChannel error.\n *\n * @param message - The error message\n * @param channelId - The ID of the channel that could not be found\n */\n constructor(\n message: string,\n public readonly channelId: string\n ) {\n super(message);\n\n this.response.setDescription(\n `Could not find channel with ID \\`${this.channelId}\\`. It could also be that the channel is not a text channel.`\n );\n }\n}\n\n/**\n * Error thrown when a channel is not a text channel.\n */\nexport class ChannelNotTextChannel extends CustomError {\n /**\n * Creates a new ChannelNotTextChannel error.\n *\n * @param message - The error message\n * @param channelId - The ID of the channel that is not a text channel\n */\n constructor(\n message: string,\n public readonly channelId: string\n ) {\n super(message);\n\n this.response.setDescription(`Channel with ID \\`${this.channelId}\\` is not a text channel.`);\n }\n}\n","import { Role } from 'discord.js';\n\nimport { CustomError } from '@interfaces/Components';\n\nimport type { TextChannel } from 'discord.js';\n\n/**\n * Error thrown when the bot lacks necessary permissions to perform an action.\n */\nexport class MissingPermissions extends CustomError {\n /**\n * Creates a new BotMissingPermissionsError.\n *\n * @param message - The error message\n * @param missingPerms - Array of missing permission names\n * @param roleOrChannel - The role or channel where permissions are missing\n */\n constructor(\n message: string,\n public missingPerms: string[],\n public roleOrChannel: Role | TextChannel\n ) {\n super(message);\n\n const missing = this.missingPerms.map((perm) => `• ${perm}`).join('\\n');\n\n const errorSubtext =\n this.roleOrChannel instanceof Role\n ? `My role, <@&${this.roleOrChannel.id}>, is missing the following permissions:`\n : `I am missing the following permissions in <#${this.roleOrChannel.id}>:`;\n\n this.response.setDescription(\n `${errorSubtext}\\n\\nPlease ensure I have the following missing permission(s):\\n${missing}`\n );\n }\n}\n\n/**\n * Error thrown when attempting to modify a role higher than the bot's highest role.\n */\nexport class RoleHigherThanMe extends CustomError {\n /**\n * Creates a new RoleHigherThanMe error.\n *\n * @param message - The error message\n */\n constructor(\n message: string,\n public role: Role,\n public botRole: Role\n ) {\n super(message);\n\n this.response.setDescription(\n `I cannot assign a role that is higher than me.\\n\\n` +\n `The role <@&${this.role.id}> is higher than my role <@&${this.botRole.id}> in the hierarchy.`\n );\n }\n}\n\n/**\n * Error thrown when attempting to assign a managed/bot role.\n */\nexport class CannotAssignBotRole extends CustomError {\n /**\n * Creates a new CannotAssignBotRole error.\n *\n * @param message - The error message\n */\n constructor(message = 'I cannot assign a managed role.') {\n super(message);\n\n this.response.setDescription('I cannot assign a managed role.');\n }\n}\n\n/**\n * Error thrown when a requested role does not exist.\n */\nexport class RoleDoesNotExist extends CustomError {\n /**\n * Creates a new RoleDoesNotExist error.\n *\n * @param message - The error message\n * @param roleId - The ID of the role that doesn't exist\n */\n constructor(\n message: string,\n public roleId: string\n ) {\n super(message);\n\n this.response.setDescription(`The role with ID \\`${this.roleId}\\` does not exist.`);\n }\n}\n\n/**\n * Error thrown when a role has dangerous permissions that shouldn't be assigned.\n */\nexport class HasDangerousPermissions extends CustomError {\n /**\n * Creates a new HasDangerousPermissions error.\n *\n * @param message - The error message\n * @param role - The role with dangerous permissions\n * @param dangerousPerms - Array of dangerous permission names\n */\n constructor(\n message: string,\n public role: Role,\n public dangerousPerms: string[]\n ) {\n super(message);\n\n const dangerous = this.dangerousPerms.map((perm) => `• ${perm}`).join('\\n');\n this.response.setDescription(\n `The role <@&${this.role.id}> has the following dangerous permissions:\\n\\n` +\n `Please ensure the following dangerous permission(s) are not enabled:\\n${dangerous}`\n );\n }\n}\n","import { CustomError } from '@interfaces/Components';\n\n/**\n * Error thrown when attempting to perform actions on a user not in the guild.\n */\nexport class UserNotInGuild extends CustomError {\n /**\n * Creates a new UserNotInGuild error.\n *\n * @param message - The error message\n */\n constructor(message = 'User is not in the guild.') {\n super(message);\n\n this.response.setDescription('User is not in the guild.');\n }\n}\n\n/**\n * Error thrown when a requested user cannot be found.\n */\nexport class UserNotFound extends CustomError {\n /**\n * Creates a new UserNotFound error.\n *\n * @param userArg - The user argument that could not be resolved\n */\n constructor(public readonly userArg: string) {\n super(`User not found: ${userArg}`);\n\n this.response\n .setTitle('User Not Found')\n .setDescription(\n `User probably doesn't exist or was deleted.\\n` +\n `**User Argument:** \\`${this.userArg}\\`\\n` +\n `Please check the user ID and try again. Only pass valid user IDs as the argument.`\n );\n }\n}\n","import { TextChannel } from 'discord.js';\n\nimport { CouldNotFindChannel } from '@bErrors/Channels';\n\nimport type { Nullable } from '@seedcord/types';\nimport type { Channel, Client, TextChannelResolvable } from 'discord.js';\n\n/**\n * Fetches and validates a text channel.\n *\n * @param client - The Discord client instance\n * @param channelId - Channel ID or TextChannel instance\n * @returns Promise resolving to the text channel\n * @throws A {@link CouldNotFindChannel} When the channel doesn't exist or isn't text-based\n */\nexport async function fetchText(client: Client, channelId: TextChannelResolvable): Promise<TextChannel> {\n if (channelId instanceof TextChannel) {\n return channelId;\n }\n\n let channel: Nullable<Channel> = client.channels.cache.get(channelId);\n\n if (!channel) {\n try {\n channel = await client.channels.fetch(channelId);\n } catch {\n throw new CouldNotFindChannel('Channel not found or not a text channel', channelId);\n }\n }\n\n if (channel?.isTextBased()) {\n return channel as TextChannel;\n }\n\n throw new CouldNotFindChannel('Channel not found or not a text channel', channelId);\n}\n","import { fetchText } from './fetchText';\n\nimport type { AtleastOneMessageComponent } from '@bUtilities/Types';\nimport type { Client, Message, TextChannelResolvable } from 'discord.js';\n\n/**\n * Sends a message to a text channel by ID.\n *\n * @param client - The Discord client instance\n * @param channelId - Channel ID or TextChannel instance\n * @param message - Message content to send\n * @returns Promise resolving to the sent message\n * @throws A {@link CouldNotFindChannel} When the channel doesn't exist or isn't text-based\n */\nexport async function sendInText(\n client: Client,\n channelId: TextChannelResolvable,\n message: AtleastOneMessageComponent\n): Promise<Message> {\n const channel = await fetchText(client, channelId);\n return await channel.send(message);\n}\n","import { Logger } from '@seedcord/services';\n\nimport { DatabaseError } from '@bErrors/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 Ctor - 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","import type { AtleastOneMessageComponent } from '@bUtilities/Types';\nimport type { Nullable } from '@seedcord/types';\nimport type { Message, User } from 'discord.js';\n\n/**\n * Sends a direct message to a user.\n *\n * @param user - The user to send the DM to\n * @param content - Message content with embeds, components, etc.\n * @returns Promise resolving to the sent message, or null if DM failed\n */\nexport async function attemptSendDM(user: User, content: AtleastOneMessageComponent): Promise<Nullable<Message>> {\n const payload = {\n ...(content.content !== undefined && { content: content.content }),\n ...(content.embeds !== undefined && { embeds: [...content.embeds] }),\n ...(content.components !== undefined && {\n components: [...content.components]\n })\n };\n\n try {\n return await user.send(payload);\n } catch {\n return null;\n }\n}\n","import { SeedcordError, SeedcordErrorCode } from '@seedcord/services';\nimport { prettify } from '@seedcord/utils';\nimport { Role, PermissionFlagsBits } from 'discord.js';\n\nimport { MissingPermissions, HasDangerousPermissions } from '@bErrors/Roles';\n\nimport type { Nullable, TypedExclude } from '@seedcord/types';\nimport type { Client, TextChannel, PermissionsBitField } from 'discord.js';\n\n/**\n * Map of permission bits to their prettified human-readable names.\n */\nexport const PermissionNames = new Map<bigint, string>(\n Object.entries(PermissionFlagsBits).map(([key, bit]) => [bit, prettify(key)])\n);\n\n/**\n * Defines the scope types for bot permission validation.\n */\nexport type BotPermissionScope = 'manage' | 'others' | 'all' | bigint[] | 'embed';\n\n/**\n * Defines the valid group types for permission checking, excluding 'all' and bigint[].\n */\nexport type BotPermissionScopeGroups = TypedExclude<BotPermissionScope, 'all' | bigint[]>;\n\n// TODO: Update perm groups so they make better sense\n/**\n * Predefined permission groups for different scopes.\n */\nexport const PERM_GROUPS: Record<BotPermissionScopeGroups, Map<bigint, string>> = {\n manage: new Map<bigint, string>([\n [PermissionFlagsBits.ManageChannels, 'Manage Channels'],\n [PermissionFlagsBits.ManageRoles, 'Manage Roles'],\n [PermissionFlagsBits.ManageWebhooks, 'Manage Webhooks'],\n [PermissionFlagsBits.ManageMessages, 'Manage Messages'],\n [PermissionFlagsBits.ManageNicknames, 'Manage Nicknames']\n ]),\n embed: new Map<bigint, string>([\n [PermissionFlagsBits.ViewChannel, 'View Channel'],\n [PermissionFlagsBits.SendMessages, 'Send Messages'],\n [PermissionFlagsBits.EmbedLinks, 'Embed Links'],\n [PermissionFlagsBits.AttachFiles, 'Attach Files'],\n [PermissionFlagsBits.UseExternalEmojis, 'Use External Emojis'],\n [PermissionFlagsBits.ReadMessageHistory, 'Read Message History']\n ]),\n others: new Map<bigint, string>([\n [PermissionFlagsBits.AddReactions, 'Add Reactions'],\n [PermissionFlagsBits.UseApplicationCommands, 'Use Application Commands']\n ])\n};\n\n/**\n * Checks permissions for a {@link Role}.\n *\n * @param client - The Discord client instance\n * @param roleOrChannel - Role to check permissions for\n * @param scope - Permission scope to validate\n * @param inverse - Whether to check for absence of permissions (role only). Defaults to false.\n * @throws A {@link MissingPermissions} When required permissions are missing\n * @throws A {@link HasDangerousPermissions} When role has dangerous permissions (if inverse is true)\n */\nexport function checkPermissions(\n client: Client,\n roleOrChannel: Role,\n scope: BotPermissionScope,\n inverse?: boolean\n): void;\n\n/**\n * Checks permissions for a {@link TextChannel}.\n *\n * @param client - The Discord client instance\n * @param roleOrChannel - TextChannel to check permissions for\n * @param scope - Permission scope to validate\n * @throws A {@link MissingPermissions} When required permissions are missing\n */\nexport function checkPermissions(client: Client, roleOrChannel: TextChannel, scope?: BotPermissionScope): void;\n\nexport function checkPermissions(\n client: Client,\n roleOrChannel: Role | TextChannel,\n scope: BotPermissionScope = 'all',\n inverse = false\n): void {\n let required: Map<bigint, string>;\n if (Array.isArray(scope)) {\n required = new Map();\n for (const bit of scope) {\n // Try finding the permission name in both groups\n const name = PermissionNames.get(bit);\n if (name) required.set(bit, name);\n }\n } else {\n switch (scope) {\n case 'manage':\n required = PERM_GROUPS.manage;\n break;\n case 'embed':\n required = PERM_GROUPS.embed;\n break;\n case 'others':\n required = new Map([...PERM_GROUPS.others, ...PERM_GROUPS.embed]);\n break;\n default:\n required = new Map([...PERM_GROUPS.manage, ...PERM_GROUPS.others, ...PERM_GROUPS.embed]);\n break;\n }\n }\n\n let permissions: Nullable<Readonly<PermissionsBitField>>;\n if (roleOrChannel instanceof Role) {\n permissions = roleOrChannel.permissions;\n } else {\n if (!client.user) {\n throw new SeedcordError(SeedcordErrorCode.CoreClientUserUnavailable);\n }\n permissions = roleOrChannel.permissionsFor(client.user, true);\n }\n\n if (!permissions) {\n throw new MissingPermissions('Missing Permissions', Array.from(required.values()), roleOrChannel);\n }\n\n if (inverse) {\n const dangerous = Array.from(required.entries())\n .filter(([bit]) => permissions.has(bit, true))\n .map(([, name]) => name);\n\n if (dangerous.length > 0) {\n throw new HasDangerousPermissions('Role has dangerous permissions', roleOrChannel as Role, dangerous);\n }\n } else {\n const missing = Array.from(required.entries())\n .filter(([bit]) => !permissions.has(bit, true))\n .map(([, name]) => name);\n\n if (missing.length > 0) {\n throw new MissingPermissions('Missing Permissions', missing, roleOrChannel);\n }\n }\n}\n","import { SeedcordError, SeedcordErrorCode } from '@seedcord/services';\n\nimport type { Client, Guild, Role } from 'discord.js';\n\n/**\n * Gets the bot's highest role in a guild.\n *\n * @param client - The Discord client instance\n * @param guild - The guild to get the bot's role from\n * @returns The bot's highest role in the guild\n * @throws A {@link SeedcordError} When the bot is not in the guild\n */\nexport function getBotRole(client: Client, guild: Guild): Role {\n if (!client.user) {\n throw new SeedcordError(SeedcordErrorCode.CoreClientUserUnavailable);\n }\n\n const botRole = guild.roles.botRoleFor(client.user);\n if (!botRole) {\n throw new SeedcordError(SeedcordErrorCode.CoreBotRoleMissing, [guild.id]);\n }\n\n return botRole;\n}\n","import { Guild } from 'discord.js';\n\nimport { checkPermissions } from './checkPermissions';\nimport { getBotRole } from './getBotRole';\n\nimport type { BotPermissionScope } from './checkPermissions';\nimport type { Client, TextChannel } from 'discord.js';\n\n/**\n * Checks if the bot has required permissions in a guild or channel.\n *\n * @param client - The Discord client instance\n * @param guildOrChannel - Guild or text channel to check permissions in\n * @param scope - Permission scope to validate\n * @param inverse - Whether to check for absence of permissions\n * @throws A {@link MissingPermissions} When bot lacks required permissions\n */\nexport function checkBotPermissions(\n client: Client,\n guildOrChannel: Guild | TextChannel,\n scope: BotPermissionScope = 'all',\n inverse = false\n): void {\n if (guildOrChannel instanceof Guild) {\n const botRole = getBotRole(client, guildOrChannel);\n checkPermissions(client, botRole, scope, inverse);\n } else {\n checkPermissions(client, guildOrChannel, scope);\n }\n}\n","import { Guild } from 'discord.js';\n\nimport { RoleDoesNotExist } from '@bErrors/Roles';\n\nimport type { Nullable } from '@seedcord/types';\nimport type { Client, Role } from 'discord.js';\n\n/**\n * Fetches a role by ID from a client or guild.\n *\n * @param clientOrGuild - Discord client or guild instance\n * @param roleId - The role ID to fetch\n * @returns Promise resolving to the role\n * @throws A {@link RoleDoesNotExist} When the role doesn't exist\n */\nexport async function fetchRole(clientOrGuild: Client | Guild, roleId: string): Promise<Role> {\n let role: Nullable<Role>;\n\n if (!roleId) {\n throw new RoleDoesNotExist('Role ID is null or undefined', roleId);\n }\n\n if (clientOrGuild instanceof Guild) {\n const guild = clientOrGuild;\n\n role = guild.roles.cache.get(roleId);\n\n if (!role) {\n try {\n role = await guild.roles.fetch(roleId);\n } catch {\n throw new RoleDoesNotExist('Role not found in specified guild', roleId);\n }\n }\n } else {\n const client = clientOrGuild;\n\n role = client.guilds.cache.map((guild) => guild.roles.cache.get(roleId)).find((role) => role);\n\n if (!role) {\n const guilds = client.guilds.cache;\n for (const guild of guilds.values()) {\n try {\n role = await guild.roles.fetch(roleId);\n if (role) break;\n } catch {\n continue;\n }\n }\n }\n }\n\n if (!role) {\n throw new RoleDoesNotExist('Role not found', roleId);\n }\n\n return role;\n}\n","import { PermissionFlagsBits } from 'discord.js';\n\nimport { RoleHigherThanMe, CannotAssignBotRole } from '@bErrors/Roles';\n\nimport { checkBotPermissions } from './checkBotPermissions';\nimport { getBotRole } from './getBotRole';\n\nimport type { Role } from 'discord.js';\n\n/**\n * Validates if the bot has permission to assign a target role.\n *\n * @param targetRole - The role to check assignment permissions for\n * @throws A {@link RoleHigherThanMe} When the target role is higher than bot's role\n * @throws A {@link CannotAssignBotRole} When trying to assign a managed/bot role\n * @throws A {@link MissingPermissions} When bot lacks Manage Roles permission\n */\nexport function hasPermsToAssign(targetRole: Role): void {\n const botRole = getBotRole(targetRole.client, targetRole.guild);\n\n if (targetRole.comparePositionTo(botRole) >= 0) {\n throw new RoleHigherThanMe('Role is higher than me', targetRole, botRole);\n }\n\n if (targetRole.managed) {\n throw new CannotAssignBotRole(`Cannot assign bot role ${targetRole.name}`);\n }\n\n checkBotPermissions(targetRole.client, targetRole.guild, [PermissionFlagsBits.ManageRoles]);\n}\n","import { UserNotInGuild } from '@bErrors/User';\n\nimport type { Guild, GuildMember } from 'discord.js';\n\n/**\n * Fetches a guild member by user ID with error handling.\n *\n * @param guild - The guild to fetch the member from\n * @param userId - The Discord user ID\n * @returns Promise resolving to the guild member\n * @throws A {@link UserNotInGuild} When the user is not found in the guild\n */\nexport async function fetchGuildMember(guild: Guild, userId: string): Promise<GuildMember> {\n let user = guild.members.cache.get(userId);\n user ??= await guild.members.fetch(userId).catch(() => {\n throw new UserNotInGuild(`User with ID ${userId} not found in guild`);\n });\n\n return user;\n}\n","import { fetchGuildMember } from './fetchGuildMember';\n\nimport type { Guild, GuildMember } from 'discord.js';\n\n/**\n * Fetches multiple guild members by user IDs.\n *\n * @param guild - The guild to fetch members from\n * @param userIds - Array of Discord user IDs\n * @returns Promise resolving to array of successfully fetched members\n */\nexport async function fetchManyGuildMembers(guild: Guild, userIds: string[]): Promise<GuildMember[]> {\n const results = await Promise.allSettled(userIds.map((userId) => fetchGuildMember(guild, userId)));\n\n return results\n .filter((result): result is PromiseFulfilledResult<GuildMember> => result.status === 'fulfilled')\n .map((result) => result.value);\n}\n","import { DiscordAPIError, RESTJSONErrorCodes } from 'discord.js';\n\nimport { UserNotFound } from '@bErrors/User';\n\nimport type { Client, User } from 'discord.js';\n\n/**\n * Fetches a Discord user by ID with error handling.\n *\n * @param client - The Discord client instance\n * @param userId - The Discord user ID\n * @returns Promise resolving to the user\n * @throws A {@link UserNotFound} When the user doesn't exist\n */\nexport async function fetchUser(client: Client, userId: string): Promise<User> {\n let user = client.users.cache.get(userId);\n user ??= await client.users.fetch(userId).catch((err) => {\n if (err instanceof DiscordAPIError && err.code === RESTJSONErrorCodes.UnknownUser) {\n throw new UserNotFound(userId);\n }\n\n throw err;\n });\n\n return user;\n}\n","import { fetchUser } from './fetchUser';\n\nimport type { Client, User } from 'discord.js';\n\n/**\n * Fetches multiple Discord users by IDs.\n *\n * @param client - The Discord client instance\n * @param userIds - Array of Discord user IDs\n * @returns Promise resolving to array of successfully fetched users\n */\nexport async function fetchManyUsers(client: Client, userIds: string[]): Promise<User[]> {\n const results = await Promise.allSettled(userIds.map((userId) => fetchUser(client, userId)));\n\n return results\n .filter((result): result is PromiseFulfilledResult<User> => result.status === 'fulfilled')\n .map((result) => result.value);\n}\n","import type { Snowflake, GuildMember } from 'discord.js';\n\n/**\n * Updates a guild member's roles by adding and removing specified roles.\n *\n * @param rolesToAdd - Array of role IDs to add to the member\n * @param rolesToRemove - Array of role IDs to remove from the member\n * @param member - The guild member to update\n * @returns Promise that resolves when roles are updated\n */\nexport async function updateMemberRoles(\n rolesToAdd: Snowflake[],\n rolesToRemove: Snowflake[],\n member: GuildMember\n): Promise<void> {\n const current = new Set(member.roles.cache.map((r) => r.id));\n const toAdd = new Set(rolesToAdd);\n const toRemove = new Set(rolesToRemove);\n const updated = current.union(toAdd).difference(toRemove);\n\n await member.roles.set([...updated]);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/bot/decorators/Command.ts","../src/miscellaneous/parseEnvColor.ts","../src/interfaces/Components.ts","../src/bot/controllers/CommandRegistry.ts","../src/bot/decorators/Events.ts","../src/bot/decorators/Middlewares.ts","../src/interfaces/Handler.ts","../src/miscellaneous/areRoutes.ts","../src/bot/controllers/EventController.ts","../src/bot/decorators/Interactions.ts","../src/bot/utilities/miscellaneous/buildSlashRoute.ts","../src/bot/errors/Database.ts","../src/bot/utilities/errors/extractErrorResponse.ts","../src/bot/decorators/Catchable.ts","../src/bot/defaults/UnhandledEvent.ts","../src/bot/controllers/InteractionController.ts","../src/interfaces/Plugin.ts","../src/bot/injectors/EmojiInjector.ts","../src/bot/Bot.ts","../src/effects/decorators/RegisterEffect.ts","../src/effects/EffectsHandler.ts","../src/effects/bases/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/bot/decorators/Confirmable/Confirmable.ts","../src/bot/errors/Channels.ts","../src/bot/errors/Roles.ts","../src/bot/errors/User.ts","../src/bot/utilities/channels/fetchText.ts","../src/bot/utilities/channels/sendInText.ts","../src/bot/utilities/errors/throwCustomError.ts","../src/bot/utilities/messages/attemptSendDM.ts","../src/bot/utilities/roles/checkPermissions.ts","../src/bot/utilities/roles/getBotRole.ts","../src/bot/utilities/roles/checkBotPermissions.ts","../src/bot/utilities/roles/fetchRole.ts","../src/bot/utilities/roles/hasPermsToAssign.ts","../src/bot/utilities/users/fetchGuildMember.ts","../src/bot/utilities/users/fetchManyGuildMembers.ts","../src/bot/utilities/users/fetchUser.ts","../src/bot/utilities/users/fetchManyUsers.ts","../src/bot/utilities/users/updateMemberRoles.ts"],"names":["CommandMetadataKey","Symbol","RegisterCommand","scope","guilds","ctor","meta","existingMeta","Reflect","getOwnMetadata","SeedcordError","SeedcordErrorCode","DecoratorCommandAlreadyRegistered","name","length","DecoratorCommandGlobalWithGuilds","Array","isArray","DecoratorCommandGuildWithoutGuilds","defineMetadata","parseEnvColor","raw","fallback","toHex","n","toString","padStart","num","Number","isNaN","startsWith","test","colorKey","Object","keys","Colors","find","key","toLowerCase","BuilderTypes","command","SlashCommandBuilder","context_menu","ContextMenuCommandBuilder","subcommand","SlashCommandSubcommandBuilder","group","SlashCommandSubcommandGroupBuilder","embed","EmbedBuilder","modal","ModalBuilder","label","LabelBuilder","text_input","TextInputBuilder","file_upload","FileUploadBuilder","button","ButtonBuilder","menu_string","StringSelectMenuBuilder","menu_option_string","StringSelectMenuOptionBuilder","menu_user","UserSelectMenuBuilder","menu_channel","ChannelSelectMenuBuilder","menu_mentionable","MentionableSelectMenuBuilder","menu_role","RoleSelectMenuBuilder","container","ContainerBuilder","text_display","TextDisplayBuilder","file","FileBuilder","media","MediaGalleryBuilder","section","SectionBuilder","separator","SeparatorBuilder","RowTypes","ActionRowBuilder","BaseComponent","_component","ComponentClass","instance","buildCustomId","prefix","args","join","BuilderComponent","type","setColor","botColor","setAccentColor","undefined","hexToNumber","setContexts","InteractionContextType","Guild","component","converter","RowComponent","BaseErrorEmbed","setTitle","CustomError","Error","_emit","response","message","captureStackTrace","emit","value","CommandRegistry","logger","Logger","isInitialised","globalCommands","guildCommands","Collection","core","init","info","chalk","bold","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","gray","cyan","g","arr","get","set","setCommands","client","application","tag","map","guildId","entries","guild","cache","warn","EventMetadataKey","RegisterEvent","defs","constructor","saved","existing","event","options","frequency","MiddlewareType","MiddlewareMetadataKey","Middleware","priority","normalizedPriority","isFinite","SeedcordTypeError","DecoratorInvalidMiddlewarePriority","events","DecoratorInteractionEventFilter","metadata","BaseHandler","checkable","break","errored","populate","hasChecks","hasErrors","setErrored","shouldBreak","getEvent","getArgs","getArg","index","InteractionHandler","InteractionMiddleware","EventMiddleware","AutocompleteHandler","focused","getFocused","EventHandler","areRoutes","routes","every","r","EventController","isInitialized","eventMap","middlewares","handlersDir","middlewareDir","loadMiddlewares","loadHandlers","attachToClient","loadedEventsArray","forEach","handlers","eventName","_fullPath","relativePath","imported","val","isEventHandlerClass","registerHandler","isMiddlewareClass","Event","registerMiddleware","middlewareCtor","alreadyRegistered","some","entry","sort","a","b","runMiddlewares","includes","middleware","runChecks","execute","err","error","String","handlerClass","names","handlerEntries","debug","register","once","bind","on","processEvent","catch","red","stack","specificHandler","shouldContinue","processHandler","handler","InteractionRoutes","SelectMenuType","InteractionMetadataKey","SlashRoute","routeOrRoutes","storeMetadata","ButtonRoute","ModalRoute","ContextMenuRoute","routeType","AutocompleteRoute","commandRoutes","focusedFields","fields","route","field","autocompleteKey","SelectMenuRoute","routeMap","symbol","savedRoutes","toStore","buildSlashRoute","arg1","arg2","arg3","sub","ChatInputCommandInteraction","AutocompleteInteraction","commandName","getSubcommandGroup","getSubcommand","UtilInvalidSlashRouteArgument","DatabaseError","uuid","setDescription","extractErrorResponse","user","randomUUID","effects","showStack","errorStack","GenericError","developerUsername","Catchable","_target","_propertyKey","descriptor","log","forceFollowup","originalMethod","interaction","DecoratorMethodNotFound","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","ignoredKeysFromConfig","interactions","ignoreCustomIds","ignoredKey","add","isHandlerClass","Interaction","routeTypes","Slash","Button","Modal","StringMenu","UserMenu","RoleMenu","ChannelMenu","MentionableMenu","MessageContextMenu","UserContextMenu","Autocomplete","Events","InteractionCreate","handleInteraction","parseCustomId","customId","parts","split","argString","handleCustomIdInteraction","getMap","interactionType","processInteraction","extractKey","getHandler","pattern","HandlerCtor","isChatInputCommand","handleSlashCommand","isButton","handleButton","isModalSubmit","handleModal","isStringSelectMenu","handleStringSelectMenu","isUserSelectMenu","handleUserSelectMenu","isRoleSelectMenu","handleRoleSelectMenu","isChannelSelectMenu","handleChannelSelectMenu","isMentionableSelectMenu","handleMentionableSelectMenu","isMessageContextMenuCommand","handleMessageContextMenu","isUserContextMenuCommand","handleUserContextMenu","isAutocomplete","handleAutocomplete","Plugin","StrictEventEmitter","pluggable","Pluggable","shutdown","startup","PLUGIN_INIT_TIMEOUT_MS","run","attach","startupPhase","CorePluginAfterInit","CorePluginKeyExists","addTask","assign","emojiStorage","Emojis","EmojiInjector","clearEmojis","emojis","configEmojis","fetch","foundCount","emojiName","emoji","e","identifier","id","deleteProperty","Bot","_client","emojiInjector","Client","clientOptions","ShutdownPhase","DiscordCleanup","stop","login","removeAllListeners","logout","botToken","username","destroy","_fallback","ConfigMissingDiscordToken","EffectMetadataKey","RegisterEffect","effect","EffectsHandler","data","WebhookLog","webhookUrlValidator","ConfigUnknownExceptionWebhookMissing","ConfigUnknownExceptionWebhookInvalid","trim","discordWebhookRegex","RegExp","URL","canParse","UnknownException","webhook","WebhookClient","url","unknownExceptionWebhookUrl","metadataFile","prepareMetadataFile","send","withComponents","avatarURL","UnhandledErrorContainer","files","filterCirculars","AttachmentBuilder","Buffer","from","JSON","stringify","description","DefaultSeparator","setSpacing","SeparatorSpacingSize","Small","setDivider","addTextDisplayComponents","text","setContent","addSeparatorComponents","addTimestampsIfAvailable","addMetadataIfAvailable","DiscordAPIError","now","Date","snowflake","match","interactionTs","SnowflakeUtil","deconstruct","timestamp","diff","seconds","Math","floor","millis","toISOString","addFileComponents","setURL","EffectsEmitter","emitter","EventEmitter","listener","EffectsRegistry","effectsMap","effectsDir","registerEffect","loadEffects","attachEffects","totalEffects","reduce","acc","exportName","isEffectHandler","effectName","Seedcord","isInstantiated","healthCheck","CoordinatedShutdown","CoordinatedStartup","CoreSingletonViolation","HealthCheck","registerStartupTasks","StartupPhase","Configuration","Instantiation","Ready","start","Checkable","EventCatchable","_prop","silent","original","eventArgs","msg","x","Message","author","errorType","resolveFactory","input","ctx","isV2","opts","usesResolver","usesCustomIds","isMessageComponentIx","ix","buildPrompt","prompt","rows","payload","clearedPayload","decide","i","resolveDecision","confirmCustomIds","cancelCustomIds","shouldDefer","isSlash","isContext","defer","maybeDefer","ephemeral","deferReply","deferUpdate","sendPrompt","fetchReply","follow","awaitComponent","componentType","ComponentType","timeoutMs","awaitMessageComponent","time","filter","c","timedOut","clearUi","edit","deleteReply","normalizeClassicOutcome","outcomeReplacement","confirmed","outcomes","outcomeUi","v2Outcomes","onTimeout","onCancel","onConfirm","classicOutcomes","Confirmable","question","isContextMenuCommand","q","promptMsg","replacement","onResolved","ChannelNotFoundError","channelId","CannotSendEmbedsError","CouldNotFindChannel","ChannelNotTextChannel","MissingPermissions","missingPerms","roleOrChannel","missing","perm","errorSubtext","Role","RoleHigherThanMe","role","botRole","CannotAssignBotRole","RoleDoesNotExist","roleId","HasDangerousPermissions","dangerousPerms","dangerous","UserNotInGuild","UserNotFound","userArg","fetchText","TextChannel","channel","channels","isTextBased","sendInText","throwCustomError","crypto","errorMessage","attemptSendDM","PermissionNames","Map","PermissionFlagsBits","bit","prettify","PERM_GROUPS","manage","ManageChannels","ManageRoles","ManageWebhooks","ManageMessages","ManageNicknames","ViewChannel","SendMessages","EmbedLinks","AttachFiles","UseExternalEmojis","ReadMessageHistory","others","AddReactions","UseApplicationCommands","checkPermissions","inverse","required","permissions","CoreClientUserUnavailable","permissionsFor","has","getBotRole","roles","botRoleFor","CoreBotRoleMissing","checkBotPermissions","guildOrChannel","fetchRole","clientOrGuild","hasPermsToAssign","targetRole","comparePositionTo","managed","fetchGuildMember","userId","members","fetchManyGuildMembers","userIds","results","Promise","allSettled","result","status","fetchUser","users","code","RESTJSONErrorCodes","UnknownUser","fetchManyUsers","updateMemberRoles","rolesToAdd","rolesToRemove","member","current","toAdd","toRemove","updated","union","difference"],"mappings":"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","file":"index.cjs","sourcesContent":["import { SeedcordError, SeedcordErrorCode } from '@seedcord/services';\n\nimport type { BuilderComponent } from '@interfaces/Components';\n\n/**\n * Metadata key for command registration information.\n *\n * @internal\n */\nexport const CommandMetadataKey = Symbol('command:metadata');\n\n/**\n * Constructor type for command classes.\n *\n * @internal\n */\nexport type CommandCtor = new (...args: any[]) => BuilderComponent<'command' | 'context_menu'>;\n\n/**\n * Metadata for global command registration.\n *\n * @internal\n */\nexport interface GlobalMeta {\n scope: 'global';\n}\n\n/**\n * Metadata for guild-specific command registration.\n *\n * @internal\n */\nexport interface GuildMeta {\n scope: 'guild';\n guilds: string[];\n}\n\n/**\n * Union type for command registration metadata.\n *\n * @internal\n */\nexport type CommandMeta = GlobalMeta | GuildMeta;\n\n/**\n * Type representing command registration scope.\n *\n * @internal\n */\nexport type CommandScope = CommandMeta['scope'];\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 if applicable\n * @decorator\n */\nexport function RegisterCommand(scope: CommandScope, guilds: string[] = []) {\n return (ctor: CommandCtor): void => {\n const meta: GlobalMeta | GuildMeta = scope === 'global' ? { scope } : { scope, guilds };\n\n // Make sure command is EITHER global or guild-scoped.\n const existingMeta = Reflect.getOwnMetadata(CommandMetadataKey, ctor) as CommandMeta | undefined;\n if (existingMeta) {\n throw new SeedcordError(SeedcordErrorCode.DecoratorCommandAlreadyRegistered, [\n ctor.name,\n existingMeta.scope,\n scope\n ]);\n }\n\n // Also make sure guilds aren't provided for global scope\n if (scope === 'global' && guilds.length > 0) {\n throw new SeedcordError(SeedcordErrorCode.DecoratorCommandGlobalWithGuilds);\n }\n\n // Also make sure guilds are provided for guild scope\n if (scope === 'guild' && (!Array.isArray(guilds) || guilds.length === 0)) {\n throw new SeedcordError(SeedcordErrorCode.DecoratorCommandGuildWithoutGuilds);\n }\n\n Reflect.defineMetadata(CommandMetadataKey, meta, ctor);\n };\n}\n","import { type ColorResolvable, Colors } from 'discord.js';\n\n/**\n * Converts a color to ColorResolvable if possible.\n *\n * @internal\n */\nexport function parseEnvColor(raw: string | undefined | null, fallback: ColorResolvable): ColorResolvable {\n if (!raw) return fallback;\n\n // eslint-disable-next-line no-magic-numbers\n const toHex = (n: number): ColorResolvable => `#${n.toString(16).padStart(6, '0')}` as ColorResolvable;\n\n // try numeric parse first\n const num = Number(raw);\n if (!Number.isNaN(num) && num >= 0) return toHex(num);\n\n // hex with #\n if (raw.startsWith('#')) return raw as ColorResolvable;\n\n // hex without #\n if (/^[0-9A-Fa-f]{6}$/.test(raw)) return `#${raw}` as ColorResolvable;\n\n // Discord named colors\n const colorKey = Object.keys(Colors).find((key) => key.toLowerCase() === raw.toLowerCase()) as\n | keyof typeof Colors\n | undefined;\n\n if (colorKey) return toHex(Colors[colorKey]);\n\n return fallback;\n}\n","import { hexToNumber } from '@seedcord/utils';\nimport {\n ActionRowBuilder,\n ButtonBuilder,\n ChannelSelectMenuBuilder,\n ContainerBuilder,\n ContextMenuCommandBuilder,\n EmbedBuilder,\n FileBuilder,\n FileUploadBuilder,\n InteractionContextType,\n LabelBuilder,\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 { parseEnvColor } from '@miscellaneous/parseEnvColor';\n\nimport type { ColorResolvable } from 'discord.js';\n\n/**\n * Available Discord.js builder classes for use with BuilderComponent\n *\n * @internal\n */\nexport const BuilderTypes = {\n // Command Components\n command: SlashCommandBuilder,\n context_menu: ContextMenuCommandBuilder,\n subcommand: SlashCommandSubcommandBuilder,\n group: SlashCommandSubcommandGroupBuilder,\n\n // Embed Components\n embed: EmbedBuilder,\n\n // Modal Components\n modal: ModalBuilder,\n label: LabelBuilder,\n text_input: TextInputBuilder,\n file_upload: FileUploadBuilder,\n\n // Action Row Components\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\n // ComponentsV2\n container: ContainerBuilder,\n text_display: TextDisplayBuilder,\n file: FileBuilder,\n media: MediaGalleryBuilder,\n section: SectionBuilder,\n separator: SeparatorBuilder\n};\n\n/**\n * Available Discord.js action row classes for use with RowComponent\n *\n * @internal\n */\nexport const 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} = {\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};\n\n/**\n * Available Discord.js builder types for use with BuilderComponent\n */\nexport type BuilderType = keyof typeof BuilderTypes;\n\n/**\n * @internal\n */\nexport type InstantiatedBuilder<BuilderKey extends BuilderType> = InstanceType<(typeof BuilderTypes)[BuilderKey]>;\n\n/**\n * Available Discord.js action row types for use with RowComponent\n */\nexport type ActionRowComponentType = keyof typeof RowTypes;\n\n/**\n * @internal\n */\nexport type InstantiatedActionRow<RowKey extends ActionRowComponentType> = InstanceType<(typeof RowTypes)[RowKey]>;\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 *\n * @internal\n */\nexport abstract 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 /**\n * Bot color for the component\n * Uses the DEFAULT_BOT_COLOR environment variable or falls back to 'Default' set by Discord.js.\n *\n * Set DEFAULT_BOT_COLOR to a hex code in your `.env` file to customize.\n */\n @Envapt<ColorResolvable>('DEFAULT_BOT_COLOR', {\n fallback: 'Default',\n converter: (raw, fallback) => parseEnvColor(raw, fallback)\n })\n declare public 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 ContainerBuilder) {\n this.instance.setAccentColor(\n this.botColor === 'Default' ? undefined : hexToNumber(this.botColor.toString())\n );\n }\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 * 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 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 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 { Logger } from '@seedcord/services';\nimport { traverseDirectory } from '@seedcord/utils';\nimport chalk from 'chalk';\nimport { Collection, SlashCommandBuilder } from 'discord.js';\n\nimport { CommandMetadataKey } from '@bDecorators/Command';\nimport { BuilderComponent } from '@interfaces/Components';\n\nimport type { CommandMeta } from '@bDecorators/Command';\nimport type { Core } from '@interfaces/Core';\nimport type { Initializeable } from '@interfaces/Plugin';\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 { EventHandler, ValidNonInteractionKeys } from '@interfaces/Handler';\nimport type { EventFrequency } from '@miscellaneous/types';\nimport type { ClientEvents } from 'discord.js';\nimport type { Constructor } from 'type-fest';\n\n/**\n * Metadata key used to store event handler information\n *\n * @internal\n */\nexport const EventMetadataKey = Symbol('event:metadata');\n\n/** Options accepted by the event registration decorator. */\nexport interface RegisterEventOptions {\n /** Frequency: 'once' or 'on'. Defaults to 'on'. */\n readonly frequency?: EventFrequency | undefined;\n}\n\n/**\n * Metadata entry representing a registered event handler.\n *\n * @internal\n */\nexport interface RegisterEventMetadataEntry<EventKey extends keyof ClientEvents> {\n readonly event: EventKey;\n readonly frequency: EventFrequency;\n}\n\n/** Tuple describing a single event and optional options. */\nexport type EventSpec<EventKey extends ValidNonInteractionKeys> = readonly [\n event: EventKey,\n options?: RegisterEventOptions\n];\n\n/**\n * Registers an event handler class with one or more Discord.js events.\n *\n * Associates the decorated class with the provided Discord client events for automatic registration and execution when those events are emitted.\n *\n * Supply any number of event tuples. Each tuple can include per event options.\n *\n * @typeParam EventKey - Union of Discord.js ClientEvents keys to register for\n * @param defs - One or more tuples of [event, options]\n * @decorator\n * @example\n * ```ts\n * \\@RegisterEvent([Events.MessageCreate])\n * class MessageHandler extends EventHandler<Events.MessageCreate> {\n * async execute() {\n * // Handle message creation\n * }\n * }\n * ```\n *\n * @example\n * ```ts\n * \\@RegisterEvent([Events.MessageCreate], [Events.MessageUpdate])\n * class MessageHandler extends EventHandler<Events.MessageCreate | Events.MessageUpdate> {\n * async execute() {\n * // Handle message creation or update\n * }\n * }\n * ```\n *\n * @example\n * ```ts\n * \\@RegisterEvent([Events.MessageCreate, { frequency: 'once' }], [Events.MessageUpdate])\n * class OneTimeMessageHandler extends EventHandler<Events.MessageCreate | Events.MessageUpdate> {\n * async execute() {\n * // Handle only the first message creation, and message update normally\n * }\n * }\n * ```\n */\nexport function RegisterEvent<const Defs extends readonly EventSpec<ValidNonInteractionKeys>[]>(...defs: Defs) {\n type EventKey = Defs[number][0];\n\n return function <HandlerCtor extends Constructor<EventHandler<EventKey>>>(constructor: HandlerCtor): void {\n const saved = Reflect.getMetadata(EventMetadataKey, constructor) as\n | RegisterEventMetadataEntry<EventKey>[]\n | undefined;\n const existing = saved ?? [];\n\n const entries = defs.map<RegisterEventMetadataEntry<EventKey>>(([event, options]) => ({\n event,\n frequency: options?.frequency ?? 'on'\n }));\n\n Reflect.defineMetadata(EventMetadataKey, [...existing, ...entries], constructor);\n };\n}\n","import { SeedcordError, SeedcordErrorCode, SeedcordTypeError } from '@seedcord/services';\n\nimport type { EventMiddleware, InteractionMiddleware, Repliables, ValidNonInteractionKeys } from '@interfaces/Handler';\nimport type { Constructor } from 'type-fest';\n\n/**\n * Middleware types supported by Seedcord\n */\nexport enum MiddlewareType {\n Interaction = 'middleware:interaction',\n Event = 'middleware:event'\n}\n\n/**\n * Metadata key for middleware configuration\n *\n * @internal\n */\nexport const MiddlewareMetadataKey = Symbol('middleware:metadata');\n\n/**\n * Additional middleware registration options\n *\n * @typeParam MType - The type of middleware being registered\n */\nexport interface MiddlewareOptions<MType extends MiddlewareType> {\n /**\n * Restrict event middleware execution to specific Discord client events\n */\n readonly events?: MType extends MiddlewareType.Event ? readonly ValidNonInteractionKeys[] : never;\n}\n\n/**\n * Metadata stored for middleware registration\n */\nexport interface MiddlewareMetadata {\n /**\n * Priority number used to order middleware\n */\n priority: number;\n /**\n * Middleware kind from {@link MiddlewareType}\n */\n type: MiddlewareType;\n /**\n * Optional list of Discord client events to target\n */\n events?: readonly ValidNonInteractionKeys[];\n}\n\n/**\n * Decorator used to register middleware with priority ordering. The lower the priority number, the earlier it runs.\n *\n * Interaction middleware cannot specify event filters.\n *\n * @param type - Middleware kind from {@link MiddlewareType}\n * @param priority - Ordering value where lower runs earlier. Default is 0\n * @param options - Additional registration options\n *\n * @decorator\n *\n * @example\n * ```ts\n * \\@Middleware(MiddlewareType.Event, 10, { events: [Events.MessageCreate, Events.MessageUpdate] })\n * class MyEventMiddleware extends EventMiddleware {}\n * ```\n * @throws A {@link SeedcordTypeError} If priority is not a finite number\n * @throws A {@link SeedcordError} If interaction middleware specifies event filters\n */\nexport function Middleware<MType extends MiddlewareType>(\n type: MType,\n priority = 0,\n options: MiddlewareOptions<MType> = {}\n) {\n return (\n ctor: Constructor<\n MType extends MiddlewareType.Interaction\n ? InteractionMiddleware<Repliables>\n : EventMiddleware<ValidNonInteractionKeys>\n >\n ): void => {\n const normalizedPriority = Number(priority);\n if (!Number.isFinite(normalizedPriority)) {\n throw new SeedcordTypeError(SeedcordErrorCode.DecoratorInvalidMiddlewarePriority);\n }\n\n if (type === MiddlewareType.Interaction && Array.isArray(options.events) && options.events.length > 0) {\n throw new SeedcordError(SeedcordErrorCode.DecoratorInteractionEventFilter);\n }\n\n const metadata: MiddlewareMetadata = {\n priority: normalizedPriority,\n type,\n ...(options.events ? { events: options.events } : {})\n };\n\n Reflect.defineMetadata(MiddlewareMetadataKey, metadata, ctor);\n };\n}\n","import { Logger } from '@seedcord/services';\n\nimport 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\nexport type ValidNonInteractionKeys = Exclude<keyof ClientEvents, Events.InteractionCreate>;\n\n/** All valid Discord.js client events except interaction events */\nexport type ValidNonInteractionTypes = ClientEvents[ValidNonInteractionKeys];\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/** Event handler types that can reply to events */\nexport type RepliableEventHandler = EventHandler<ValidNonInteractionKeys> | EventMiddleware<ValidNonInteractionKeys>;\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 * @see {@link Catchable}\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\n/**\n * Interface for handlers that implement pre-execution checks\n *\n * @internal\n */\nexport interface HandlerWithChecks extends WithChecks, Handler {}\n\n/**\n * Base class for all handlers. Not meant to be used directly.\n *\n * @internal\n */\nexport abstract 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 protected logger: Logger;\n\n protected constructor(\n event: ValidEvent,\n public core: Core,\n args?: string[]\n ) {\n this.event = event;\n this.args = args ?? [];\n this.logger = new Logger(this.constructor.name);\n\n this.populate();\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 /**\n * Populates the handler with necessary data before execution. Override this method in your handler classes to customize population logic. This method is called at the end of the constructor before all async operations.\n */\n protected populate(): 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 * Base class for Discord event middleware\n *\n * Middleware runs before event handlers and can modify behavior or block execution.\n */\nexport abstract class EventMiddleware<EventName extends ValidNonInteractionKeys>\n extends BaseHandler<ClientEvents[EventName]>\n implements Handler\n{\n constructor(event: ClientEvents[EventName], 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 ValidNonInteractionKeys>\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 InteractionMiddlewareConstructor = TypedConstructor<typeof InteractionMiddleware> &\n (new (event: Repliables, core: Core, args?: string[]) => InteractionMiddleware<Repliables>);\n\n/** Constructor type for legacy interaction middleware */\nexport type MiddlewareConstructor = InteractionMiddlewareConstructor;\n\n/** Constructor type for event middleware */\nexport type EventMiddlewareConstructor = TypedConstructor<typeof EventMiddleware> &\n (new <EventName extends ValidNonInteractionKeys>(\n event: ClientEvents[EventName],\n core: Core,\n args?: string[]\n ) => EventMiddleware<EventName>);\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","/**\n * Checks if the provided value is an array of strings.\n *\n * @internal\n */\nexport function areRoutes(routes: unknown): routes is string[] {\n return Array.isArray(routes) && routes.every((r) => typeof r === 'string');\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 { EventMetadataKey } from '@bDecorators/Events';\nimport { MiddlewareMetadataKey, MiddlewareType } from '@bDecorators/Middlewares';\nimport { EventHandler, EventMiddleware } from '@interfaces/Handler';\nimport { areRoutes } from '@miscellaneous/areRoutes';\n\nimport type { RegisterEventMetadataEntry } from '@bDecorators/Events';\nimport type { MiddlewareMetadata } from '@bDecorators/Middlewares';\nimport type { Core } from '@interfaces/Core';\nimport type { EventHandlerConstructor, EventMiddlewareConstructor, ValidNonInteractionKeys } from '@interfaces/Handler';\nimport type { Initializeable } from '@interfaces/Plugin';\nimport type { EventFrequency } from '@miscellaneous/types';\n\ninterface RegisteredEventMiddleware {\n readonly ctor: EventMiddlewareConstructor;\n readonly priority: number;\n readonly events?: readonly ValidNonInteractionKeys[];\n}\n\ninterface RegisteredEventHandlerEntry {\n readonly ctor: EventHandlerConstructor;\n readonly frequency: EventFrequency;\n}\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, RegisteredEventHandlerEntry[]>();\n private readonly middlewares: RegisteredEventMiddleware[] = [];\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 const middlewareDir = this.core.config.bot.events.middlewares;\n if (middlewareDir) {\n this.logger.info(`${chalk.bold(middlewareDir)} ${chalk.gray('(middlewares)')}`);\n await this.loadMiddlewares(middlewareDir);\n }\n\n await this.loadHandlers(handlersDir);\n this.attachToClient();\n\n this.logger.info(`→ ${chalk.magenta.bold(this.middlewares.length)} middlewares`);\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)) continue;\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 this.logger\n );\n }\n\n private async loadMiddlewares(dir: string): Promise<void> {\n await traverseDirectory(\n dir,\n (_fullPath, relativePath, imported) => {\n for (const val of Object.values(imported)) {\n if (!this.isMiddlewareClass(val)) continue;\n const metadata = Reflect.getMetadata(MiddlewareMetadataKey, val) as MiddlewareMetadata | undefined;\n if (metadata?.type !== MiddlewareType.Event) continue;\n\n this.registerMiddleware(val, metadata, relativePath);\n }\n },\n this.logger\n );\n }\n\n private registerMiddleware(\n middlewareCtor: EventMiddlewareConstructor,\n metadata: MiddlewareMetadata,\n relativePath: string\n ): void {\n const alreadyRegistered = this.middlewares.some((entry) => entry.ctor === middlewareCtor);\n if (alreadyRegistered) return;\n\n this.middlewares.push({\n ctor: middlewareCtor,\n priority: metadata.priority,\n ...(metadata.events ? { events: metadata.events } : {})\n });\n this.middlewares.sort((a, b) => a.priority - b.priority);\n\n this.logger.info(\n `${chalk.italic('Registered event middleware')} ${chalk.bold.yellow(middlewareCtor.name)} ${chalk.gray(`(priority ${metadata.priority})`)} from ${chalk.gray(relativePath)}`\n );\n }\n\n private async runMiddlewares<KeyOfEvents extends keyof ClientEvents>(\n eventName: KeyOfEvents,\n args: ClientEvents[KeyOfEvents]\n ): Promise<boolean> {\n for (const { ctor, events } of this.middlewares) {\n if (events && !events.includes(eventName)) continue;\n\n try {\n const middleware = new ctor(args, this.core);\n if (middleware.hasChecks()) await middleware.runChecks();\n\n if (middleware.shouldBreak() || middleware.hasErrors()) return false;\n\n await middleware.execute();\n\n if (middleware.shouldBreak() || middleware.hasErrors()) return false;\n } catch (err) {\n this.logger.error(`Error in event middleware ${ctor.name} for event ${String(eventName)}:`, err);\n return false;\n }\n }\n\n return true;\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 isMiddlewareClass(obj: unknown): obj is EventMiddlewareConstructor {\n if (typeof obj !== 'function') return false;\n return obj.prototype instanceof EventMiddleware && Reflect.hasMetadata(MiddlewareMetadataKey, obj);\n }\n\n private registerHandler(handlerClass: EventHandlerConstructor): void {\n const raw = Reflect.getMetadata(EventMetadataKey, handlerClass) as unknown;\n\n if (Array.isArray(raw)) {\n for (const entry of raw as RegisterEventMetadataEntry<keyof ClientEvents>[]) {\n const key = entry.event;\n\n let handlers = this.eventMap.get(key);\n if (!handlers) {\n handlers = [];\n this.eventMap.set(key, handlers);\n }\n\n handlers.push({\n ctor: handlerClass,\n frequency: entry.frequency\n });\n }\n return;\n }\n\n const names = areRoutes(raw) ? raw : typeof raw === 'string' ? [raw] : [];\n\n if (names.length === 0) return;\n\n for (const name of names) {\n const key = name as keyof ClientEvents;\n\n let handlers = this.eventMap.get(key);\n if (!handlers) {\n handlers = [];\n this.eventMap.set(key, handlers);\n }\n handlers.push({\n ctor: handlerClass,\n frequency: 'on'\n });\n }\n }\n\n private attachToClient(): void {\n for (const [eventName, handlerEntries] of this.eventMap) {\n this.logger.debug(\n `Attaching ${chalk.bold.green(eventName)} to the client with ${chalk.gray(handlerEntries.length)} handler(s)`\n );\n\n for (const entry of handlerEntries) {\n const register =\n entry.frequency === 'once'\n ? this.core.bot.client.once.bind(this.core.bot.client)\n : this.core.bot.client.on.bind(this.core.bot.client);\n\n register(eventName, (...args: ClientEvents[typeof eventName]) => {\n this.core.bot.emit('any:event', eventName, ...args);\n void (async () => {\n await this.processEvent(eventName, args, entry.ctor).catch((err: Error) => {\n this.logger.error(`[${chalk.bold.red('UNHANDLED ERROR AT ROOT')}] ${err.name}`, err.stack);\n this.core.bot.emit('error:unhandled:event', err);\n });\n })();\n });\n }\n }\n }\n\n private async processEvent<KeyOfEvents extends keyof ClientEvents>(\n eventName: KeyOfEvents,\n args: ClientEvents[KeyOfEvents],\n specificHandler?: EventHandlerConstructor\n ): Promise<void> {\n const shouldContinue = await this.runMiddlewares(eventName, args);\n if (!shouldContinue) return;\n\n if (specificHandler) {\n await this.processHandler(eventName, specificHandler, args);\n return;\n }\n\n const handlerEntries = this.eventMap.get(eventName);\n if (!handlerEntries || handlerEntries.length === 0) return;\n\n for (const entry of handlerEntries) {\n await this.processHandler(eventName, entry.ctor, args);\n }\n }\n\n private async processHandler<KeyOfEvents extends keyof ClientEvents>(\n eventName: KeyOfEvents,\n ctor: EventHandlerConstructor,\n args: ClientEvents[KeyOfEvents]\n ): Promise<void> {\n try {\n this.logger.debug(`Processing ${chalk.bold.green(eventName)} with ${chalk.gray(ctor.name)}`);\n const handler = new ctor(args, this.core);\n if (handler.hasChecks()) await handler.runChecks();\n\n if (handler.shouldBreak()) return;\n\n if (!handler.hasErrors()) await handler.execute();\n } catch (err) {\n this.logger.error(`Error in event ${String(eventName)} handler ${ctor.name}:`, err);\n }\n }\n}\n","import { areRoutes } from '@miscellaneous/areRoutes';\n\nimport type { AutocompleteHandler, InteractionHandler, Repliables } from '@interfaces/Handler';\nimport type {\n AnySelectMenuInteraction,\n ButtonInteraction,\n ChatInputCommandInteraction,\n ContextMenuCommandInteraction,\n ModalSubmitInteraction\n} from 'discord.js';\nimport type { Constructor } from 'type-fest';\n\n/**\n * Enum defining interaction route types for decorators\n *\n * @internal\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\n/**\n * Types of select menus supported for routing\n */\nexport enum SelectMenuType {\n String = 'string',\n User = 'user',\n Role = 'role',\n Channel = 'channel',\n Mentionable = 'mentionable'\n}\n\n/**\n * Metadata key used to mark classes as interaction handlers\n *\n * @internal\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 *\n * @example\n * ```\n * \\@SlashRoute(['ban', 'kick'])\n * class ModerationHandler extends InteractionHandler {\n * // handles /ban and /kick commands\n * }\n * ```\n *\n * @example\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: Constructor<InteractionHandler<ChatInputCommandInteraction>>): 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 *\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: Constructor<InteractionHandler<ButtonInteraction>>): 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: Constructor<InteractionHandler<ModalSubmitInteraction>>): 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: Constructor<InteractionHandler<ContextMenuCommandInteraction>>): 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: Constructor<AutocompleteHandler>): 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 *\n * @decorator\n *\n * @example\n * ```typescript\n * \\@SelectMenuRoute(SelectMenuType.String, 'fruits')\n * class RoleSelectHandler extends InteractionHandler {\n * // handles string select menus with customId starting with 'fruits'\n * }\n * ```\n */\nexport function SelectMenuRoute(type: SelectMenuType, routeOrRoutes: string | string[]) {\n return function (constructor: Constructor<InteractionHandler<AnySelectMenuInteraction>>): 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(\n symbol: InteractionRoutes,\n routes: string | string[],\n constructor: Constructor<InteractionHandler<Repliables> | AutocompleteHandler>\n): void {\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 { SeedcordErrorCode, SeedcordTypeError } from '@seedcord/services';\nimport { ChatInputCommandInteraction, AutocompleteInteraction } from 'discord.js';\n/**\n * Route string computed from provided parts.\n *\n * @typeParam Cmmd - Main command name\n * @typeParam Subc - Subcommand name\n * @typeParam Grp - Group name (will be ignored if subcommand is not provided with it)\n */\nexport type CommandRouteString<\n Cmmd extends string,\n Subc extends string | undefined,\n Grp extends string | undefined\n> = Subc extends string ? (Grp extends string ? `${Cmmd}/${Grp}/${Subc}` : `${Cmmd}/${Subc}`) : Cmmd;\n\n/**\n * From provided positional arguments. Either provide the route to either {@link SlashRoute} or {@link AutocompleteRoute} manually, or use this utility to build it.\n *\n * @param command - Main command name\n * @param subcommand - Optional subcommand name\n * @param group - Optional group name (will be ignored if subcommand is not provided with it)\n */\nexport function buildSlashRoute<\n Cmmd extends string,\n Subc extends string | undefined = undefined,\n Grp extends string | undefined = undefined\n>(command: Cmmd, subcommand?: Subc, group?: Grp): CommandRouteString<Cmmd, Subc, Grp>;\n\n/**\n * From a Discord interaction. The {@link InteractionController} uses this internally to build the route string to then route the correct handler.\n *\n * @internal\n */\nexport function buildSlashRoute(interaction: ChatInputCommandInteraction | AutocompleteInteraction): string;\n\n// Implementation\nexport function buildSlashRoute(\n arg1: ChatInputCommandInteraction | AutocompleteInteraction | string,\n arg2?: string,\n arg3?: string\n): string {\n let command: string;\n let sub: string | undefined;\n let group: string | undefined;\n\n if (typeof arg1 === 'string') {\n command = arg1;\n sub = arg2;\n group = arg3;\n } else if (arg1 instanceof ChatInputCommandInteraction || arg1 instanceof AutocompleteInteraction) {\n command = arg1.commandName;\n group = arg1.options.getSubcommandGroup(false) ?? undefined;\n sub = arg1.options.getSubcommand(false) ?? undefined;\n } else {\n throw new SeedcordTypeError(SeedcordErrorCode.UtilInvalidSlashRouteArgument);\n }\n\n if (sub && group) return `${command}/${group}/${sub}`;\n if (sub) return `${command}/${sub}`;\n return command;\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';\nimport { Envapt } from 'envapt';\n\nimport { DatabaseError } from '@bErrors/Database';\nimport { CustomError } from '@interfaces/Components';\nimport { Core } from '@interfaces/Core';\n\nimport type { Nullable } from '@seedcord/types';\nimport type { EmbedBuilder, Guild, User } from 'discord.js';\nimport type { UUID } from 'node:crypto';\n\nconst logger = new Logger('ErrorsHandling');\n\n/**\n * Structure representing the extracted error response.\n */\nexport interface ExtractedErrorResponse {\n /** The unique identifier for the error instance */\n uuid: UUID;\n /** The formatted error response to be sent to the user */\n response: EmbedBuilder;\n}\n\n/**\n * Processes an error and extracts the standardized response, if available (else returns a {@link GenericError}).\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 */\nexport function extractErrorResponse(\n error: Error,\n core: Core,\n guild: Nullable<Guild>,\n user: Nullable<User>,\n metadata?: unknown\n): ExtractedErrorResponse {\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, metadata });\n\n logger.error(`DatabaseError: ${error.uuid}`);\n } else if (error.emit) {\n 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) logger.error(uuid, error);\n else logger.error(`${uuid} | ${error.message}`);\n\n core.effects.emit('unknownException', { uuid, error, guild, user, metadata });\n\n return {\n uuid,\n response: new GenericError(uuid).response\n };\n}\n\n/**\n * Generic error shown to users when an unknown error occurs\n *\n * Set an environment variable called `DEVELOPER_DISCORD_USERNAME` in your `.env` file to customize the contact name.\n */\nexport class GenericError extends CustomError {\n @Envapt('DEVELOPER_DISCORD_USERNAME')\n private readonly developerUsername: string = 'the developer';\n\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 ${this.developerUsername} with a way to reproduce the error and the following:\\n` +\n `### UUID: \\`${this.uuid}\\``\n );\n }\n}\n","import { SeedcordError, SeedcordErrorCode } from '@seedcord/services';\nimport { MessageFlags } from 'discord.js';\n\nimport { extractErrorResponse } from '@bUtilities/errors/extractErrorResponse';\n\nimport type { RepliableInteractionHandler } from '@interfaces/Handler';\n\n/**\n * Configuration options for the Catchable decorator.\n */\nexport interface CatchableOptions {\n /** Whether to log errors to console using console.error (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 SeedcordError(SeedcordErrorCode.DecoratorMethodNotFound);\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 } = extractErrorResponse(\n error,\n this.core,\n interaction.guild,\n interaction.user,\n interaction\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 { Catchable } from '@bDecorators/Catchable';\nimport { InteractionHandler, Repliables } from '@interfaces/Handler';\n\n/**\n * Default handler for unhandled interaction.\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 { InteractionMetadataKey, InteractionRoutes } from '@bDecorators/Interactions';\nimport { MiddlewareMetadataKey, MiddlewareType } from '@bDecorators/Middlewares';\nimport { buildSlashRoute } from '@bUtilities/miscellaneous/buildSlashRoute';\nimport { AutocompleteHandler, InteractionHandler, InteractionMiddleware } from '@interfaces/Handler';\nimport { areRoutes } from '@miscellaneous/areRoutes';\n\nimport { UnhandledEvent } from '../defaults/UnhandledEvent';\n\nimport type { MiddlewareMetadata } from '@bDecorators/Middlewares';\nimport type { Core } from '@interfaces/Core';\nimport type { HandlerConstructor, InteractionMiddlewareConstructor, 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\ninterface RegisteredMiddleware {\n readonly ctor: InteractionMiddlewareConstructor;\n readonly priority: number;\n}\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 | RegExp>();\n\n private readonly middlewares: RegisteredMiddleware[] = [];\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 const middlewareDir = this.core.config.bot.interactions.middlewares;\n if (middlewareDir) {\n this.logger.info(`${chalk.bold(middlewareDir)} ${chalk.gray('(middlewares)')}`);\n await this.loadMiddlewares(middlewareDir);\n }\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.middlewares.length)} middlewares`);\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)) continue;\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 this.logger\n );\n }\n\n private async loadMiddlewares(dir: string): Promise<void> {\n await traverseDirectory(\n dir,\n (_fullPath, relativePath, imported) => {\n for (const val of Object.values(imported)) {\n if (!this.isMiddlewareClass(val)) continue;\n const metadata = Reflect.getMetadata(MiddlewareMetadataKey, val) as MiddlewareMetadata | undefined;\n if (metadata?.type !== MiddlewareType.Interaction) continue;\n\n this.registerMiddleware(val, metadata, relativePath);\n }\n },\n this.logger\n );\n }\n\n private registerMiddleware(\n middlewareCtor: InteractionMiddlewareConstructor,\n metadata: MiddlewareMetadata,\n relativePath: string\n ): void {\n const alreadyRegistered = this.middlewares.some((entry) => entry.ctor === middlewareCtor);\n if (alreadyRegistered) return;\n\n this.middlewares.push({ ctor: middlewareCtor, priority: metadata.priority });\n this.middlewares.sort((a, b) => a.priority - b.priority);\n\n this.logger.info(\n `${chalk.italic('Registered middleware')} ${chalk.bold.yellow(middlewareCtor.name)} ${chalk.gray(`(priority ${metadata.priority})`)} from ${chalk.gray(relativePath)}`\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 isMiddlewareClass(obj: unknown): obj is InteractionMiddlewareConstructor {\n if (typeof obj !== 'function') return false;\n return obj.prototype instanceof InteractionMiddleware && Reflect.hasMetadata(MiddlewareMetadataKey, obj);\n }\n\n private registerHandler(handlerClass: HandlerConstructor): void {\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.core.bot.emit('any:interaction', interaction);\n this.handleInteraction(interaction).catch((err: Error) => {\n this.logger.error(`[${chalk.bold.red('UNHANDLED ERROR AT ROOT')}] ${err.name}`, err.stack);\n this.core.bot.emit('error:unhandled:interaction', err);\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 // Check if the key is in the ignore list\n if (\n [...this.keysToIgnore].some((pattern) =>\n typeof pattern === 'string' ? pattern === key : pattern.test(key)\n )\n ) {\n return;\n }\n\n // Run middlewares first\n for (const { ctor } of this.middlewares) {\n const middleware = new ctor(interaction as Repliables, this.core, args);\n if (middleware.hasChecks()) await middleware.runChecks();\n if (middleware.shouldBreak() || middleware.hasErrors()) return;\n\n await middleware.execute();\n if (middleware.shouldBreak() || 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 = 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 = 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","import { SeedcordError, SeedcordErrorCode, StrictEventEmitter } from '@seedcord/services';\nimport chalk from 'chalk';\n\nimport type { Core } from './Core';\nimport type {\n SENoEvents,\n CoordinatedShutdown,\n CoordinatedStartup,\n Logger,\n StartupPhase,\n SEEventMapLike\n} 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<TPluginEvents extends SEEventMapLike<TPluginEvents> = SENoEvents>\n extends StrictEventEmitter<TPluginEvents>\n implements Initializeable\n{\n /** Logger instance for this plugin - must be implemented by subclasses */\n public abstract logger: Logger;\n\n constructor(protected pluggable: Core) {\n super();\n }\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 * @typeParam 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 * @typeParam 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 TPluggableEvents extends SEEventMapLike<TPluggableEvents> = SENoEvents\n> extends StrictEventEmitter<TPluggableEvents> {\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 super();\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 A {@link SeedcordError} 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) {\n throw new SeedcordError(SeedcordErrorCode.CorePluginAfterInit);\n }\n if ((this as Record<string, unknown>)[key]) {\n throw new SeedcordError(SeedcordErrorCode.CorePluginKeyExists, [key]);\n }\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 { Logger } from '@seedcord/services';\nimport chalk from 'chalk';\n\nimport type { Core } from '@interfaces/Core';\n\nconst emojiStorage: Record<string, string> = {};\n\n/**\n * Emoji mapping interface. Augment this to add your project's emoji keys. Make sure to provide the same keys when configuring emojis in your bot config.\n *\n * @example\n * ```ts\n * declare module 'seedcord' {\n * interface EmojiMap {\n * ThumbsUp: string;\n * ThumbsDown: string;\n * Lol: string;\n * Kek: string;\n * }\n * }\n * ```\n *\n * @example\n * ```ts\n * // Or extend it directly\n * declare module 'seedcord' {\n * export interface EmojiMap extends MyEmojiMap {}\n * }\n * ```\n *\n * @example\n * ```ts\n * // Then, import and use it anywhere in your app\n * import { Emojis } from 'seedcord';\n *\n * console.log(Emojis.ThumbsUp); // '<:thumbsup:1872389747982323423>'\n * ```\n */\nexport interface EmojiMap {}\n\n/**\n * Global emoji mappings object\n *\n * @see {@link EmojiMap}\n */\nexport const Emojis = emojiStorage as EmojiMap;\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 this.clearEmojis();\n\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 if (typeof emojiName !== 'string') {\n this.logger.warn(\n `${chalk.bold.yellow('Invalid')}: ${chalk.magenta.bold(String(key))} (expected string, received ${typeof emojiName})`\n );\n return;\n }\n\n const emoji = this.core.bot.client.application?.emojis.cache.find((e) => e.name === emojiName);\n\n if (emoji) {\n emojiStorage[key] = `<${emoji.identifier}>`;\n foundCount++;\n\n this.logger.debug(`${chalk.bold.green('Found')}: ${chalk.magenta.bold(emojiName)} (${emoji.id})`);\n\n return;\n }\n\n emojiStorage[key] = emojiName;\n this.logger.warn(\n `${chalk.bold.yellow('Missing')}: ${chalk.magenta.bold(emojiName)} (using configured value)`\n );\n });\n\n this.logger.info(`${chalk.bold.green('Loaded')}: ${chalk.magenta.bold(foundCount)} emoji(s)`);\n }\n\n private clearEmojis(): void {\n for (const key of Object.keys(emojiStorage)) Reflect.deleteProperty(emojiStorage, key);\n }\n}\n","import { Logger, SeedcordError, SeedcordErrorCode, ShutdownPhase } from '@seedcord/services';\nimport chalk from 'chalk';\nimport { Client, ClientEvents, Interaction } from 'discord.js';\nimport { Envapt } from 'envapt';\n\nimport { CommandRegistry } from '@bControllers/CommandRegistry';\nimport { EventController } from '@bControllers/EventController';\nimport { InteractionController } from '@bControllers/InteractionController';\nimport { Plugin } from '@interfaces/Plugin';\n\nimport { EmojiInjector, Emojis, type EmojiMap } from './injectors/EmojiInjector';\n\nimport type { Core } from '@interfaces/Core';\n\n/**\n * Bot event types\n */\nexport interface BotEvents {\n 'error:unhandled:interaction': [error: Error];\n 'error:unhandled:event': [error: Error];\n 'any:event': { [K in keyof ClientEvents]: [K, ...ClientEvents[K]] }[keyof ClientEvents];\n 'any:interaction': [interaction: Interaction];\n}\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<BotEvents> {\n @Envapt<string>('DISCORD_BOT_TOKEN', {\n converter(raw, _fallback) {\n if (typeof raw !== 'string') {\n throw new SeedcordError(SeedcordErrorCode.ConfigMissingDiscordToken);\n }\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 public readonly emojis: EmojiMap = Emojis;\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(core);\n this.emojiInjector = new EmojiInjector(core);\n\n 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.interactions.init();\n await this.events.init();\n\n await this.login();\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 /**\n * Emits with correlation between a Discord event key and its exact arg tuple.\n *\n * @typeParam TKey - Discord event name\n * @param event - Must be the literal `any:event`\n * @param name - Concrete Discord event name\n * @param args - Exact tuple for that Discord event\n */\n override emit<TKey extends keyof ClientEvents>(\n event: 'any:event',\n name: TKey,\n ...args: ClientEvents[TKey]\n ): boolean;\n\n /**\n * Fallback for other BotEvents keys.\n *\n * @typeParam TEventKey - Bot event key\n * @param event - Bot event key\n * @param args - Tuple payload for the key\n */\n override emit<TEventKey extends keyof BotEvents>(event: TEventKey, ...args: BotEvents[TEventKey]): boolean;\n\n override emit(event: string, ...args: unknown[]): boolean {\n return super.emit(event as never, ...(args as never));\n }\n}\n","import type { EffectKeys } from '../types/Effects';\nimport type { EventFrequency } from '@miscellaneous/types';\nimport type { Constructor } from 'type-fest';\n\n/**\n * Metadata key used to store effect handler information\n *\n * @internal\n */\nexport const EffectMetadataKey = Symbol('effect:metadata');\n\n/**\n * Options accepted by the `@RegisterEffect` decorator.\n */\nexport interface RegisterEffectOptions {\n /** Frequency: `'once'` or `'on'`. Defaults to `'on'`. */\n readonly frequency?: EventFrequency | undefined;\n}\n\n/**\n * Metadata entry representing a registered effect handler.\n *\n * @internal\n */\nexport interface RegisterEffectMetadataEntry {\n /** The effect event name to register for. */\n readonly effect: EffectKeys;\n /** Frequency: `'once'` or `'on'`. Defaults to `'on'`. */\n readonly frequency?: EventFrequency | undefined;\n}\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 * @typeParam TEffect - The side effect event name to register for\n * @param effect - The side effect event name to register for\n * @param options - Options to configure the effect handler registration.\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 * @example\n * ```ts\n * \\@RegisterEffect('userJoin', { frequency: 'once' })\n * // or\n * \\@RegisterEffect('userJoin')\n * ```\n */\nexport function RegisterEffect<TEffect extends EffectKeys>(effect: TEffect, options?: RegisterEffectOptions) {\n return function (constructor: Constructor<unknown>): void {\n const meta: RegisterEffectMetadataEntry = {\n effect,\n frequency: options?.frequency\n };\n\n Reflect.defineMetadata(EffectMetadataKey, meta, constructor);\n };\n}\n","import type { EffectKeys, AllEffects } from './types/Effects';\nimport type { Core } from '@interfaces/Core';\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 { EffectKeys, AllEffects } from '../types/Effects';\nimport type { Core } from '@interfaces/Core';\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 by implementing the webhook property.\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 { Logger, SeedcordError, SeedcordErrorCode } from '@seedcord/services';\nimport { filterCirculars } from '@seedcord/utils';\nimport { WebhookClient, AttachmentBuilder, SeparatorSpacingSize, DiscordAPIError, SnowflakeUtil } from 'discord.js';\nimport { Envapt } from 'envapt';\n\nimport { BuilderComponent } from '@interfaces/Components';\n\nimport { WebhookLog } from '../bases/WebhookLog';\nimport { RegisterEffect } from '../decorators/RegisterEffect';\nimport { AllEffects } from '../types/Effects';\n\nfunction webhookUrlValidator(raw: unknown, _fallback: unknown): string {\n if (raw === null) {\n throw new SeedcordError(SeedcordErrorCode.ConfigUnknownExceptionWebhookMissing);\n }\n if (typeof raw !== 'string') {\n throw new SeedcordError(SeedcordErrorCode.ConfigUnknownExceptionWebhookInvalid);\n }\n\n const value = raw.trim();\n if (value === '') {\n throw new SeedcordError(SeedcordErrorCode.ConfigUnknownExceptionWebhookMissing);\n }\n\n const pattern = String.raw`^https?:\\/\\/(?:canary\\.|ptb\\.)?discord(?:app)?\\.com\\/api\\/webhooks\\/\\d+\\/[\\w$-]+$`;\n const discordWebhookRegex = new RegExp(pattern);\n\n if (!URL.canParse(value) || !discordWebhookRegex.test(value)) {\n throw new SeedcordError(SeedcordErrorCode.ConfigUnknownExceptionWebhookInvalid);\n }\n\n return value;\n}\n\n/**\n * Default effect to log unhandled exceptions via webhook. It provides basic information about the error:\n * - Error stack trace\n * - Guild ID and name (if applicable)\n * - User ID and username (if applicable)\n * - A unique UUID for tracking\n * - Timestamps comparing interaction time and error log time (if applicable)\n * - Metadata associated with the error (if provided)\n *\n * Developers need to set the UNKNOWN_EXCEPTION_WEBHOOK_URL environment variable in their .env file otherwise this effect will throw an error during initialization.\n *\n * @throws A {@link SeedcordError} if UNKNOWN_EXCEPTION_WEBHOOK_URL is not set or is invalid\n */\n@RegisterEffect('unknownException')\nexport class UnknownException extends WebhookLog<'unknownException'> {\n private static readonly logger = new Logger('Effect: UnknownException');\n\n @Envapt('UNKNOWN_EXCEPTION_WEBHOOK_URL', {\n converter: (raw, fallback) => webhookUrlValidator(raw, fallback)\n })\n declare static readonly unknownExceptionWebhookUrl: string;\n\n webhook = new WebhookClient({\n url: UnknownException.unknownExceptionWebhookUrl\n });\n\n async execute(): Promise<void> {\n const metadataFile = this.prepareMetadataFile();\n\n try {\n await this.webhook.send({\n flags: 'IsComponentsV2',\n withComponents: true,\n username: 'Unknown Exception',\n avatarURL:\n 'https://cdn.discordapp.com/attachments/1351446034827579466/1351446912947191830/warning-2.png',\n components: [new UnhandledErrorContainer(this.data).component],\n files: metadataFile ? [metadataFile] : []\n });\n } catch (error) {\n UnknownException.logger.error('Failed to send unknown exception webhook', error);\n }\n }\n\n private prepareMetadataFile(): AttachmentBuilder | null {\n const { metadata } = this.data;\n if (!metadata) return null;\n\n const content = filterCirculars(metadata);\n return new AttachmentBuilder(Buffer.from(JSON.stringify(content, undefined, 2), 'utf-8'), {\n name: 'metadata.json',\n description: 'Metadata associated with the error'\n });\n }\n}\n\nclass DefaultSeparator extends BuilderComponent<'separator'> {\n constructor() {\n super('separator');\n\n this.instance.setSpacing(SeparatorSpacingSize.Small).setDivider(true);\n }\n}\nclass UnhandledErrorContainer extends BuilderComponent<'container'> {\n constructor(data: AllEffects['unknownException']) {\n super('container');\n\n const { uuid, error, guild, user, metadata } = data;\n\n this.instance\n .addTextDisplayComponents((text) =>\n text.setContent(\n `### An unknown exception was thrown\\n` +\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 )\n )\n .addSeparatorComponents(new DefaultSeparator().component)\n .addTextDisplayComponents((text) => text.setContent(`### UUID \\`${uuid}\\`\\n\\`\\`\\`${error.stack}\\`\\`\\``));\n\n this.addTimestampsIfAvailable(error);\n this.addMetadataIfAvailable(metadata);\n }\n\n private addTimestampsIfAvailable(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\n .addSeparatorComponents(new DefaultSeparator().component)\n .addTextDisplayComponents((text) =>\n text.setContent(\n `### Timestamps\\n` +\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 )\n );\n }\n\n private addMetadataIfAvailable(metadata: unknown): void {\n if (!metadata) return;\n\n this.instance\n .addSeparatorComponents(new DefaultSeparator().component)\n .addTextDisplayComponents((text) => text.setContent('### Metadata'))\n .addFileComponents((file) => file.setURL('attachment://metadata.json'));\n }\n}\n","import { EventEmitter } from 'node: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 *\n * @internal\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';\n\nimport { EffectMetadataKey } from './decorators/RegisterEffect';\nimport { UnknownException } from './default/UnknownException';\nimport { EffectsEmitter } from './EffectsEmitter';\nimport { EffectsHandler } from './EffectsHandler';\n\nimport type { RegisterEffectMetadataEntry } from './decorators/RegisterEffect';\nimport type { AllEffects, EffectKeys } from './types/Effects';\nimport type { Core } from '@interfaces/Core';\nimport type { EventFrequency } from '@miscellaneous/types';\nimport type { TypedConstructor } from '@seedcord/types';\n\ntype EffectConstructor = TypedConstructor<typeof EffectsHandler>;\ninterface RegisteredEffectHandlerEntry {\n ctor: EffectConstructor;\n frequency: EventFrequency;\n}\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, RegisteredEffectHandlerEntry[]>();\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, { effect: 'unknownException', frequency: 'on' });\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 meta = Reflect.getMetadata(EffectMetadataKey, val) as RegisterEffectMetadataEntry;\n this.registerEffect(val, meta);\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 registerEffect(handler: EffectConstructor, options: RegisterEffectMetadataEntry): void {\n let handlers = this.effectsMap.get(options.effect);\n if (!handlers) {\n handlers = [];\n this.effectsMap.set(options.effect, handlers);\n }\n handlers.push({ ctor: handler, frequency: options.frequency ?? 'on' });\n }\n\n private isEffectHandler(obj: unknown): obj is EffectConstructor {\n if (typeof obj !== 'function') return false;\n return obj.prototype instanceof EffectsHandler && Reflect.hasMetadata(EffectMetadataKey, obj);\n }\n\n private attachEffects(): void {\n for (const [effectName, handlerEntries] of this.effectsMap) {\n for (const entry of handlerEntries) {\n const register =\n entry.frequency === 'once'\n ? this.emitter.once.bind(this.emitter)\n : this.emitter.on.bind(this.emitter);\n register(effectName, (data) => {\n try {\n const instance = new entry.ctor(data, this.core);\n void instance.execute();\n } catch (err) {\n this.logger.error(\n `Error in side effect ${String(effectName)} handler ${entry.ctor.name}:`,\n err\n );\n }\n });\n }\n }\n }\n\n public override emit<KeyOfEffects extends EffectKeys>(\n event: KeyOfEffects,\n data: AllEffects[KeyOfEffects]\n ): boolean {\n return this.emitter.emit(event, data);\n }\n}\n","import {\n HealthCheck,\n CoordinatedShutdown,\n CoordinatedStartup,\n SeedcordError,\n SeedcordErrorCode,\n StartupPhase\n} 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 SeedcordError} 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 SeedcordError(SeedcordErrorCode.CoreSingletonViolation);\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\n/**\n * Constructor type for handler classes.\n *\n * @internal\n */\nexport type 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 * @typeParam TypeHandler - The type of the handler class being decorated\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 implements WithChecks {\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","import { SeedcordError, SeedcordErrorCode } from '@seedcord/services';\nimport { Message } from 'discord.js';\n\nimport { extractErrorResponse } from '@bUtilities/errors/extractErrorResponse';\n\nimport type { CustomError } from '@interfaces/Components';\nimport type { EventHandler, RepliableEventHandler } from '@interfaces/Handler';\nimport type { ClientEvents } from 'discord.js';\nimport type { NonEmptyTuple } from 'type-fest';\n\n/**\n * Configuration options for the EventCatchable decorator.\n */\nexport interface EventCatchableOptions {\n /** Whether to log errors to console using console.error (default: `false`) */\n log?: boolean;\n /**\n * Whether to fail silently without trying to send a message (default: `false`).\n *\n * Can pass a list of {@link CustomError} types to only silence those specific errors.\n */\n silent?: boolean | NonEmptyTuple<typeof CustomError>;\n}\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 options - Configuration for error handling behavior\n * @see {@link EventCatchableOptions}\n * @decorator\n * @example\n * ```typescript\n * class MessageHandler extends EventHandler {\n * \\@EventCatchable({ log: true, silent: [MyCustomError] })\n * async execute() {\n * // Event handling logic\n * }\n * }\n * ```\n */\nexport function EventCatchable(options?: EventCatchableOptions) {\n return function (\n _target: RepliableEventHandler,\n _prop: string,\n descriptor: TypedPropertyDescriptor<(...args: any[]) => Promise<void>>\n ): void {\n const log = options?.log ?? false;\n const silent = options?.silent ?? false;\n const original = descriptor.value;\n\n descriptor.value = async function (this: EventHandler<keyof ClientEvents>, ...args: any[]): Promise<void> {\n if (!original) throw new SeedcordError(SeedcordErrorCode.DecoratorMethodNotFound);\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 } = extractErrorResponse(\n err,\n this.core,\n msg?.guild ?? null,\n msg?.author ?? null,\n eventArgs\n );\n\n if (typeof silent === 'boolean' && silent) return;\n if (typeof silent !== 'boolean' && silent.some((errorType) => err instanceof errorType)) {\n return;\n }\n\n if (!msg) return;\n\n await msg.reply({ embeds: [response], components: [] });\n }\n };\n };\n}\n","import { SeedcordError, SeedcordErrorCode } from '@seedcord/services';\nimport { ComponentType } from 'discord.js';\n\nimport type {\n ConfirmableFactory,\n ConfirmableContext,\n ConfirmableOptions,\n ConfirmableComponentsV2Options,\n ConfirmableClassicOptions,\n ResolverSource,\n CustomIdSource,\n ConfirmablePayload,\n RowLike,\n ClassicPayload,\n OutcomeUiV2,\n OutcomeUiClassic,\n QuestionInput,\n ComponentInteractionFor,\n MaybeClearedClassic\n} from './types';\nimport type { Repliables, RepliableInteractionHandler } from '@interfaces/Handler';\nimport type { MessageComponentType, MessageComponentInteraction, Message } from 'discord.js';\nimport type { Promisable, NonEmptyTuple } from 'type-fest';\n\n/* utils */\n\nconst resolveFactory = async <TValue>(input: ConfirmableFactory<TValue>, ctx: ConfirmableContext): Promise<TValue> =>\n typeof input === 'function' ? await (input as (c: ConfirmableContext) => Promisable<TValue>)(ctx) : input;\n\nconst isV2 = <TComponentType extends MessageComponentType>(\n opts: ConfirmableOptions<TComponentType>\n): opts is ConfirmableComponentsV2Options<TComponentType> => 'container' in opts;\n\nconst usesResolver = <TComponentType extends MessageComponentType>(\n opts: ConfirmableOptions<TComponentType>\n): opts is\n | (ConfirmableClassicOptions<TComponentType> & ResolverSource<TComponentType>)\n | (ConfirmableComponentsV2Options<TComponentType> & ResolverSource<TComponentType>) => 'resolveDecision' in opts;\n\nconst usesCustomIds = <TComponentType extends MessageComponentType>(\n opts: ConfirmableOptions<TComponentType>\n): opts is ConfirmableOptions<TComponentType> & CustomIdSource => 'confirmCustomIds' in opts;\n\nconst isMessageComponentIx = (ix: Repliables): ix is Repliables & MessageComponentInteraction =>\n 'deferUpdate' in ix && 'customId' in ix;\n\n/* payload builders */\n\nconst buildPrompt = async <TComponentType extends MessageComponentType>(\n opts: ConfirmableOptions<TComponentType>,\n ctx: ConfirmableContext\n): Promise<ConfirmablePayload> => {\n if (isV2(opts)) {\n const container = await resolveFactory(opts.container, ctx);\n return { flags: 'IsComponentsV2', components: [container.component] };\n }\n\n const prompt = await resolveFactory(opts.prompt, ctx);\n const rows = await resolveFactory(opts.rows, ctx);\n const components = [...rows] as NonEmptyTuple<RowLike>;\n\n const payload: ClassicPayload = { components };\n\n if (typeof prompt === 'string') payload.content = prompt;\n else payload.embeds = [prompt.component];\n\n return payload;\n};\n\nconst clearedPayload = <TComponentType extends MessageComponentType>(\n opts: ConfirmableOptions<TComponentType>\n): ConfirmablePayload =>\n isV2(opts) ? { flags: 'IsComponentsV2', components: [] } : { components: [] as readonly RowLike[] };\n\n/* decision */\n\nconst decide = async <TComponentType extends MessageComponentType>(\n opts: ConfirmableOptions<TComponentType>,\n i: MessageComponentInteraction\n): Promise<boolean> => {\n if (usesResolver(opts)) return opts.resolveDecision(i as ComponentInteractionFor<TComponentType>);\n if (usesCustomIds(opts)) {\n const { confirmCustomIds, cancelCustomIds = [] } = opts;\n if (confirmCustomIds.includes(i.customId)) return true;\n if (cancelCustomIds.includes(i.customId)) return false;\n }\n return false;\n};\n\n/* flow helpers */\n\nconst shouldDefer = <TComponentType extends MessageComponentType>(\n ix: Repliables,\n opts: ConfirmableOptions<TComponentType>,\n isSlash: boolean,\n isContext: boolean\n): boolean => {\n if (ix.deferred) return false;\n if (opts.defer === false) return false;\n return isSlash || isContext;\n};\n\nconst maybeDefer = async <TComponentType extends MessageComponentType>(\n ix: Repliables,\n opts: ConfirmableOptions<TComponentType>,\n isSlash: boolean,\n isContext: boolean\n): Promise<void> => {\n if (!shouldDefer(ix, opts, isSlash, isContext)) return;\n\n if (isSlash || isContext) {\n const { ephemeral = true } = opts;\n const flags = ephemeral ? { flags: 'Ephemeral' as const } : undefined;\n if (flags) await ix.deferReply(flags);\n else await ix.deferReply();\n } else if (isMessageComponentIx(ix)) {\n await ix.deferUpdate();\n } else {\n await ix.deferReply().catch(() => undefined);\n }\n};\n\nconst sendPrompt = async (\n ix: Repliables,\n payload: ConfirmablePayload,\n ephemeral: boolean,\n isSlash: boolean,\n isContext: boolean\n): Promise<Message> => {\n if (isSlash || isContext) {\n if (ix.deferred) return ix.editReply(payload as Parameters<typeof ix.editReply>[0]);\n const reply = { ...payload, ...(ephemeral ? { flags: 'Ephemeral' } : {}) } as Parameters<typeof ix.reply>[0];\n await ix.reply(reply);\n return ix.fetchReply();\n }\n\n const follow = { ...payload, ...(ephemeral ? { flags: 'Ephemeral' } : {}) } as Parameters<typeof ix.followUp>[0];\n return ix.followUp(follow);\n};\n\nconst awaitComponent = async <TComponentType extends MessageComponentType>(\n msg: Message,\n original: Repliables,\n opts: ConfirmableOptions<TComponentType>\n): Promise<{ button: MessageComponentInteraction | null; timedOut: boolean }> => {\n const componentType = opts.componentType ?? ComponentType.Button;\n const timeoutMs = opts.timeoutMs ?? 10_000;\n\n try {\n const button = await msg.awaitMessageComponent({\n componentType,\n time: timeoutMs,\n filter: (c) => {\n if (c.user.id !== original.user.id) return false;\n if (usesCustomIds(opts)) {\n const { confirmCustomIds, cancelCustomIds = [] } = opts;\n return confirmCustomIds.includes(c.customId) || cancelCustomIds.includes(c.customId);\n }\n return true;\n }\n });\n return { button, timedOut: false };\n } catch {\n return { button: null, timedOut: true };\n }\n};\n\nconst clearUi = async <TComponentType extends MessageComponentType>(\n ix: Repliables,\n msg: Message,\n opts: ConfirmableOptions<TComponentType>,\n isSlash: boolean\n): Promise<void> => {\n if (!isSlash) {\n try {\n await msg.edit(clearedPayload(opts) as Parameters<typeof msg.edit>[0]);\n } catch {\n await ix.deleteReply(msg).catch(() => undefined);\n }\n return;\n }\n await ix.editReply(clearedPayload(opts) as Parameters<typeof ix.editReply>[0]).catch(() => undefined);\n};\n\nconst normalizeClassicOutcome = (payload: MaybeClearedClassic): ClassicPayload => ({\n ...payload,\n components: payload.components ?? []\n});\n\nconst outcomeReplacement = async <TComponentType extends MessageComponentType>(\n opts: ConfirmableOptions<TComponentType>,\n ctx: ConfirmableContext,\n confirmed: boolean,\n timedOut: boolean\n): Promise<ConfirmablePayload | null> => {\n const outcomes = opts.outcomeUi;\n\n if (isV2(opts)) {\n const v2Outcomes = outcomes as OutcomeUiV2;\n if (timedOut) return await resolveFactory(v2Outcomes.onTimeout, ctx);\n if (!confirmed) return await resolveFactory(v2Outcomes.onCancel, ctx);\n if (v2Outcomes.onConfirm) return await resolveFactory(v2Outcomes.onConfirm, ctx);\n return null;\n }\n\n const classicOutcomes = outcomes as OutcomeUiClassic;\n if (timedOut) return normalizeClassicOutcome(await resolveFactory(classicOutcomes.onTimeout, ctx));\n if (!confirmed) return normalizeClassicOutcome(await resolveFactory(classicOutcomes.onCancel, ctx));\n if (classicOutcomes.onConfirm) {\n return normalizeClassicOutcome(await resolveFactory(classicOutcomes.onConfirm, ctx));\n }\n return null;\n};\n\n/* decorator */\n\n/**\n * Wraps a repliable handler method with an interactive confirmation flow.\n *\n * Displays a prompt, waits for a follow-up component interaction, and conditionally executes the original method\n * based on the user's decision. The decorator supports both classic action rows + embed/content and ComponentV2 containers.\n *\n * @typeParam TComp - Message component type that should resolve the confirmation.\n * @param question - Static string or lazy factory that resolves the prompt question.\n * @param options - Confirmation flow configuration.\n * @decorator\n */\nexport function Confirmable<TComponent extends MessageComponentType = ComponentType.Button>(\n question: QuestionInput,\n options: ConfirmableOptions<TComponent>\n) {\n type HandlerMethod = (...args: unknown[]) => Promise<void>;\n\n return function (\n _target: RepliableInteractionHandler,\n _propertyKey: string,\n descriptor: TypedPropertyDescriptor<HandlerMethod>\n ): TypedPropertyDescriptor<HandlerMethod> {\n const original = descriptor.value;\n\n descriptor.value = async function (this: RepliableInteractionHandler, ...args: unknown[]): Promise<void> {\n if (!original) throw new SeedcordError(SeedcordErrorCode.DecoratorMethodNotFound);\n\n const ix = this.getEvent();\n const isSlash = ix.isChatInputCommand();\n const isContext = ix.isContextMenuCommand();\n const { ephemeral = true } = options;\n\n await maybeDefer(ix, options, isSlash, isContext);\n\n const q = typeof question === 'function' ? await question.apply(this) : question;\n\n const ctx: ConfirmableContext = { handler: this, interaction: ix, question: q };\n\n const prompt = await buildPrompt(options, ctx);\n\n const promptMsg = await sendPrompt(ix, prompt, ephemeral, isSlash, isContext);\n\n const { button, timedOut } = await awaitComponent(promptMsg, ix, options);\n\n let confirmed = false;\n if (button) {\n await button.deferUpdate().catch(() => undefined);\n confirmed = await decide(options, button);\n }\n\n const replacement = await outcomeReplacement(options, ctx, confirmed, timedOut);\n\n if (replacement) {\n if (isSlash || isContext) {\n await ix.editReply(replacement as Parameters<typeof ix.editReply>[0]).catch(() => undefined);\n } else {\n await promptMsg.edit(replacement as Parameters<typeof promptMsg.edit>[0]).catch(async () => {\n await ix.deleteReply(promptMsg).catch(() => undefined);\n await ix.followUp(replacement as Parameters<typeof ix.followUp>[0]).catch(() => undefined);\n });\n }\n } else {\n await clearUi(ix, promptMsg, options, isSlash);\n }\n\n if (options.onResolved) {\n await options.onResolved({\n confirmed,\n timedOut,\n handler: this,\n interaction: ix,\n question: q,\n ...(button ? { button } : {})\n });\n }\n\n if (confirmed) {\n await original.apply(this, args);\n }\n };\n\n return descriptor;\n };\n}\n","import { CustomError } from '@interfaces/Components';\n\n/**\n * Error thrown when a requested channel cannot be found.\n */\nexport class ChannelNotFoundError extends CustomError {\n /**\n * Creates a new ChannelNotFoundError.\n *\n * @param message - The error message\n * @param channelId - The ID of the channel that could not be found\n */\n constructor(\n message: string,\n public readonly channelId: string\n ) {\n super(message);\n\n this.response.setDescription(`Channel with ID \\`${this.channelId}\\` not found.`);\n }\n}\n\n/**\n * Error thrown when the bot cannot send embeds in a channel.\n */\nexport class CannotSendEmbedsError extends CustomError {\n /**\n * Creates a new CannotSendEmbedsError.\n *\n * @param message - The error message\n * @param channelId - The ID of the channel where embeds cannot be sent\n */\n constructor(\n message: string,\n public readonly channelId: string\n ) {\n super(message);\n\n this.response.setDescription(\n `Cannot send embeds in <#${this.channelId}>.\\n\\n` +\n `Please ensure I have the following permissions:\\n` +\n `• View Channel\\n` +\n `• Send Messages\\n` +\n `• Embed Links\\n` +\n `• Attach Files\\n` +\n `• Read Message History\\n` +\n `• Use External Emojis\\n`\n );\n }\n}\n\n/**\n * Error thrown when a channel could not be found or accessed.\n */\nexport class CouldNotFindChannel extends CustomError {\n /**\n * Creates a new CouldNotFindChannel error.\n *\n * @param message - The error message\n * @param channelId - The ID of the channel that could not be found\n */\n constructor(\n message: string,\n public readonly channelId: string\n ) {\n super(message);\n\n this.response.setDescription(\n `Could not find channel with ID \\`${this.channelId}\\`. It could also be that the channel is not a text channel.`\n );\n }\n}\n\n/**\n * Error thrown when a channel is not a text channel.\n */\nexport class ChannelNotTextChannel extends CustomError {\n /**\n * Creates a new ChannelNotTextChannel error.\n *\n * @param message - The error message\n * @param channelId - The ID of the channel that is not a text channel\n */\n constructor(\n message: string,\n public readonly channelId: string\n ) {\n super(message);\n\n this.response.setDescription(`Channel with ID \\`${this.channelId}\\` is not a text channel.`);\n }\n}\n","import { Role } from 'discord.js';\n\nimport { CustomError } from '@interfaces/Components';\n\nimport type { TextChannel } from 'discord.js';\n\n/**\n * Error thrown when the bot lacks necessary permissions to perform an action.\n */\nexport class MissingPermissions extends CustomError {\n /**\n * Creates a new BotMissingPermissionsError.\n *\n * @param message - The error message\n * @param missingPerms - Array of missing permission names\n * @param roleOrChannel - The role or channel where permissions are missing\n */\n constructor(\n message: string,\n public missingPerms: string[],\n public roleOrChannel: Role | TextChannel\n ) {\n super(message);\n\n const missing = this.missingPerms.map((perm) => `• ${perm}`).join('\\n');\n\n const errorSubtext =\n this.roleOrChannel instanceof Role\n ? `My role, <@&${this.roleOrChannel.id}>, is missing the following permissions:`\n : `I am missing the following permissions in <#${this.roleOrChannel.id}>:`;\n\n this.response.setDescription(\n `${errorSubtext}\\n\\nPlease ensure I have the following missing permission(s):\\n${missing}`\n );\n }\n}\n\n/**\n * Error thrown when attempting to modify a role higher than the bot's highest role.\n */\nexport class RoleHigherThanMe extends CustomError {\n /**\n * Creates a new RoleHigherThanMe error.\n *\n * @param message - The error message\n */\n constructor(\n message: string,\n public role: Role,\n public botRole: Role\n ) {\n super(message);\n\n this.response.setDescription(\n `I cannot assign a role that is higher than me.\\n\\n` +\n `The role <@&${this.role.id}> is higher than my role <@&${this.botRole.id}> in the hierarchy.`\n );\n }\n}\n\n/**\n * Error thrown when attempting to assign a managed/bot role.\n */\nexport class CannotAssignBotRole extends CustomError {\n /**\n * Creates a new CannotAssignBotRole error.\n *\n * @param message - The error message\n */\n constructor(message = 'I cannot assign a managed role.') {\n super(message);\n\n this.response.setDescription('I cannot assign a managed role.');\n }\n}\n\n/**\n * Error thrown when a requested role does not exist.\n */\nexport class RoleDoesNotExist extends CustomError {\n /**\n * Creates a new RoleDoesNotExist error.\n *\n * @param message - The error message\n * @param roleId - The ID of the role that doesn't exist\n */\n constructor(\n message: string,\n public roleId: string\n ) {\n super(message);\n\n this.response.setDescription(`The role with ID \\`${this.roleId}\\` does not exist.`);\n }\n}\n\n/**\n * Error thrown when a role has dangerous permissions that shouldn't be assigned.\n */\nexport class HasDangerousPermissions extends CustomError {\n /**\n * Creates a new HasDangerousPermissions error.\n *\n * @param message - The error message\n * @param role - The role with dangerous permissions\n * @param dangerousPerms - Array of dangerous permission names\n */\n constructor(\n message: string,\n public role: Role,\n public dangerousPerms: string[]\n ) {\n super(message);\n\n const dangerous = this.dangerousPerms.map((perm) => `• ${perm}`).join('\\n');\n this.response.setDescription(\n `The role <@&${this.role.id}> has the following dangerous permissions:\\n\\n` +\n `Please ensure the following dangerous permission(s) are not enabled:\\n${dangerous}`\n );\n }\n}\n","import { CustomError } from '@interfaces/Components';\n\n/**\n * Error thrown when attempting to perform actions on a user not in the guild.\n */\nexport class UserNotInGuild extends CustomError {\n /**\n * Creates a new UserNotInGuild error.\n *\n * @param message - The error message\n */\n constructor(message = 'User is not in the guild.') {\n super(message);\n\n this.response.setDescription('User is not in the guild.');\n }\n}\n\n/**\n * Error thrown when a requested user cannot be found.\n */\nexport class UserNotFound extends CustomError {\n /**\n * Creates a new UserNotFound error.\n *\n * @param userArg - The user argument that could not be resolved\n */\n constructor(public readonly userArg: string) {\n super(`User not found: ${userArg}`);\n\n this.response\n .setTitle('User Not Found')\n .setDescription(\n `User probably doesn't exist or was deleted.\\n` +\n `**User Argument:** \\`${this.userArg}\\`\\n` +\n `Please check the user ID and try again. Only pass valid user IDs as the argument.`\n );\n }\n}\n","import { TextChannel } from 'discord.js';\n\nimport { CouldNotFindChannel } from '@bErrors/Channels';\n\nimport type { Nullable } from '@seedcord/types';\nimport type { Channel, Client, TextChannelResolvable } from 'discord.js';\n\n/**\n * Fetches and validates a text channel.\n *\n * @param client - The Discord client instance\n * @param channelId - Channel ID or TextChannel instance\n * @returns Promise resolving to the text channel\n * @throws A {@link CouldNotFindChannel} When the channel doesn't exist or isn't text-based\n */\nexport async function fetchText(client: Client, channelId: TextChannelResolvable): Promise<TextChannel> {\n if (channelId instanceof TextChannel) {\n return channelId;\n }\n\n let channel: Nullable<Channel> = client.channels.cache.get(channelId);\n\n if (!channel) {\n try {\n channel = await client.channels.fetch(channelId);\n } catch {\n throw new CouldNotFindChannel('Channel not found or not a text channel', channelId);\n }\n }\n\n if (channel?.isTextBased()) {\n return channel as TextChannel;\n }\n\n throw new CouldNotFindChannel('Channel not found or not a text channel', channelId);\n}\n","import { fetchText } from './fetchText';\n\nimport type { AtleastOneMessageComponent } from '@bUtilities/Types';\nimport type { Client, Message, TextChannelResolvable } from 'discord.js';\n\n/**\n * Sends a message to a text channel by ID.\n *\n * @param client - The Discord client instance\n * @param channelId - Channel ID or TextChannel instance\n * @param message - Message content to send\n * @returns Promise resolving to the sent message\n * @throws A {@link CouldNotFindChannel} When the channel doesn't exist or isn't text-based\n */\nexport async function sendInText(\n client: Client,\n channelId: TextChannelResolvable,\n message: AtleastOneMessageComponent\n): Promise<Message> {\n const channel = await fetchText(client, channelId);\n return await channel.send(message);\n}\n","import { Logger } from '@seedcord/services';\n\nimport { DatabaseError } from '@bErrors/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 Ctor - 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","import type { AtleastOneMessageComponent } from '@bUtilities/Types';\nimport type { Nullable } from '@seedcord/types';\nimport type { Message, User } from 'discord.js';\n\n/**\n * Sends a direct message to a user.\n *\n * @param user - The user to send the DM to\n * @param content - Message content with embeds, components, etc.\n * @returns Promise resolving to the sent message, or null if DM failed\n */\nexport async function attemptSendDM(user: User, content: AtleastOneMessageComponent): Promise<Nullable<Message>> {\n const payload = {\n ...(content.content !== undefined && { content: content.content }),\n ...(content.embeds !== undefined && { embeds: [...content.embeds] }),\n ...(content.components !== undefined && {\n components: [...content.components]\n })\n };\n\n try {\n return await user.send(payload);\n } catch {\n return null;\n }\n}\n","import { SeedcordError, SeedcordErrorCode } from '@seedcord/services';\nimport { prettify } from '@seedcord/utils';\nimport { Role, PermissionFlagsBits } from 'discord.js';\n\nimport { MissingPermissions, HasDangerousPermissions } from '@bErrors/Roles';\n\nimport type { Nullable, TypedExclude } from '@seedcord/types';\nimport type { Client, TextChannel, PermissionsBitField } from 'discord.js';\n\n/**\n * Map of permission bits to their prettified human-readable names.\n */\nexport const PermissionNames = new Map<bigint, string>(\n Object.entries(PermissionFlagsBits).map(([key, bit]) => [bit, prettify(key)])\n);\n\n/**\n * Defines the scope types for bot permission validation.\n */\nexport type BotPermissionScope = 'manage' | 'others' | 'all' | bigint[] | 'embed';\n\n/**\n * Defines the valid group types for permission checking, excluding 'all' and bigint[].\n */\nexport type BotPermissionScopeGroups = TypedExclude<BotPermissionScope, 'all' | bigint[]>;\n\n// TODO: Update perm groups so they make better sense\n/**\n * Predefined permission groups for different scopes.\n */\nexport const PERM_GROUPS: Record<BotPermissionScopeGroups, Map<bigint, string>> = {\n manage: new Map<bigint, string>([\n [PermissionFlagsBits.ManageChannels, 'Manage Channels'],\n [PermissionFlagsBits.ManageRoles, 'Manage Roles'],\n [PermissionFlagsBits.ManageWebhooks, 'Manage Webhooks'],\n [PermissionFlagsBits.ManageMessages, 'Manage Messages'],\n [PermissionFlagsBits.ManageNicknames, 'Manage Nicknames']\n ]),\n embed: new Map<bigint, string>([\n [PermissionFlagsBits.ViewChannel, 'View Channel'],\n [PermissionFlagsBits.SendMessages, 'Send Messages'],\n [PermissionFlagsBits.EmbedLinks, 'Embed Links'],\n [PermissionFlagsBits.AttachFiles, 'Attach Files'],\n [PermissionFlagsBits.UseExternalEmojis, 'Use External Emojis'],\n [PermissionFlagsBits.ReadMessageHistory, 'Read Message History']\n ]),\n others: new Map<bigint, string>([\n [PermissionFlagsBits.AddReactions, 'Add Reactions'],\n [PermissionFlagsBits.UseApplicationCommands, 'Use Application Commands']\n ])\n};\n\n/**\n * Checks permissions for a {@link Role}.\n *\n * @param client - The Discord client instance\n * @param roleOrChannel - Role to check permissions for\n * @param scope - Permission scope to validate\n * @param inverse - Whether to check for absence of permissions (role only). Defaults to false.\n * @throws A {@link MissingPermissions} When required permissions are missing\n * @throws A {@link HasDangerousPermissions} When role has dangerous permissions (if inverse is true)\n */\nexport function checkPermissions(\n client: Client,\n roleOrChannel: Role,\n scope: BotPermissionScope,\n inverse?: boolean\n): void;\n\n/**\n * Checks permissions for a {@link TextChannel}.\n *\n * @param client - The Discord client instance\n * @param roleOrChannel - TextChannel to check permissions for\n * @param scope - Permission scope to validate\n * @throws A {@link MissingPermissions} When required permissions are missing\n */\nexport function checkPermissions(client: Client, roleOrChannel: TextChannel, scope?: BotPermissionScope): void;\n\nexport function checkPermissions(\n client: Client,\n roleOrChannel: Role | TextChannel,\n scope: BotPermissionScope = 'all',\n inverse = false\n): void {\n let required: Map<bigint, string>;\n if (Array.isArray(scope)) {\n required = new Map();\n for (const bit of scope) {\n // Try finding the permission name in both groups\n const name = PermissionNames.get(bit);\n if (name) required.set(bit, name);\n }\n } else {\n switch (scope) {\n case 'manage':\n required = PERM_GROUPS.manage;\n break;\n case 'embed':\n required = PERM_GROUPS.embed;\n break;\n case 'others':\n required = new Map([...PERM_GROUPS.others, ...PERM_GROUPS.embed]);\n break;\n default:\n required = new Map([...PERM_GROUPS.manage, ...PERM_GROUPS.others, ...PERM_GROUPS.embed]);\n break;\n }\n }\n\n let permissions: Nullable<Readonly<PermissionsBitField>>;\n if (roleOrChannel instanceof Role) {\n permissions = roleOrChannel.permissions;\n } else {\n if (!client.user) {\n throw new SeedcordError(SeedcordErrorCode.CoreClientUserUnavailable);\n }\n permissions = roleOrChannel.permissionsFor(client.user, true);\n }\n\n if (!permissions) {\n throw new MissingPermissions('Missing Permissions', Array.from(required.values()), roleOrChannel);\n }\n\n if (inverse) {\n const dangerous = Array.from(required.entries())\n .filter(([bit]) => permissions.has(bit, true))\n .map(([, name]) => name);\n\n if (dangerous.length > 0) {\n throw new HasDangerousPermissions('Role has dangerous permissions', roleOrChannel as Role, dangerous);\n }\n } else {\n const missing = Array.from(required.entries())\n .filter(([bit]) => !permissions.has(bit, true))\n .map(([, name]) => name);\n\n if (missing.length > 0) {\n throw new MissingPermissions('Missing Permissions', missing, roleOrChannel);\n }\n }\n}\n","import { SeedcordError, SeedcordErrorCode } from '@seedcord/services';\n\nimport type { Client, Guild, Role } from 'discord.js';\n\n/**\n * Gets the bot's highest role in a guild.\n *\n * @param client - The Discord client instance\n * @param guild - The guild to get the bot's role from\n * @returns The bot's highest role in the guild\n * @throws A {@link SeedcordError} When the bot is not in the guild\n */\nexport function getBotRole(client: Client, guild: Guild): Role {\n if (!client.user) {\n throw new SeedcordError(SeedcordErrorCode.CoreClientUserUnavailable);\n }\n\n const botRole = guild.roles.botRoleFor(client.user);\n if (!botRole) {\n throw new SeedcordError(SeedcordErrorCode.CoreBotRoleMissing, [guild.id]);\n }\n\n return botRole;\n}\n","import { Guild } from 'discord.js';\n\nimport { checkPermissions } from './checkPermissions';\nimport { getBotRole } from './getBotRole';\n\nimport type { BotPermissionScope } from './checkPermissions';\nimport type { Client, TextChannel } from 'discord.js';\n\n/**\n * Checks if the bot has required permissions in a guild or channel.\n *\n * @param client - The Discord client instance\n * @param guildOrChannel - Guild or text channel to check permissions in\n * @param scope - Permission scope to validate\n * @param inverse - Whether to check for absence of permissions\n * @throws A {@link MissingPermissions} When bot lacks required permissions\n */\nexport function checkBotPermissions(\n client: Client,\n guildOrChannel: Guild | TextChannel,\n scope: BotPermissionScope = 'all',\n inverse = false\n): void {\n if (guildOrChannel instanceof Guild) {\n const botRole = getBotRole(client, guildOrChannel);\n checkPermissions(client, botRole, scope, inverse);\n } else {\n checkPermissions(client, guildOrChannel, scope);\n }\n}\n","import { Guild } from 'discord.js';\n\nimport { RoleDoesNotExist } from '@bErrors/Roles';\n\nimport type { Nullable } from '@seedcord/types';\nimport type { Client, Role } from 'discord.js';\n\n/**\n * Fetches a role by ID from a client or guild.\n *\n * @param clientOrGuild - Discord client or guild instance\n * @param roleId - The role ID to fetch\n * @returns Promise resolving to the role\n * @throws A {@link RoleDoesNotExist} When the role doesn't exist\n */\nexport async function fetchRole(clientOrGuild: Client | Guild, roleId: string): Promise<Role> {\n let role: Nullable<Role>;\n\n if (!roleId) {\n throw new RoleDoesNotExist('Role ID is null or undefined', roleId);\n }\n\n if (clientOrGuild instanceof Guild) {\n const guild = clientOrGuild;\n\n role = guild.roles.cache.get(roleId);\n\n if (!role) {\n try {\n role = await guild.roles.fetch(roleId);\n } catch {\n throw new RoleDoesNotExist('Role not found in specified guild', roleId);\n }\n }\n } else {\n const client = clientOrGuild;\n\n role = client.guilds.cache.map((guild) => guild.roles.cache.get(roleId)).find((role) => role);\n\n if (!role) {\n const guilds = client.guilds.cache;\n for (const guild of guilds.values()) {\n try {\n role = await guild.roles.fetch(roleId);\n if (role) break;\n } catch {\n continue;\n }\n }\n }\n }\n\n if (!role) {\n throw new RoleDoesNotExist('Role not found', roleId);\n }\n\n return role;\n}\n","import { PermissionFlagsBits } from 'discord.js';\n\nimport { RoleHigherThanMe, CannotAssignBotRole } from '@bErrors/Roles';\n\nimport { checkBotPermissions } from './checkBotPermissions';\nimport { getBotRole } from './getBotRole';\n\nimport type { Role } from 'discord.js';\n\n/**\n * Validates if the bot has permission to assign a target role.\n *\n * @param targetRole - The role to check assignment permissions for\n * @throws A {@link RoleHigherThanMe} When the target role is higher than bot's role\n * @throws A {@link CannotAssignBotRole} When trying to assign a managed/bot role\n * @throws A {@link MissingPermissions} When bot lacks Manage Roles permission\n */\nexport function hasPermsToAssign(targetRole: Role): void {\n const botRole = getBotRole(targetRole.client, targetRole.guild);\n\n if (targetRole.comparePositionTo(botRole) >= 0) {\n throw new RoleHigherThanMe('Role is higher than me', targetRole, botRole);\n }\n\n if (targetRole.managed) {\n throw new CannotAssignBotRole(`Cannot assign bot role ${targetRole.name}`);\n }\n\n checkBotPermissions(targetRole.client, targetRole.guild, [PermissionFlagsBits.ManageRoles]);\n}\n","import { UserNotInGuild } from '@bErrors/User';\n\nimport type { Guild, GuildMember } from 'discord.js';\n\n/**\n * Fetches a guild member by user ID with error handling.\n *\n * @param guild - The guild to fetch the member from\n * @param userId - The Discord user ID\n * @returns Promise resolving to the guild member\n * @throws A {@link UserNotInGuild} When the user is not found in the guild\n */\nexport async function fetchGuildMember(guild: Guild, userId: string): Promise<GuildMember> {\n let user = guild.members.cache.get(userId);\n user ??= await guild.members.fetch(userId).catch(() => {\n throw new UserNotInGuild(`User with ID ${userId} not found in guild`);\n });\n\n return user;\n}\n","import { fetchGuildMember } from './fetchGuildMember';\n\nimport type { Guild, GuildMember } from 'discord.js';\n\n/**\n * Fetches multiple guild members by user IDs.\n *\n * @param guild - The guild to fetch members from\n * @param userIds - Array of Discord user IDs\n * @returns Promise resolving to array of successfully fetched members\n */\nexport async function fetchManyGuildMembers(guild: Guild, userIds: string[]): Promise<GuildMember[]> {\n const results = await Promise.allSettled(userIds.map((userId) => fetchGuildMember(guild, userId)));\n\n return results\n .filter((result): result is PromiseFulfilledResult<GuildMember> => result.status === 'fulfilled')\n .map((result) => result.value);\n}\n","import { DiscordAPIError, RESTJSONErrorCodes } from 'discord.js';\n\nimport { UserNotFound } from '@bErrors/User';\n\nimport type { Client, User } from 'discord.js';\n\n/**\n * Fetches a Discord user by ID with error handling.\n *\n * @param client - The Discord client instance\n * @param userId - The Discord user ID\n * @returns Promise resolving to the user\n * @throws A {@link UserNotFound} When the user doesn't exist\n */\nexport async function fetchUser(client: Client, userId: string): Promise<User> {\n let user = client.users.cache.get(userId);\n user ??= await client.users.fetch(userId).catch((err) => {\n if (err instanceof DiscordAPIError && err.code === RESTJSONErrorCodes.UnknownUser) {\n throw new UserNotFound(userId);\n }\n\n throw err;\n });\n\n return user;\n}\n","import { fetchUser } from './fetchUser';\n\nimport type { Client, User } from 'discord.js';\n\n/**\n * Fetches multiple Discord users by IDs.\n *\n * @param client - The Discord client instance\n * @param userIds - Array of Discord user IDs\n * @returns Promise resolving to array of successfully fetched users\n */\nexport async function fetchManyUsers(client: Client, userIds: string[]): Promise<User[]> {\n const results = await Promise.allSettled(userIds.map((userId) => fetchUser(client, userId)));\n\n return results\n .filter((result): result is PromiseFulfilledResult<User> => result.status === 'fulfilled')\n .map((result) => result.value);\n}\n","import type { Snowflake, GuildMember } from 'discord.js';\n\n/**\n * Updates a guild member's roles by adding and removing specified roles.\n *\n * @param rolesToAdd - Array of role IDs to add to the member\n * @param rolesToRemove - Array of role IDs to remove from the member\n * @param member - The guild member to update\n * @returns Promise that resolves when roles are updated\n */\nexport async function updateMemberRoles(\n rolesToAdd: Snowflake[],\n rolesToRemove: Snowflake[],\n member: GuildMember\n): Promise<void> {\n const current = new Set(member.roles.cache.map((r) => r.id));\n const toAdd = new Set(rolesToAdd);\n const toRemove = new Set(rolesToRemove);\n const updated = current.union(toAdd).difference(toRemove);\n\n await member.roles.set([...updated]);\n}\n"]}
|