seedcord 0.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/library/Globals.ts","../src/interfaces/Components.ts","../src/bot/errors/Database.ts","../src/services/Logger.ts","../src/library/Helpers.ts","../src/bot/decorators/CommandRegisterable.ts","../src/bot/controllers/CommandRegistry.ts","../src/interfaces/Handler.ts","../src/bot/decorators/EventRegisterable.ts","../src/bot/controllers/EventController.ts","../src/bot/decorators/InteractionConfigurable.ts","../src/bot/utilities/ErrorHandlingUtils.ts","../src/bot/decorators/Catchable.ts","../src/bot/defaults/UnhandledEvent.ts","../src/bot/controllers/InteractionController.ts","../src/bot/injectors/EmojiInjector.ts","../src/interfaces/Plugin.ts","../src/services/Lifecycle/CoordinatedLifecycle.ts","../src/services/Lifecycle/CoordinatedShutdown.ts","../src/bot/Bot.ts","../src/hooks/decorators/RegisterHook.ts","../src/hooks/interfaces/HookHandler.ts","../src/hooks/interfaces/abstracts/WebhookLog.ts","../src/hooks/default/UnknownException.ts","../src/hooks/HookEmitter.ts","../src/hooks/HookController.ts","../src/services/HealthCheck.ts","../src/services/Lifecycle/CoordinatedStartup.ts","../src/Seedcord.ts","../src/bot/decorators/Checkable.ts","../src/bot/decorators/EventCatchable.ts","../src/services/CooldownManager.ts","../src/mongo/decorators/DatabaseModel.ts","../src/mongo/decorators/DatabaseService.ts","../src/mongo/BaseService.ts","../src/mongo/Mongo.ts","../src/mongo/decorators/DBCatchable.ts"],"names":["Globals","Envapter","botToken","healthCheckPort","healthCheckPath","shutdownIsEnabled","unknownExceptionWebhookUrl","botColor","isProduction","fallback","undefined","BuilderTypes","command","SlashCommandBuilder","embed","EmbedBuilder","button","ButtonBuilder","menu_string","StringSelectMenuBuilder","menu_option_string","StringSelectMenuOptionBuilder","menu_user","UserSelectMenuBuilder","menu_channel","ChannelSelectMenuBuilder","menu_mentionable","MentionableSelectMenuBuilder","menu_role","RoleSelectMenuBuilder","modal","ModalBuilder","subcommand","SlashCommandSubcommandBuilder","group","SlashCommandSubcommandGroupBuilder","context_menu","ContextMenuCommandBuilder","RowTypes","ActionRowBuilder","ModalTypes","text","TextInputBuilder","BaseComponent","_component","ComponentClass","instance","BuilderComponent","type","setColor","setContexts","InteractionContextType","Guild","component","buildCustomId","prefix","args","length","join","RowComponent","ModalRow","addComponents","ModalComponent","BaseErrorEmbed","setTitle","CustomError","Error","_emit","response","message","captureStackTrace","emit","DatabaseConnectionFailure","setDescription","DatabaseError","uuid","name","Logger","instances","Map","get","set","transportName","consoleTransport","createConsoleTransport","initializeLogger","getFormatCustomizations","padding","format","errors","stack","splat","colorize","level","timestamp","printf","info","ts","String","lvl","padEnd","lbl","label","msg","base","splatSym","Symbol","for","raw","extras","Array","isArray","cleaned","filter","x","Object","keys","rendered","parts","push","JSON","stringify","transports","Console","combine","isDevelopment","isStaging","transportsArray","maxSizeInMB","File","filename","uncolorize","json","bigint","space","maxsize","maxFiles","tailable","logger","createLogger","error","warn","http","verbose","debug","silly","Info","Warn","Debug","Silly","numberFixer","num","decimalPlaces","factor","Math","pow","round","Number","EPSILON","percentage","num1","num2","toFixed","generateAsciiTable","data","firstRow","table","columnWidths","i","maxWidth","row","cell","max","createLine","char","left","intersect","right","line","forEach","width","index","repeat","rowIndex","columnIndex","columnWidth","formatWord","word","charAt","toUpperCase","slice","toLowerCase","longestStringLength","arr","map","el","toString","currentTime","floor","Date","now","ordinal","n","s","v","suffix","prettyDifference","numBefore","numAfter","isTsOrJsFile","entry","isFile","endsWith","traverseDirectory","dir","callback","entries","readdir","withFileTypes","fullPath","relativePath","relative","process","cwd","isDirectory","imported","throwCustomError","customError","crypto","randomUUID","errorMessage","prettify","key","replace","trim","fyShuffle","items","array","j","random","CommandMetadataKey","RegisterCommand","scope","guilds","ctor","meta","Reflect","defineMetadata","CommandRegistry","isInitialised","globalCommands","guildCommands","core","init","chalk","bold","config","bot","commands","path","loadCommands","green","magenta","size","_full","rel","mod","exported","values","isCommandClass","registerCommand","obj","prototype","hasMetadata","getMetadata","comp","commandType","italic","yellow","gray","cyan","g","setCommands","client","application","tag","guildId","guild","cache","BaseHandler","checkable","break","errored","event","hasChecks","hasErrors","setErrored","shouldBreak","getEvent","getArgs","getArg","InteractionHandler","InteractionMiddleware","AutocompleteHandler","focused","options","getFocused","EventHandler","EventMetadataKey","RegisterEvent","eventName","constructor","EventController","isInitialized","eventMap","handlersDir","events","loadHandlers","attachToClient","loadedEventsArray","handlers","_fullPath","val","isEventHandlerClass","registerHandler","handlerClass","user","username","on","processEvent","handlerCtors","HandlerCtor","handler","runChecks","execute","err","InteractionRoutes","SelectMenuType","InteractionMetadataKey","SlashRoute","routeOrRoutes","storeMetadata","ButtonRoute","ModalRoute","ContextMenuRoute","routeType","AutocompleteRoute","commandRoutes","focusedFields","routes","fields","route","field","autocompleteKey","SelectMenuRoute","routeMap","symbol","areRoutes","every","r","savedRoutes","existing","toStore","ErrorHandlingUtils","handleError","hooks","GenericError","Catchable","_target","_propertyKey","descriptor","log","forceFollowup","originalMethod","value","interaction","apply","console","res","embeds","components","followUp","flags","MessageFlags","Ephemeral","replied","deferred","editReply","reply","UnhandledEvent","content","InteractionController","slashMap","buttonMap","modalMap","stringSelectMap","userSelectMap","roleSelectMap","channelSelectMap","mentionableSelectMap","messageContextMenuMap","userContextMenuMap","autocompleteMap","keysToIgnore","Set","middlewares","interactions","isHandlerClass","routeTypes","Slash","Button","Modal","StringMenu","UserMenu","RoleMenu","ChannelMenu","MentionableMenu","MessageContextMenu","UserContextMenu","Autocomplete","Events","InteractionCreate","handleInteraction","catch","red","parseCustomId","customId","split","argString","handleCustomIdInteraction","getMap","interactionType","processInteraction","extractKey","getHandler","has","MiddlewareCtor","middleware","isChatInputCommand","handleSlashCommand","isButton","handleButton","isModalSubmit","handleModal","isStringSelectMenu","handleStringSelectMenu","isUserSelectMenu","handleUserSelectMenu","isRoleSelectMenu","handleRoleSelectMenu","isChannelSelectMenu","handleChannelSelectMenu","isMentionableSelectMenu","handleMentionableSelectMenu","isMessageContextMenuCommand","handleMessageContextMenu","isUserContextMenuCommand","handleUserContextMenu","isAutocomplete","handleAutocomplete","buildSlashRoute","commandName","getSubcommandGroup","sub","getSubcommand","EmojiInjector","emojis","configEmojis","fetch","foundCount","emojiName","emoji","find","e","identifier","Plugin","pluggable","Pluggable","shutdown","startup","PLUGIN_INIT_TIMEOUT_MS","run","attach","startupPhase","addTask","assign","CoordinatedLifecycle","EventEmitter","tasksMap","loggerName","phaseOrder","phaseEnum","phase","taskName","task","timeoutMs","canAddTask","tasks","timeout","getTaskType","removeTask","canRemoveTask","initialLength","filteredTasks","removed","runPhase","results","executeTasksInPhase","failures","status","runTaskWithTimeout","Promise","race","_","reject","setTimeout","listener","off","ShutdownPhase","PHASE_ORDER","LOG_FLUSH_DELAY_MS","CoordinatedShutdown","isShuttingDown","exitCode","registerSignalHandlers","resolve","then","reason","exit","Bot","_client","emojiInjector","Client","clientOptions","DiscordCleanup","stop","login","removeAllListeners","logout","destroy","HookMetadataKey","RegisterHook","hook","HookHandler","WebhookLog","UnknownException","webhook","WebhookClient","url","send","avatarURL","UnhandledErrorEmbed","id","setTimestampsIfAvailable","DiscordAPIError","snowflake","match","interactionTs","SnowflakeUtil","deconstruct","diff","seconds","millis","addFields","toISOString","inline","HookEmitter","emitter","once","HookController","hookMap","hooksDir","registerHook","loadHooks","attachHooks","totalHooks","from","reduce","acc","exportName","isHookHandler","hookName","HTTP_OK","HTTP_NOT_FOUND","HealthCheck","port","server","StopServices","createServer","req","method","writeHead","end","listen","shutdownResolve","close","StartupPhase","CoordinatedStartup","isStartingUp","hasStarted","isReady","isRunning","Seedcord","isInstantiated","healthCheck","registerStartupTasks","Configuration","Instantiation","Ready","start","Checkable","EventCatchable","_prop","original","eventArgs","Message","result","author","CooldownManager","window","Err","opts","cooldown","check","last","remaining","isActive","clear","delete","ModelMetadataKey","DatabaseModel","collection","target","propertyKey","schema","model","mongoose","ServiceMetadataKey","DatabaseService","BaseService","db","_register","Mongo","uri","services","ExternalResources","connect","loadServices","disconnect","dbName","tls","ssl","connection","servicesDir","Service","isServiceClass","DBCatchable"],"mappings":"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","file":"index.mjs","sourcesContent":["import { ColorResolvable } from 'discord.js';\nimport { Envapt, Envapter } from 'envapt';\n\n/**\n * Global configuration variables for the application. These ENV variables are reserved for the framework.\n *\n * Set them in your `.env` file to override the default.\n */\nexport class Globals extends Envapter {\n @Envapt('DISCORD_BOT_TOKEN', { fallback: undefined })\n public static readonly botToken: string;\n\n // Healthcheck\n @Envapt('HEALTH_CHECK_PORT', { fallback: 6956 })\n public static readonly healthCheckPort: number;\n\n @Envapt('HEALTH_CHECK_PATH', { fallback: '/healthcheck' })\n public static readonly healthCheckPath: string;\n\n // Coordinated Shutdown\n @Envapt('SHUTDOWN_IS_ENABLED', { fallback: false })\n public static readonly shutdownIsEnabled: boolean;\n\n // Unknown Exception Webhook URL\n @Envapt('UNKNOWN_EXCEPTION_WEBHOOK_URL', { fallback: undefined })\n public static readonly unknownExceptionWebhookUrl: string;\n\n // Variables\n /**\n * The default color of the bot's embeds. Can simply override by `Globals.botColor =`\n */\n public static botColor: ColorResolvable = this.isProduction ? '#fe565a' : '#3fa045';\n}\n","import {\n ActionRowBuilder,\n ButtonBuilder,\n ChannelSelectMenuBuilder,\n ContextMenuCommandBuilder,\n EmbedBuilder,\n InteractionContextType,\n MentionableSelectMenuBuilder,\n ModalBuilder,\n RoleSelectMenuBuilder,\n SlashCommandBuilder,\n SlashCommandSubcommandBuilder,\n SlashCommandSubcommandGroupBuilder,\n StringSelectMenuBuilder,\n StringSelectMenuOptionBuilder,\n TextInputBuilder,\n UserSelectMenuBuilder\n} from 'discord.js';\n\nimport { Globals } from '../library/Globals';\n\nimport type { ModalActionRowComponentBuilder } from 'discord.js';\n\nconst BuilderTypes = {\n command: SlashCommandBuilder,\n embed: EmbedBuilder,\n button: ButtonBuilder,\n menu_string: StringSelectMenuBuilder,\n menu_option_string: StringSelectMenuOptionBuilder,\n menu_user: UserSelectMenuBuilder,\n menu_channel: ChannelSelectMenuBuilder,\n menu_mentionable: MentionableSelectMenuBuilder,\n menu_role: RoleSelectMenuBuilder,\n modal: ModalBuilder,\n subcommand: SlashCommandSubcommandBuilder,\n group: SlashCommandSubcommandGroupBuilder,\n context_menu: ContextMenuCommandBuilder\n};\n\nconst RowTypes: {\n button: typeof ActionRowBuilder<ButtonBuilder>;\n menu_string: typeof ActionRowBuilder<StringSelectMenuBuilder>;\n menu_user: typeof ActionRowBuilder<UserSelectMenuBuilder>;\n menu_channel: typeof ActionRowBuilder<ChannelSelectMenuBuilder>;\n menu_mentionable: typeof ActionRowBuilder<MentionableSelectMenuBuilder>;\n menu_role: typeof ActionRowBuilder<RoleSelectMenuBuilder>;\n modal: typeof ActionRowBuilder<ModalActionRowComponentBuilder>;\n} = {\n button: ActionRowBuilder<ButtonBuilder>,\n menu_string: ActionRowBuilder<StringSelectMenuBuilder>,\n menu_user: ActionRowBuilder<UserSelectMenuBuilder>,\n menu_channel: ActionRowBuilder<ChannelSelectMenuBuilder>,\n menu_mentionable: ActionRowBuilder<MentionableSelectMenuBuilder>,\n menu_role: ActionRowBuilder<RoleSelectMenuBuilder>,\n modal: ActionRowBuilder<ModalActionRowComponentBuilder>\n};\n\nconst ModalTypes = {\n text: TextInputBuilder\n};\n\ntype BuilderType = keyof typeof BuilderTypes;\ntype InstantiatedBuilder<BuilderKey extends BuilderType> = InstanceType<(typeof BuilderTypes)[BuilderKey]>;\n\ntype ActionRowComponentType = keyof typeof RowTypes;\ntype InstantiatedActionRow<RowKey extends ActionRowComponentType> = InstanceType<(typeof RowTypes)[RowKey]>;\n\ntype ModalFieldTypes = keyof typeof ModalTypes;\ntype InstantiatedModalField<ModalKey extends ModalFieldTypes> = InstanceType<(typeof ModalTypes)[ModalKey]>;\n\nabstract class BaseComponent<TComponent> {\n private readonly _component: TComponent;\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n protected constructor(ComponentClass: new () => TComponent) {\n this._component = new ComponentClass();\n }\n\n /**\n * @description Returns the configured component\n * @note Do not use for mutating using setters.\n * @see instance for mutating the component\n * @usage `new SomeComponent().component`\n */\n public abstract get component(): InstantiatedBuilder<BuilderType> | InstantiatedActionRow<ActionRowComponentType>;\n\n /**\n * @description Returns the instantiated component\n * @note Use this for configuring the component using its instance setters.\n * @usage `this.instance.someMethod()`\n */\n protected get instance(): TComponent {\n return this._component;\n }\n}\n\nexport abstract class BuilderComponent<BuilderKey extends BuilderType> extends BaseComponent<\n InstantiatedBuilder<BuilderKey>\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(Globals.botColor);\n\n // Override in builders\n if (this.instance instanceof SlashCommandBuilder || this.instance instanceof ContextMenuCommandBuilder) {\n this.instance.setContexts(InteractionContextType.Guild);\n }\n }\n\n get component(): InstantiatedBuilder<BuilderKey> {\n // TODO: Add checks for specific builders that make sure mandatory fields are set\n\n return this.instance;\n }\n\n public buildCustomId(prefix: string, ...args: string[]): string {\n if (args.length === 0) return prefix;\n return `${prefix}:${args.join('-')}`;\n }\n}\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\nclass ModalRow<ModalKey extends ModalFieldTypes> extends RowComponent<'modal'> {\n constructor(component: InstantiatedModalField<ModalKey>) {\n super('modal');\n\n this.instance.addComponents(component);\n }\n}\n\nexport abstract class ModalComponent<ModalKey extends ModalFieldTypes> extends BaseComponent<\n InstantiatedModalField<ModalKey>\n> {\n protected constructor(type: ModalKey) {\n const ComponentClass = ModalTypes[type] as unknown;\n super(ComponentClass as new () => InstantiatedModalField<ModalKey>);\n }\n\n get component(): InstantiatedActionRow<'modal'> {\n return new ModalRow<ModalKey>(this.instance).component;\n }\n}\n\nexport class BaseErrorEmbed extends BuilderComponent<'embed'> {\n public constructor() {\n super('embed');\n this.instance.setTitle('Cannot Proceed');\n }\n}\n\nexport abstract class CustomError extends Error {\n protected _emit = false;\n public readonly response = new BaseErrorEmbed().component;\n\n protected constructor(public override message: string) {\n super(message);\n Error.captureStackTrace(this, this.constructor);\n }\n\n public get emit(): boolean {\n return this._emit;\n }\n}\n\nexport type CustomErrorConstructor = new (message: string, ...args: any[]) => CustomError;\n","import { CustomError } from '../../interfaces/Components';\n\nimport type { UUID } from 'crypto';\n\nexport class DatabaseConnectionFailure extends CustomError {\n constructor(message = 'Failed to connect to the database.') {\n super(message);\n\n this.response.setDescription('Failed to connect to the database.');\n }\n}\n\nexport class DatabaseError extends CustomError {\n protected override _emit = true; // Emit in logs regardless of environment\n\n constructor(\n message: string,\n public uuid: UUID\n ) {\n super(message);\n this.name = 'DatabaseError';\n\n this.response\n .setTitle('Database Error')\n .setDescription(`An error occurred while interacting with the database.\\n### UUID: \\`${this.uuid}\\``);\n }\n}\n","import { createLogger, format, transports } from 'winston';\n\nimport { Globals } from '../library/Globals';\n\nimport type { Logform, Logger as Winston } from 'winston';\nimport type { ConsoleTransportInstance } from 'winston/lib/winston/transports';\n\nexport class Logger {\n declare private logger: Winston;\n private static readonly instances = new Map<string, Logger>();\n\n private static instance(prefix: string): Logger {\n let instance = this.instances.get(prefix);\n if (!instance) {\n instance = new Logger(prefix);\n this.instances.set(prefix, instance);\n }\n return instance;\n }\n\n constructor(transportName: string) {\n const consoleTransport = this.createConsoleTransport(transportName);\n this.initializeLogger(consoleTransport);\n }\n\n private getFormatCustomizations(): Logform.Format[] {\n const padding = 7;\n return [\n format.errors({ stack: true }),\n format.splat(),\n format.colorize({ level: true }),\n format.timestamp({ format: 'D MMM, hh:mm:ss a' }),\n format.printf((info: Logform.TransformableInfo) => {\n const ts = String(info.timestamp ?? '');\n const lvl = String(info.level).padEnd(padding);\n const lbl = String(info.label ?? '');\n const msg = String(info.message ?? '');\n\n const base = `${ts} [${lvl}]: ${lbl} - ${msg}`;\n\n const splatSym = Symbol.for('splat');\n const raw = (info as unknown as Record<string | symbol, unknown>)[splatSym];\n const extras = Array.isArray(raw) ? raw : [];\n\n const cleaned = extras\n .filter((x) => !(x instanceof Error))\n .filter((x) => {\n if (!x) return false;\n if (typeof x !== 'object') return true;\n return Object.keys(x as object).length > 0;\n });\n\n let rendered = base;\n\n if (typeof info.stack === 'string') {\n rendered += `\\n${String(info.stack)}`;\n }\n\n if (cleaned.length) {\n const parts: string[] = [];\n for (const x of cleaned) {\n if (typeof x === 'string') parts.push(x);\n else {\n try {\n parts.push(JSON.stringify(x, null, 2));\n } catch {\n parts.push(String(x));\n }\n }\n }\n rendered += `\\n${parts.join(' ')}`;\n }\n\n return rendered;\n })\n ];\n }\n\n private createConsoleTransport(transportName: string): ConsoleTransportInstance {\n return new transports.Console({\n format: format.combine(format.label({ label: transportName }), ...this.getFormatCustomizations()),\n level: Globals.isDevelopment ? 'silly' : Globals.isStaging ? 'debug' : 'info'\n });\n }\n\n private initializeLogger(consoleTransport: transports.ConsoleTransportInstance): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transportsArray: any[] = [consoleTransport];\n\n // Add file transport only in non-production environments\n if (Globals.isDevelopment) {\n const maxSizeInMB = 10;\n transportsArray.push(\n new transports.File({\n filename: 'logs/application.log',\n level: 'debug',\n format: format.combine(\n format.uncolorize(),\n format.errors({ stack: true }),\n format.timestamp(),\n format.json({ bigint: true, space: 2 })\n ),\n maxsize: maxSizeInMB * 1024 * 1024, // 10MB\n maxFiles: 5,\n tailable: true\n })\n );\n }\n\n this.logger = createLogger({\n transports: transportsArray\n });\n }\n\n public error(msg: string, ...args: unknown[]): void {\n this.logger.error(msg, ...args);\n }\n\n public warn(msg: string, ...args: unknown[]): void {\n this.logger.warn(msg, ...args);\n }\n\n public info(msg: string, ...args: unknown[]): void {\n this.logger.info(msg, ...args);\n }\n\n public http(msg: string, ...args: unknown[]): void {\n this.logger.http(msg, ...args);\n }\n\n public verbose(msg: string, ...args: unknown[]): void {\n this.logger.verbose(msg, ...args);\n }\n\n public debug(msg: string, ...args: unknown[]): void {\n this.logger.debug(msg, ...args);\n }\n\n public silly(msg: string, ...args: unknown[]): void {\n this.logger.silly(msg, ...args);\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public static Error(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.error(msg, ...args);\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public static Info(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.info(msg, ...args);\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public static Warn(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.warn(msg, ...args);\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public static Debug(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.debug(msg, ...args);\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public static Silly(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.silly(msg, ...args);\n }\n}\n","import { readdir } from 'node:fs/promises';\nimport * as path from 'node:path';\n\nimport { DatabaseError } from '../bot/errors/Database';\nimport { Logger } from '../services/Logger';\n\nimport type { CustomErrorConstructor } from '../interfaces/Components';\nimport type * as fs from 'node:fs';\n\n/**\n * Rounds a number to a specified number of decimal places.\n *\n * @param num - The number to be rounded.\n * @param decimalPlaces - The number of decimal places to round to.\n * @returns The rounded number.\n */\nexport function numberFixer(num: number, decimalPlaces: number): number {\n const factor = Math.pow(10, decimalPlaces);\n return Math.round((num + Number.EPSILON) * factor) / factor;\n}\n\n/**\n * Takes two numbers and returns the percentage of the first number in the second number with two decimal places.\n *\n * @param num1 The first number.\n * @param num2 The second number.\n *\n * @returns The percentage of the first number in the second number with two decimal places.\n */\nexport function percentage(num1: number, num2: number): number {\n return Number(((num1 / num2) * 100).toFixed(2));\n}\n\n/**\n * Generates an ASCII table from the provided data.\n *\n * @param data - The data to be displayed in the table.\n * @returns The generated ASCII table as a string.\n */\nexport function generateAsciiTable(data: string[][]): string {\n if (data.length === 0) return '';\n\n const firstRow = data[0];\n if (!firstRow || firstRow.length === 0) return '';\n\n let table = '';\n const columnWidths: number[] = [];\n\n // Determine the maximum width for each column\n for (let i = 0; i < firstRow.length; i++) {\n let maxWidth = 0;\n for (const row of data) {\n const cell = row[i];\n if (cell !== undefined) maxWidth = Math.max(maxWidth, cell.length);\n }\n columnWidths.push(maxWidth);\n }\n\n // Function to create a horizontal line\n const createLine = (char: string, left: string, intersect: string, right: string): string => {\n let line = left;\n columnWidths.forEach((width, index) => {\n line += char.repeat(width + 2);\n if (index < columnWidths.length - 1) line += intersect;\n else line += right;\n });\n line += '\\n';\n return line;\n };\n\n // Top border\n table += createLine('═', '╔', '╦', '╗');\n\n data.forEach((row, rowIndex) => {\n // Row content\n table += '║';\n row.forEach((cell, columnIndex) => {\n const columnWidth = columnWidths[columnIndex];\n if (columnWidth !== undefined) table += ` ${cell.padEnd(columnWidth)} ║`;\n });\n table += '\\n';\n\n // Separator or bottom border\n if (rowIndex < data.length - 1) table += createLine('─', '╠', '╬', '╣');\n else table += createLine('═', '╚', '╩', '╝');\n });\n\n return table;\n}\n\n/**\n * Returns the word with it's first letter capitalized and the rest in lowercase.\n * @param word - The word to be formatted.\n * @returns The formatted word.\n */\nexport function formatWord(word: string): string {\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n}\n\n/**\n * Function takes an array of strings or numbers and returns the number of characters in the longest string/number\n * @param arr - The array of strings or numbers\n */\nexport function longestStringLength(arr: (string | number)[]): number {\n return Math.max(...arr.map((el) => el.toString().length));\n}\n\n/**\n * Return current time in seconds\n */\nexport function currentTime(): number {\n return Math.floor(Date.now() / 1000);\n}\n\n/**\n * Returns the ordinal suffix for a given number.\n *\n * @param n - The number to get the ordinal for\n * @returns The number with its ordinal suffix\n *\n * @example\n * ordinal(1); // \"1st\"\n * ordinal(22); // \"22nd\"\n * ordinal(13); // \"13th\"\n */\nexport function ordinal(n: number): string {\n const s = ['th', 'st', 'nd', 'rd'];\n const v = n % 100;\n const index = (v - 20) % 10;\n const suffix = s[index] ?? s[v] ?? s[0];\n if (!suffix) return `${n}th`;\n\n return `${n}${suffix}`;\n}\n\n/**\n * Calculates the difference between two numbers and formats it as a string with a '+' prefix for positive differences.\n *\n * @param numBefore - The initial number value\n * @param numAfter - The final number value\n * @returns A string representing the difference, with a '+' sign for positive differences\n *\n * @example\n * // Returns \"+5\"\n * prettyDifference(10, 15);\n *\n * @example\n * // Returns \"-3\"\n * prettyDifference(10, 7);\n */\nexport function prettyDifference(numBefore: number, numAfter: number): string {\n return (numAfter - numBefore > 0 ? `+${numAfter - numBefore}` : numAfter - numBefore).toString();\n}\n\n/**\n * Determines if a directory entry is a TypeScript or JavaScript file.\n *\n * @param entry - The directory entry to check.\n * @returns True if the entry is a file ending with .ts or .js.\n */\nexport function isTsOrJsFile(entry: fs.Dirent): boolean {\n return (\n entry.isFile() &&\n (entry.name.endsWith('.ts') || entry.name.endsWith('.js')) &&\n !entry.name.endsWith('.d.ts') &&\n !entry.name.endsWith('.map')\n );\n}\n\n/**\n * Recursively traverses through a directory, importing all .ts and .js files and applying a callback to each import.\n *\n * @param dir - The directory path to traverse.\n * @param callback - A function that will be called for each imported module. It receives the full file path, the file's relative path, and the imported module as arguments.\n * @returns A Promise that resolves when the traversal is complete.\n */\nexport async function traverseDirectory(\n dir: string,\n callback: (fullPath: string, relativePath: string, imported: Record<string, unknown>) => Promise<void> | void\n): Promise<void> {\n let entries: fs.Dirent[];\n\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n Logger.Error('Failed to read directory', dir);\n entries = [];\n }\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativePath = path.relative(process.cwd(), fullPath);\n\n if (entry.isDirectory()) {\n await traverseDirectory(fullPath, callback);\n } else if (isTsOrJsFile(entry)) {\n const imported = (await import(fullPath)) as Record<string, unknown>;\n await callback(fullPath, relativePath, imported);\n }\n }\n}\n\n/**\n * Throws a custom error with a formatted message and optional UUID.\n *\n * Wraps an unknown error in a {@link CustomError} subclass. If the error class\n * is {@link DatabaseError}, a UUID is generated and passed to the constructor.\n *\n * @typeParam T - A constructor for a {@link CustomError} subclass\n * @param error - The original error or value\n * @param message - Custom message to include\n * @param CustomError - Error class to instantiate and throw\n * @throws Instance of the provided {@link CustomError} subclass\n *\n * @example\n * try {\n * // risky code\n * } catch (e) {\n * throwCustomError(e, \"Something went wrong\", MyCustomError);\n * }\n */\nexport function throwCustomError<Ctor extends CustomErrorConstructor>(\n error: unknown,\n message: string,\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\n/**\n * Converts a camelCase or snake_case string into a human-readable format.\n *\n * This function inserts spaces before capital letters that follow lowercase\n * letters, replaces underscores with spaces, and trims any extra whitespace.\n *\n * @param key - The string to be converted to a human-readable format\n * @returns A prettified string with proper spacing\n *\n * @example\n * prettify(\"camelCaseString\") // returns \"camel Case String\"\n * @example\n * prettify(\"snake_case_string\") // returns \"snake case string\"\n */\nexport function prettify(key: string): string {\n // Insert a space before each capital that follows a lower-case letter\n return key\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/_/g, ' ') // handle any snake_case\n .trim();\n}\n\n/**\n * Shuffles an array using the Fisher-Yates algorithm.\n * This function creates a new array with the same elements in a random order,\n * without modifying the original array.\n *\n * @template TArray - The type of elements in the array\n * @param {TArray[]} items - The array to shuffle\n * @returns {TArray[]} A new array with the same elements in a random order\n *\n * @example\n * const numbers = [1, 2, 3, 4, 5];\n * const shuffled = fyShuffle(numbers);\n * // shuffled might be [3, 1, 5, 2, 4]\n * // numbers is still [1, 2, 3, 4, 5]\n */\nexport function fyShuffle<TArray>(items: TArray[]): TArray[] {\n const array = items.slice();\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n // @ts-ignore - TypeScript doesn't recognize that TArray can be swapped\n [array[i], array[j]] = [array[j], array[i]];\n }\n return array;\n}\n","import type { BuilderComponent } from '../../interfaces/Components';\n\nexport const CommandMetadataKey = Symbol('command:metadata');\n\ntype CommandCtor = new (...args: any[]) => BuilderComponent<'command' | 'context_menu'>;\n\ninterface GlobalMeta {\n scope: 'global';\n}\n\ninterface GuildMeta {\n scope: 'guild';\n guilds: string[];\n}\n\nexport type CommandMeta = GlobalMeta | GuildMeta;\n\nexport function RegisterCommand(scope: 'global'): (ctor: CommandCtor) => void;\nexport function RegisterCommand(scope: 'guild', guilds: string[]): (ctor: CommandCtor) => void;\nexport function RegisterCommand(scope: 'global' | 'guild', guilds: string[] = []) {\n return (ctor: CommandCtor): void => {\n const meta: GlobalMeta | GuildMeta = scope === 'global' ? { scope } : { scope, guilds };\n Reflect.defineMetadata(CommandMetadataKey, meta, ctor);\n };\n}\n","import chalk from 'chalk';\nimport { SlashCommandBuilder } from 'discord.js';\n\nimport { BuilderComponent } from '../../interfaces/Components';\nimport { traverseDirectory } from '../../library/Helpers';\nimport { Logger } from '../../services/Logger';\nimport { CommandMetadataKey } from '../decorators/CommandRegisterable';\n\nimport type { Core } from '../../interfaces/Core';\nimport type { Initializeable } from '../../interfaces/Plugin';\nimport type { CommandMeta } from '../decorators/CommandRegisterable';\nimport type { ContextMenuCommandBuilder } from 'discord.js';\n\ntype CommandCtor = new () => BuilderComponent<'command' | 'context_menu'>;\n\nexport class CommandRegistry implements Initializeable {\n private readonly logger = new Logger('Commands');\n private isInitialised = false;\n\n public readonly globalCommands: (SlashCommandBuilder | ContextMenuCommandBuilder)[] = [];\n public readonly guildCommands = new Map<string, (SlashCommandBuilder | ContextMenuCommandBuilder)[]>();\n\n public constructor(private readonly core: Core) {}\n\n public async init(): Promise<void> {\n if (this.isInitialised) return;\n this.isInitialised = true;\n\n this.logger.info(chalk.bold(this.core.config.bot.commands.path));\n\n await this.loadCommands(this.core.config.bot.commands.path);\n\n this.logger.info(\n `${chalk.bold.green('Loaded')}: ${chalk.magenta.bold(\n this.globalCommands.length\n )} global, ${chalk.magenta.bold(this.guildCommands.size)} guild groups`\n );\n }\n\n private async loadCommands(dir: string): Promise<void> {\n await traverseDirectory(dir, (_full, rel, mod) => {\n for (const exported of Object.values(mod)) if (this.isCommandClass(exported)) this.registerCommand(exported, rel);\n });\n }\n\n private isCommandClass(obj: unknown): obj is CommandCtor {\n if (typeof obj !== 'function') return false;\n return obj.prototype instanceof BuilderComponent && Reflect.hasMetadata(CommandMetadataKey, obj);\n }\n\n private registerCommand(ctor: CommandCtor, rel: string): void {\n const meta = Reflect.getMetadata(CommandMetadataKey, ctor) as CommandMeta | undefined;\n\n if (!meta) return;\n\n const instance = new ctor();\n const comp = instance.component;\n\n const commandType = comp instanceof SlashCommandBuilder ? 'slash command' : 'context menu command';\n\n if (meta.scope === 'global') {\n this.globalCommands.push(comp);\n this.logger.info(`${chalk.italic('Registered')} ${chalk.bold.yellow(ctor.name)} from ${chalk.gray(rel)}`);\n this.logger.info(` → Global ${commandType}: ${chalk.bold.cyan(comp.name)}`);\n } else {\n for (const g of meta.guilds) {\n const arr = this.guildCommands.get(g) ?? [];\n arr.push(comp);\n this.guildCommands.set(g, arr);\n }\n this.logger.info(`${chalk.italic('Registered')} ${chalk.bold.yellow(ctor.name)} from ${chalk.gray(rel)}`);\n this.logger.info(\n ` → Guild ${commandType}: ${chalk.bold.cyan(comp.name)} for ${chalk.magenta.bold(meta.guilds.length)} guild(s)`\n );\n }\n }\n\n public async setCommands(): Promise<void> {\n if (this.globalCommands.length > 0) {\n await this.core.bot.client.application?.commands.set(this.globalCommands);\n const tag = this.globalCommands.length === 1 ? 'command' : 'commands';\n this.logger.info(\n `${chalk.bold.green('Configured')} ${chalk.magenta.bold(this.globalCommands.length)} global ${tag}`\n );\n this.logger.info(` → ${this.globalCommands.map((command) => chalk.bold.cyan(command.name)).join(', ')}`);\n }\n\n for (const [guildId, commands] of this.guildCommands.entries()) {\n const guild = this.core.bot.client.guilds.cache.get(guildId);\n if (!guild) {\n this.logger.warn(`Guild with ID ${guildId} not found, skipping command registration.`);\n continue;\n }\n\n await guild.commands.set(commands);\n const tag = commands.length === 1 ? 'command' : 'commands';\n this.logger.info(\n `${chalk.bold.green('Configured')} ${chalk.magenta.bold(commands.length)} ${tag} for guild ${chalk.bold.yellow(guild.name)}`\n );\n this.logger.info(` → ${commands.map((command) => chalk.bold.cyan(command.name)).join(', ')}`);\n }\n }\n}\n","import type { Core } from './Core';\nimport type { TypedConstructor } from '@seedcord/types';\nimport type {\n AnySelectMenuInteraction,\n AutocompleteFocusedOption,\n AutocompleteInteraction,\n ButtonInteraction,\n ChatInputCommandInteraction,\n ClientEvents,\n ContextMenuCommandInteraction,\n Events,\n ModalSubmitInteraction\n} from 'discord.js';\n\nexport type ValidInteractionTypes =\n | ChatInputCommandInteraction\n | ButtonInteraction\n | ModalSubmitInteraction\n | AutocompleteInteraction\n | AnySelectMenuInteraction\n | ContextMenuCommandInteraction;\n\nexport type ValidNonInteractionTypes = ClientEvents[Exclude<keyof ClientEvents, Events.InteractionCreate>];\nexport type ValidEventTypes = ValidInteractionTypes | ValidNonInteractionTypes;\n\nexport type Repliables = Exclude<ValidInteractionTypes, AutocompleteInteraction>;\n\nexport type RepliableInteractionHandler = InteractionHandler<Repliables> | InteractionMiddleware<Repliables>;\n\nexport interface Handler {\n execute(): Promise<void>;\n}\n\nexport interface WithChecks {\n runChecks(): Promise<void>;\n}\n\ninterface HandlerWithChecks extends WithChecks, Handler {}\n\nabstract class BaseHandler<ValidEvent extends ValidEventTypes> implements Handler {\n protected checkable = false;\n protected break = false;\n protected errored = false;\n protected event: ValidEvent;\n protected args: string[] = [];\n\n protected constructor(\n event: ValidEvent,\n public core: Core,\n args?: string[]\n ) {\n this.event = event;\n this.args = args ?? [];\n }\n\n abstract execute(): Promise<void>;\n\n public hasChecks(): this is HandlerWithChecks {\n return this.checkable;\n }\n\n public hasErrors(): boolean {\n return this.errored;\n }\n\n public setErrored(): void {\n this.errored = true;\n }\n\n public shouldBreak(): boolean {\n return this.break;\n }\n\n public getEvent(): ValidEvent {\n return this.event;\n }\n\n /**\n * Get the arguments passed from the customId\n * For example, if customId is \"accept:user123-guild456\", args will be [\"user123\", \"guild456\"]\n */\n protected getArgs(): string[] {\n return this.args;\n }\n\n /**\n * Get a specific argument by index\n */\n protected getArg(index: number): string | undefined {\n return this.args[index];\n }\n}\n\n/**\n * All interactions with the bot including Handlers and what those hooks do or pass to other services should extend this class.\n * This class implements ICheckable when the decorator Checkable is used on the class.\n * @implements Handler\n * @template Repliable - A type that extends one of the ValidEventTypes. Can add more types to the ValidEventTypes union type if needed.\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\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 * Autocomplete interactions handler - separate from repliable interactions\n */\nexport abstract class AutocompleteHandler extends BaseHandler<AutocompleteInteraction> implements Handler {\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 * All non-interaction events with the bot including Handlers and what those hooks do or pass to other services should extend this class.\n * This class implements ICheckable when the decorator Checkable is used on the class.\n * @implements Handler\n * @template Repliable - A type that extends one of the ValidEventTypes. Can add more types to the ValidEventTypes union type if needed.\n */\nexport abstract class EventHandler<Repliable extends keyof ClientEvents>\n extends BaseHandler<ClientEvents[Repliable]>\n implements Handler\n{\n constructor(event: ClientEvents[Repliable], core: Core, args?: string[]) {\n super(event, core, args);\n }\n}\n\n// A generic type alias for a handler constructor\nexport type HandlerConstructor = TypedConstructor<typeof InteractionHandler | typeof AutocompleteHandler>;\n\nexport type MiddlewareConstructor = TypedConstructor<typeof InteractionMiddleware> &\n (new (event: Repliables, core: Core, args?: string[]) => InteractionMiddleware<Repliables>);\n\nexport type AutocompleteHandlerConstructor = TypedConstructor<typeof AutocompleteHandler> &\n (new (event: AutocompleteInteraction, core: Core, args?: string[]) => AutocompleteHandler);\n\nexport type EventHandlerConstructor = TypedConstructor<typeof EventHandler>;\n","import type { ConstructorFunction } from '@seedcord/types';\nimport type { ClientEvents } from 'discord.js';\n\nexport const EventMetadataKey = Symbol('event:metadata');\n\nexport function RegisterEvent<KeyofEvents extends keyof ClientEvents>(eventName: KeyofEvents) {\n return function (constructor: ConstructorFunction): void {\n Reflect.defineMetadata(EventMetadataKey, eventName, constructor);\n };\n}\n","import chalk from 'chalk';\n\nimport { EventHandler } from '../../interfaces/Handler';\nimport { traverseDirectory } from '../../library/Helpers';\nimport { Logger } from '../../services/Logger';\nimport { EventMetadataKey } from '../decorators/EventRegisterable';\n\nimport type { Core } from '../../interfaces/Core';\nimport type { EventHandlerConstructor } from '../../interfaces/Handler';\nimport type { Initializeable } from '../../interfaces/Plugin';\nimport type { ClientEvents } from 'discord.js';\n\nexport class EventController implements Initializeable {\n private readonly logger = new Logger('Events');\n private isInitialized = false;\n\n private readonly eventMap = new Map<keyof ClientEvents, EventHandlerConstructor[]>();\n\n public constructor(protected core: Core) {}\n\n public async init(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n this.isInitialized = true;\n\n const handlersDir = this.core.config.bot.events.path;\n this.logger.info(chalk.bold(handlersDir));\n\n await this.loadHandlers(handlersDir);\n this.attachToClient();\n\n const loadedEventsArray: string[] = [];\n this.eventMap.forEach((handlers, eventName) => {\n loadedEventsArray.push(`${chalk.magenta.bold(handlers.length)} ${eventName}`);\n });\n this.logger.info(\n `${chalk.bold.green('Loaded')}: ${this.eventMap.size > 0 ? loadedEventsArray.join(', ') : 'none'}`\n );\n }\n\n private async loadHandlers(dir: string): Promise<void> {\n await traverseDirectory(dir, (_fullPath, relativePath, imported) => {\n for (const val of Object.values(imported)) {\n if (this.isEventHandlerClass(val)) {\n this.registerHandler(val);\n this.logger.info(\n `${chalk.italic('Registered')} ${chalk.bold.yellow(val.name)} from ${chalk.gray(relativePath)}`\n );\n }\n }\n });\n }\n\n private isEventHandlerClass(obj: unknown): obj is EventHandlerConstructor {\n if (typeof obj !== 'function') return false;\n return obj.prototype instanceof EventHandler && Reflect.hasMetadata(EventMetadataKey, obj);\n }\n\n private registerHandler(handlerClass: EventHandlerConstructor): void {\n const eventName = Reflect.getMetadata(EventMetadataKey, handlerClass) as keyof ClientEvents | undefined;\n if (!eventName) return;\n\n let handlers = this.eventMap.get(eventName);\n if (!handlers) {\n handlers = [];\n this.eventMap.set(eventName, handlers);\n }\n handlers.push(handlerClass);\n }\n\n private attachToClient(): void {\n for (const [eventName] of this.eventMap) {\n // For each event type, call all relevant hooks in sequence.\n this.logger.debug(\n `Attaching ${chalk.bold.green(eventName)} to ${chalk.bold.yellow(this.core.bot.client.user?.username)}`\n );\n this.core.bot.client.on(eventName, (...args: ClientEvents[typeof eventName]) => {\n void (async () => {\n await this.processEvent(eventName, args);\n })();\n });\n }\n }\n\n private async processEvent<KeyOfEvents extends keyof ClientEvents>(\n eventName: KeyOfEvents,\n args: ClientEvents[KeyOfEvents]\n ): Promise<void> {\n const handlerCtors = this.eventMap.get(eventName);\n if (!handlerCtors || handlerCtors.length === 0) return;\n\n for (const HandlerCtor of handlerCtors) {\n try {\n this.logger.debug(`Processing ${chalk.bold.green(eventName)} with ${chalk.gray(HandlerCtor.name)}`);\n const handler = new HandlerCtor(args, this.core);\n if (handler.hasChecks()) {\n await handler.runChecks();\n }\n\n if (handler.shouldBreak()) return;\n\n // Execute if no errors\n if (!handler.hasErrors()) {\n await handler.execute();\n }\n } catch (err) {\n this.logger.error(`Error in event ${String(eventName)} handler ${HandlerCtor.name}:`, err);\n }\n }\n }\n}\n","import type { ConstructorFunction } from '@seedcord/types';\n\nexport enum InteractionRoutes {\n Slash = 'interaction:slash',\n Button = 'interaction:button',\n Modal = 'interaction:modal',\n StringMenu = 'interaction:stringMenu',\n UserMenu = 'interaction:userMenu',\n RoleMenu = 'interaction:roleMenu',\n ChannelMenu = 'interaction:channelMenu',\n MentionableMenu = 'interaction:mentionableMenu',\n MessageContextMenu = 'interaction:messageContextMenu',\n UserContextMenu = 'interaction:userContextMenu',\n Autocomplete = 'interaction:autocomplete'\n}\n\nexport enum SelectMenuType {\n String = 'string',\n User = 'user',\n Role = 'role',\n Channel = 'channel',\n Mentionable = 'mentionable'\n}\n\nexport const InteractionMetadataKey = Symbol('interaction:metadata');\n\n/**\n * Decorator for slash command routes. The route can be:\n * - \"profile\"\n * - \"settings/edit\"\n * - \"settings/advanced/edit\"\n *\n * Pass an array of routes if the same handler should respond to multiple.\n */\nexport function SlashRoute(routeOrRoutes: string | string[]) {\n return function (constructor: ConstructorFunction): void {\n storeMetadata(InteractionRoutes.Slash, routeOrRoutes, constructor);\n };\n}\n\n/**\n * Decorator for button routes. This should match a `customId` prefix.\n * e.g., 'accept' or 'login'.\n */\nexport function ButtonRoute(routeOrRoutes: string | string[]) {\n return function (constructor: ConstructorFunction): void {\n storeMetadata(InteractionRoutes.Button, routeOrRoutes, constructor);\n };\n}\n\n/**\n * Decorator for modal routes. This should match a `customId` prefix.\n */\nexport function ModalRoute(routeOrRoutes: string | string[]) {\n return function (constructor: ConstructorFunction): void {\n storeMetadata(InteractionRoutes.Modal, routeOrRoutes, constructor);\n };\n}\n\n/**\n * Decorator for context menu commands. This should match the command name.\n * @param type - The type of context menu ('message' or 'user')\n * @param routeOrRoutes - The command name(s) to route to this handler\n */\nexport function ContextMenuRoute(type: 'message' | 'user', routeOrRoutes: string | string[]) {\n return function (constructor: ConstructorFunction): void {\n const routeType = type === 'message' ? InteractionRoutes.MessageContextMenu : InteractionRoutes.UserContextMenu;\n storeMetadata(routeType, routeOrRoutes, constructor);\n };\n}\n\n/**\n * Decorator for autocomplete interactions. Supports routing by command and focused field.\n * @param commandRoutes - Command name or subcommand paths\n * @param focusedFields - Focused option names to handle\n * @example @AutocompleteRoute('user', 'name') // Single command, single field\n * @example @AutocompleteRoute(['user', 'profile'], ['name', 'bio']) // Multiple commands, multiple fields\n */\nexport function AutocompleteRoute(commandRoutes: string | string[], focusedFields: string | string[]) {\n return function (constructor: ConstructorFunction): void {\n const routes = Array.isArray(commandRoutes) ? commandRoutes : [commandRoutes];\n const fields = Array.isArray(focusedFields) ? focusedFields : [focusedFields];\n\n // Create unique keys for each route-focused combination\n routes.forEach((route) => {\n fields.forEach((field) => {\n const autocompleteKey = `${route}:${field}`;\n storeMetadata(InteractionRoutes.Autocomplete, autocompleteKey, constructor);\n });\n });\n };\n}\n\n/**\n * Decorator for select menu routes. This should match a `customId` prefix.\n */\nexport function SelectMenuRoute(type: SelectMenuType, routeOrRoutes: string | string[]) {\n return function (constructor: ConstructorFunction): void {\n const routeMap = {\n [SelectMenuType.String]: InteractionRoutes.StringMenu,\n [SelectMenuType.User]: InteractionRoutes.UserMenu,\n [SelectMenuType.Role]: InteractionRoutes.RoleMenu,\n [SelectMenuType.Channel]: InteractionRoutes.ChannelMenu,\n [SelectMenuType.Mentionable]: InteractionRoutes.MentionableMenu\n };\n\n storeMetadata(routeMap[type], routeOrRoutes, constructor);\n };\n}\n\n/**\n * Helper to store route(s) in an array on reflect metadata.\n */\nfunction storeMetadata(symbol: InteractionRoutes, routes: string | string[], constructor: ConstructorFunction): void {\n const areRoutes = (routes: unknown): routes is string[] => {\n return Array.isArray(routes) && routes.every((r) => typeof r === 'string');\n };\n\n const savedRoutes: unknown = Reflect.getMetadata(symbol, constructor);\n const existing: string[] = areRoutes(savedRoutes) ? savedRoutes : [];\n\n const toStore = Array.isArray(routes) ? routes : [routes];\n Reflect.defineMetadata(symbol, [...existing, ...toStore], constructor);\n Reflect.defineMetadata(InteractionMetadataKey, true, constructor);\n}\n","import * as crypto from 'crypto';\n\nimport { CustomError } from '../../interfaces/Components';\nimport { Logger } from '../../services/Logger';\nimport { DatabaseError } from '../errors/Database';\n\nimport type { Core } from '../../interfaces/Core';\nimport type { Nullish } from '@seedcord/types';\nimport type { UUID } from 'crypto';\nimport type { EmbedBuilder, Guild, User } from 'discord.js';\n\nexport class ErrorHandlingUtils {\n private static readonly logger = new Logger('Errors');\n\n public static handleError(\n error: Error,\n core: Core,\n guild: Nullish<Guild>,\n user: Nullish<User>\n ): { uuid: UUID; response: EmbedBuilder } {\n const uuid = crypto.randomUUID();\n\n if (error instanceof CustomError) {\n if (error instanceof DatabaseError) {\n core.hooks.emit('unknownException', { uuid, error, guild, user });\n\n this.logger.error(`DatabaseError: ${error.uuid}`);\n } else if (error.emit) {\n this.logger.error(`${error.name}: ${error.message}`, error);\n }\n\n return {\n uuid,\n response: error.response\n };\n }\n\n this.logger.error(uuid, error);\n core.hooks.emit('unknownException', { uuid, error, guild, user });\n\n return {\n uuid,\n response: new GenericError(uuid).response\n };\n }\n}\n\n// Generic error for non-CustomError instances\nclass GenericError extends CustomError {\n constructor(private readonly uuid: UUID) {\n super('An unknown error occurred');\n\n this.response\n .setTitle('Error')\n .setDescription(\n `An unknown error occurred. Please reach out to the developer with a way to reproduce the error and the following:\\n` +\n `### UUID: \\`${this.uuid}\\``\n );\n }\n}\n","import { MessageFlags } from 'discord.js';\n\nimport { ErrorHandlingUtils } from '../utilities/ErrorHandlingUtils';\n\nimport type { RepliableInteractionHandler } from '../../interfaces/Handler';\n\ninterface CatchableOptions {\n log?: boolean;\n forceFollowup?: boolean;\n}\nexport function Catchable(options?: CatchableOptions) {\n return function (\n _target: RepliableInteractionHandler,\n _propertyKey: string,\n descriptor: TypedPropertyDescriptor<(...args: any[]) => Promise<void>>\n ): void {\n const log = options?.log ?? false;\n const forceFollowup = options?.forceFollowup ?? false;\n\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: RepliableInteractionHandler, ...args: any[]): Promise<void> {\n const interaction = this.getEvent();\n\n if (!originalMethod) throw new Error('Method not found');\n\n try {\n await originalMethod.apply(this, args);\n } catch (error) {\n if (!(error instanceof Error)) throw error;\n\n this.setErrored();\n\n // eslint-disable-next-line no-console\n if (log) console.error(error);\n\n const { response } = ErrorHandlingUtils.handleError(error, this.core, interaction.guild, interaction.user);\n\n const res = {\n embeds: [response],\n components: []\n };\n\n if (forceFollowup) {\n await interaction.followUp({ flags: MessageFlags.Ephemeral, ...res });\n return;\n }\n\n if (interaction.replied) {\n await interaction.followUp({ flags: MessageFlags.Ephemeral, ...res });\n } else if (interaction.deferred) {\n await interaction.editReply(res);\n } else {\n await interaction.reply({ flags: MessageFlags.Ephemeral, ...res });\n }\n }\n };\n };\n}\n","import { MessageFlags } from 'discord.js';\n\nimport { InteractionHandler, Repliables } from '../../interfaces/Handler';\nimport { Catchable } from '../decorators/Catchable';\n\nexport class UnhandledEvent extends InteractionHandler<Repliables> {\n @Catchable()\n async execute(): Promise<void> {\n await this.event.reply({\n content: `Feature not implemented yet.`,\n flags: MessageFlags.Ephemeral\n });\n }\n}\n","import chalk from 'chalk';\nimport { Events } from 'discord.js';\n\nimport { AutocompleteHandler, InteractionHandler } from '../../interfaces/Handler';\nimport { traverseDirectory } from '../../library/Helpers';\nimport { Logger } from '../../services/Logger';\nimport { InteractionMetadataKey, InteractionRoutes } from '../decorators/InteractionConfigurable';\nimport { UnhandledEvent } from '../defaults/UnhandledEvent';\n\nimport type { Core } from '../../interfaces/Core';\nimport type { HandlerConstructor, MiddlewareConstructor, Repliables } from '../../interfaces/Handler';\nimport type { Initializeable } from '../../interfaces/Plugin';\nimport type {\n AutocompleteInteraction,\n ButtonInteraction,\n ChannelSelectMenuInteraction,\n ChatInputCommandInteraction,\n Interaction,\n MentionableSelectMenuInteraction,\n MessageContextMenuCommandInteraction,\n ModalSubmitInteraction,\n RoleSelectMenuInteraction,\n StringSelectMenuInteraction,\n UserContextMenuCommandInteraction,\n UserSelectMenuInteraction\n} from 'discord.js';\n\nexport class InteractionController implements Initializeable {\n private readonly logger = new Logger('Interactions');\n private isInitialized = false;\n\n private readonly slashMap = new Map<string, HandlerConstructor>();\n private readonly buttonMap = new Map<string, HandlerConstructor>();\n private readonly modalMap = new Map<string, HandlerConstructor>();\n private readonly stringSelectMap = new Map<string, HandlerConstructor>();\n private readonly userSelectMap = new Map<string, HandlerConstructor>();\n private readonly roleSelectMap = new Map<string, HandlerConstructor>();\n private readonly channelSelectMap = new Map<string, HandlerConstructor>();\n private readonly mentionableSelectMap = new Map<string, HandlerConstructor>();\n private readonly messageContextMenuMap = new Map<string, HandlerConstructor>();\n private readonly userContextMenuMap = new Map<string, HandlerConstructor>();\n private readonly autocompleteMap = new Map<string, HandlerConstructor>();\n\n private readonly keysToIgnore = new Set(['confirm!confirmable', 'cancel!confirmable']);\n\n private readonly middlewares: MiddlewareConstructor[] = [];\n\n constructor(protected core: Core) {}\n\n public async init(): Promise<void> {\n if (this.isInitialized) return;\n\n this.isInitialized = true;\n\n const handlersDir = this.core.config.bot.interactions.path;\n this.logger.info(chalk.bold(handlersDir));\n\n await this.loadHandlers(handlersDir);\n this.attachToClient();\n\n this.logger.info(`${chalk.bold.green('Loaded interaction handlers:')}`);\n this.logger.info(`→ ${chalk.magenta.bold(this.slashMap.size)} slash commands`);\n this.logger.info(`→ ${chalk.magenta.bold(this.buttonMap.size)} buttons`);\n this.logger.info(`→ ${chalk.magenta.bold(this.modalMap.size)} modals`);\n this.logger.info(`→ ${chalk.magenta.bold(this.stringSelectMap.size)} string selects`);\n this.logger.info(`→ ${chalk.magenta.bold(this.userSelectMap.size)} user selects`);\n this.logger.info(`→ ${chalk.magenta.bold(this.roleSelectMap.size)} role selects`);\n this.logger.info(`→ ${chalk.magenta.bold(this.channelSelectMap.size)} channel selects`);\n this.logger.info(`→ ${chalk.magenta.bold(this.mentionableSelectMap.size)} mentionable selects`);\n this.logger.info(`→ ${chalk.magenta.bold(this.messageContextMenuMap.size)} message context menus`);\n this.logger.info(`→ ${chalk.magenta.bold(this.userContextMenuMap.size)} user context menus`);\n this.logger.info(`→ ${chalk.magenta.bold(this.autocompleteMap.size)} autocomplete`);\n }\n\n private async loadHandlers(dir: string): Promise<void> {\n await traverseDirectory(dir, (_fullPath, relativePath, imported) => {\n for (const val of Object.values(imported)) {\n if (this.isHandlerClass(val)) {\n this.registerHandler(val);\n this.logger.info(\n `${chalk.italic('Registered')} ${chalk.bold.yellow(val.name)} from ${chalk.gray(relativePath)}`\n );\n }\n }\n });\n }\n\n private isHandlerClass(obj: unknown): obj is HandlerConstructor {\n if (typeof obj !== 'function') return false;\n return (\n (obj.prototype instanceof InteractionHandler && Reflect.hasMetadata(InteractionMetadataKey, obj)) ||\n (obj.prototype instanceof AutocompleteHandler && Reflect.hasMetadata(InteractionMetadataKey, obj))\n );\n }\n\n private registerHandler(handlerClass: HandlerConstructor): void {\n const areRoutes = (routes: unknown): routes is string[] => {\n return Array.isArray(routes) && routes.every((r) => typeof r === 'string');\n };\n\n const routeTypes: [InteractionRoutes, Map<string, HandlerConstructor>][] = [\n [InteractionRoutes.Slash, this.slashMap],\n [InteractionRoutes.Button, this.buttonMap],\n [InteractionRoutes.Modal, this.modalMap],\n [InteractionRoutes.StringMenu, this.stringSelectMap],\n [InteractionRoutes.UserMenu, this.userSelectMap],\n [InteractionRoutes.RoleMenu, this.roleSelectMap],\n [InteractionRoutes.ChannelMenu, this.channelSelectMap],\n [InteractionRoutes.MentionableMenu, this.mentionableSelectMap],\n [InteractionRoutes.MessageContextMenu, this.messageContextMenuMap],\n [InteractionRoutes.UserContextMenu, this.userContextMenuMap],\n [InteractionRoutes.Autocomplete, this.autocompleteMap]\n ];\n for (const [routeType, map] of routeTypes) {\n const meta: unknown = Reflect.getMetadata(routeType, handlerClass);\n if (!areRoutes(meta)) continue;\n\n const routes = meta;\n routes.forEach((route) => map.set(route, handlerClass));\n }\n }\n\n private attachToClient(): void {\n this.core.bot.client.on(Events.InteractionCreate, (interaction) => {\n this.handleInteraction(interaction).catch((err: Error) => {\n this.logger.error(`[${chalk.bold.red('UNHANDLED ERROR AT ROOT')}] ${err.name}`, err.stack);\n });\n });\n }\n\n private parseCustomId(customId: string): { prefix: string; args: string[] } {\n const parts = customId.split(':');\n const prefix = parts[0] ?? '';\n const argString = parts[1] ?? '';\n const args = argString ? argString.split('-') : [];\n\n return { prefix, args };\n }\n\n private async handleCustomIdInteraction<TInteraction extends Interaction & { customId: string }>(\n interaction: TInteraction,\n getMap: () => Map<string, HandlerConstructor>,\n interactionType: string\n ): Promise<void> {\n const { prefix, args } = this.parseCustomId(interaction.customId);\n if (!prefix) return this.logger.warn(`${interactionType} has invalid customId: ${interaction.customId}`);\n\n await this.processInteraction(\n interaction,\n () => prefix,\n (key) => getMap().get(key),\n args\n );\n }\n\n public async processInteraction<TInteraction extends Interaction>(\n interaction: TInteraction,\n extractKey: (i: TInteraction) => string,\n getHandler: (key: string) => HandlerConstructor | undefined,\n args?: string[]\n ): Promise<void> {\n const key = extractKey(interaction);\n if (this.keysToIgnore.has(key)) return;\n\n // Run middlewares first\n for (const MiddlewareCtor of this.middlewares) {\n const middleware = new MiddlewareCtor(interaction as Repliables, this.core, args);\n await middleware.execute();\n if (middleware.hasErrors()) return;\n }\n let HandlerCtor = getHandler(key);\n if (!HandlerCtor) {\n // Automatically fallback to UnhandledEvent\n this.logger.warn(`No handler found for key ${chalk.bold.cyan(key)}. Falling back to UnhandledEvent.`);\n HandlerCtor = UnhandledEvent;\n }\n\n this.logger.debug(`Processing ${chalk.bold.green(key)} with ${chalk.gray(HandlerCtor.name)}`);\n // @ts-expect-error TS can't infer the type of interaction here\n const handler = new HandlerCtor(interaction as Repliables, this.core, args);\n if (handler.hasChecks()) await handler.runChecks();\n if (handler.shouldBreak()) return;\n if (!handler.hasErrors()) await handler.execute();\n }\n\n private async handleInteraction(interaction: Interaction): Promise<void> {\n switch (true) {\n case interaction.isChatInputCommand():\n await this.handleSlashCommand(interaction);\n break;\n case interaction.isButton():\n await this.handleButton(interaction);\n break;\n case interaction.isModalSubmit():\n await this.handleModal(interaction);\n break;\n case interaction.isStringSelectMenu():\n await this.handleStringSelectMenu(interaction);\n break;\n case interaction.isUserSelectMenu():\n await this.handleUserSelectMenu(interaction);\n break;\n case interaction.isRoleSelectMenu():\n await this.handleRoleSelectMenu(interaction);\n break;\n case interaction.isChannelSelectMenu():\n await this.handleChannelSelectMenu(interaction);\n break;\n case interaction.isMentionableSelectMenu():\n await this.handleMentionableSelectMenu(interaction);\n break;\n case interaction.isMessageContextMenuCommand():\n await this.handleMessageContextMenu(interaction);\n break;\n case interaction.isUserContextMenuCommand():\n await this.handleUserContextMenu(interaction);\n break;\n case interaction.isAutocomplete():\n await this.handleAutocomplete(interaction);\n break;\n default:\n this.logger.warn(`Unhandled interaction type: ${interaction.type}`);\n break;\n }\n }\n\n private async handleSlashCommand(interaction: ChatInputCommandInteraction): Promise<void> {\n const route = this.buildSlashRoute(interaction);\n await this.processInteraction(\n interaction,\n () => route,\n (key) => this.slashMap.get(key)\n );\n }\n\n private async handleButton(interaction: ButtonInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.buttonMap, 'Button');\n }\n\n private async handleModal(interaction: ModalSubmitInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.modalMap, 'Modal');\n }\n\n private async handleStringSelectMenu(interaction: StringSelectMenuInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.stringSelectMap, 'String select menu');\n }\n\n private async handleUserSelectMenu(interaction: UserSelectMenuInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.userSelectMap, 'User select menu');\n }\n\n private async handleRoleSelectMenu(interaction: RoleSelectMenuInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.roleSelectMap, 'Role select menu');\n }\n\n private async handleChannelSelectMenu(interaction: ChannelSelectMenuInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.channelSelectMap, 'Channel select menu');\n }\n\n private async handleMentionableSelectMenu(interaction: MentionableSelectMenuInteraction): Promise<void> {\n await this.handleCustomIdInteraction(interaction, () => this.mentionableSelectMap, 'Mentionable select menu');\n }\n\n private async handleMessageContextMenu(interaction: MessageContextMenuCommandInteraction): Promise<void> {\n await this.processInteraction(\n interaction,\n () => interaction.commandName,\n (key) => this.messageContextMenuMap.get(key)\n );\n }\n\n private async handleUserContextMenu(interaction: UserContextMenuCommandInteraction): Promise<void> {\n await this.processInteraction(\n interaction,\n () => interaction.commandName,\n (key) => this.userContextMenuMap.get(key)\n );\n }\n\n private async handleAutocomplete(interaction: AutocompleteInteraction): Promise<void> {\n const route = this.buildSlashRoute(interaction);\n const focused = interaction.options.getFocused(true);\n const autocompleteKey = `${route}:${focused.name}`;\n\n await this.processInteraction(\n interaction,\n () => autocompleteKey,\n (key) => this.autocompleteMap.get(key)\n );\n }\n\n // Build the route from commandName, subcommandGroup, subcommand\n private buildSlashRoute(interaction: ChatInputCommandInteraction | AutocompleteInteraction): string {\n const command = interaction.commandName;\n const group = interaction.options.getSubcommandGroup(false);\n const sub = interaction.options.getSubcommand(false);\n\n let route = command;\n if (group && sub) {\n route = `${route}/${group}/${sub}`;\n } else if (group) {\n route = `${route}/${group}`;\n } else if (sub) {\n route = `${route}/${sub}`;\n }\n return route;\n }\n}\n","import chalk from 'chalk';\n\nimport { Logger } from '../../services/Logger';\n\nimport type { Core } from '../../interfaces/Core';\n\nexport class EmojiInjector {\n private readonly logger = new Logger('Emojis');\n\n constructor(private readonly core: Core) {}\n\n public async init(): Promise<void> {\n // Check if we have emoji config\n if (!this.core.config.bot.emojis || Object.keys(this.core.config.bot.emojis).length === 0) {\n this.logger.info(`${chalk.bold.green('Loaded')}: ${chalk.magenta.bold('0')} emojis`);\n return;\n }\n\n const configEmojis = this.core.config.bot.emojis;\n await this.core.bot.client.application?.emojis.fetch();\n\n let foundCount = 0;\n\n Object.entries(configEmojis).forEach(([key, emojiName]) => {\n const emoji = this.core.bot.client.application?.emojis.cache.find((e) => e.name === emojiName);\n\n if (emoji) {\n configEmojis[key] = `<${emoji.identifier}>`;\n\n foundCount++;\n }\n });\n\n this.logger.info(`${chalk.bold.green('Loaded')}: ${chalk.magenta.bold(foundCount)} emojis`);\n }\n}\n","import chalk from 'chalk';\n\nimport type { Core } from './Core';\nimport type { CoordinatedShutdown } from '../services/Lifecycle/CoordinatedShutdown';\nimport type { CoordinatedStartup, StartupPhase } from '../services/Lifecycle/CoordinatedStartup';\nimport type { Logger } from '../services/Logger';\nimport type { Tail } from '@seedcord/types';\n\nexport interface Initializeable {\n init(): Promise<void>;\n}\n\nexport abstract class Plugin implements Initializeable {\n public abstract logger: Logger;\n constructor(protected pluggable: Core) {}\n abstract init(): Promise<void>;\n}\n\n/** A plugin constructor can accept any tail of args after Core */\nexport type PluginCtor<TPlugin extends Plugin = Plugin> = new (core: Core, ...args: any[]) => TPlugin;\n\n/** Convenience: the argument list a given constructor expects */\nexport type PluginArgs<Ctor extends PluginCtor> = Tail<ConstructorParameters<Ctor>>;\n\nexport class Pluggable {\n protected isInitialized = false;\n protected readonly shutdown: CoordinatedShutdown;\n protected readonly startup: CoordinatedStartup;\n\n private static readonly PLUGIN_INIT_TIMEOUT_MS = 15000;\n\n constructor(shutdown: CoordinatedShutdown, startup: CoordinatedStartup) {\n this.shutdown = shutdown;\n this.startup = startup;\n }\n\n protected async init(): Promise<this> {\n if (this.isInitialized) return this;\n\n await this.startup.run();\n this.isInitialized = true;\n\n return this;\n }\n\n public attach<Key extends string, Ctor extends PluginCtor>(\n this: this,\n key: Key,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Plugin: Ctor,\n startupPhase: StartupPhase,\n ...args: PluginArgs<Ctor>\n ): this & Record<Key, InstanceType<Ctor>> {\n if (this.isInitialized) throw new Error('Cannot attach a plugin after initialization.');\n if ((this as Record<string, unknown>)[key]) throw new Error(`Plugin with key \"${key}\" already exists.`);\n\n const instance = new Plugin(this as unknown as Core, ...args);\n\n const entry = {\n [key]: instance\n } as Record<Key, InstanceType<Ctor>>;\n\n this.startup.addTask(\n startupPhase,\n `Plugin:${key}`,\n async () => {\n instance.logger.info(chalk.bold('Initializing'));\n await instance.init();\n instance.logger.info(chalk.bold('Initialized'));\n },\n Pluggable.PLUGIN_INIT_TIMEOUT_MS\n );\n\n return Object.assign(this, entry);\n }\n}\n","/*\n * Inspired by Akka Coordinated Shutdown: https://doc.akka.io/libraries/akka-core/current/coordinated-shutdown.html\n * and Lewis's implementation in a private repo elsewhere (https://github.com/Yomanz)\n */\n\nimport { EventEmitter } from 'node:events';\n\nimport chalk from 'chalk';\n\nimport { Logger } from '../Logger';\n\nimport type { LifecycleTask } from '@seedcord/types';\n\n/**\n * Abstract base class for coordinated lifecycle management (startup/shutdown)\n */\nexport abstract class CoordinatedLifecycle<TPhase extends number> {\n protected readonly logger: Logger;\n protected readonly events = new EventEmitter();\n protected readonly tasksMap = new Map<TPhase, LifecycleTask[]>();\n\n protected constructor(\n loggerName: string,\n protected readonly phaseOrder: TPhase[],\n protected readonly phaseEnum: Record<number, string>\n ) {\n this.logger = new Logger(loggerName);\n // Initialize phases\n this.phaseOrder.forEach((phase) => this.tasksMap.set(phase, []));\n }\n\n /**\n * Add a task to a specific phase\n */\n public addTask(phase: TPhase, taskName: string, task: () => Promise<void>, timeoutMs: number): void {\n if (!this.canAddTask()) return;\n\n const tasks = this.tasksMap.get(phase);\n if (!tasks) throw new Error(`Unknown phase: ${phase}`);\n\n tasks.push({ name: taskName, task, timeout: timeoutMs });\n this.logger.debug(\n `${chalk.italic('Added')} ${this.getTaskType()} task ${chalk.bold.cyan(taskName)} to phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n }\n\n /**\n * Remove a task by name from a specific phase\n */\n public removeTask(phase: TPhase, taskName: string): boolean {\n if (!this.canRemoveTask()) return false;\n\n const tasks = this.tasksMap.get(phase);\n if (!tasks) return false;\n\n const initialLength = tasks.length;\n const filteredTasks = tasks.filter((task) => task.name !== taskName);\n this.tasksMap.set(phase, filteredTasks);\n\n const removed = initialLength !== filteredTasks.length;\n if (removed) {\n this.logger.debug(\n `${chalk.italic('Removed')} ${this.getTaskType()} task ${chalk.bold.cyan(taskName)} from phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n }\n\n return removed;\n }\n\n /**\n * Run all tasks in a specific phase\n */\n protected async runPhase(phase: TPhase): Promise<void> {\n const tasks = this.tasksMap.get(phase) ?? [];\n if (tasks.length === 0) {\n this.logger.warn(`No tasks to run in phase ${chalk.bold.magenta(this.phaseEnum[phase])}`);\n return;\n }\n\n this.logger.info(\n `${chalk.bold.yellow('Running')} ${this.getTaskType()} phase ${chalk.bold.magenta(this.phaseEnum[phase])} with ${chalk.bold.cyan(tasks.length)} tasks`\n );\n this.emit(`phase:${phase}:start`);\n\n // Execute all tasks with the execution strategy\n const results: PromiseSettledResult<void>[] = await this.executeTasksInPhase(phase, tasks);\n\n // Check results\n const failures = results.filter((r) => r.status === 'rejected').length;\n if (failures > 0) {\n const errorMessage = `Phase ${chalk.bold.magenta(this.phaseEnum[phase])} completed with ${chalk.bold.red(failures)} failed tasks`;\n\n throw new Error(errorMessage);\n } else {\n this.logger.info(\n `Phase ${chalk.bold.magenta(this.phaseEnum[phase])} ${chalk.bold.green('completed successfully')}`\n );\n }\n\n this.emit(`phase:${phase}:complete`);\n }\n\n /**\n * Run a single task with timeout\n */\n protected async runTaskWithTimeout(phase: TPhase, task: LifecycleTask): Promise<void> {\n this.logger.info(\n `${chalk.italic('Starting')} task ${chalk.bold.cyan(task.name)} in phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n\n try {\n // Create a race between the task and a timeout\n await Promise.race([\n task.task(),\n new Promise<void>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Task '${task.name}' timed out after ${task.timeout}ms`));\n }, task.timeout);\n })\n ]);\n\n this.logger.info(\n `${chalk.italic('Completed')} task ${chalk.bold.cyan(task.name)} in phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n } catch (error) {\n this.logger.error(\n `${chalk.italic('Failed')} task ${chalk.bold.cyan(task.name)} in phase ${chalk.bold.magenta(this.phaseEnum[phase])}:`,\n error\n );\n throw error;\n }\n }\n\n /**\n * Subscribe to lifecycle events\n */\n public on(event: string, listener: (...args: unknown[]) => void): void {\n this.events.on(event, listener);\n }\n\n /**\n * Unsubscribe from lifecycle events\n */\n public off(event: string, listener: (...args: unknown[]) => void): void {\n this.events.off(event, listener);\n }\n\n protected emit(event: string, ...args: unknown[]): boolean {\n return this.events.emit(event, ...args);\n }\n\n // Abstract methods to be implemented by subclasses\n protected abstract canAddTask(): boolean;\n protected abstract canRemoveTask(): boolean;\n protected abstract getTaskType(): string;\n protected abstract executeTasksInPhase(phase: TPhase, tasks: LifecycleTask[]): Promise<PromiseSettledResult<void>[]>;\n}\n","import chalk from 'chalk';\n\nimport { CoordinatedLifecycle } from './CoordinatedLifecycle';\nimport { Globals } from '../../library/Globals';\n\nimport type { LifecycleTask, PhaseEvents, UnionToTuple } from '@seedcord/types';\n\n/**\n * Shutdown phases for coordinated application shutdown.\n */\nexport enum ShutdownPhase {\n /** Stop accepting new requests/interactions */\n StopAcceptingRequests = 1,\n /** Stop background services (health checks, etc.) */\n StopServices,\n /** Disconnect from external resources (database, APIs) */\n ExternalResources,\n /** Disconnect from Discord */\n DiscordCleanup,\n /** Final cleanup tasks */\n FinalCleanup\n}\n\n/** Define the order of phases */\nconst PHASE_ORDER: ShutdownPhase[] = [\n ShutdownPhase.StopAcceptingRequests,\n ShutdownPhase.StopServices,\n ShutdownPhase.ExternalResources,\n ShutdownPhase.DiscordCleanup,\n ShutdownPhase.FinalCleanup\n];\n\ntype CoordinatedShutdownEventKey = PhaseEvents<'shutdown', UnionToTuple<ShutdownPhase>>;\n\nexport interface ShutdownTask extends LifecycleTask {}\n\nconst LOG_FLUSH_DELAY_MS = 500;\n\nexport class CoordinatedShutdown extends CoordinatedLifecycle<ShutdownPhase> {\n private isShuttingDown = false;\n private exitCode = 0;\n\n public constructor() {\n super('CoordinatedShutdown', PHASE_ORDER, ShutdownPhase);\n\n // Register signal hooks\n this.registerSignalHandlers();\n }\n\n protected canAddTask(): boolean {\n return Globals.shutdownIsEnabled;\n }\n\n protected canRemoveTask(): boolean {\n return true;\n }\n\n protected getTaskType(): string {\n return 'shutdown';\n }\n\n protected async executeTasksInPhase(\n phase: ShutdownPhase,\n tasks: LifecycleTask[]\n ): Promise<PromiseSettledResult<void>[]> {\n // Execute all tasks in parallel (unlike startup which uses sequential)\n const results: PromiseSettledResult<void>[] = [];\n for (const task of tasks) {\n results.push(\n await Promise.resolve()\n .then(() => this.runTaskWithTimeout(phase, task))\n .then(\n () => ({ status: 'fulfilled', value: undefined }) satisfies PromiseSettledResult<void>,\n (reason) => ({ status: 'rejected', reason }) satisfies PromiseSettledResult<void>\n )\n );\n }\n return results;\n }\n\n private registerSignalHandlers(): void {\n if (!Globals.shutdownIsEnabled) return;\n\n process.on('SIGTERM', () => {\n this.logger.info(`Received ${chalk.yellow.bold('SIGTERM')} signal`);\n void this.run(0);\n });\n\n process.on('SIGINT', () => {\n this.logger.info(`Received ${chalk.yellow.bold('SIGINT')} signal`);\n void this.run(0);\n });\n }\n\n /**\n * Add a task to a specific shutdown phase\n */\n public override addTask(phase: ShutdownPhase, taskName: string, task: () => Promise<void>, timeoutMs = 5000): void {\n super.addTask(phase, taskName, task, timeoutMs);\n }\n\n /**\n * Remove a task by name from a specific phase\n */\n public override removeTask(phase: ShutdownPhase, taskName: string): boolean {\n return super.removeTask(phase, taskName);\n }\n\n /**\n * Start the coordinated shutdown sequence\n */\n public async run(exitCode = 0): Promise<void> {\n if (this.isShuttingDown) {\n this.logger.warn('Shutdown sequence already in progress');\n return;\n }\n\n this.isShuttingDown = true;\n this.exitCode = exitCode;\n this.logger.info(\n `${chalk.bold.yellow('Starting')} coordinated shutdown with exit code ${chalk.bold.cyan(exitCode)}`\n );\n this.emit('shutdown:start');\n\n try {\n // Execute each phase in order\n for (const phase of PHASE_ORDER) {\n await this.runPhase(phase);\n }\n\n this.logger.info(`${chalk.bold.green('Coordinated shutdown completed')} successfully`);\n this.emit('shutdown:complete');\n } catch (error) {\n this.logger.error(`${chalk.bold.red('Coordinated shutdown failed')}`);\n this.emit('shutdown:error', error);\n } finally {\n this.logger.info(`${chalk.bold.red('Exiting')} process with code ${chalk.bold.cyan(this.exitCode)}`);\n setTimeout(() => {\n process.exit(this.exitCode);\n }, LOG_FLUSH_DELAY_MS);\n }\n }\n\n /**\n * Subscribe to shutdown events\n */\n public override on(event: CoordinatedShutdownEventKey, listener: (...args: unknown[]) => void): void {\n super.on(event, listener);\n }\n\n /**\n * Unsubscribe from shutdown events\n */\n public override off(event: CoordinatedShutdownEventKey, listener: (...args: unknown[]) => void): void {\n super.off(event, listener);\n }\n}\n","import chalk from 'chalk';\nimport { Client } from 'discord.js';\n\nimport { CommandRegistry } from './controllers/CommandRegistry';\nimport { EventController } from './controllers/EventController';\nimport { InteractionController } from './controllers/InteractionController';\nimport { EmojiInjector } from './injectors/EmojiInjector';\nimport { Plugin } from '../interfaces/Plugin';\nimport { Globals } from '../library/Globals';\nimport { ShutdownPhase } from '../services/Lifecycle/CoordinatedShutdown';\nimport { Logger } from '../services/Logger';\n\nimport type { Core } from '../interfaces/Core';\n\nexport class Bot extends Plugin {\n public readonly logger = new Logger('Bot');\n private isInitialized = false;\n\n private readonly _client: Client;\n private readonly interactions: InteractionController;\n private readonly events: EventController;\n private readonly commands: CommandRegistry;\n private readonly emojiInjector: EmojiInjector;\n\n constructor(protected core: Core) {\n super(core);\n\n this._client = new Client(core.config.bot.clientOptions);\n\n this.interactions = new InteractionController(core);\n this.events = new EventController(core);\n\n this.commands = new CommandRegistry(this.core);\n this.emojiInjector = new EmojiInjector(this.core);\n\n this.core.shutdown.addTask(ShutdownPhase.DiscordCleanup, 'stop-bot', async () => await this.stop());\n }\n\n public async init(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n this.isInitialized = true;\n\n await this.login();\n\n await this.interactions.init();\n await this.events.init();\n\n await this.commands.init();\n await this.commands.setCommands();\n\n await this.emojiInjector.init();\n }\n\n public async stop(): Promise<void> {\n this._client.removeAllListeners();\n\n await this.logout();\n }\n\n private async login(): Promise<Bot> {\n await this._client.login(Globals.botToken);\n this.logger.info(`Logged in as ${chalk.bold.magenta(this._client.user?.username)}!`);\n return this;\n }\n\n private async logout(): Promise<void> {\n await this._client.destroy();\n this.logger.info(chalk.bold.red('Logged out of Discord!'));\n }\n\n public get client(): Client {\n return this._client;\n }\n}\n","import type { HookKeys } from '../types/Hooks';\nimport type { ConstructorFunction } from '@seedcord/types';\n\nexport const HookMetadataKey = Symbol('hook:metadata');\n\nexport function RegisterHook<THook extends HookKeys>(hook: THook) {\n return function (constructor: ConstructorFunction): void {\n Reflect.defineMetadata(HookMetadataKey, hook, constructor);\n };\n}\n","import type { Core } from '../../interfaces/Core';\nimport type { AllHooks, HookKeys } from '../types/Hooks';\n\nexport abstract class HookHandler<KeyOfHooks extends HookKeys> {\n constructor(\n protected readonly data: AllHooks[KeyOfHooks],\n protected readonly core: Core\n ) {\n this.data = data;\n this.core = core;\n }\n\n abstract execute(): Promise<void>;\n}\n","import { HookHandler } from '../HookHandler';\n\nimport type { Core } from '../../../interfaces/Core';\nimport type { AllHooks, HookKeys } from '../../types/Hooks';\nimport type { WebhookClient } from 'discord.js';\n\nexport abstract class WebhookLog<KeyofHooks extends HookKeys> extends HookHandler<KeyofHooks> {\n abstract webhook: WebhookClient;\n\n constructor(data: AllHooks[KeyofHooks], core: Core) {\n super(data, core);\n }\n}\n","import { DiscordAPIError, SnowflakeUtil, WebhookClient } from 'discord.js';\n\nimport { BuilderComponent } from '../../interfaces/Components';\nimport { Globals } from '../../library/Globals';\nimport { RegisterHook } from '../decorators/RegisterHook';\nimport { WebhookLog } from '../interfaces/abstracts/WebhookLog';\nimport { AllHooks } from '../types/Hooks';\n\n@RegisterHook('unknownException')\nexport class UnknownException extends WebhookLog<'unknownException'> {\n webhook = new WebhookClient({\n url: Globals.unknownExceptionWebhookUrl\n });\n\n async execute(): Promise<void> {\n await this.webhook.send({\n username: 'Unknown Exception',\n avatarURL: 'https://cdn.discordapp.com/attachments/1351446034827579466/1351446912947191830/warning-2.png',\n embeds: [new UnhandledErrorEmbed(this.data).component]\n });\n }\n}\n\nclass UnhandledErrorEmbed extends BuilderComponent<'embed'> {\n constructor(data: AllHooks['unknownException']) {\n super('embed');\n\n const { uuid, error, guild, user } = data;\n\n this.instance\n .setTitle(`An unknown exception was thrown`)\n .setColor('#ef4860')\n .setDescription(\n `**Guild ID:** \\`${guild?.id ?? 'Not used in a guild'}\\`\\n` +\n `**Guild Name:** ${guild?.name ?? 'Not used in a guild'}\\n` +\n `**User ID:** \\`${user?.id ?? 'Missing user info'}\\`\\n` +\n `**Username:** ${user?.username ?? 'Missing user info'}\\n` +\n `### UUID: \\`${uuid}\\`\\n` +\n `\\`\\`\\`${error.stack}\\`\\`\\``\n );\n\n this.setTimestampsIfAvailable(error);\n }\n\n private setTimestampsIfAvailable(error: Error): void {\n if (!(error instanceof DiscordAPIError)) return;\n\n const now = Date.now();\n\n // Extract the snowflake ID from `/interactions/{ID}/`\n const snowflake = error.url.match(/\\/interactions\\/(\\d+)\\//)?.[1];\n if (!snowflake) return undefined;\n\n // Discord epoch offset (ms) and timestamp extraction\n const interactionTs = Number(SnowflakeUtil.deconstruct(snowflake).timestamp);\n\n // Time difference\n const diff = now - interactionTs;\n const seconds = Math.floor(diff / 1000);\n const millis = diff % 1000;\n\n this.instance.addFields([\n {\n name: 'Timestamps',\n value:\n `- **\\`Interaction sent\\` :** ${new Date(interactionTs).toISOString()} (${interactionTs})\\n` +\n `- **\\`Error logged \\` :** ${new Date(now).toISOString()} (${now})\\n` +\n `- **\\`Offset \\` :** ${seconds}s ${millis}ms`,\n inline: true\n }\n ]);\n }\n}\n","import { EventEmitter } from 'events';\n\nimport type { AllHooks, HookKeys } from './types/Hooks';\n\nexport class HookEmitter {\n private readonly emitter = new EventEmitter();\n\n public on<KeyOfHooks extends HookKeys>(event: KeyOfHooks, listener: (data: AllHooks[KeyOfHooks]) => void): this {\n this.emitter.on(event, listener);\n return this;\n }\n\n public once<KeyOfHooks extends HookKeys>(event: KeyOfHooks, listener: (data: AllHooks[KeyOfHooks]) => void): this {\n this.emitter.once(event, listener);\n return this;\n }\n\n public emit<KeyOfHooks extends HookKeys>(event: KeyOfHooks, data: AllHooks[KeyOfHooks]): boolean {\n return this.emitter.emit(event, data);\n }\n}\n","import chalk from 'chalk';\n\nimport { Plugin } from '../interfaces/Plugin';\nimport { traverseDirectory } from '../library/Helpers';\nimport { Logger } from '../services/Logger';\nimport { HookMetadataKey } from './decorators/RegisterHook';\nimport { UnknownException } from './default/UnknownException';\nimport { HookEmitter } from './HookEmitter';\nimport { HookHandler } from './interfaces/HookHandler';\n\nimport type { Core } from '../interfaces/Core';\nimport type { AllHooks, HookKeys } from './types/Hooks';\nimport type { TypedConstructor } from '@seedcord/types';\n\ntype HookConstructor = TypedConstructor<typeof HookHandler>;\n\nexport class HookController extends Plugin {\n public readonly logger = new Logger('Hooks');\n private isInitialized = false;\n private readonly hookMap = new Map<HookKeys, HookConstructor[]>();\n private readonly emitter = new HookEmitter();\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 hooksDir = this.core.config.hooks.path;\n this.logger.info(chalk.bold(hooksDir));\n\n this.registerHook('unknownException', UnknownException);\n\n await this.loadHooks(hooksDir);\n\n this.attachHooks();\n\n const totalHooks = Array.from(this.hookMap.values()).reduce((acc, handlers) => acc + handlers.length, 0);\n this.logger.info(`${chalk.bold.green('Loaded')}: ${chalk.bold.magenta(totalHooks)} hooks`);\n }\n\n private async loadHooks(dir: string): Promise<void> {\n await traverseDirectory(dir, (_fullPath, relativePath, imported) => {\n for (const exportName of Object.keys(imported)) {\n const val = imported[exportName];\n if (this.isHookHandler(val)) {\n const hookName = Reflect.getMetadata(HookMetadataKey, val) as HookKeys | undefined;\n if (hookName) {\n this.registerHook(hookName, val);\n this.logger.info(\n `${chalk.italic('Registered')} ${chalk.bold.yellow(val.name)} from ${chalk.gray(relativePath)}`\n );\n }\n }\n }\n });\n }\n\n private registerHook(hookName: HookKeys, handler: HookConstructor): void {\n let handlers = this.hookMap.get(hookName);\n if (!handlers) {\n handlers = [];\n this.hookMap.set(hookName, handlers);\n }\n handlers.push(handler);\n }\n\n private isHookHandler(obj: unknown): obj is HookConstructor {\n if (typeof obj !== 'function') return false;\n return obj.prototype instanceof HookHandler;\n }\n\n private attachHooks(): void {\n for (const [hookName, handlerCtors] of this.hookMap) {\n this.emitter.on(hookName, (data) => {\n for (const HandlerCtor of handlerCtors) {\n try {\n const instance = new HandlerCtor(data, this.core);\n void instance.execute();\n } catch (err) {\n this.logger.error(`Error in hook ${String(hookName)} handler ${HandlerCtor.name}:`, err);\n }\n }\n });\n }\n }\n\n public emit<KeyOfHooks extends HookKeys>(event: KeyOfHooks, data: AllHooks[KeyOfHooks]): boolean {\n return this.emitter.emit(event, data);\n }\n}\n","import { createServer } from 'http';\n\nimport chalk from 'chalk';\n\nimport { ShutdownPhase } from './Lifecycle/CoordinatedShutdown';\nimport { Logger } from './Logger';\nimport { Plugin } from '../interfaces/Plugin';\nimport { Globals } from '../library/Globals';\n\nimport type { Core } from '../interfaces/Core';\nimport type { IncomingMessage, Server, ServerResponse } from 'http';\n\nconst HTTP_OK = 200;\nconst HTTP_NOT_FOUND = 404;\n\nexport class HealthCheck extends Plugin {\n public readonly logger = new Logger('HealthCheck');\n private readonly port: number = Globals.healthCheckPort;\n private readonly path: string = Globals.healthCheckPath;\n private server?: Server;\n\n constructor(private readonly core: Core) {\n super(core);\n // Register shutdown task\n this.core.shutdown.addTask(ShutdownPhase.StopServices, 'stop-healthcheck-server', async () => await this.stop());\n }\n\n /**\n * Starts the health check server.\n * @returns Promise that resolves when the server is listening\n */\n public async init(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.server = createServer((req: IncomingMessage, res: ServerResponse) => {\n if (req.method === 'GET' && req.url === this.path) {\n res.writeHead(HTTP_OK, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ status: 'ok', timestamp: Date.now() }));\n } else {\n res.writeHead(HTTP_NOT_FOUND, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ status: 'not found' }));\n }\n });\n\n this.server.on('error', reject);\n\n this.server.listen(this.port, () => {\n this.logger.info(\n `${chalk.green.bold('✓')} Health check server listening on ${chalk.cyan(`http://localhost:${this.port}${this.path}`)}`\n );\n resolve();\n });\n });\n }\n\n public stop(): Promise<void> {\n return new Promise((shutdownResolve) => {\n this.server?.close(() => {\n this.logger.info(chalk.bold.red('Health check server stopped'));\n shutdownResolve();\n });\n });\n }\n}\n","import chalk from 'chalk';\n\nimport { CoordinatedLifecycle } from './CoordinatedLifecycle';\n\nimport type { LifecycleTask, PhaseEvents, UnionToTuple } from '@seedcord/types';\n\n/**\n * Startup phases for coordinated plugin initialization.\n */\nexport enum StartupPhase {\n /** Validate environment variables and config files */\n Validation = 1,\n /** Discover plugin constructors via decorators or registry */\n Discovery,\n /** Register plugin metadata and declared dependencies */\n Registration,\n /** Inject and validate plugin-specific configuration */\n Configuration,\n /** Instantiate plugin classes with Core and arguments */\n Instantiation,\n /** Activate plugins by calling their init/setup hooks */\n Activation,\n /** Mark seedcord as ready and start handling interactions */\n Ready\n}\n\n/** Define the order of phases */\nconst PHASE_ORDER: StartupPhase[] = [\n StartupPhase.Validation,\n StartupPhase.Discovery,\n StartupPhase.Registration,\n StartupPhase.Configuration,\n StartupPhase.Instantiation,\n StartupPhase.Activation,\n StartupPhase.Ready\n];\n\ntype CoordinatedStartupEventKey = PhaseEvents<'startup', UnionToTuple<StartupPhase>>;\n\nexport interface StartupTask extends LifecycleTask {}\n\nexport class CoordinatedStartup extends CoordinatedLifecycle<StartupPhase> {\n private isStartingUp = false;\n private hasStarted = false;\n\n public constructor() {\n super('CoordinatedStartup', PHASE_ORDER, StartupPhase);\n }\n\n /**\n * Add a task to a specific startup phase\n */\n public override addTask(phase: StartupPhase, taskName: string, task: () => Promise<void>, timeoutMs = 10000): void {\n super.addTask(phase, taskName, task, timeoutMs);\n }\n\n protected canAddTask(): boolean {\n if (this.hasStarted) {\n throw new Error('Cannot add tasks after startup sequence has already completed');\n }\n\n if (this.isStartingUp) {\n throw new Error('Cannot add tasks while startup sequence is in progress');\n }\n\n return true;\n }\n\n protected canRemoveTask(): boolean {\n if (this.isStartingUp) {\n throw new Error('Cannot remove tasks while startup sequence is in progress');\n }\n\n return true;\n }\n\n protected getTaskType(): string {\n return 'startup';\n }\n\n protected async executeTasksInPhase(\n phase: StartupPhase,\n tasks: LifecycleTask[]\n ): Promise<PromiseSettledResult<void>[]> {\n // Execute all tasks in sequence\n const results: PromiseSettledResult<void>[] = [];\n for (const task of tasks) {\n results.push(\n await Promise.resolve()\n .then(() => this.runTaskWithTimeout(phase, task))\n .then(\n () => ({ status: 'fulfilled', value: undefined }) satisfies PromiseSettledResult<void>,\n (reason) => ({ status: 'rejected', reason }) satisfies PromiseSettledResult<void>\n )\n );\n }\n return results;\n }\n\n /**\n * Start the coordinated startup sequence\n */\n public async run(): Promise<void> {\n if (this.hasStarted) {\n this.logger.warn('Startup sequence has already completed');\n return;\n }\n\n if (this.isStartingUp) {\n this.logger.warn('Startup sequence already in progress');\n return;\n }\n\n this.isStartingUp = true;\n this.logger.info(`${chalk.bold.green('Starting')} coordinated startup sequence`);\n this.emit('startup:start');\n\n try {\n // Execute each phase in order\n for (const phase of PHASE_ORDER) await this.runPhase(phase);\n\n this.hasStarted = true;\n this.logger.info(`${chalk.bold.green('Coordinated startup completed')} successfully`);\n this.emit('startup:complete');\n } catch (error) {\n this.logger.error(`${chalk.bold.red('Coordinated startup failed')}`);\n this.emit('startup:error', error);\n throw error;\n } finally {\n this.isStartingUp = false;\n }\n }\n\n /**\n * Subscribe to startup events\n */\n public override on(event: CoordinatedStartupEventKey, listener: (...args: unknown[]) => void): void {\n super.on(event, listener);\n }\n\n /**\n * Unsubscribe from startup events\n */\n public override off(event: CoordinatedStartupEventKey, listener: (...args: unknown[]) => void): void {\n super.off(event, listener);\n }\n\n /**\n * Check if startup has completed\n */\n public get isReady(): boolean {\n return this.hasStarted;\n }\n\n /**\n * Check if startup is currently running\n */\n public get isRunning(): boolean {\n return this.isStartingUp;\n }\n}\n","import chalk from 'chalk';\n\nimport { Bot } from './bot/Bot';\nimport { HookController } from './hooks/HookController';\nimport { Pluggable } from './interfaces/Plugin';\nimport { HealthCheck } from './services/HealthCheck';\nimport { CoordinatedShutdown } from './services/Lifecycle/CoordinatedShutdown';\nimport { CoordinatedStartup, StartupPhase } from './services/Lifecycle/CoordinatedStartup';\n\nimport type { Config } from './interfaces/Config';\nimport type { Core } from './interfaces/Core';\n\nexport class Seedcord extends Pluggable implements Core {\n private static isInstantiated = false;\n public override readonly shutdown: CoordinatedShutdown;\n public override readonly startup: CoordinatedStartup;\n\n public readonly hooks: HookController;\n public readonly bot: Bot;\n private readonly healthCheck: HealthCheck;\n\n constructor(public readonly config: Config) {\n // Create lifecycle instances\n const shutdown = new CoordinatedShutdown();\n const startup = new CoordinatedStartup();\n\n // Pass them to parent constructor\n super(shutdown, startup);\n\n // Store references for public access\n this.shutdown = shutdown;\n this.startup = startup;\n\n if (Seedcord.isInstantiated) {\n throw new Error('Seedcord can only be instantiated once. Use the existing instance instead.');\n }\n Seedcord.isInstantiated = true;\n\n this.hooks = new HookController(this as unknown as Core);\n this.bot = new Bot(this as unknown as Core);\n this.healthCheck = new HealthCheck(this as unknown as Core);\n\n this.registerStartupTasks();\n }\n\n private registerStartupTasks(): void {\n this.startup.addTask(StartupPhase.Configuration, 'Hook Initialization', async () => {\n this.hooks.logger.info(chalk.bold('Initializing'));\n await this.hooks.init();\n this.hooks.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 public async start(): Promise<this> {\n await super.init();\n return this;\n }\n}\n\n// Type assertion to tell TypeScript that plugins will exist at runtime\nexport interface Seedcord extends Core {}\n","import type { Handler } from '../../interfaces/Handler';\n\ntype HandlerCtor = new (...args: any[]) => Handler;\n\nexport function Checkable<TypeHandler extends HandlerCtor>(ctor: TypeHandler): TypeHandler {\n return class extends ctor {\n static override name = ctor.name;\n checkable = true as const;\n };\n}\n","/* decorators/EventCatchable.ts */\nimport { Message } from 'discord.js';\n\nimport { ErrorHandlingUtils } from '../utilities/ErrorHandlingUtils';\n\nimport type { EventHandler } from '../../interfaces/Handler';\nimport type { ClientEvents } from 'discord.js';\n\nexport function EventCatchable(log?: boolean) {\n return function (\n _target: EventHandler<keyof ClientEvents>,\n _prop: string,\n descriptor: TypedPropertyDescriptor<(...args: any[]) => Promise<void>>\n ): void {\n const original = descriptor.value;\n\n descriptor.value = async function (this: EventHandler<keyof ClientEvents>, ...args: any[]): Promise<void> {\n if (!original) throw new Error('Method not found');\n\n try {\n await original.apply(this, args);\n } catch (err) {\n if (!(err instanceof Error)) throw err;\n\n this.setErrored();\n // eslint-disable-next-line no-console\n if (log) console.error(err);\n\n const eventArgs = Array.isArray(this.getEvent()) ? (this.getEvent() as unknown[]) : [this.getEvent()];\n const msg = eventArgs.find((x): x is Message => x instanceof Message);\n\n // Use ErrorHandlingUtils for consistent error handling\n const result = ErrorHandlingUtils.handleError(err, this.core, msg?.guild ?? null, msg?.author ?? null);\n\n if (!msg) return;\n\n await msg.reply({ embeds: [result.response], components: [] });\n }\n };\n };\n}\n","import { Logger } from './Logger';\nimport { Globals } from '../library/Globals';\n\nexport interface CooldownOptions {\n // Cooldown window in milliseconds (default 1 000)\n cooldown?: number;\n // Custom error class to throw when a key is still cooling down\n err?: new (msg: string, ...args: any[]) => Error;\n // Message passed to the error constructor (default \"Cooldown active\")\n message?: string;\n}\n\n/**\n * Lightweight utility for per-key cooldowns\n */\nexport class CooldownManager {\n private readonly window: number;\n private readonly Err: new (msg: string, ...args: any[]) => Error;\n private readonly msg: string;\n private readonly map = new Map<string, number>();\n\n constructor(opts: CooldownOptions = {}) {\n this.window = opts.cooldown ?? 1_000;\n this.Err = opts.err ?? Error;\n this.msg = opts.message ?? 'Cooldown active';\n }\n\n /** Record usage without any checks. */\n set(key: string): void {\n this.map.set(key, Date.now());\n }\n\n /**\n * Verify cooldown for `key`.\\\n * If active → throws the custom error.\\\n * If not active → updates timestamp and returns void.\n */\n check(key: string): void {\n const now = Date.now();\n const last = this.map.get(key);\n const remaining = this.window - (now - (last ?? 0));\n\n if (Globals.isDevelopment && remaining > 0) {\n Logger.Debug('CooldownManager', `${key} - ${remaining}ms remaining`);\n }\n\n if (last !== undefined && remaining > 0) {\n throw new this.Err(this.msg, remaining);\n }\n this.map.set(key, now);\n }\n\n /** Returns true if the key is still cooling down (does not update timestamp). */\n isActive(key: string): boolean {\n const last = this.map.get(key);\n return last !== undefined && Date.now() - last < this.window;\n }\n\n /** Remove a key from the map (useful for manual resets). */\n clear(key: string): void {\n this.map.delete(key);\n }\n}\n","import mongoose from 'mongoose';\n\nimport type { ServiceKeys } from '../types/Services';\n\nexport const ModelMetadataKey = Symbol('db:model');\n\nexport function DatabaseModel<TService extends ServiceKeys>(collection: TService) {\n return <\n SchemaObj extends Record<KeyOfSchema, mongoose.Schema>,\n KeyOfSchema extends keyof SchemaObj & (string | symbol)\n >(\n target: SchemaObj,\n propertyKey: KeyOfSchema\n ): void => {\n const schema = target[propertyKey];\n const name = String(collection);\n const model = mongoose.model(name, schema);\n Reflect.defineMetadata(ModelMetadataKey, model, target);\n };\n}\n","import type { BaseService } from '../BaseService';\nimport type { ServiceKeys } from '../types/Services';\nimport type { ConstructorFunction } from '@seedcord/types';\n\nexport const ServiceMetadataKey = Symbol('db:serviceKey');\n\nexport function DatabaseService<TService extends ServiceKeys>(key: TService) {\n return <DatabaseCtor extends ConstructorFunction & { prototype: BaseService }>(ctor: DatabaseCtor): void => {\n Reflect.defineMetadata(ServiceMetadataKey, key, ctor);\n };\n}\n","import { ModelMetadataKey } from './decorators/DatabaseModel';\nimport { ServiceMetadataKey } from './decorators/DatabaseService';\n\nimport type { Mongo } from './Mongo';\nimport type { Services } from './types/Services';\nimport type { Core } from '../interfaces/Core';\nimport type { IDocument, TypedConstructor } from '@seedcord/types';\nimport type mongoose from 'mongoose';\n\nexport abstract class BaseService<Doc extends IDocument = IDocument> {\n public readonly model: mongoose.Model<Doc>;\n\n public constructor(\n protected readonly db: Mongo,\n protected readonly core: Core\n ) {\n const ctor = this.constructor;\n\n const key = Reflect.getMetadata(ServiceMetadataKey, ctor) as string | undefined;\n if (!key) throw new Error(`Missing @DatabaseService on ${ctor.name}`);\n\n const model = Reflect.getMetadata(ModelMetadataKey, ctor) as mongoose.Model<Doc> | undefined;\n if (!model) throw new Error(`Missing @DatabaseModel on ${ctor.name}`);\n\n this.model = model;\n\n db._register(key as keyof Services, this as unknown as Services[keyof Services]);\n }\n}\n\nexport type BaseServiceConstructor = TypedConstructor<typeof BaseService>;\n","import chalk from 'chalk';\nimport mongoose from 'mongoose';\n\nimport { BaseService } from './BaseService';\nimport { DatabaseConnectionFailure } from '../bot/errors/Database';\nimport { Globals } from '../library/Globals';\nimport { throwCustomError, traverseDirectory } from '../library/Helpers';\nimport { ShutdownPhase } from '../services/Lifecycle/CoordinatedShutdown';\nimport { Logger } from '../services/Logger';\nimport { ServiceMetadataKey } from './decorators/DatabaseService';\nimport { Plugin } from '../interfaces/Plugin';\n\nimport type { BaseServiceConstructor } from './BaseService';\nimport type { Services } from './types/Services';\nimport type { Core } from '../interfaces/Core';\n\ninterface MongoOptions {\n servicesDir: string;\n uri: string;\n dbName: string;\n}\n\nexport class Mongo extends Plugin {\n public readonly logger = new Logger('MongoDB');\n private isInitialised = false;\n private readonly uri: string;\n\n /**\n * Map of all loaded services.\n * Keys come from `@DatabaseService('key')`\n */\n public readonly services: Services = {} as Services;\n\n constructor(\n public readonly core: Core,\n private readonly options: MongoOptions\n ) {\n super(core);\n this.uri = options.uri;\n\n this.core.shutdown.addTask(ShutdownPhase.ExternalResources, 'stop-database', async () => await this.stop());\n }\n\n public async init(): Promise<void> {\n if (this.isInitialised) return;\n this.isInitialised = true;\n\n await this.connect();\n await this.loadServices();\n }\n\n public async stop(): Promise<void> {\n await this.disconnect();\n }\n\n private async connect(): Promise<void> {\n await mongoose\n .connect(this.uri, {\n dbName: this.options.dbName,\n ...(Globals.isProduction && { tls: true, ssl: true })\n })\n .then((i) => this.logger.info(`Connected to MongoDB: ${chalk.bold.magenta(i.connection.name)}`))\n .catch((err) => throwCustomError(err, 'Could not connect to MongoDB', DatabaseConnectionFailure));\n }\n\n private async disconnect(): Promise<void> {\n await mongoose\n .disconnect()\n .then(() => this.logger.info(chalk.red.bold('Disconnected from MongoDB')))\n .catch((err) => this.logger.error(`Could not disconnect from MongoDB: ${(err as Error).message}`));\n }\n\n private async loadServices(): Promise<void> {\n const servicesDir = this.options.servicesDir;\n this.logger.info(chalk.bold(servicesDir));\n\n await traverseDirectory(servicesDir, (_full, rel, mod) => {\n for (const Service of Object.values(mod)) {\n if (this.isServiceClass(Service)) {\n const instance = new Service(this, this.core);\n this.logger.info(\n `${chalk.italic('Registered')} ${chalk.bold.yellow(instance.constructor.name)} from ${chalk.gray(rel)}`\n );\n }\n }\n });\n\n this.logger.info(`${chalk.bold.green('Loaded')}: ${chalk.magenta(Object.keys(this.services).length)} services`);\n }\n\n private isServiceClass(obj: unknown): obj is BaseServiceConstructor {\n return (\n typeof obj === 'function' && obj.prototype instanceof BaseService && Reflect.hasMetadata(ServiceMetadataKey, obj)\n );\n }\n\n _register<SKey extends keyof Services>(key: SKey, instance: Services[SKey]): void {\n this.services[key] = instance;\n }\n}\n","import { DatabaseError } from '../../bot/errors/Database';\nimport { CustomError } from '../../interfaces/Components';\nimport { throwCustomError } from '../../library/Helpers';\n\nexport function DBCatchable<TypeReturn>(errorMessage: string) {\n return function (\n _target: unknown,\n _propertyKey: string,\n descriptor: TypedPropertyDescriptor<(...args: any[]) => Promise<TypeReturn>>\n ): void {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (...args: any[]): Promise<TypeReturn> {\n if (!originalMethod) {\n throw new Error('Method not found');\n }\n\n try {\n return await originalMethod.apply(this, args);\n } catch (error) {\n if (!(error instanceof CustomError)) {\n throwCustomError(error, errorMessage, DatabaseError);\n } else {\n throw error;\n }\n }\n };\n };\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "seedcord",
3
+ "type": "module",
4
+ "version": "0.1.0-alpha.0",
5
+ "description": "A Discord bot framework built on top of Discord.js",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/seedcord/seedcord.git",
9
+ "directory": "packages/seedcord"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": {
14
+ "development": "./src/index.ts",
15
+ "import": "./dist/index.d.mts",
16
+ "require": "./dist/index.d.cts",
17
+ "default": "./dist/index.d.ts"
18
+ },
19
+ "development": "./src/index.ts",
20
+ "import": {
21
+ "types": "./dist/index.d.mts",
22
+ "default": "./dist/index.mjs"
23
+ },
24
+ "require": {
25
+ "types": "./dist/index.d.cts",
26
+ "default": "./dist/index.cjs"
27
+ },
28
+ "default": "./dist/index.mjs"
29
+ }
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "package.json",
34
+ "README.md",
35
+ "LICENSE"
36
+ ],
37
+ "peerDependencies": {
38
+ "typescript": "^5.9.2"
39
+ },
40
+ "dependencies": {
41
+ "chalk": "^5.4.1",
42
+ "discord.js": "^14.0.0",
43
+ "envapt": "^2.2.8",
44
+ "mongoose": "^8.16.4",
45
+ "reflect-metadata": "^0.2.2",
46
+ "winston": "^3.17.0",
47
+ "@seedcord/types": "^0.0.0"
48
+ },
49
+ "devDependencies": {
50
+ "@seedcord/tsup-config": "^1.0.0",
51
+ "@seedcord/eslint-config": "^1.0.0",
52
+ "@seedcord/tsconfig": "^1.0.0"
53
+ },
54
+ "scripts": {
55
+ "build": "tsup && cp dist/index.d.cts dist/index.d.mts",
56
+ "clean": "rm -rf dist",
57
+ "lint": "eslint 'src/**/*.{ts,tsx}' --cache",
58
+ "lint:fix": "eslint 'src/**/*.{ts,tsx}' --fix --cache",
59
+ "fmt": "prettier --write 'src/**/*.{ts,tsx,json,md}' --cache",
60
+ "fmt:check": "prettier --check 'src/**/*.{ts,tsx,json,md}' --cache",
61
+ "tc": "tsc --noEmit",
62
+ "test": "vitest run",
63
+ "test:watch": "vitest dev",
64
+ "coverage": "vitest run --coverage"
65
+ }
66
+ }