vimcord 1.0.1 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/command.base.ts","../src/validators/permissions.validator.ts","../src/builders/baseCommand.builder.ts","../src/builders/contextCommand.builder.ts","../src/utils/dir.ts","../src/builders/event.builder.ts","../src/builders/prefixCommand.builder.ts","../src/builders/slashCommand.builder.ts","../src/client.ts","../src/configs/tools.config.ts","../src/configs/app.config.ts","../src/configs/staff.config.ts","../src/configs/slashCommand.config.ts","../src/configs/prefixCommand.config.ts","../src/configs/contextCommand.config.ts","../src/tools/Logger.ts","../src/tools/utils.ts","../src/types/status.ts","../src/utils/number.ts","../src/utils/random.ts","../src/modules/status.manager.ts","../src/modules/command.manager.ts","../src/modules/event.manager.ts","../src/utils/sendCommandErrorEmbed.ts","../src/tools/BetterEmbed.ts","../src/tools/dynaSend.ts","../src/tools/types.ts","../src/utils/async.ts","../package.json","../src/modules/db/mongo/mongo.ts","../src/modules/db/mongo/mongoSchema.builder.ts","../src/tools/BetterCollector.ts","../src/tools/BetterContainer.ts","../src/tools/BetterModal.ts","../src/tools/Paginator.ts","../src/tools/Prompt.ts","../src/utils/VimcordCLI.ts","../src/utils/clientUtils.ts"],"sourcesContent":["import {\n AppCommandDeployment,\n CommandMetadata,\n CommandPermissionResults,\n CommandPermissions,\n CommandRateLimitOptions\n} from \"./command.options\";\nimport { ChatInputCommandInteraction, ContextMenuCommandInteraction, Message } from \"discord.js\";\nimport { type Vimcord } from \"@/client\";\n\nexport enum CommandType {\n Slash = 0,\n Prefix = 1,\n Context = 2\n}\n\nexport enum MissingPermissionReason {\n User = 0,\n Bot = 1,\n Role = 2,\n UserBlacklisted = 3,\n RoleBlacklisted = 4,\n NotInGuild = 5,\n NotGuildOwner = 6,\n NotBotOwner = 7,\n NotBotStaff = 8\n}\n\nexport enum RateLimitScope {\n User = 0,\n Guild = 1,\n Channel = 2,\n Global = 3\n}\n\nexport type BaseCommandParameters<T extends CommandType> = T extends CommandType.Slash\n ? [client: Vimcord<true>, interaction: ChatInputCommandInteraction]\n : T extends CommandType.Prefix\n ? [client: Vimcord<true>, message: Message]\n : T extends CommandType.Context\n ? [client: Vimcord<true>, interaction: ContextMenuCommandInteraction]\n : never;\n\nexport interface BaseCommandConfig<T extends CommandType> {\n /** Is this command enabled? @default true */\n enabled?: boolean;\n /** Custom conditions that must be met for this command to execute */\n conditions?: Array<(...args: BaseCommandParameters<T>) => boolean | Promise<boolean>>;\n /** Command permission requirements */\n permissions?: CommandPermissions;\n /** Command metadata configuration */\n metadata?: CommandMetadata;\n /** Rate limiting options */\n rateLimit?: CommandRateLimitOptions<(...args: BaseCommandParameters<T>) => any>;\n /** Log whenever a command is executed? @default true */\n logExecution?: boolean;\n\n /** Executed before the main command logic */\n beforeExecute?: (...args: BaseCommandParameters<T>) => any;\n /** The main command function that will be executed */\n execute?: (...args: BaseCommandParameters<T>) => any;\n /** Executed after successful execution */\n afterExecute?: (result: any, ...args: BaseCommandParameters<T>) => any;\n /** Executed when the required permissions are not met */\n onMissingPermissions?: (results: CommandPermissionResults, ...args: BaseCommandParameters<T>) => any;\n /** Executed when the required conditions are not met */\n onConditionsNotMet?: (...args: BaseCommandParameters<T>) => any;\n /** Executed when this command is used when its disabled */\n onUsedWhenDisabled?: (...args: BaseCommandParameters<T>) => any;\n /** Executed when the rate limit is hit */\n onRateLimit?: (...args: BaseCommandParameters<T>) => any;\n /** Custom error handler */\n onError?: (error: Error, ...args: BaseCommandParameters<T>) => any;\n}\n\nexport interface BaseAppCommandConfig {\n /** Command deployment configuration */\n deployment?: AppCommandDeployment;\n}\n\nexport interface CommandInternalRateLimitData {\n /** Number of times executed */\n executions: number;\n /** Timestamp of latest execution */\n timestamp: number;\n}\n","import { BaseInteraction, CommandInteraction, GuildMember, PermissionResolvable, User } from \"discord.js\";\nimport { CommandPermissionResults, CommandPermissions } from \"@ctypes/command.options\";\nimport { MissingPermissionReason } from \"@ctypes/command.base\";\nimport { type Vimcord } from \"@/client\";\n\nfunction __existsAndTrue(value: boolean | undefined) {\n return value !== undefined && value;\n}\n\nexport function validateCommandPermissions(\n permissions: CommandPermissions,\n client: Vimcord<true>,\n user: GuildMember | User,\n command: CommandInteraction | string\n): CommandPermissionResults {\n const inGuild = \"guild\" in user;\n\n const missingUserPermissions: PermissionResolvable[] = [];\n const missingBotPermissions: PermissionResolvable[] = [];\n const missingRoles: string[] = [];\n\n if (permissions.user?.length && inGuild) {\n for (const permission of permissions.user) {\n if (!user.permissions.has(permission)) {\n missingUserPermissions.push(permission);\n }\n }\n\n if (missingUserPermissions.length) {\n return { validated: false, failReason: MissingPermissionReason.User, missingUserPermissions };\n }\n }\n\n if (permissions.bot?.length && inGuild && user.guild.members.me) {\n for (const permission of permissions.bot) {\n if (!user.guild.members.me!.permissions.has(permission)) {\n missingBotPermissions.push(permission);\n }\n }\n\n if (missingBotPermissions.length) {\n return { validated: false, failReason: MissingPermissionReason.Bot, missingBotPermissions };\n }\n }\n\n if (permissions.roles?.length && inGuild) {\n for (const role of permissions.roles) {\n if (!user.roles.cache.has(role)) {\n missingRoles.push(role);\n }\n }\n\n if (missingRoles.length) {\n return { validated: false, failReason: MissingPermissionReason.Role, missingRoles };\n }\n }\n\n if (permissions.userBlacklist?.length) {\n if (permissions.userBlacklist.includes(user.id)) {\n return { validated: false, failReason: MissingPermissionReason.UserBlacklisted, blacklistedUser: user.id };\n }\n }\n\n if (permissions.roleBlacklist?.length && inGuild) {\n if (user.roles.cache.some(role => permissions.roleBlacklist!.includes(role.id))) {\n return { validated: false, failReason: MissingPermissionReason.RoleBlacklisted, blacklistedRole: user.id };\n }\n }\n\n if (__existsAndTrue(permissions.guildOnly) && !inGuild) {\n return { validated: false, failReason: MissingPermissionReason.NotInGuild };\n }\n\n if (__existsAndTrue(permissions.guildOwnerOnly) && inGuild && user.id !== user.guild.ownerId) {\n return { validated: false, failReason: MissingPermissionReason.NotGuildOwner };\n }\n\n if (__existsAndTrue(permissions.botOwnerOnly) && user.id !== client.config.staff.ownerId) {\n return { validated: false, failReason: MissingPermissionReason.NotBotOwner };\n }\n\n if (__existsAndTrue(permissions.botStaffOnly)) {\n if (!client.config.staff.superUsers.includes(user.id)) {\n return { validated: false, failReason: MissingPermissionReason.NotBotStaff };\n }\n\n if (inGuild) {\n for (const [k, role] of user.roles.cache) {\n if (!user.roles.cache.has(role.id)) {\n missingRoles.push(role.id);\n }\n }\n\n if (missingRoles.length) {\n return { validated: false, failReason: MissingPermissionReason.NotBotStaff, missingRoles };\n }\n }\n\n if (command instanceof BaseInteraction && command.isCommand()) {\n let commandName: string | null = null;\n\n if (command.isChatInputCommand()) {\n const subcommand = command.options.getSubcommand();\n commandName = `${command.commandName}${subcommand ? ` ${subcommand}` : \"\"}`;\n } else {\n commandName = command.commandName;\n }\n\n if (\n !client.config.staff.bypassers.some(\n bypass =>\n bypass.commandName.toLowerCase() === commandName.toLowerCase() && bypass.userIds.includes(user.id)\n )\n ) {\n return { validated: false, failReason: MissingPermissionReason.NotBotStaff };\n }\n }\n\n if (\n typeof command === \"string\" &&\n !client.config.staff.bypassers.some(\n bypass => bypass.commandName.toLowerCase() === command.toLowerCase() && bypass.userIds.includes(user.id)\n )\n ) {\n return { validated: false, failReason: MissingPermissionReason.NotBotStaff };\n }\n }\n\n return { validated: true };\n}\n","import {\n CommandType,\n RateLimitScope,\n BaseCommandParameters,\n BaseCommandConfig,\n CommandInternalRateLimitData\n} from \"@ctypes/command.base\";\nimport {\n CommandMetadata,\n CommandPermissionResults,\n CommandPermissions,\n CommandRateLimitOptions\n} from \"@ctypes/command.options\";\nimport { Guild, GuildMember, TextBasedChannel, User } from \"discord.js\";\nimport { validateCommandPermissions } from \"@validators/permissions.validator\";\nimport { randomUUID } from \"node:crypto\";\nimport { type Vimcord } from \"@/client\";\nimport _ from \"lodash\";\n\nexport abstract class BaseCommandBuilder<T extends CommandType, O extends BaseCommandConfig<T> = BaseCommandConfig<T>> {\n readonly uuid: string = randomUUID();\n readonly commandType: T;\n\n /** Local command configuration and hooks */\n protected options: O;\n\n /** Internal state for rate limiting across different scopes */\n private readonly rlStores = {\n [RateLimitScope.Global]: { executions: 0, timestamp: 0 } as CommandInternalRateLimitData,\n [RateLimitScope.User]: new Map<string, CommandInternalRateLimitData>(),\n [RateLimitScope.Guild]: new Map<string, CommandInternalRateLimitData>(),\n [RateLimitScope.Channel]: new Map<string, CommandInternalRateLimitData>()\n };\n\n /** * Mapping of CommandTypes to their respective config keys in the Vimcord client\n */\n private readonly typeConfigMapping: Record<CommandType, string> = {\n [CommandType.Slash]: \"slashCommands\",\n [CommandType.Prefix]: \"prefixCommands\",\n [CommandType.Context]: \"contextCommands\"\n };\n\n constructor(type: T, options: O = {} as O) {\n this.commandType = type;\n this.options = { enabled: true, ...options };\n }\n\n private validateBaseConfig() {\n if (this.options.rateLimit) {\n const { max, interval } = this.options.rateLimit;\n if (max <= 0 || interval <= 0) {\n throw new Error(`[Vimcord:${this.constructor.name}] Rate limit values must be positive.`);\n }\n }\n }\n\n /**\n * Resolves the final configuration by merging layers:\n * Client Defaults < Client Type-Specific < Local Command Options\n */\n protected resolveConfig(client: Vimcord): O {\n const typeKey = this.typeConfigMapping[this.commandType];\n const typeSpecificGlobals = (client.config as any)?.[typeKey] || {};\n\n return _.merge({}, typeSpecificGlobals, this.options);\n }\n\n /**\n * Executes the command lifecycle.\n * Merges global client config with local command options at runtime.\n */\n async run(client: Vimcord<true>, ...args: BaseCommandParameters<T>): Promise<void> {\n const config = this.resolveConfig(client);\n const ctx = this.extractContext(args);\n\n try {\n // 1. Availability\n if (!config.enabled) {\n return await config.onUsedWhenDisabled?.(...args);\n }\n\n // 2. Rate Limiting\n if (this.isRateLimited(config, ctx)) {\n return await config.onRateLimit?.(...args);\n }\n\n // 3. Permissions\n const perms = this.checkPermissions(client, ctx.member || ctx.user, args[1] as any);\n if (!perms.validated) {\n return await config.onMissingPermissions?.(perms, ...args);\n }\n\n // 4. Custom Conditions\n if (!(await this.checkConditions(config, ...args))) {\n return await config.onConditionsNotMet?.(...args);\n }\n\n // 5. Execution Pipeline\n await config.beforeExecute?.(...args);\n\n if (config.logExecution !== false) {\n // Resolve name based on builder type\n const cmdName = (this.options as any).name || (this as any).builder?.name || \"Unknown\";\n const location = ctx.guild ? `${ctx.guild.name} (${ctx.guild.id})` : \"Direct Messages\";\n\n client.logger.commandExecuted(cmdName, ctx.user.username, location);\n }\n\n const result = await config.execute?.(...args);\n await config.afterExecute?.(result, ...args);\n } catch (error) {\n await this.handleError(error as Error, config, ...args);\n }\n }\n\n /**\n * Internal logic to determine if a command execution should be throttled.\n * @param config The merged configuration to use for limits.\n * @param ctx Extracted Discord context (User, Guild, Channel).\n */\n private isRateLimited(config: BaseCommandConfig<T>, ctx: ReturnType<typeof this.extractContext>): boolean {\n if (!config.rateLimit) return false;\n\n const { scope, interval, max } = config.rateLimit;\n const now = Date.now();\n const key = this.getScopeKey(scope, ctx);\n\n if (scope !== RateLimitScope.Global && !key) return false;\n\n let data: CommandInternalRateLimitData;\n if (scope === RateLimitScope.Global) {\n data = this.rlStores[RateLimitScope.Global];\n } else {\n const store = this.rlStores[scope] as Map<string, CommandInternalRateLimitData>;\n data = store.get(key!) ?? { executions: 0, timestamp: now };\n store.set(key!, data);\n }\n\n if (now - data.timestamp > interval) {\n data.executions = 0;\n data.timestamp = now;\n }\n\n if (data.executions >= max) return true;\n\n data.executions++;\n return false;\n }\n\n /**\n * Validates if the user has required permissions.\n */\n private checkPermissions(client: Vimcord<true>, user: GuildMember | User, target: any): CommandPermissionResults {\n if (!this.options.permissions) return { validated: true };\n return validateCommandPermissions(this.options.permissions, client, user, target);\n }\n\n /**\n * Evaluates all custom conditions defined for the command.\n */\n private async checkConditions(config: BaseCommandConfig<T>, ...args: BaseCommandParameters<T>): Promise<boolean> {\n if (!config.conditions?.length) return true;\n const results = await Promise.all(config.conditions.map(c => c(...args)));\n return results.every(Boolean);\n }\n\n /**\n * Normalizes the trigger arguments into a standard context object.\n */\n private extractContext(args: BaseCommandParameters<T>) {\n const event = args[1] as any;\n return {\n user: (event.user || event.author) as User,\n member: event.member as GuildMember | null,\n guild: event.guild as Guild | null,\n channel: event.channel as TextBasedChannel | null\n };\n }\n\n /**\n * Resolves the storage key based on the RateLimit scope.\n */\n private getScopeKey(scope: RateLimitScope, ctx: ReturnType<typeof this.extractContext>): string | null {\n switch (scope) {\n case RateLimitScope.User:\n return ctx.user.id;\n case RateLimitScope.Guild:\n return ctx.guild?.id ?? null;\n case RateLimitScope.Channel:\n return ctx.channel?.id ?? null;\n default:\n return null;\n }\n }\n\n /**\n * Handles command errors by checking local handlers before falling back to global handlers.\n */\n private async handleError(err: Error, config: BaseCommandConfig<T>, ...args: BaseCommandParameters<T>) {\n if (config.onError) return config.onError(err, ...args);\n throw err;\n }\n\n /** Toggle command availability */\n setEnabled(enabled: boolean): this {\n this.options.enabled = enabled;\n return this;\n }\n\n /** Merge new permission requirements into the existing ones */\n setPermissions(perms: CommandPermissions): this {\n this.options.permissions = _.merge(this.options.permissions || {}, perms);\n return this;\n }\n\n /** Add custom logic checks that run before execution */\n addConditions(...conditions: Array<(...args: BaseCommandParameters<T>) => boolean | Promise<boolean>>): this {\n this.options.conditions = [...(this.options.conditions || []), ...conditions];\n return this;\n }\n\n /** Set the primary command execution logic */\n setExecute(fn: (...args: BaseCommandParameters<T>) => any): this {\n this.options.execute = fn;\n return this;\n }\n\n /** * Set the custom conditions that must be met for this command to execute\n */\n setConditions(conditions: Array<(...args: BaseCommandParameters<T>) => boolean | Promise<boolean>>): this {\n this.options.conditions = conditions;\n return this;\n }\n\n /** * Set the command metadata configuration\n */\n setMetadata(metadata: CommandMetadata): this {\n this.options.metadata = _.merge(this.options.metadata || {}, metadata);\n return this;\n }\n\n /** * Set the rate limiting options for this command\n */\n setRateLimit(options: CommandRateLimitOptions<(...args: BaseCommandParameters<T>) => any>): this {\n this.options.rateLimit = options;\n this.validateBaseConfig();\n return this;\n }\n\n /** * Set whether to log whenever this command is executed\n * @default true\n */\n setLogExecution(log: boolean): this {\n this.options.logExecution = log;\n return this;\n }\n\n /** * Set the function to execute before the main command logic\n */\n setBeforeExecute(callback: (...args: BaseCommandParameters<T>) => any): this {\n this.options.beforeExecute = callback;\n return this;\n }\n\n /** * Set the function to execute after successful command execution\n */\n setAfterExecute(callback: (result: any, ...args: BaseCommandParameters<T>) => any): this {\n this.options.afterExecute = callback;\n return this;\n }\n\n /** * Set the function to execute when the required permissions are not met\n */\n setOnMissingPermissions(callback: (results: CommandPermissionResults, ...args: BaseCommandParameters<T>) => any): this {\n this.options.onMissingPermissions = callback;\n return this;\n }\n\n /** * Set the function to execute when the required conditions are not met\n */\n setOnConditionsNotMet(callback: (...args: BaseCommandParameters<T>) => any): this {\n this.options.onConditionsNotMet = callback;\n return this;\n }\n\n /** * Set the function to execute when this command is used when its disabled\n */\n setOnUsedWhenDisabled(callback: (...args: BaseCommandParameters<T>) => any): this {\n this.options.onUsedWhenDisabled = callback;\n return this;\n }\n\n /** * Set the function to execute when the rate limit is hit\n */\n setOnRateLimit(callback: (...args: BaseCommandParameters<T>) => any): this {\n this.options.onRateLimit = callback;\n return this;\n }\n\n /** * Set a custom error handler for this command\n */\n setOnError(callback: (error: Error, ...args: BaseCommandParameters<T>) => any): this {\n this.options.onError = callback;\n return this;\n }\n}\n","import { BaseAppCommandConfig, BaseCommandConfig, CommandType } from \"@ctypes/command.base\";\nimport { ContextMenuCommandBuilder, ContextMenuCommandInteraction } from \"discord.js\";\nimport { BaseCommandBuilder } from \"@builders/baseCommand.builder\";\nimport { AppCommandDeployment } from \"@ctypes/command.options\";\nimport { type Vimcord } from \"@/client\";\nimport _ from \"lodash\";\n\nexport interface ContextCommandConfig extends BaseCommandConfig<CommandType.Context>, BaseAppCommandConfig {\n builder: ContextMenuCommandBuilder | ((builder: ContextMenuCommandBuilder) => ContextMenuCommandBuilder);\n deferReply?: boolean | { ephemeral?: boolean };\n}\n\nexport class ContextCommandBuilder extends BaseCommandBuilder<CommandType.Context, ContextCommandConfig> {\n public builder!: ContextMenuCommandBuilder;\n\n constructor(config: ContextCommandConfig) {\n super(CommandType.Context, config);\n this.setBuilder(config.builder);\n\n const originalExecute = this.options.execute;\n this.options.execute = async (client, interaction) => {\n return await this.handleExecution(client, interaction, originalExecute);\n };\n }\n\n private async handleExecution(\n client: Vimcord<true>,\n interaction: ContextMenuCommandInteraction,\n originalExecute?: ContextCommandConfig[\"execute\"]\n ) {\n const config = this.resolveConfig(client);\n\n if (config.deferReply && !interaction.replied && !interaction.deferred) {\n await interaction.deferReply(typeof config.deferReply === \"object\" ? config.deferReply : undefined);\n }\n\n return await originalExecute?.(client, interaction);\n }\n\n private validateBuilder() {\n if (!this.builder.name) throw new Error(`[Vimcord] ContextCommandBuilder: Command name is required.`);\n this.builder.toJSON();\n }\n\n // --- Specialized Fluent API ---\n\n setBuilder(builder: ContextCommandConfig[\"builder\"]): this {\n this.builder = typeof builder === \"function\" ? builder(new ContextMenuCommandBuilder()) : builder;\n this.validateBuilder();\n return this;\n }\n\n setDeferReply(defer: ContextCommandConfig[\"deferReply\"]): this {\n this.options.deferReply = defer;\n return this;\n }\n\n setDeployment(deployment: AppCommandDeployment): this {\n this.options.deployment = _.merge(this.options.deployment || {}, deployment);\n return this;\n }\n\n setExecute(fn: ContextCommandConfig[\"execute\"]): this {\n const originalExecute = fn;\n this.options.execute = async (client, interaction) => {\n return await this.handleExecution(client, interaction, originalExecute);\n };\n return this;\n }\n\n toConfig(): ContextCommandConfig {\n return { ...this.options, builder: this.builder };\n }\n}\n","import jsTools from \"jstools\";\nimport path from \"node:path\";\n\nexport function getProcessDir() {\n const mainPath = process.argv[1];\n if (!mainPath) return \"\";\n return path.dirname(mainPath);\n}\n\nexport async function importModulesFromDir<T extends any>(dir: string, fnPrefix?: string) {\n const cwd = getProcessDir();\n const MODULE_RELATIVE_PATH = path.join(cwd, dir);\n const MODULE_LOG_PATH = dir;\n\n /* Search the directory for event modules */\n const files = jsTools\n .readDir(MODULE_RELATIVE_PATH, { recursive: true })\n .filter(\n fn => fn.endsWith(`${fnPrefix ? `.${fnPrefix}` : \"\"}.js`) || fn.endsWith(`${fnPrefix ? `.${fnPrefix}` : \"\"}.ts`)\n );\n\n if (!files.length) {\n return [];\n }\n\n // Import the modules found in the given directory\n const modules = await Promise.all(\n files.map(async fn => {\n let _path = path.join(MODULE_RELATIVE_PATH, fn);\n let _logPath = `./${path.join(MODULE_LOG_PATH, fn)}`;\n\n let _module;\n try {\n delete require.cache[require.resolve(_path)];\n _module = require(_path);\n } catch (err: any) {\n // Log the warning to the console\n console.warn(`Failed to import module at '${_logPath}'`, err);\n _module = null;\n }\n\n return { module: _module, path: _logPath };\n })\n );\n\n /* Filter out modules that failed to import and return */\n const filteredModules = modules.filter(m => m.module) as { module: T; path: string }[];\n\n if (!filteredModules.length) {\n console.warn(`No valid modules were found in directory '${dir}'`);\n }\n\n // Return the filtered modules\n return filteredModules;\n}\n\nexport function getCallerFileName() {\n const stack = new Error().stack?.split(\"\\n\");\n return stack?.at(4)?.split(\"at file\")?.at(1)?.split(\"/\").at(-1)?.split(\":\").at(0)?.split(\".\").at(0);\n}\n","import { EventDeployment, EventMetadata, EventRateLimitOptions } from \"@ctypes/event.options\";\nimport { EventParameters } from \"@ctypes/event.helpers\";\nimport { EventConfig } from \"@ctypes/event.base\";\nimport { getCallerFileName } from \"@utils/dir\";\nimport { ClientEvents } from \"discord.js\";\nimport { randomUUID } from \"node:crypto\";\nimport _ from \"lodash\";\n\nexport class EventBuilder<T extends keyof ClientEvents = keyof ClientEvents> implements EventConfig<T> {\n readonly uuid: string = randomUUID();\n\n event: T;\n name: string = getCallerFileName() || this.uuid;\n enabled;\n once;\n priority;\n conditions;\n metadata;\n deployment;\n rateLimit;\n beforeExecute;\n execute;\n afterExecute;\n onError;\n\n private rateLimitData: { executions: number; timestamp: number } = { executions: 0, timestamp: 0 };\n\n static create<T extends keyof ClientEvents>(event: T, name?: string): EventBuilder<T> {\n return new EventBuilder<T>({ event, name });\n }\n\n constructor(config: EventConfig<T>) {\n this.event = config.event;\n this.name = config.name || this.name;\n this.enabled = config.enabled ?? true;\n this.once = config.once ?? false;\n this.priority = config.priority ?? 0;\n this.conditions = config.conditions;\n this.metadata = config.metadata;\n this.deployment = config.deployment;\n this.rateLimit = config.rateLimit;\n this.beforeExecute = config.beforeExecute;\n this.execute = config.execute;\n this.afterExecute = config.afterExecute;\n this.onError = config.onError;\n\n this.validate();\n }\n\n validate() {\n // Validate event name\n if (!this.event) {\n throw new Error(\"Event name is required\");\n }\n\n // Validate priority\n if (this.priority !== undefined && this.priority < 0) {\n throw new Error(\"Priority must be non-negative\");\n }\n\n // Validate rateLimit\n if (this.rateLimit) {\n if (this.rateLimit.max <= 0) {\n throw new Error(\"Rate limit max must be greater than 0\");\n }\n if (this.rateLimit.interval <= 0) {\n throw new Error(\"Rate limit interval must be greater than 0\");\n }\n }\n\n // Validate that at least execute is provided\n if (!this.execute) {\n throw new Error(\"Execute function is required\");\n }\n }\n\n clone(): EventBuilder<T> {\n return new EventBuilder<T>(this.toConfig());\n }\n\n toConfig(): EventConfig<T> {\n return {\n event: this.event,\n name: this.name,\n enabled: this.enabled,\n once: this.once,\n priority: this.priority,\n conditions: this.conditions,\n metadata: this.metadata,\n deployment: this.deployment,\n rateLimit: this.rateLimit,\n beforeExecute: this.beforeExecute,\n execute: this.execute,\n afterExecute: this.afterExecute,\n onError: this.onError\n };\n }\n\n setEvent(event: T): this {\n this.event = event;\n return this;\n }\n\n setName(name: string): this {\n this.name = name;\n return this;\n }\n\n setEnabled(enabled: boolean): this {\n this.enabled = enabled;\n return this;\n }\n\n enable(): this {\n return this.setEnabled(true);\n }\n\n disable(): this {\n return this.setEnabled(false);\n }\n\n setOnce(once: boolean = true): this {\n this.once = once;\n return this;\n }\n\n setPriority(priority: number): this {\n this.priority = priority;\n return this;\n }\n\n addCondition(condition: (...args: EventParameters<T>) => boolean): this {\n if (!this.conditions) this.conditions = [];\n this.conditions.push(condition);\n return this;\n }\n\n setConditions(conditions: Array<(...args: EventParameters<T>) => boolean>): this {\n this.conditions = conditions;\n return this;\n }\n\n setMetadata(metadata: EventMetadata): this {\n this.metadata = _.merge(this.metadata, metadata);\n return this;\n }\n\n setDeployment(deployment: EventDeployment): this {\n this.deployment = _.merge(this.deployment, deployment);\n return this;\n }\n\n setRateLimit(options: EventRateLimitOptions<T>): this {\n this.rateLimit = options;\n return this;\n }\n\n setBeforeExecute(beforeExecute: (...args: EventParameters<T>) => Promise<any> | any): this {\n this.beforeExecute = beforeExecute;\n return this;\n }\n\n setExecute(execute: (...args: EventParameters<T>) => Promise<any> | any): this {\n this.execute = execute;\n return this;\n }\n\n setAfterExecute(afterExecute: (result: any, ...args: EventParameters<T>) => Promise<any> | any): this {\n this.afterExecute = afterExecute;\n return this;\n }\n\n setOnError(onError: (error: Error, ...args: EventParameters<T>) => Promise<any> | any): this {\n this.onError = onError;\n return this;\n }\n\n getRateLimitInfo(): { executions: number; timestamp: number; isLimited: boolean } | null {\n if (!this.rateLimit) return null;\n return { ...this.rateLimitData, isLimited: this.isRateLimited(false) };\n }\n\n resetRateLimit(): this {\n this.rateLimitData = { executions: 0, timestamp: 0 };\n return this;\n }\n\n isRateLimited(updateExecutions: boolean = true): boolean {\n if (!this.rateLimit) return false;\n\n const now = Date.now();\n\n // Reset if interval has passed\n if (now - this.rateLimitData.timestamp >= this.rateLimit.interval) {\n this.rateLimitData.executions = 0;\n this.rateLimitData.timestamp = now;\n }\n\n if (updateExecutions) {\n this.rateLimitData.executions++;\n }\n\n return this.rateLimitData.executions >= this.rateLimit.max;\n }\n\n async checkConditions(...args: EventParameters<T>): Promise<boolean> {\n if (!this.conditions?.length) return true;\n\n const results = await Promise.all(this.conditions.map(condition => condition(...args)));\n return results.every(Boolean);\n }\n\n async executeEvent(...args: EventParameters<T>): Promise<any> {\n try {\n // Check if event is enabled\n if (!this.enabled) {\n // TODO: Implement disabled console error\n return;\n }\n\n // Check rate limits\n if (this.isRateLimited()) {\n if (this.rateLimit?.onRateLimit) {\n return await this.rateLimit.onRateLimit(...args);\n }\n // TODO: Implement rate-limited console error\n return;\n }\n\n // Check conditions\n if (!(await this.checkConditions(...args))) {\n // TODO: Implement missing conditions console error\n return;\n }\n\n // Execute beforeExecute hook\n if (this.beforeExecute) {\n await this.beforeExecute(...args);\n }\n\n // Execute main event\n const result = await this.execute?.(...args);\n\n // Execute afterExecute hook\n if (this.afterExecute) {\n await this.afterExecute(result, ...args);\n }\n\n return result;\n } catch (err) {\n if (this.onError) {\n return await this.onError(err as Error, ...args);\n }\n\n // Log error if no custom handler\n console.error(`Error in event '${this.name}':`, err);\n throw err;\n }\n }\n}\n","import { BaseCommandConfig, CommandType } from \"@ctypes/command.base\";\nimport { BaseCommandBuilder } from \"@builders/baseCommand.builder\";\nimport { Message } from \"discord.js\";\nimport { type Vimcord } from \"@/client\";\n\n/**\n * Configuration specific to Prefix-based commands\n */\nexport interface PrefixCommandConfig extends BaseCommandConfig<CommandType.Prefix> {\n /** The primary name of the command */\n name: string;\n /** Alternative triggers for this command */\n aliases?: string[];\n /** A brief explanation of what the command does */\n description?: string;\n}\n\nexport class PrefixCommandBuilder extends BaseCommandBuilder<CommandType.Prefix, PrefixCommandConfig> {\n constructor(config: PrefixCommandConfig) {\n super(CommandType.Prefix, config);\n\n // Standardize the wrapping pattern:\n // We capture the original execute and wrap it with prefix-specific logic\n const originalExecute = this.options.execute;\n this.options.execute = async (client, message) => {\n return await this.handleExecution(client, message, originalExecute);\n };\n\n this.validatePrefixConfig();\n }\n\n /**\n * Specialized execution logic for Prefix Commands.\n */\n private async handleExecution(\n client: Vimcord<true>,\n message: Message,\n originalExecute?: PrefixCommandConfig[\"execute\"]\n ) {\n // Future hooks for prefix commands (like auto-parsing args) go here\n return await originalExecute?.(client, message);\n }\n\n private validatePrefixConfig() {\n if (!this.options.name) {\n throw new Error(`[Vimcord] PrefixCommandBuilder: Command name is required.`);\n }\n }\n\n // --- Fluent API (Prefix Specific Only) ---\n\n /**\n * Set the primary name of the command.\n */\n setName(name: string): this {\n this.options.name = name;\n return this;\n }\n\n /**\n * Set or replace the command aliases.\n */\n setAliases(aliases: string[]): this {\n this.options.aliases = aliases;\n return this;\n }\n\n /**\n * Add additional aliases without clearing existing ones.\n */\n addAliases(...aliases: string[]): this {\n this.options.aliases = [...(this.options.aliases || []), ...aliases];\n return this;\n }\n\n /**\n * Set the command description.\n */\n setDescription(description: string): this {\n this.options.description = description;\n return this;\n }\n\n // --- Overrides ---\n\n /**\n * Override setExecute to ensure handleExecution remains the entry point.\n * This is the only base method we need to redefine.\n */\n setExecute(fn: PrefixCommandConfig[\"execute\"]): this {\n const originalExecute = fn;\n this.options.execute = async (client, message) => {\n return await this.handleExecution(client, message, originalExecute);\n };\n return this;\n }\n\n /**\n * Converts the current builder state back into a config object.\n */\n toConfig(): PrefixCommandConfig {\n return {\n ...this.options\n };\n }\n}\n","import { BaseAppCommandConfig, BaseCommandConfig, CommandType } from \"@ctypes/command.base\";\nimport { ChatInputCommandInteraction, SlashCommandBuilder as DJSSlashCommandBuilder } from \"discord.js\";\nimport { AnySlashCommandBuilder, AppCommandDeployment } from \"@ctypes/command.options\";\nimport { BaseCommandBuilder } from \"@builders/baseCommand.builder\";\nimport { type Vimcord } from \"@/client\";\nimport _ from \"lodash\";\n\nexport interface SlashCommandConfig extends BaseCommandConfig<CommandType.Slash>, BaseAppCommandConfig {\n builder: AnySlashCommandBuilder | ((builder: DJSSlashCommandBuilder) => AnySlashCommandBuilder);\n deferReply?: boolean | { ephemeral?: boolean };\n routes?: Array<{ name: string; handler: (client: Vimcord<true>, interaction: ChatInputCommandInteraction) => any }>;\n onUnknownRouteHandler?: (client: Vimcord<true>, interaction: ChatInputCommandInteraction) => any;\n}\n\nexport class SlashCommandBuilder extends BaseCommandBuilder<CommandType.Slash, SlashCommandConfig> {\n public builder!: AnySlashCommandBuilder;\n private readonly routes: Map<string, (client: Vimcord<true>, interaction: ChatInputCommandInteraction) => any> =\n new Map();\n\n constructor(config: SlashCommandConfig) {\n super(CommandType.Slash, config);\n this.setBuilder(config.builder);\n if (config.routes) this.addRoutes(...config.routes);\n\n const originalExecute = this.options.execute;\n this.options.execute = async (client, interaction) => {\n return await this.handleExecution(client, interaction, originalExecute);\n };\n }\n\n private async handleExecution(\n client: Vimcord<true>,\n interaction: ChatInputCommandInteraction,\n originalExecute?: SlashCommandConfig[\"execute\"]\n ) {\n const config = this.resolveConfig(client);\n\n if (config.deferReply && !interaction.replied && !interaction.deferred) {\n await interaction.deferReply(typeof config.deferReply === \"object\" ? config.deferReply : undefined);\n }\n\n const subCommand = interaction.options.getSubcommand(false);\n if (subCommand) {\n const handler = this.routes.get(subCommand.toLowerCase());\n if (handler) return await handler(client, interaction);\n if (config.onUnknownRouteHandler) return await config.onUnknownRouteHandler(client, interaction);\n }\n\n return await originalExecute?.(client, interaction);\n }\n\n private validateBuilder() {\n if (!this.builder.name) throw new Error(`[Vimcord] SlashCommandBuilder: Command name is required.`);\n if (!this.builder.description) throw new Error(`[Vimcord] SlashCommandBuilder: Command description is required.`);\n this.builder.toJSON();\n }\n\n // --- Specialized Fluent API ---\n\n setBuilder(builder: SlashCommandConfig[\"builder\"]): this {\n this.builder = typeof builder === \"function\" ? builder(new DJSSlashCommandBuilder()) : builder;\n this.validateBuilder();\n return this;\n }\n\n setDeferReply(defer: SlashCommandConfig[\"deferReply\"]): this {\n this.options.deferReply = defer;\n return this;\n }\n\n setDeployment(deployment: AppCommandDeployment): this {\n this.options.deployment = _.merge(this.options.deployment || {}, deployment);\n return this;\n }\n\n setRoutes(...routes: NonNullable<SlashCommandConfig[\"routes\"]>): this {\n this.routes.clear();\n this.addRoutes(...routes);\n return this;\n }\n\n addRoutes(...routes: NonNullable<SlashCommandConfig[\"routes\"]>): this {\n if (!this.options.routes) this.options.routes = [];\n for (const route of routes) {\n const name = route.name.toLowerCase();\n this.routes.set(name, route.handler);\n const existingIndex = this.options.routes.findIndex(r => r.name.toLowerCase() === name);\n if (existingIndex > -1) this.options.routes[existingIndex] = route;\n else this.options.routes.push(route);\n }\n return this;\n }\n\n setUnknownRouteHandler(handler: SlashCommandConfig[\"onUnknownRouteHandler\"]): this {\n this.options.onUnknownRouteHandler = handler;\n return this;\n }\n\n setExecute(fn: SlashCommandConfig[\"execute\"]): this {\n const originalExecute = fn;\n this.options.execute = async (client, interaction) => {\n return await this.handleExecution(client, interaction, originalExecute);\n };\n return this;\n }\n\n toConfig(): SlashCommandConfig {\n return {\n ...this.options,\n builder: this.builder,\n routes: Array.from(this.routes.entries()).map(([name, handler]) => ({ name, handler }))\n };\n }\n}\n","import { Client, ClientOptions, Guild, User, userMention } from \"discord.js\";\nimport dotEnv, { DotenvConfigOptions } from \"dotenv\";\n\nimport { VimcordDatabaseManager } from \"@ctypes/database\";\nimport { PartialDeep } from \"type-fest\";\n\nimport { globalVimcordToolsConfig } from \"@configs/tools.config\";\nimport { createVimcordAppConfig, VimcordAppConfig } from \"@/configs/app.config\";\nimport { createVimcordStaffConfig, VimcordStaffConfig } from \"@configs/staff.config\";\nimport { createVimcordSlashCommandConfig, VimcordSlashCommandConfig } from \"@configs/slashCommand.config\";\nimport { createVimcordPrefixCommandConfig, VimcordPrefixCommandConfig } from \"@configs/prefixCommand.config\";\nimport { createVimcordContextCommandConfig, VimcordContextCommandConfig } from \"@configs/contextCommand.config\";\n\nimport { VimcordStatusManager } from \"./modules/status.manager\";\nimport { VimcordCommandManager } from \"@modules/command.manager\";\nimport { VimcordEventManager } from \"@modules/event.manager\";\nimport { EventBuilder } from \"@builders/event.builder\";\n\nimport { sendCommandErrorEmbed } from \"./utils/sendCommandErrorEmbed\";\nimport { retryExponentialBackoff } from \"@utils/async\";\nimport { fetchGuild, fetchUser } from \"./tools/utils\";\nimport { BetterEmbed } from \"./tools/BetterEmbed\";\nimport { version } from \"../package.json\";\nimport { randomUUID } from \"node:crypto\";\nimport { Logger } from \"./tools/Logger\";\nimport chalk from \"chalk\";\n\nexport interface CommandErrorMessageConfig {\n /** Use a custom embed */\n embed?: (embed: BetterEmbed, error: Error, guild: Guild | null | undefined) => BetterEmbed;\n /** @default config.staff.mainServer.inviteUrl */\n inviteUrl?: string;\n /** The support server invite button label @default \"Support Server\" */\n inviteButtonLabel?: string;\n /** The error details button label @default \"Details\" */\n detailButtonLabel?: string;\n /** @default 30_000 // 30 seconds */\n detailButtonIdleTimeout?: number;\n /** Should the message be ephemeral? */\n ephemeral?: boolean;\n /** Should the message be deleted after a certain amount of time? */\n deleteAfter?: number;\n}\n\nexport interface VimcordFeatures {\n /** Use global process error handlers @defaultValue `false` */\n useGlobalErrorHandlers?: boolean;\n /** Use our default prefix command handler @defaultValue `true` */\n useDefaultPrefixCommandHandler?: boolean;\n /** Use our default slash command handler @defaultValue `true` */\n useDefaultSlashCommandHandler?: boolean;\n /** Use our default context command handler @defaultValue `true` */\n useDefaultContextCommandHandler?: boolean;\n\n /** Reply to the user with an Uh-oh! embed when a command fails. If not using our default command handlers, you will have to implement this yourself using {@link sendCommandErrorEmbed}\n * @example\n * ```ts\n * try {\n * // Execute the command\n * return command.executeCommand(client, message);\n * } catch (err) {\n * // Send the error embed, this already handles the feature configuration\n * sendCommandErrorEmbed(client, err as Error, message.guild, message);\n * // Re-throw the error so it can be handled by an error handler\n * throw err;\n * }\n * ``` */\n enableCommandErrorMessage?: boolean | CommandErrorMessageConfig;\n\n /** Update the state of {@link globalVimcordToolsConfig.devMode} whenever {@link VimcordAppConfig.devMode} is updated in the client. This is mainly useful for {@link BetterEmbed} to switch between devMode and production colors during runtime without having to update the global config manually @defaultValue `false` */\n hookToolsDevMode?: boolean;\n\n /** Setup and configure `dotenv` @defaultValue `false` */\n useEnv?: boolean | DotenvConfigOptions;\n\n /** The maximum number of attempts to log into Discord @defaultValue `3` */\n loginAttempts?: number;\n\n /** Import modules from directories */\n importModules?: {\n events?: string | string[];\n slashCommands?: string | string[];\n prefixCommands?: string | string[];\n contextCommands?: string | string[];\n };\n}\n\nexport interface VimcordConfig {\n app: VimcordAppConfig;\n staff: VimcordStaffConfig;\n slashCommands: VimcordSlashCommandConfig;\n prefixCommands: VimcordPrefixCommandConfig;\n contextCommands: VimcordContextCommandConfig;\n}\n\nexport const clientInstances: Vimcord[] = [];\n\nexport class Vimcord<Ready extends boolean = boolean> extends Client<Ready> {\n readonly uuid: string = randomUUID();\n readonly index: number = clientInstances.length;\n\n readonly clientOptions: ClientOptions;\n readonly features: VimcordFeatures;\n readonly config: VimcordConfig;\n\n status: VimcordStatusManager;\n events: VimcordEventManager;\n commands: VimcordCommandManager;\n database?: VimcordDatabaseManager;\n\n // Configure custom logger\n logger = new Logger({ prefixEmoji: \"⚡\", prefix: `vimcord (i${this.index})` }).extend({\n clientBanner(client: Vimcord) {\n if (client.config.app.disableBanner) return;\n\n const border = \"═\".repeat(50);\n console.log(chalk.hex(this.colors.primary)(`\\n╔${border}╗`));\n console.log(\n chalk.hex(this.colors.primary)(\"║\") +\n chalk.bold.hex(this.colors.text)(\n ` 🚀 ${client.config.app.name} v${client.config.app.appVersion}`.padEnd(\n 50 - (client.config.app.devMode ? 12 : 0)\n )\n ) +\n chalk.hex(this.colors.primary)(\n `${client.config.app.devMode ? chalk.hex(this.colors.warn)(\"devMode ⚠️ \") : \"\"}║`\n )\n );\n\n console.log(chalk.hex(this.colors.primary)(`║${\"\".padEnd(50)}║`));\n\n console.log(\n chalk.hex(this.colors.primary)(\"║\") +\n chalk.hex(this.colors.muted)(\n ` # Powered by Vimcord v${version}`.padEnd(50 - 3 - `${client.index}`.length)\n ) +\n chalk.hex(this.colors.primary)(`${chalk.hex(this.colors.muted)(`i${client.index}`)} ║`)\n );\n console.log(chalk.hex(this.colors.primary)(`╚${border}╝\\n`));\n },\n\n clientReady(clientTag: string, guildCount: number) {\n console.log(\n this.formatTimestamp(),\n this.formatPrefix(),\n chalk.hex(this.colors.success)(\"🤖 READY\"),\n chalk.white(`Connected as ${chalk.bold.hex(this.colors.primary)(clientTag)}`),\n chalk.hex(this.colors.muted)(`• ${guildCount} guilds`)\n );\n },\n\n moduleLoaded(moduleName: string, count?: number, ignoredCount?: number): void {\n const countText = count ? chalk.hex(this.colors.muted)(`(${count} items)`) : \"\";\n console.log(\n this.formatTimestamp(),\n this.formatPrefix(),\n chalk.hex(\"#9B59B6\")(\"📦 MODULE\"),\n chalk.hex(this.colors.warn)(`${moduleName} loaded`),\n ignoredCount ? chalk.hex(this.colors.muted)(`(${ignoredCount} ignored)`) : \"\",\n countText\n );\n },\n\n commandExecuted(commandName: string, username: string, guildName?: string) {\n const location = guildName ? `in ${chalk.hex(this.colors.muted)(guildName)}` : \"in DMs\";\n console.log(\n this.formatTimestamp(),\n this.formatPrefix(),\n chalk.hex(\"#87CEEB\")(\"📝 COMMAND\"),\n chalk.hex(this.colors.warn)(`/${commandName}`),\n chalk.white(`used by ${chalk.bold(username)}`),\n chalk.hex(this.colors.muted)(location)\n );\n },\n\n database(action: string, details?: string) {\n console.log(\n this.formatTimestamp(),\n this.formatPrefix(),\n chalk.hex(\"#FF6B9D\")(\"🗄️ DATABASE\"),\n chalk.white(action),\n details ? chalk.hex(this.colors.muted)(details) : \"\"\n );\n }\n });\n\n private clientStartingPromise: Promise<string | null> | null = null;\n\n constructor(options: ClientOptions, features: VimcordFeatures = {}, config: PartialDeep<VimcordConfig> = {}) {\n super(options);\n\n this.clientOptions = options;\n this.features = features;\n\n this.config = {\n app: createVimcordAppConfig(config.app),\n staff: createVimcordStaffConfig(config.staff),\n slashCommands: createVimcordSlashCommandConfig(config.slashCommands),\n prefixCommands: createVimcordPrefixCommandConfig(config.prefixCommands),\n contextCommands: createVimcordContextCommandConfig(config.contextCommands)\n };\n\n // Configure the status manager\n this.status = new VimcordStatusManager(this);\n // Configure the event manager\n this.events = new VimcordEventManager(this);\n // Configure the command manager\n this.commands = new VimcordCommandManager(this);\n\n /* - - - - - { Features } - - - - - */\n if (this.features.useEnv) {\n if (typeof this.features.useEnv === \"object\") {\n dotEnv.config({ quiet: true, ...this.features.useEnv });\n } else {\n dotEnv.config({ quiet: true });\n }\n }\n\n // Configure default error handlers\n if (this.features.useGlobalErrorHandlers) {\n process.on(\"uncaughtException\", err => this.logger.error(\"Uncaught Exception\", err));\n process.on(\"unhandledRejection\", err => this.logger.error(\"Unhandled Rejection\", err as Error));\n process.on(\"exit\", code => this.logger.debug(`Process exited with code ${code}`));\n this.on(\"error\", err => this.logger.error(\"Client Error\", err));\n this.on(\"shardError\", err => this.logger.error(\"Client Shard Error\", err));\n }\n\n /* - - - - - { Client } - - - - - */\n this.logger.clientBanner(this);\n\n // Handle client ready\n this.once(\"clientReady\", client => {\n this.logger.clientReady(client.user.tag, client.guilds.cache.size);\n });\n\n // Add to global instances\n clientInstances.push(this);\n }\n\n /** Returns the options, features, and config of this client */\n toJSON() {\n return {\n options: this.clientOptions,\n features: this.features,\n config: this.config\n };\n }\n\n /** Make a clone of this client */\n clone() {\n const { options, features, config } = this.toJSON();\n return new Vimcord(options, features, config);\n }\n\n configureApp(options: PartialDeep<VimcordAppConfig> = {}) {\n this.config.app = createVimcordAppConfig(options);\n if (this.features.hookToolsDevMode) {\n globalVimcordToolsConfig.devMode = this.config.app.devMode;\n }\n return this;\n }\n\n configureStaff(options: PartialDeep<VimcordStaffConfig> = {}) {\n this.config.staff = createVimcordStaffConfig(options);\n return this;\n }\n\n configureSlashCommands(options: PartialDeep<VimcordSlashCommandConfig>) {\n this.config.slashCommands = createVimcordSlashCommandConfig(options);\n return this;\n }\n\n configurePrefixCommands(options: PartialDeep<VimcordPrefixCommandConfig>) {\n this.config.prefixCommands = createVimcordPrefixCommandConfig(options);\n return this;\n }\n\n configureContextCommands(options: PartialDeep<VimcordContextCommandConfig>) {\n this.config.contextCommands = createVimcordContextCommandConfig(options);\n return this;\n }\n\n async addEventModules(dir: string | string[], replaceAll?: boolean) {\n await this.events.importFrom(dir, replaceAll);\n return this;\n }\n\n async addSlashCommandModules(dir: string | string[], replaceAll?: boolean) {\n await this.commands.slash.importFrom(dir, replaceAll);\n return this;\n }\n\n async addPrefixCommandModules(dir: string | string[], replaceAll?: boolean) {\n await this.commands.prefix.importFrom(dir, replaceAll);\n return this;\n }\n\n async addContextCommandModules(dir: string | string[], replaceAll?: boolean) {\n await this.commands.context.importFrom(dir, replaceAll);\n return this;\n }\n\n async useDatabase(database: VimcordDatabaseManager): Promise<boolean> {\n this.database = database;\n this.logger.database(\"Using\", database.name);\n return this.database.connect();\n }\n\n async whenReady(): Promise<Vimcord<true>> {\n if (this.isReady()) return this as Vimcord<true>;\n\n return new Promise((resolve, reject) => {\n // Force timeout after 45 seconds\n const timeout = setTimeout(() => reject(new Error(\"Client is not ready\")), 45_000);\n\n this.once(\"clientReady\", () => {\n clearTimeout(timeout);\n resolve(this as Vimcord<true>);\n });\n });\n }\n\n async build() {\n /* Ensure updated configuration */\n this.configureApp(this.config.app);\n this.configureStaff(this.config.staff);\n this.configureSlashCommands(this.config.slashCommands);\n this.configurePrefixCommands(this.config.prefixCommands);\n this.configureContextCommands(this.config.contextCommands);\n\n // Automatically import external modules\n if (this.features.importModules) {\n const importModules = this.features.importModules;\n\n await Promise.all([\n importModules.events && this.addEventModules(importModules.events),\n importModules.slashCommands && this.addSlashCommandModules(importModules.slashCommands),\n importModules.prefixCommands && this.addPrefixCommandModules(importModules.prefixCommands),\n importModules.contextCommands && this.addContextCommandModules(importModules.contextCommands)\n ]);\n }\n\n // Configure default slash command handler\n if (this.features.useDefaultSlashCommandHandler) {\n this.events.register(defaultSlashCommandHandler);\n }\n\n // Configure default prefix command handler\n if (this.features.useDefaultPrefixCommandHandler) {\n this.events.register(defaultPrefixCommandHandler);\n }\n\n // Configure default context command handler\n if (this.features.useDefaultContextCommandHandler) {\n this.events.register(defaultContextCommandHandler);\n }\n\n return this;\n }\n\n /** Automatically uses `process.env.TOKEN` or `process.env.TOKEN_DEV` if token isn't provided */\n async start(token?: string): Promise<string | null>;\n async start(preHook?: (client: Vimcord) => any): Promise<string | null>;\n async start(token?: string, preHook?: (client: Vimcord) => any): Promise<string | null>;\n async start(\n tokenOrPreHook?: string | ((client: Vimcord) => any),\n preHook?: (client: Vimcord) => any\n ): Promise<string | null> {\n if (this.clientStartingPromise) return this.clientStartingPromise;\n\n const main = async () => {\n let token = typeof tokenOrPreHook === \"string\" ? tokenOrPreHook : undefined;\n token ??= this.config.app.devMode ? process.env.TOKEN_DEV : process.env.TOKEN;\n\n if (!token) {\n throw new Error(\n `TOKEN Missing: ${this.config.app.devMode ? \"devMode is enabled, but TOKEN_DEV is not set\" : \"TOKEN not set\"}`\n );\n }\n\n // Build the client\n await this.build();\n\n try {\n // Run the pre-hook\n if (typeof tokenOrPreHook === \"function\") {\n await tokenOrPreHook(this);\n } else {\n await preHook?.(this as Vimcord<true>);\n }\n\n const stopLoader = this.logger.loader(\"Connecting to Discord...\");\n const loginResult = await retryExponentialBackoff(\n () => super.login(token),\n this.features.loginAttempts ?? 3,\n 1_000\n );\n stopLoader(\"Connected to Discord \");\n this.config.app.verbose && this.logger.debug(\"⏳ Waiting for ready...\");\n return loginResult;\n } catch (err) {\n this.logger.error(\n `Failed to log into Discord after ${this.features.loginAttempts} attempt(s))`,\n err as Error\n );\n return null;\n } finally {\n this.clientStartingPromise = null;\n }\n };\n\n this.clientStartingPromise = main();\n return this.clientStartingPromise;\n }\n\n async kill() {\n await super.destroy();\n const idx = clientInstances.indexOf(this);\n if (idx >= 0) clientInstances.splice(idx, 1);\n this.logger.debug(\"🚪 Logged out of Discord\");\n }\n\n /** Shortcut for {@link fetchUser tools.fetchUser} */\n async fetchUser(id: string | undefined | null): Promise<User | null> {\n const client = await this.whenReady();\n return fetchUser(client, id);\n }\n\n /** Shortcut for {@link fetchGuild tools.fetchGuild} */\n async fetchGuild(id: string | undefined | null): Promise<Guild | null> {\n const client = await this.whenReady();\n return fetchGuild(client, id);\n }\n}\n\nconst defaultPrefixCommandHandler = new EventBuilder({\n event: \"messageCreate\",\n name: \"PrefixCommandHandler\",\n async execute(client, message) {\n if (message.author.bot || !message.guild) return;\n\n const config = client.config.prefixCommands;\n\n // 1. Resolve the active prefix for this guild\n let activePrefix = config.defaultPrefix;\n\n if (config.guildPrefixResolver) {\n try {\n const customPrefix = await config.guildPrefixResolver(client, message.guild.id);\n if (customPrefix) activePrefix = customPrefix;\n } catch (err) {\n client.logger.error(`Error in guildPrefixResolver for guild ${message.guild.id}:`, err as Error);\n // Fallback to defaultPrefix on error\n }\n }\n\n let prefixUsed: string | undefined;\n\n // 2. Determine if a valid prefix was used (Custom/Default vs Mention)\n if (message.content.startsWith(activePrefix)) {\n prefixUsed = activePrefix;\n } else if (config.allowMentionAsPrefix) {\n const mention = userMention(client.user.id);\n if (message.content.startsWith(mention)) {\n prefixUsed = message.content.startsWith(`${mention} `) ? `${mention} ` : mention;\n }\n }\n\n if (!prefixUsed) return;\n\n // 3. Extract trigger and raw arguments\n const contentWithoutPrefix = message.content.slice(prefixUsed.length).trim();\n const args = contentWithoutPrefix.split(/\\s+/);\n const trigger = args.shift();\n\n if (!trigger) return;\n\n // 4. Resolve the builder\n const command = client.commands.prefix.resolve(trigger);\n if (!command) return;\n\n // 5. Cleanup content and Run\n message.content = args.join(\" \");\n\n try {\n return await command.run(client, client, message);\n } catch (err) {\n await sendCommandErrorEmbed(client, err as Error, message.guild, message);\n throw err;\n }\n }\n});\n\nconst defaultSlashCommandHandler = new EventBuilder({\n event: \"interactionCreate\",\n name: \"SlashCommandHandler\",\n async execute(client, interaction) {\n // 1. Ensure it's a Chat Input (Slash) command\n if (!interaction.isChatInputCommand()) return;\n\n // 2. Fetch the builder from our refactored manager\n const command = client.commands.slash.get(interaction.commandName);\n\n // 3. Handle unknown commands\n if (!command) {\n const content = `**/\\`${interaction.commandName}\\`** is not a registered command.`;\n\n // Safety check: if the interaction was somehow already deferred/replied\n if (interaction.replied || interaction.deferred) {\n return interaction.followUp({ content, flags: \"Ephemeral\" });\n }\n return interaction.reply({ content, flags: \"Ephemeral\" });\n }\n\n try {\n return await command.run(client, client, interaction);\n } catch (err) {\n await sendCommandErrorEmbed(client, err as Error, interaction.guild, interaction);\n throw err;\n }\n }\n});\n\nconst defaultContextCommandHandler = new EventBuilder({\n event: \"interactionCreate\",\n name: \"ContextCommandHandler\",\n async execute(client, interaction) {\n // 1. Ensure it is a Context Menu interaction (User or Message)\n if (!interaction.isContextMenuCommand()) return;\n\n // 2. Resolve the builder from our Context Manager\n const command = client.commands.context.get(interaction.commandName);\n\n // 3. Handle unknown context commands\n if (!command) {\n const content = `**${interaction.commandName}** is not a registered context command.`;\n\n // Standard safety check for deferred/replied states\n if (interaction.replied || interaction.deferred) {\n return interaction.followUp({ content, flags: \"Ephemeral\" });\n }\n return interaction.reply({ content, flags: \"Ephemeral\" });\n }\n\n try {\n return await command.run(client, client, interaction);\n } catch (err) {\n await sendCommandErrorEmbed(client, err as Error, interaction.guild, interaction);\n throw err;\n }\n }\n});\n","import { ColorResolvable } from \"discord.js\";\nimport { PartialDeep } from \"type-fest\";\nimport _ from \"lodash\";\n\nexport interface VimcordToolsConfig {\n devMode: boolean;\n\n embedColor: ColorResolvable[];\n embedColorDev: ColorResolvable[];\n\n timeouts: {\n collectorTimeout: number;\n collectorIdle: number;\n pagination: number;\n prompt: number;\n modalSubmit: number;\n };\n\n collector: {\n notAParticipantMessage: string;\n userLockMessage: string;\n notAParticipantWarningCooldown: number;\n };\n\n paginator: {\n notAParticipantMessage: string;\n\n jumpableThreshold: number;\n longThreshold: number;\n\n buttons: Record<\n \"first\" | \"back\" | \"jump\" | \"next\" | \"last\",\n { label: string; emoji: { animated?: boolean; name: string; id: string } }\n >;\n };\n\n prompt: {\n defaultTitle: string;\n defaultDescription: string;\n confirmLabel: string;\n rejectLabel: string;\n };\n}\n\nexport const globalVimcordToolsConfig: VimcordToolsConfig = {\n devMode: false,\n\n embedColor: [],\n embedColorDev: [],\n\n timeouts: {\n collectorTimeout: 60_000,\n collectorIdle: 60_000,\n pagination: 60_000,\n prompt: 30_000,\n modalSubmit: 60_000\n },\n\n collector: {\n notAParticipantMessage: \"You are not allowed to use this.\",\n userLockMessage: \"Please wait until your current action is finished.\",\n notAParticipantWarningCooldown: 5_000\n },\n\n paginator: {\n notAParticipantMessage: \"You are not allowed to use this.\",\n\n jumpableThreshold: 5,\n longThreshold: 4,\n\n buttons: {\n first: { label: \"◀◀\", emoji: { name: \"⏮️\", id: \"⏮️\" } },\n back: { label: \"◀\", emoji: { name: \"◀️\", id: \"◀️\" } },\n jump: { label: \"📄\", emoji: { name: \"📄\", id: \"📄\" } },\n next: { label: \"▶\", emoji: { name: \"▶️\", id: \"▶️\" } },\n last: { label: \"▶▶\", emoji: { name: \"⏭️\", id: \"⏭️\" } }\n }\n },\n\n prompt: {\n defaultTitle: \"Are you sure?\",\n defaultDescription: \"Make sure you know what you're doing.\",\n confirmLabel: \"Confirm\",\n rejectLabel: \"Cancel\"\n }\n};\n\nexport function defineGlobalToolsConfig(options: PartialDeep<VimcordToolsConfig>) {\n Object.assign(globalVimcordToolsConfig, _.merge(globalVimcordToolsConfig, options));\n}\n\nexport function createToolsConfig(options?: PartialDeep<VimcordToolsConfig>) {\n return _.merge(globalVimcordToolsConfig, options);\n}\n","import { PartialDeep } from \"type-fest\";\nimport _ from \"lodash\";\n\nexport interface VimcordAppConfig {\n devMode: boolean;\n name: string;\n appVersion: string;\n\n /** Enable verbose console logs?\n * @default false */\n verbose: boolean;\n\n /** Disable the vimcord client banner on startup\n * @default false */\n disableBanner: boolean;\n}\n\nconst defaultConfig: VimcordAppConfig = {\n devMode: process.argv.includes(\"--dev\"),\n name: \"Discord Bot\",\n appVersion: \"1.0.0\",\n verbose: false,\n disableBanner: false\n};\n\nexport function createVimcordAppConfig(options: PartialDeep<VimcordAppConfig> = {}): VimcordAppConfig {\n return _.merge(defaultConfig, options);\n}\n","import { PartialDeep } from \"type-fest\";\nimport _ from \"lodash\";\n\nexport interface VimcordStaffConfig {\n ownerId: string | null;\n superUsers: string[];\n superUserRoles: string[];\n bypassers: { commandName: string; userIds: string[] }[];\n bypassesGuildAdmin: {\n allBotStaff: boolean;\n botOwner: boolean;\n superUsers: boolean;\n bypassers: boolean;\n };\n guild: {\n id: string | null;\n inviteUrl: string | null;\n channels: Record<string, string>;\n };\n}\n\nconst defaultConfig: VimcordStaffConfig = {\n ownerId: null,\n superUsers: [],\n superUserRoles: [],\n bypassers: [],\n bypassesGuildAdmin: {\n allBotStaff: false,\n botOwner: false,\n superUsers: false,\n bypassers: false\n },\n guild: {\n id: null,\n inviteUrl: null,\n channels: {}\n }\n};\n\nexport function createVimcordStaffConfig(options: PartialDeep<VimcordStaffConfig> = {}): VimcordStaffConfig {\n return _.merge(defaultConfig, options);\n}\n","import { BaseCommandConfig, CommandType } from \"@ctypes/command.base\";\nimport { PartialDeep } from \"type-fest\";\nimport _ from \"lodash\";\n\nexport interface VimcordSlashCommandConfig extends BaseCommandConfig<CommandType.Slash> {}\n\nconst defaultConfig: VimcordSlashCommandConfig = {\n logExecution: true\n};\n\nexport function createVimcordSlashCommandConfig(\n options: PartialDeep<VimcordSlashCommandConfig> = {}\n): VimcordSlashCommandConfig {\n return _.merge(defaultConfig, options);\n}\n","import { BaseCommandConfig, CommandType } from \"@ctypes/command.base\";\nimport { PartialDeep } from \"type-fest\";\nimport _ from \"lodash\";\nimport { Vimcord } from \"@/client\";\n\nexport interface VimcordPrefixCommandConfig extends BaseCommandConfig<CommandType.Prefix> {\n /** @default ! */\n defaultPrefix: string;\n /** @default true */\n allowMentionAsPrefix: boolean;\n /** @default true */\n allowCaseInsensitiveCommandNames: boolean;\n /**\n * A custom resolver to fetch a guild-specific prefix.\n * Returns a string (the prefix) or null/undefined to fallback to default.\n */\n guildPrefixResolver?: (\n client: Vimcord,\n guildId: string\n ) => Promise<string | null | undefined> | string | null | undefined;\n}\n\nconst defaultConfig: VimcordPrefixCommandConfig = {\n enabled: true,\n defaultPrefix: \"!\",\n allowMentionAsPrefix: true,\n allowCaseInsensitiveCommandNames: true,\n logExecution: true\n};\n\nexport function createVimcordPrefixCommandConfig(\n options: PartialDeep<VimcordPrefixCommandConfig> = {}\n): VimcordPrefixCommandConfig {\n return _.merge(defaultConfig, options);\n}\n","import { BaseCommandConfig, CommandType } from \"@ctypes/command.base\";\nimport { PartialDeep } from \"type-fest\";\nimport _ from \"lodash\";\n\nexport interface VimcordContextCommandConfig extends BaseCommandConfig<CommandType.Context> {}\n\nconst defaultConfig: VimcordContextCommandConfig = {\n enabled: true,\n logExecution: true\n};\n\nexport function createVimcordContextCommandConfig(\n options: PartialDeep<VimcordContextCommandConfig> = {}\n): VimcordContextCommandConfig {\n return _.merge(defaultConfig, options);\n}\n","import chalk from \"chalk\";\n\nexport interface LoggerOptions {\n colors?: Partial<typeof LOGGER_COLORS>;\n prefix?: string | null;\n prefixEmoji?: string | null;\n minLevel?: LogLevel;\n /** @defaultValue `true` */\n showTimestamp?: boolean;\n}\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n SUCCESS = 2,\n WARN = 3,\n ERROR = 4\n}\n\nexport const LOGGER_COLORS = {\n primary: \"#5865F2\",\n success: \"#57F287\",\n warn: \"#FEE75C\",\n danger: \"#ED4245\",\n muted: \"#747F8D\",\n text: \"#FFFFFF\"\n};\n\n/** Reusable functions for using `console.log()`, but in 4k ultra HD retrocolor */\nexport class Logger {\n private logPrefixEmoji: string | null;\n private logPrefix: string | null;\n private minLevel: LogLevel;\n private showTimestamp: boolean;\n private colorScheme: typeof LOGGER_COLORS;\n\n constructor(options?: LoggerOptions) {\n const { prefixEmoji = null, prefix = null, minLevel = LogLevel.DEBUG, showTimestamp = true } = options || {};\n\n this.logPrefixEmoji = prefixEmoji;\n this.logPrefix = prefix;\n this.minLevel = minLevel;\n this.showTimestamp = showTimestamp;\n\n this.colorScheme = {\n ...LOGGER_COLORS,\n ...options?.colors\n };\n }\n\n protected formatTimestamp(): string {\n if (!this.showTimestamp) return \"\";\n const now = new Date();\n const time = now.toLocaleTimeString(\"en-US\", {\n hour12: false,\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\"\n });\n return chalk.hex(this.colorScheme.muted)(`[${time}]`);\n }\n\n protected formatPrefix(): string {\n if (!this.logPrefix) return \"\";\n return chalk.bold.hex(this.colorScheme.primary)(\n `${this.logPrefixEmoji ? `${this.logPrefixEmoji} ` : \"\"}${this.logPrefix}`\n );\n }\n\n protected shouldLog(level: LogLevel): boolean {\n return level >= this.minLevel;\n }\n\n get prefixEmoji() {\n return this.logPrefixEmoji;\n }\n\n get prefix() {\n return this.logPrefix;\n }\n\n get colors() {\n return this.colorScheme;\n }\n\n extend<Extra extends Record<string, (...args: any) => void>>(extras: Extra & ThisType<Logger>): Logger & Extra {\n for (const [key, fn] of Object.entries(extras as any)) {\n if (typeof fn === \"function\") {\n (this as any)[key] = function (...args: any[]) {\n return fn.call(this, ...args);\n };\n }\n }\n\n return this as any as Logger & Extra;\n }\n\n setPrefix(prefix: string | null): this {\n this.logPrefix = prefix;\n return this;\n }\n\n setPrefixEmoji(prefixEmoji: string | null): this {\n this.logPrefixEmoji = prefixEmoji;\n return this;\n }\n\n setMinLevel(minLevel: LogLevel): this {\n this.minLevel = minLevel;\n return this;\n }\n\n setShowTimestamp(show: boolean): this {\n this.showTimestamp = show;\n return this;\n }\n\n setColors(colors: Partial<typeof LOGGER_COLORS>): this {\n this.colorScheme = {\n ...LOGGER_COLORS,\n ...colors\n };\n return this;\n }\n\n log(message: string, ...args: any[]): void {\n console.log(this.formatTimestamp(), this.formatPrefix(), message, ...args);\n }\n\n debug(message: string, ...args: any[]): void {\n if (!this.shouldLog(LogLevel.DEBUG)) return;\n console.log(\n this.formatTimestamp(),\n this.formatPrefix(),\n chalk.hex(this.colorScheme.muted)(\"DEBUG\"),\n chalk.dim(message),\n ...args\n );\n }\n\n info(message: string, ...args: any[]): void {\n if (!this.shouldLog(LogLevel.INFO)) return;\n console.log(this.formatTimestamp(), this.formatPrefix(), chalk.hex(\"#87CEEB\")(\"INFO\"), message, ...args);\n }\n\n success(message: string, ...args: any[]): void {\n if (!this.shouldLog(LogLevel.SUCCESS)) return;\n console.log(\n this.formatTimestamp(),\n this.formatPrefix(),\n chalk.bold.hex(this.colorScheme.success)(\"✓ SUCCESS\"),\n chalk.hex(this.colorScheme.success)(message),\n ...args\n );\n }\n\n warn(message: string, ...args: any[]): void {\n if (!this.shouldLog(LogLevel.WARN)) return;\n console.warn(\n this.formatTimestamp(),\n this.formatPrefix(),\n chalk.bold.hex(this.colorScheme.warn)(\"⚠ WARN\"),\n chalk.hex(this.colorScheme.warn)(message),\n ...args\n );\n }\n\n error(message: string, error?: Error, ...args: any[]): void {\n if (!this.shouldLog(LogLevel.ERROR)) return;\n console.error(\n this.formatTimestamp(),\n this.formatPrefix(),\n chalk.bold.hex(this.colorScheme.danger)(\"✕ ERROR\"),\n chalk.hex(this.colorScheme.danger)(message),\n ...args\n );\n\n if (error && error.stack) {\n console.error(chalk.dim(error.stack));\n }\n }\n\n loader(message: string): (newMessage?: string) => void {\n const frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n let i = 0;\n\n const interval = setInterval(() => {\n process.stdout.write(\n `\\r${this.formatTimestamp()} ${this.formatPrefix()} ${chalk.hex(this.colorScheme.warn)(frames[i])} ${message}`\n );\n i = (i + 1) % frames.length;\n }, 100);\n\n return (newMessage?: string) => {\n clearInterval(interval);\n process.stdout.write(\n `\\r${this.formatTimestamp()} ${this.formatPrefix()} ${chalk.hex(this.colorScheme.success)(\"✓\")} ${newMessage || message}\\n`\n );\n };\n }\n\n table(title: string, data: Record<string, any>): void {\n console.log(this.formatTimestamp(), this.formatPrefix(), chalk.bold(title));\n\n Object.entries(data).forEach(([key, value]) => {\n const formattedKey = chalk.hex(this.colorScheme.warn)(` ${key}`);\n const formattedValue = chalk.hex(this.colorScheme.muted)(value);\n console.log(`${formattedKey.padEnd(25)} ${formattedValue}`);\n });\n }\n\n section(title: string): void {\n const line = \"─\".repeat(Math.max(30, title.length + 4));\n console.log(chalk.hex(this.colorScheme.muted)(`\\n┌─${line}─┐`));\n console.log(\n chalk.hex(this.colorScheme.muted)(\"│ \") +\n chalk.bold.hex(this.colorScheme.text)(title.padEnd(line.length)) +\n chalk.hex(this.colorScheme.muted)(\" │\")\n );\n console.log(chalk.hex(this.colorScheme.muted)(`└─${line}─┘`));\n }\n}\n\n// Export singleton instance\nexport const logger = new Logger();\n","import {\n AnyThreadChannel,\n CategoryChannel,\n Channel,\n ChannelType,\n Client,\n DMChannel,\n Guild,\n GuildBasedChannel,\n GuildMember,\n GuildTextBasedChannel,\n Message,\n PartialDMChannel,\n PartialGroupDMChannel,\n Role,\n TextBasedChannel,\n User,\n VoiceBasedChannel\n} from \"discord.js\";\n\nexport type FetchedChannel<T> = T extends ChannelType.DM\n ? PartialGroupDMChannel | DMChannel | PartialDMChannel\n : T extends ChannelType.GuildText\n ? GuildBasedChannel & TextBasedChannel\n : T extends ChannelType.PublicThread | ChannelType.PrivateThread | ChannelType.AnnouncementThread\n ? AnyThreadChannel\n : T extends ChannelType.GuildVoice\n ? VoiceBasedChannel\n : T extends ChannelType.GuildCategory\n ? CategoryChannel\n : GuildBasedChannel;\n\nexport type FetchedMessageMention<T extends MentionType, InGuild extends boolean> = T extends \"user\"\n ? User\n : T extends \"member\"\n ? GuildMember\n : T extends \"channel\"\n ? InGuild extends true\n ? GuildBasedChannel\n : Channel\n : Role;\n\nexport type MentionType = \"user\" | \"member\" | \"channel\" | \"role\";\n\nexport interface GetMessageMentionOptions {\n cleanContent?: string;\n /** Return the ID instead of the object. */\n parse?: boolean;\n}\n\n/** Returns the string if it's populated, or \"0\" otherwise.\n *\n * Useful for fetching where the provided ID may or may not exist.\n * @param str The string to check. */\nexport function __zero(str?: string | null): string {\n return str?.length ? str : \"0\";\n}\n\n/** Check if the given string is a mention or a snowflake.\n *\n * Looks for formats like `<@123456789>`, or a numeric string with at least 6 digits.\n * @param str The string to check. */\nexport function isMentionOrSnowflake(str: string | undefined): boolean {\n return str ? (str.match(/<@[#&]?[\\d]{6,}>/) || str.match(/\\d{6,}/) ? true : false) : false;\n}\n\n/** Remove mention syntax from a string.\n * @param str The string to clean. */\nexport function cleanMention(str: string | undefined): string | undefined {\n return str ? str.replaceAll(/[<@#&>]/g, \"\").trim() : undefined;\n}\n\n/** Get a mention or snowflake argument of a specified type from a message.\n * @param message - The message to parse.\n * @param content - The message's clean content to parse. Will be used if message.mentions isn't populated.\n * @param type - The type of mention.\n * @param index - The argument index in the content. Default is `0`\n * @param idOnly - Whether to return the ID instead of the fecthed object. */\nexport async function getMessageMention<M extends Message, T extends MentionType>(\n message: M,\n content: string | undefined | null,\n type: T,\n index: number,\n idOnly: true\n): Promise<string | null>;\nexport async function getMessageMention<M extends Message, T extends MentionType>(\n message: M,\n content: string | undefined | null,\n type: T,\n index?: number,\n idOnly?: false\n): Promise<FetchedMessageMention<T, M extends Message<true> ? true : false> | null>;\nexport async function getMessageMention<M extends Message, T extends MentionType>(\n message: M,\n content: string | undefined | null,\n type: T,\n index: number = 0,\n idOnly?: boolean\n) {\n const args = content?.split(\" \");\n const arg = isMentionOrSnowflake(args?.[index]) ? cleanMention(args?.[index]) : undefined;\n\n switch (type) {\n case \"user\":\n const userMention = message.mentions.users.at(index) || null;\n if (!userMention && arg) {\n return idOnly ? arg : ((await fetchUser(message.client, arg)) as any);\n } else {\n return idOnly ? userMention?.id || null : (userMention as any);\n }\n\n case \"member\":\n if (!message.guild) return null;\n const member = await fetchMember(message.guild, message.mentions.users.at(index)?.id ?? arg);\n return idOnly ? member?.id || null : (member as any);\n\n case \"channel\":\n const channelMention = message.mentions.channels.at(index) || null;\n if (!channelMention && arg) {\n return idOnly\n ? arg\n : ((message.guild\n ? await fetchChannel(message.guild, arg)\n : (message.client.channels.cache.get(__zero(arg)) ??\n message.client.channels.fetch(__zero(arg)))) as any);\n } else {\n return idOnly ? channelMention?.id || null : (channelMention as any);\n }\n\n case \"role\":\n const roleMention = message.mentions.roles.at(index) || null;\n if (!roleMention && arg) {\n return idOnly ? arg : message.guild ? ((await fetchRole(message.guild, arg)) as any) : null;\n } else {\n return idOnly ? roleMention?.id || null : (roleMention as any);\n }\n\n default:\n return null;\n }\n}\n\n/** Get the ID of the first mention of a specified type from a message or message content.\n * @param options Optional options that aren't really optional. */\nexport function getFirstMentionId(options: { message?: Message; content?: string; type: MentionType }): string {\n let mentionId = \"\";\n\n if (options.message) {\n switch (options.type) {\n case \"user\":\n mentionId = options.message.mentions.users.first()?.id || \"\";\n break;\n case \"channel\":\n mentionId = options.message.mentions.channels.first()?.id || \"\";\n break;\n case \"role\":\n mentionId = options.message.mentions.roles.first()?.id || \"\";\n break;\n }\n }\n\n const firstArg = options.content?.split(\" \")[0] || \"\";\n return mentionId || isMentionOrSnowflake(firstArg) ? cleanMention(firstArg)! : \"\";\n}\n\n/** Fetch a user from the client, checking the cache first.\n * @param client - The client to fetch the user from.\n * @param userId - The ID of the user to fetch. */\nexport async function fetchUser(client: Client<true>, userId: string | undefined | null): Promise<User | null> {\n if (!userId) return null;\n return client.users.cache.get(__zero(userId)) || (await client.users.fetch(__zero(userId)).catch(() => null));\n}\n\n/** Fetch a guild from the client, checking the cache first.\n * @param client - The client to fetch the guild from.\n * @param guildId - The ID of the guild to fetch. */\nexport async function fetchGuild(client: Client<true>, guildId: string | undefined | null): Promise<Guild | null> {\n if (!guildId) return null;\n return client.guilds.cache.get(__zero(guildId)) || (await client.guilds.fetch(__zero(guildId)).catch(() => null));\n}\n\n/** Fetch a member from a guild, checking the cache first.\n * @param guild - The guild to fetch the member from.\n * @param memberId - The ID of the member to fetch. */\nexport async function fetchMember(guild: Guild, memberId: string | undefined | null): Promise<GuildMember | null> {\n if (!memberId) return null;\n return guild.members.cache.get(__zero(memberId)) || (await guild.members.fetch(__zero(memberId)).catch(() => null));\n}\n\n/** Fetch a channel from a guild, checking the cache first.\n *\n * ***NOTE:*** If the channel type does not match the provided type or the channel is null, null is returned.\n * @param guild - The guild to fetch the channel from.\n * @param channelId - The ID of the channel to fetch.\n * @param type - The type of channel to fetch. */\nexport async function fetchChannel<T extends ChannelType>(\n guild: Guild,\n channelId: string | undefined | null,\n type?: T\n): Promise<FetchedChannel<T> | null> {\n if (!channelId) return null;\n const channel =\n guild.channels.cache.get(__zero(channelId)) || (await guild.channels.fetch(__zero(channelId)).catch(() => null));\n if (type && channel?.type !== type) return null;\n return channel as any;\n}\n\n/** Fetch a role from a guild, checking the cache first.\n * @param guild - The guild to fetch the role from.\n * @param roleId - The ID of the role to fetch. */\nexport async function fetchRole(guild: Guild, roleId: string | undefined | null): Promise<Role | null> {\n if (!roleId) return null;\n return guild.roles.cache.get(__zero(roleId)) || (await guild.roles.fetch(__zero(roleId)).catch(() => null)) || null;\n}\n\n/** Fetch a message from a channel, checking the cache first.\n * @param channel - The channel to fetch the message from.\n * @param messageId - The ID of the message to fetch. */\nexport async function fetchMessage(\n channel: GuildTextBasedChannel | VoiceBasedChannel,\n messageId: string | undefined | null\n): Promise<Message | null> {\n if (!messageId) return null;\n return (\n channel.messages.cache.get(__zero(messageId)) ||\n (await channel.messages.fetch(__zero(messageId)).catch(() => null)) ||\n null\n );\n}\n","import { ActivityType } from \"discord.js\";\nimport { PartialDeep } from \"type-fest\";\nimport _ from \"lodash\";\n\nexport enum StatusType {\n DND = \"dnd\",\n Idle = \"idle\",\n Online = \"online\",\n Invisible = \"invisible\"\n}\n\nexport interface ClientActivity {\n /** Mappings:\n * - `$USER_COUNT` - this.client.users.cache.size\n * - `$GUILD_COUNT` - this.client.guilds.cache.size\n * - `$STAFF_GUILD_MEMBER_COUNT` - self explanatory\n */\n name: string;\n type: ActivityType;\n status: StatusType;\n streamUrl?: string;\n}\n\nexport interface ClientStatus {\n /** In seconds */\n interval?: number;\n randomize?: boolean;\n activity: ClientActivity | ClientActivity[];\n}\n\nexport interface VimcordClientStatus {\n production: ClientStatus;\n development: ClientStatus;\n}\n\nconst defaultPresence: VimcordClientStatus = {\n production: {\n interval: 60_000,\n randomize: false,\n activity: [\n { status: StatusType.Online, type: ActivityType.Custom, name: \"Need help? Use /help or !help\" },\n { status: StatusType.Online, type: ActivityType.Custom, name: \"Join our community!\" },\n { status: StatusType.Online, type: ActivityType.Watching, name: \"✨ $GUILD_COUNT servers\" }\n ]\n },\n development: {\n activity: { status: StatusType.DND, type: ActivityType.Custom, name: \"In development!\" }\n }\n};\n\nexport function createVimcordStatusConfig(options: PartialDeep<VimcordClientStatus> = {}): VimcordClientStatus {\n return _.merge(defaultPresence, options);\n}\n","export function formatThousands(num: number, sep = \",\") {\n return `${num}`.replace(/\\B(?<!\\.\\d*)(?=(\\d{3})+(?!\\d))/g, sep);\n}\n","export function pickRandom<T extends any[]>(\n arr: T,\n options?: { notEqualTo?: any; maxRerollAttempts?: number; clone?: boolean }\n): T[number] {\n const _rnd = () => {\n return arr[Math.floor(Math.random() * arr.length)] as T[number];\n };\n\n let att = 0;\n let candidate = _rnd();\n\n if (options?.notEqualTo !== undefined && arr.length > 1) {\n while (candidate === options.notEqualTo) {\n if (att < (options?.maxRerollAttempts ?? 100)) {\n throw new Error(`pickRandom reached max reroll attempts (${options?.maxRerollAttempts ?? 100})`);\n }\n candidate = _rnd();\n att++;\n }\n }\n\n return options?.clone ? structuredClone(candidate) : candidate;\n}\n","import { Vimcord } from \"@/client\";\nimport { Logger } from \"@/tools/Logger\";\nimport { fetchGuild } from \"@/tools/utils\";\nimport { ClientActivity, ClientStatus, createVimcordStatusConfig, VimcordClientStatus } from \"@/types/status\";\nimport { formatThousands } from \"@/utils/number\";\nimport { pickRandom } from \"@/utils/random\";\nimport cron, { ScheduledTask } from \"node-cron\";\nimport EventEmitter from \"node:events\";\nimport { PartialDeep } from \"type-fest\";\n\ntype VimcordStatusManagerEvents = {\n changed: [ClientActivity];\n cleared: [];\n rotation: [ClientActivity];\n rotationPaused: [ScheduledTask];\n rotationStarted: [ScheduledTask];\n rotationDestroyed: [];\n};\n\nexport class VimcordStatusManager {\n client: Vimcord;\n logger: Logger;\n emitter: EventEmitter<VimcordStatusManagerEvents> = new EventEmitter();\n\n lastActivity: ClientActivity | null = null;\n lastActivityIndex: number = 0;\n private task: ScheduledTask | null = null;\n\n constructor(client: Vimcord) {\n this.client = client;\n\n // Define custom logger instance\n this.logger = new Logger({ prefixEmoji: \"💬\", prefix: `StatusManager (i${this.client.index})` });\n\n this.emitter.on(\"changed\", activity => {\n if (this.client.config.app.verbose) {\n this.logger.debug(`Status changed to '${activity.name}'`);\n }\n });\n\n this.emitter.on(\"cleared\", () => {\n if (this.client.config.app.verbose) {\n this.logger.debug(\"Status cleared\");\n }\n });\n\n this.emitter.on(\"rotation\", () => {\n if (this.client.config.app.verbose) {\n this.logger.debug(\"Status rotated\");\n }\n });\n\n this.emitter.on(\"rotationStarted\", () => {\n if (this.client.config.app.verbose) {\n this.logger.debug(\"Status rotation resumed ▶️\");\n }\n });\n\n this.emitter.on(\"rotationPaused\", () => {\n if (this.client.config.app.verbose) {\n this.logger.debug(\"Status rotation paused ⏸️\");\n }\n });\n }\n\n private clearData() {\n this.task?.destroy();\n this.task = null;\n this.lastActivity = null;\n this.lastActivityIndex = 0;\n return this;\n }\n\n private async getReadyClient() {\n const client = await this.client.whenReady();\n if (!client.user) throw new Error(\"Cannot manage the client's activity when its user is not hydrated\");\n return client;\n }\n\n private async formatActivityName(name: string) {\n name = name\n .replace(\"$USER_COUNT\", formatThousands(this.client.users.cache.size))\n .replace(\"$GUILD_COUNT\", formatThousands(this.client.guilds.cache.size))\n .replace(\n \"$INVITE\",\n this.client.config.staff.guild.inviteUrl\n ? this.client.config.staff.guild.inviteUrl\n : \"<STAFF_INVITE_URL_NOT_SET>\"\n );\n\n // Staff guild context\n if (name.includes(\"$STAFF_GUILD_MEMBER_COUNT\")) {\n await fetchGuild(this.client as Vimcord<true>, this.client.config.staff.guild.id)\n .then(guild => {\n if (!guild) return (name = name.replace(\"$STAFF_GUILD_MEMBER_COUNT\", \"<STAFF_GUILD_NOT_FOUND>\"));\n\n // Guild member count\n name = name.replace(\"$STAFF_GUILD_MEMBER_COUNT\", formatThousands(guild.members.cache.size));\n })\n .catch(err => this.logger.error(\"Failed to fetch the staff guild\", err));\n }\n\n return name;\n }\n\n private async setActivity(activity: ClientActivity) {\n const client = await this.getReadyClient();\n\n // Format the activity's name\n activity.name = await this.formatActivityName(activity.name);\n\n // Set the status\n client.user.setStatus(activity.status);\n // Set the activity\n client.user.setActivity({ name: activity.name, type: activity.type, url: activity.streamUrl });\n\n this.emitter.emit(\"changed\", activity);\n }\n\n private async statusRotationTask(clientStatus: ClientStatus) {\n let activity: ClientActivity;\n\n // Randomly pick a new activity that wasn't our last one\n if (clientStatus.randomize) {\n activity = pickRandom(clientStatus.activity as ClientActivity[], {\n notEqualTo: this.lastActivity,\n clone: true\n });\n\n // Cache the current activity to compare to the next one\n this.lastActivity = activity;\n } else {\n const activityIndex = (this.lastActivityIndex + 1) % (clientStatus.activity as ClientActivity[]).length;\n this.lastActivityIndex = activityIndex;\n\n // Pick the next activity in the list\n activity = (clientStatus.activity as ClientActivity[])[activityIndex]!;\n }\n\n // Set the client's activity to the new activity\n await this.setActivity(activity);\n this.emitter.emit(\"rotation\", activity);\n }\n\n private async scheduleStatusRotation(clientStatus: ClientStatus) {\n if (!clientStatus.interval) throw new Error(\"Cannot create client activity interval without interval time\");\n\n this.task?.destroy();\n this.task = null;\n\n // Set the initial status\n await this.statusRotationTask(clientStatus);\n\n // Create the rotation task\n this.task = cron.createTask(\n `*/${clientStatus.interval} * * * * *`,\n async () => await this.statusRotationTask(clientStatus),\n { noOverlap: true }\n );\n\n // Start the rotation task\n this.start();\n this.emitter.emit(\"rotationStarted\", this.task);\n }\n\n start(): this {\n if (this.task) {\n this.task.start();\n this.emitter.emit(\"rotationStarted\", this.task);\n if (this.client.config.app.verbose) {\n this.logger.debug(\"Status rotation started\");\n }\n }\n return this;\n }\n\n pause(): this {\n if (this.task) {\n this.task.stop();\n this.emitter.emit(\"rotationPaused\", this.task);\n if (this.client.config.app.verbose) {\n this.logger.debug(\"Status rotation paused\");\n }\n }\n return this;\n }\n\n async set(status: PartialDeep<VimcordClientStatus>): Promise<this> {\n const statusConfig = createVimcordStatusConfig(status);\n\n let clientStatus: ClientStatus;\n\n if (this.client.config.app.devMode) {\n clientStatus = statusConfig.development;\n } else {\n clientStatus = statusConfig.production;\n }\n\n // Just set the status without creating an interval\n if (!clientStatus.interval) {\n await this.setActivity(Array.isArray(clientStatus.activity) ? clientStatus.activity[0]! : clientStatus.activity);\n return this;\n }\n\n // Create an activity interval\n if (clientStatus.interval) {\n await this.scheduleStatusRotation(clientStatus);\n }\n\n return this;\n }\n\n async destroy(): Promise<this> {\n if (this.task) {\n this.task.destroy();\n this.task = null;\n this.emitter.emit(\"rotationDestroyed\");\n if (this.client.config.app.verbose) {\n this.logger.debug(\"Status rotation destroyed\");\n }\n\n // Clear the status and data\n await this.clear();\n }\n return this;\n }\n\n async clear(): Promise<this> {\n const client = await this.getReadyClient();\n this.clearData();\n client.user.setActivity({ name: \"\" });\n this.emitter.emit(\"cleared\");\n if (this.client.config.app.verbose) {\n this.logger.debug(\"Status cleared\");\n }\n return this;\n }\n}\n","import { REST, Routes } from \"discord.js\";\nimport { CommandType } from \"@ctypes/command.base\";\nimport { VimcordCommandBuilderByType } from \"@ctypes/command.helpers\";\nimport { importModulesFromDir } from \"@utils/dir\";\nimport { type Vimcord } from \"@/client\";\n\n/**\n * Shared logic for Application Commands (Slash & Context)\n */\nabstract class VimcordAppCommandManager<T extends CommandType.Slash | CommandType.Context> {\n public commands: Map<string, VimcordCommandBuilderByType<T>> = new Map();\n protected rest!: REST;\n\n constructor(\n protected client: Vimcord,\n protected typeName: string\n ) {\n this.client.whenReady().then(c => (this.rest = new REST().setToken(c.token)));\n }\n\n get(name: string) {\n return this.commands.get(name);\n }\n\n /**\n * Filters and returns commands based on deployment options\n */\n getAll(options?: { names?: string[]; fuzzyNames?: string[]; globalOnly?: boolean; ignoreDeploymentOptions?: boolean }) {\n const matchedCommands = new Map<string, VimcordCommandBuilderByType<T>>();\n const isDev = this.client.config.app.devMode;\n\n for (const cmd of this.commands.values()) {\n const config = cmd.toConfig() as any;\n const name = (cmd.builder as any).name;\n\n // 1. Name Filtering\n if (options?.names || options?.fuzzyNames) {\n const nameMatched = options.names?.includes(name) || options.fuzzyNames?.some(fuzzy => name.includes(fuzzy));\n\n if (!nameMatched) continue;\n }\n\n if (options?.ignoreDeploymentOptions) {\n matchedCommands.set(name, cmd);\n continue;\n }\n\n // 2. Environment/Deployment Filtering\n const deployment = config.deployment || {};\n const isProperEnv =\n !deployment.environments || deployment.environments.includes(isDev ? \"development\" : \"production\");\n\n if (!isProperEnv) continue;\n\n // 3. Global Filter\n if (options?.globalOnly && deployment.global === false) continue;\n\n matchedCommands.set(name, cmd);\n }\n\n return matchedCommands;\n }\n\n async registerGlobal(options?: { commands?: string[]; fuzzyCommands?: string[] }) {\n const client = await this.client.whenReady();\n const commands = Array.from(\n this.getAll({\n names: options?.commands,\n fuzzyNames: options?.fuzzyCommands,\n globalOnly: true\n }).values()\n ).map(cmd => cmd.builder.toJSON());\n\n if (!commands.length) {\n console.log(`[${this.typeName}] No commands to register`);\n return;\n }\n\n console.log(`[${this.typeName}] Registering ${commands.length} commands globally...`);\n\n try {\n await this.rest.put(Routes.applicationCommands(client.user.id), { body: commands });\n console.log(`[${this.typeName}] ✔ Registered app commands globally`);\n } catch (err) {\n console.log(`[${this.typeName}] ✖ Failed to register app commands globally`, err);\n }\n }\n\n async registerGuild(options?: { commands?: string[]; fuzzyCommands?: string[]; guilds?: string[] }) {\n const client = await this.client.whenReady();\n const commands = Array.from(\n this.getAll({\n names: options?.commands,\n fuzzyNames: options?.fuzzyCommands\n }).values()\n ).map(cmd => cmd.builder.toJSON());\n\n if (!commands.length) {\n console.log(`[${this.typeName}] No commands to register`);\n return;\n }\n\n const guildIds = options?.guilds || client.guilds.cache.map(g => g.id);\n console.log(`[${this.typeName}] Registering ${commands.length} commands for ${guildIds.length} guilds...`);\n\n await Promise.all(\n guildIds.map(guildId =>\n this.rest\n .put(Routes.applicationGuildCommands(client.user.id, guildId), { body: commands })\n .then(() => {\n const gName = client.guilds.cache.get(guildId)?.name || \"n/a\";\n console.log(`[${this.typeName}] ✔ Set app commands in guild: ${guildId} (${gName})`);\n })\n .catch(err => {\n const gName = client.guilds.cache.get(guildId)?.name || \"n/a\";\n console.log(`[${this.typeName}] ✖ Failed to set app commands in guild: ${guildId} (${gName})`, err);\n })\n )\n );\n }\n\n async unregisterGuild(options?: { guilds?: string[] }) {\n const client = await this.client.whenReady();\n const guildIds = options?.guilds || client.guilds.cache.map(g => g.id);\n\n console.log(`[${this.typeName}] Unregistering commands from ${guildIds.length} guilds...`);\n\n await Promise.all(\n guildIds.map(guildId =>\n this.rest\n .put(Routes.applicationGuildCommands(client.user.id, guildId), { body: [] })\n .then(() => console.log(`[${this.typeName}] ✔ Removed app commands in guild: ${guildId}`))\n .catch(err =>\n console.log(`[${this.typeName}] ✖ Failed to remove app commands in guild: ${guildId}`, err)\n )\n )\n );\n }\n\n async unregisterGlobal() {\n const client = await this.client.whenReady();\n try {\n await this.rest.put(Routes.applicationCommands(client.user.id), { body: [] });\n console.log(`[${this.typeName}] ✔ Removed app commands globally`);\n } catch (err) {\n console.log(`[${this.typeName}] ✖ Failed to remove app commands globally`, err);\n }\n }\n}\n\nexport class VimcordSlashCommandManager extends VimcordAppCommandManager<CommandType.Slash> {\n constructor(client: Vimcord) {\n super(client, \"SlashCommandManager\");\n }\n\n async importFrom(dir: string | string[], replaceAll = false) {\n if (replaceAll) this.commands.clear();\n const dirs = Array.isArray(dir) ? dir : [dir];\n\n // Map over directories since the utility only takes a string\n const modules = (\n await Promise.all(\n dirs.map(d => importModulesFromDir<{ default: VimcordCommandBuilderByType<CommandType.Slash> }>(d, \"slash\"))\n )\n ).flat();\n\n for (const { module } of modules) {\n this.commands.set(module.default.builder.name, module.default);\n }\n this.client.logger.moduleLoaded(\"Slash Commands\", modules.length);\n return this.commands;\n }\n}\n\nexport class VimcordContextCommandManager extends VimcordAppCommandManager<CommandType.Context> {\n constructor(client: Vimcord) {\n super(client, \"ContextCommandManager\");\n }\n\n async importFrom(dir: string | string[], replaceAll = false) {\n if (replaceAll) this.commands.clear();\n const dirs = Array.isArray(dir) ? dir : [dir];\n\n const modules = (\n await Promise.all(\n dirs.map(d => importModulesFromDir<{ default: VimcordCommandBuilderByType<CommandType.Context> }>(d, \"ctx\"))\n )\n ).flat();\n\n for (const { module } of modules) {\n this.commands.set(module.default.builder.name, module.default);\n }\n this.client.logger.moduleLoaded(\"Context Commands\", modules.length);\n return this.commands;\n }\n}\n\nexport class VimcordPrefixCommandManager {\n public commands: Map<string, VimcordCommandBuilderByType<CommandType.Prefix>> = new Map();\n\n constructor(private client: Vimcord) {}\n\n resolve(trigger: string) {\n const config = this.client.config.prefixCommands;\n const search = config.allowCaseInsensitiveCommandNames ? trigger.toLowerCase() : trigger;\n\n return Array.from(this.commands.values()).find(cmd => {\n const opts = cmd.toConfig();\n const name = config.allowCaseInsensitiveCommandNames ? opts.name.toLowerCase() : opts.name;\n if (name === search) return true;\n return opts.aliases?.some(a =>\n config.allowCaseInsensitiveCommandNames ? a.toLowerCase() === search : a === search\n );\n });\n }\n\n async importFrom(dir: string | string[], replaceAll = false) {\n if (replaceAll) this.commands.clear();\n const dirs = Array.isArray(dir) ? dir : [dir];\n\n const modules = (\n await Promise.all(\n dirs.map(d =>\n importModulesFromDir<{ default: VimcordCommandBuilderByType<CommandType.Prefix> }>(d, \"prefix\")\n )\n )\n ).flat();\n\n for (const { module } of modules) {\n this.commands.set(module.default.toConfig().name, module.default);\n }\n this.client.logger.moduleLoaded(\"Prefix Commands\", modules.length);\n return this.commands;\n }\n}\n\nexport class VimcordCommandManager {\n public readonly slash: VimcordSlashCommandManager;\n public readonly prefix: VimcordPrefixCommandManager;\n public readonly context: VimcordContextCommandManager;\n\n constructor(client: Vimcord) {\n this.slash = new VimcordSlashCommandManager(client);\n this.prefix = new VimcordPrefixCommandManager(client);\n this.context = new VimcordContextCommandManager(client);\n }\n}\n","import { EventBuilder } from \"@builders/event.builder\";\nimport { importModulesFromDir } from \"@utils/dir\";\nimport { ClientEvents, Events } from \"discord.js\";\nimport { type Vimcord } from \"@/client\";\nimport { Logger } from \"@/tools/Logger\";\n\nexport class VimcordEventManager {\n client: Vimcord;\n events: Map<string, EventBuilder<any>> = new Map();\n logger: Logger;\n\n constructor(client: Vimcord) {\n this.client = client;\n\n // Define custom logger instance\n this.logger = new Logger({ prefixEmoji: \"📋\", prefix: `EventManager (i${this.client.index})` });\n\n for (const event of Object.values(Events)) {\n client.on(event.toString(), async (...args) =>\n this.executeEvents.apply(this, [event as keyof ClientEvents, ...(args as ClientEvents[keyof ClientEvents])])\n );\n }\n }\n\n register<T extends keyof ClientEvents>(...events: EventBuilder<T>[]): void {\n for (const event of events) {\n this.events.set(event.name, event);\n\n if (this.client.config.app.verbose) {\n this.logger.debug(`'${event.name}' registered for EventType '${event.event}'`);\n }\n }\n }\n\n unregister(...names: string[]): void {\n for (const name of names) {\n const event = this.events.get(name);\n if (!event) continue;\n\n this.events.delete(name);\n\n if (this.client.config.app.verbose) {\n this.logger.debug(`'${event.name}' unregistered for EventType '${event.event}'`);\n }\n }\n }\n\n clear() {\n this.events.forEach(e => this.unregister(e.name));\n this.events.clear();\n }\n\n get(name: string): EventBuilder | undefined {\n return this.events.get(name);\n }\n\n getByTag(tag: string): EventBuilder[] {\n return Array.from(this.events.values()).filter(event => event.metadata?.tags?.includes(tag));\n }\n\n getByCategory(category: string): EventBuilder[] {\n return Array.from(this.events.values()).filter(event => event.metadata?.category?.includes(category));\n }\n\n getByEvent<T extends keyof ClientEvents>(eventType: T): EventBuilder<T>[] {\n return Array.from(this.events.values()).filter(event => event.event === eventType);\n }\n\n async executeEvents<T extends keyof ClientEvents>(eventType: T, ...args: ClientEvents[T]): Promise<void> {\n const events = this.getByEvent(eventType);\n if (!events.length) return;\n\n const sortedEvents = events.sort((a, b) => b.priority - a.priority);\n\n await Promise.all(\n sortedEvents.map(async event => {\n try {\n await event.execute?.(this.client as Vimcord<true>, ...args);\n if (event.once) {\n this.unregister(event.name);\n }\n } catch (err) {\n this.logger.error(`'${event.name}' failed to execute`, err as Error);\n }\n })\n );\n }\n\n /** Import event modules that end with `.event` */\n async importFrom(dir: string | string[], replaceAll?: boolean) {\n dir = Array.isArray(dir) ? dir : [dir];\n\n const eventModules = await Promise.all(\n dir.map(dir => importModulesFromDir<{ default: EventBuilder<any> }>(dir, \"event\"))\n );\n\n // Clear current registered events\n if (replaceAll) {\n this.clear();\n }\n\n let importedEvents = 0;\n let ignoredEvents = 0;\n\n // Register the imported event modules\n for (const event of eventModules.flat()) {\n if (!event.module.default.enabled) {\n ignoredEvents++;\n } else {\n importedEvents++;\n }\n\n this.register(event.module.default);\n }\n\n this.client.logger.moduleLoaded(\"Event Handlers\", importedEvents, ignoredEvents);\n return this.events;\n }\n}\n","import {\n ActionRowBuilder,\n AttachmentBuilder,\n ButtonBuilder,\n ButtonStyle,\n CommandInteraction,\n ComponentType,\n Guild,\n Message\n} from \"discord.js\";\nimport { BetterEmbed } from \"@/tools/BetterEmbed\";\nimport { SendMethod } from \"@/tools/types\";\nimport { type Vimcord } from \"@/client\";\n\nexport async function sendCommandErrorEmbed(\n client: Vimcord,\n error: Error,\n guild: Guild | null | undefined,\n messageOrInteraction: Message | CommandInteraction\n) {\n if (!client.features.enableCommandErrorMessage) return null;\n\n const config =\n typeof client.features.enableCommandErrorMessage !== \"boolean\"\n ? client.features.enableCommandErrorMessage\n : undefined;\n\n const buttons = {\n supportServer: new ButtonBuilder({\n url: config?.inviteUrl || client.config.staff.guild.inviteUrl || \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\", // may or may not be a rickroll\n label: config?.inviteButtonLabel || \"Support Support\",\n style: ButtonStyle.Link\n }),\n\n details: new ButtonBuilder({\n customId: \"btn_details\",\n label: config?.detailButtonLabel || \"Details\",\n style: ButtonStyle.Secondary\n })\n };\n\n // Action row\n const actionRow = new ActionRowBuilder<ButtonBuilder>({\n components:\n config?.inviteUrl && guild?.id !== (config.inviteUrl || client.config.staff.guild.id)\n ? [buttons.supportServer, buttons.details]\n : [buttons.details]\n });\n\n // Create the embed (Error)\n const embed_error =\n config?.embed?.(new BetterEmbed(), error, guild) ||\n new BetterEmbed({\n color: \"Red\",\n title: \"Something went wrong\",\n description: \"If you keep encountering this error, please report it\"\n });\n\n // Send the embed\n const msg = await embed_error.send(messageOrInteraction, {\n components: [actionRow],\n flags: config?.ephemeral ? \"Ephemeral\" : undefined,\n deleteAfter: config?.deleteAfter\n });\n if (!msg) return null;\n\n // Collect interactions\n const collector = msg.createMessageComponentCollector({\n componentType: ComponentType.Button,\n idle: config?.detailButtonIdleTimeout ?? 30_000,\n filter: i => i.customId === \"btn_details\"\n });\n\n collector.on(\"collect\", i => {\n const attachment = new AttachmentBuilder(Buffer.from(`${error.message}\\n\\n${error.stack}`), {\n name: \"error.txt\"\n });\n\n // Send the error attachment\n i.reply({ files: [attachment], flags: \"Ephemeral\" });\n });\n\n collector.on(\"end\", () => {\n // Disable the details button\n buttons.details.setDisabled(true);\n\n // Update the action row\n embed_error.send(messageOrInteraction, {\n sendMethod: messageOrInteraction instanceof Message ? SendMethod.MessageEdit : undefined,\n components: [actionRow]\n });\n });\n\n return msg;\n}\n","import {\n APIEmbed,\n APIEmbedField,\n Client,\n ColorResolvable,\n EmbedBuilder,\n GuildMember,\n Message,\n TextBasedChannel,\n User\n} from \"discord.js\";\nimport type { InteractionResolveable, SendHandler } from \"./types\";\nimport { globalVimcordToolsConfig, VimcordToolsConfig } from \"@/configs/tools.config\";\nimport { dynaSend, DynaSendOptions } from \"./dynaSend\";\nimport { Vimcord } from \"@/client\";\n\nexport interface BetterEmbedContext {\n client?: Vimcord | Client | null;\n interaction?: InteractionResolveable | null;\n channel?: TextBasedChannel | null;\n message?: Message | null;\n user?: GuildMember | User | null;\n}\n\nexport interface BetterEmbedAuthor {\n text: string;\n icon?: string | boolean | null;\n hyperlink?: string | null;\n}\n\nexport interface BetterEmbedTitle {\n text: string;\n hyperlink?: string | null;\n}\n\nexport interface BetterEmbedFooter {\n text: string;\n icon?: string | boolean | null;\n}\n\nexport interface BetterEmbedData {\n context?: BetterEmbedContext | null;\n author?: string | BetterEmbedAuthor | null;\n title?: string | BetterEmbedTitle | null;\n thumbnailUrl?: string | null;\n description?: string | (string | null | undefined)[] | null;\n imageUrl?: string | null;\n footer?: string | BetterEmbedFooter | null;\n fields?: (APIEmbedField | null | undefined)[];\n color?: ColorResolvable | ColorResolvable[] | null;\n timestamp?: number | boolean | Date | null;\n acf?: boolean;\n config?: VimcordToolsConfig;\n}\n\nexport class BetterEmbed {\n private embed = new EmbedBuilder();\n private data: Required<Omit<BetterEmbedData, \"config\">>;\n private config: VimcordToolsConfig;\n\n /** A powerful wrapper for `EmbedBuilder` that introduces useful features\n *\n * Auto-shorthand context formatting (_ACF_) is enabled by default\n *\n * All functions utilize _ACF_ unless `BetterEmbed.acf` is set to `false`\n *\n * ___Use a blackslash___ `\\` ___to escape any context___\n *\n * \\- - - Author Context - - -\n * - __`$USER`__: _author's mention (@xsqu1znt)_\n * - __`$USER_NAME`__: _author's username_\n * - __`$DISPLAY_NAME`__: _author's display name (requires `GuildMember` context)_\n * - __`$USER_AVATAR`__: _author's avatar_\n *\n * \\- - - Client Context - - -\n *\n * - __`$BOT_AVATAR`__: _bot's avatar_\n *\n * \\- - - Shorthand Context - - -\n * - __`$YEAR`__: _YYYY_\n * - __`$MONTH`__: _MM_\n * - __`$DAY`__: _DD_\n * - __`$year`__: _YY_\n * - __`$month`__: _M or MM_\n * - __`$day`__: _D or DD_ */\n constructor(data: BetterEmbedData = {}) {\n this.config = data.config || globalVimcordToolsConfig;\n\n // Initialize with defaults\n this.data = {\n context: data.context || null,\n author: data.author || null,\n title: data.title || null,\n thumbnailUrl: data.thumbnailUrl || null,\n description: data.description || null,\n imageUrl: data.imageUrl || null,\n footer: data.footer || null,\n fields: data.fields || [],\n color: data.color ?? (this.config.devMode ? this.config.embedColorDev : this.config.embedColor),\n timestamp: data.timestamp || null,\n acf: data.acf ?? true\n };\n\n this.build();\n }\n\n private build(): void {\n this.normalizeData();\n this.applyContextFormatting();\n this.configureEmbed();\n }\n\n private normalizeData(): void {\n if (typeof this.data.author === \"string\") {\n this.data.author = { text: this.data.author };\n }\n\n if (typeof this.data.title === \"string\") {\n this.data.title = { text: this.data.title };\n }\n\n if (typeof this.data.footer === \"string\") {\n this.data.footer = { text: this.data.footer };\n }\n\n if (this.data.timestamp === true) {\n this.data.timestamp = Date.now();\n }\n }\n\n private getContextUser(): GuildMember | User | null {\n const context = this.data.context;\n if (!context) return null;\n\n return (\n context.user ||\n (context.interaction as any)?.member ||\n (context.interaction as any)?.user ||\n context.message?.member ||\n context.message?.author ||\n null\n );\n }\n\n private getContextClient(): Vimcord | Client | null {\n const context = this.data.context;\n if (!context) return null;\n\n return context.client || context.interaction?.client || context.message?.client || null;\n }\n\n private applyContextFormatting(str?: string): string | undefined {\n if (!this.data.acf) return;\n\n const user = this.getContextUser();\n const guildMember = user instanceof GuildMember ? user : null;\n const actualUser = guildMember?.user || (user instanceof User ? user : null);\n const client = this.getContextClient();\n\n const formatString = (str: string): string => {\n if (!str || !str.includes(\"$\")) return str;\n\n return (\n str\n // User context\n .replace(/(?<!\\\\)\\$USER\\b/g, actualUser?.toString() || \"$USER\")\n .replace(/(?<!\\\\)\\$USER_NAME\\b/g, actualUser?.username || \"$USER_NAME\")\n .replace(/(?<!\\\\)\\$USER_AVATAR\\b/g, actualUser?.avatarURL() || \"$USER_AVATAR\")\n .replace(/(?<!\\\\)\\$DISPLAY_NAME\\b/g, guildMember?.displayName || \"$DISPLAY_NAME\")\n\n // Bot context\n .replace(/(?<!\\\\)\\$BOT_AVATAR\\b/g, client?.user?.avatarURL() || \"$BOT_AVATAR\")\n\n // Utility\n .replace(/(?<!\\\\)\\$INVIS\\b/g, \"\\u200B\")\n\n // Date context\n .replace(/(?<!\\\\)\\$YEAR/g, new Date().getFullYear().toString())\n .replace(/(?<!\\\\)\\$MONTH/g, String(new Date().getMonth() + 1).padStart(2, \"0\"))\n .replace(/(?<!\\\\)\\$DAY/g, String(new Date().getDate()).padStart(2, \"0\"))\n .replace(/(?<!\\\\)\\$year/g, String(new Date().getFullYear()).slice(-2))\n .replace(/(?<!\\\\)\\$month/g, String(new Date().getMonth() + 1).padStart(2, \"0\"))\n .replace(/(?<!\\\\)\\$day/g, String(new Date().getDate()).padStart(2, \"0\"))\n\n // Mentions\n .replace(/(?<!\\\\|<)@([0-9]+)(?!>)/g, \"<@$1>\")\n .replace(/(?<!\\\\|<)@&([0-9]+)(?!>)/g, \"<@&$1>\")\n .replace(/(?<!\\\\|<)#([0-9]+)(?!>)/g, \"<#$1>\")\n );\n };\n\n if (str) {\n // Apply context to the given string and return early\n return formatString(str);\n }\n\n // Apply formatting to text fields\n if (this.data.author && typeof this.data.author === \"object\") {\n this.data.author.text = formatString(this.data.author.text);\n\n // Handle author icon\n if (this.data.author.icon === true && actualUser) {\n this.data.author.icon = actualUser.avatarURL();\n } else if (typeof this.data.author.icon === \"string\") {\n this.data.author.icon = formatString(this.data.author.icon);\n }\n }\n\n if (this.data.title && typeof this.data.title === \"object\") {\n this.data.title.text = formatString(this.data.title.text);\n }\n\n if (this.data.description) {\n this.data.description = formatString(\n Array.isArray(this.data.description)\n ? this.data.description.filter(s => s !== null && s !== undefined).join(\"\\n\")\n : this.data.description\n );\n }\n\n if (this.data.footer && typeof this.data.footer === \"object\") {\n this.data.footer.text = formatString(this.data.footer.text);\n }\n\n if (this.data.thumbnailUrl) {\n this.data.thumbnailUrl = formatString(this.data.thumbnailUrl);\n }\n\n if (this.data.imageUrl) {\n this.data.imageUrl = formatString(this.data.imageUrl);\n }\n\n // Apply formatting to fields\n this.data.fields = this.data.fields.filter(Boolean).map(field => ({\n ...field,\n name: formatString(field!.name),\n value: formatString(field!.value)\n }));\n }\n\n private configureEmbed(): void {\n // Set author\n if (this.data.author && typeof this.data.author === \"object\" && this.data.author.text) {\n try {\n this.embed.setAuthor({\n name: this.data.author.text,\n iconURL: typeof this.data.author.icon === \"string\" ? this.data.author.icon : undefined,\n url: this.data.author.hyperlink || undefined\n });\n } catch (error) {\n console.error(\"[BetterEmbed] Invalid author configuration:\", error);\n }\n }\n\n // Set title\n if (this.data.title && typeof this.data.title === \"object\" && this.data.title.text) {\n try {\n this.embed.setTitle(this.data.title.text);\n if (this.data.title.hyperlink) {\n this.embed.setURL(this.data.title.hyperlink);\n }\n } catch (error) {\n console.error(\"[BetterEmbed] Invalid title configuration:\", error);\n }\n }\n\n // Set description\n if (this.data.description) {\n this.embed.setDescription(\n Array.isArray(this.data.description) ? this.data.description.join(\"\\n\") : this.data.description\n );\n }\n\n // Set thumbnail\n if (this.data.thumbnailUrl) {\n try {\n this.embed.setThumbnail(this.data.thumbnailUrl);\n } catch (error) {\n console.error(\"[BetterEmbed] Invalid thumbnail URL:\", error);\n }\n }\n\n // Set image\n if (this.data.imageUrl) {\n try {\n this.embed.setImage(this.data.imageUrl);\n } catch (error) {\n console.error(\"[BetterEmbed] Invalid image URL:\", error);\n }\n }\n\n // Set footer\n if (this.data.footer && typeof this.data.footer === \"object\" && this.data.footer.text) {\n try {\n this.embed.setFooter({\n text: this.data.footer.text,\n iconURL: typeof this.data.footer.icon === \"string\" ? this.data.footer.icon : undefined\n });\n } catch (error) {\n console.error(\"[BetterEmbed] Invalid footer configuration:\", error);\n }\n }\n\n // Set color\n if (this.data.color) {\n try {\n const color = Array.isArray(this.data.color)\n ? (this.data.color[Math.floor(Math.random() * this.data.color.length)] ?? null)\n : this.data.color;\n this.embed.setColor(color);\n } catch (error) {\n console.error(\"[BetterEmbed] Invalid color:\", error);\n }\n }\n\n // Set timestamp\n if (this.data.timestamp && this.data.timestamp !== true) {\n try {\n this.embed.setTimestamp(this.data.timestamp as Date | number);\n } catch (error) {\n console.error(\"[BetterEmbed] Invalid timestamp:\", error);\n }\n }\n\n // Set fields\n if (this.data.fields.length > 0) {\n const validFields = this.data.fields.slice(0, 25); // Discord limit\n if (this.data.fields.length > 25) {\n console.warn(\"[BetterEmbed] Only first 25 fields will be used (Discord limit)\");\n }\n this.embed.setFields(validFields as APIEmbedField[]);\n }\n }\n\n setAuthor(author: string | BetterEmbedAuthor | null): this {\n this.data.author = author;\n this.build();\n return this;\n }\n\n setTitle(title: string | BetterEmbedTitle | null): this {\n this.data.title = title;\n this.build();\n return this;\n }\n\n setDescription(description: string | null): this {\n this.data.description = description;\n this.build();\n return this;\n }\n\n setThumbnail(url: string | null): this {\n this.data.thumbnailUrl = url;\n this.build();\n return this;\n }\n\n setImage(url: string | null): this {\n this.data.imageUrl = url;\n this.build();\n return this;\n }\n\n setFooter(footer: string | BetterEmbedFooter | null): this {\n this.data.footer = footer;\n this.build();\n return this;\n }\n\n setColor(color: ColorResolvable | ColorResolvable[] | null): this {\n this.data.color = color;\n this.build();\n return this;\n }\n\n setTimestamp(timestamp: number | boolean | Date | null): this {\n this.data.timestamp = timestamp;\n this.build();\n return this;\n }\n\n addFields(fields: APIEmbedField[]): this {\n this.data.fields = [...this.data.fields, ...fields];\n this.build();\n return this;\n }\n\n setFields(fields: APIEmbedField[]): this {\n this.data.fields = fields;\n this.build();\n return this;\n }\n\n spliceFields(index: number, deleteCount: number, ...fields: APIEmbedField[]): this {\n this.data.fields.splice(index, deleteCount, ...fields);\n this.build();\n return this;\n }\n\n clone(overrides: Partial<BetterEmbedData> = {}): BetterEmbed {\n return new BetterEmbed({ ...this.data, ...overrides });\n }\n\n toJSON(): APIEmbed {\n return this.embed.toJSON();\n }\n\n async send(\n handler: SendHandler,\n options: DynaSendOptions = {},\n overrides?: Partial<BetterEmbedData>\n ): Promise<Message | null> {\n this.build();\n\n // Apply ACF to message content\n if (options.content && this.data.acf) {\n options.content = this.applyContextFormatting(options.content) as string;\n }\n\n return await dynaSend(handler, {\n ...options,\n embeds: [\n overrides ? this.clone(overrides) : this,\n ...(Array.isArray(options?.embeds) ? options?.embeds : options?.embeds ? [options?.embeds] : [])\n ]\n });\n }\n}\n","import {\n ActionRowBuilder,\n APIContainerComponent,\n BaseChannel,\n BaseInteraction,\n BaseMessageOptions,\n ContainerBuilder,\n ForwardOptions,\n GuildMember,\n GuildTextBasedChannel,\n InteractionCallbackResponse,\n InteractionReplyOptions,\n Message,\n MessageActionRowComponentBuilder,\n MessageMentionOptions,\n PollData,\n RepliableInteraction,\n ReplyOptions,\n StickerResolvable,\n User\n} from \"discord.js\";\nimport { EmbedResolvable, SendHandler, SendMethod } from \"./types\";\nimport { BetterContainer } from \"./BetterContainer\";\n\ntype Mutable<T> = {\n -readonly [P in keyof T]: T[P];\n};\n\nexport type SendableComponent = ContainerBuilder | BetterContainer | ActionRowBuilder<MessageActionRowComponentBuilder>;\nexport type RequiredDynaSendOptions = DynaSendOptions &\n (\n | { content: string }\n | { embeds: DynaSendOptions[\"embeds\"] }\n | { components: DynaSendOptions[\"components\"] }\n | { files: Mutable<BaseMessageOptions[\"files\"]> }\n | { stickers: StickerResolvable[] }\n | { poll: PollData }\n | { forward: ForwardOptions }\n );\n\nexport interface DynaSendOptions {\n /** The method used to send the message - auto-detected if not provided */\n sendMethod?: SendMethod;\n /** Text content to send in the message */\n content?: string;\n /** Embeds to send with the message */\n embeds?: EmbedResolvable[];\n /** Components to send with the message */\n components?: SendableComponent[];\n /** Attachments to send with the message */\n files?: Mutable<BaseMessageOptions[\"files\"]>;\n /** Stickers to send with the message */\n stickers?: StickerResolvable[];\n /** Send a poll */\n poll?: PollData;\n /** Interaction flags */\n flags?: InteractionReplyOptions[\"flags\"];\n /** Return the message after replying to or editing an interaction */\n withResponse?: boolean;\n /** Mention types allowed for the message */\n allowedMentions?: MessageMentionOptions;\n /** The message to reply to */\n reply?: ReplyOptions;\n /** Forward a message */\n forward?: ForwardOptions;\n /** Send as a TTS message */\n tts?: boolean;\n /** Time in milliseconds before deleting the message */\n deleteAfter?: number;\n}\n\nexport class DynaSend {\n private static forceArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n }\n\n private static isInteractionCallback(obj: any): obj is InteractionCallbackResponse {\n return obj instanceof InteractionCallbackResponse;\n }\n\n private static filterFlags(\n flags: InteractionReplyOptions[\"flags\"],\n excludeFlags: string[]\n ): InteractionReplyOptions[\"flags\"] {\n if (!flags) return undefined;\n const flagArray = this.forceArray(flags);\n return flagArray.filter(flag => !excludeFlags.includes(flag as string));\n }\n\n private static detectSendMethod(handler: SendHandler): SendMethod {\n if (handler instanceof BaseInteraction) {\n return handler.replied || handler.deferred ? SendMethod.EditReply : SendMethod.Reply;\n }\n if (handler instanceof BaseChannel) return SendMethod.Channel;\n if (handler instanceof Message) return SendMethod.MessageReply;\n if (handler instanceof GuildMember || handler instanceof User) return SendMethod.User;\n\n throw new Error(\"[DynaSend] Unable to determine send method for handler type\");\n }\n\n private static validateSendMethod(handler: SendHandler, method: SendMethod): void {\n const interactionMethods = [SendMethod.Reply, SendMethod.EditReply, SendMethod.FollowUp];\n\n if (interactionMethods.includes(method) && !(handler instanceof BaseInteraction)) {\n throw new TypeError(`[DynaSend] SendMethod '${SendMethod[method]}' requires BaseInteraction handler`);\n }\n\n if (method === SendMethod.Channel && !(handler instanceof BaseChannel)) {\n throw new TypeError(`[DynaSend] SendMethod '${SendMethod[method]}' requires BaseChannel handler`);\n }\n\n if ([SendMethod.MessageReply, SendMethod.MessageEdit].includes(method) && !(handler instanceof Message)) {\n throw new TypeError(`[DynaSend] SendMethod '${SendMethod[method]}' requires Message handler`);\n }\n\n if (method === SendMethod.User && !(handler instanceof GuildMember || handler instanceof User)) {\n throw new TypeError(`[DynaSend] SendMethod '${SendMethod[method]}' requires User or GuildMember handler`);\n }\n }\n\n private static createMessageData(options: DynaSendOptions, method: SendMethod): any {\n const baseData = {\n content: options.content,\n embeds: options.embeds,\n components: options.components,\n files: options.files,\n allowedMentions: options.allowedMentions,\n tts: options.tts\n };\n\n switch (method) {\n case SendMethod.Reply:\n return {\n ...baseData,\n flags: options.flags,\n withResponse: options.withResponse,\n poll: options.poll\n };\n\n case SendMethod.EditReply:\n return {\n ...baseData,\n flags: this.filterFlags(options.flags, [\"Ephemeral\", \"SuppressNotifications\"]),\n withResponse: options.withResponse,\n poll: options.poll\n };\n\n case SendMethod.FollowUp:\n return {\n ...baseData,\n flags: options.flags,\n withResponse: options.withResponse,\n poll: options.poll\n };\n\n case SendMethod.Channel:\n return {\n ...baseData,\n flags: this.filterFlags(options.flags, [\"Ephemeral\"]),\n poll: options.poll,\n stickers: options.stickers,\n reply: options.reply\n };\n\n case SendMethod.MessageReply:\n return {\n ...baseData,\n flags: this.filterFlags(options.flags, [\"Ephemeral\"]),\n poll: options.poll,\n stickers: options.stickers\n };\n\n case SendMethod.MessageEdit:\n return {\n ...baseData,\n flags: this.filterFlags(options.flags, [\"Ephemeral\", \"SuppressNotifications\"])\n };\n\n case SendMethod.User:\n return {\n ...baseData,\n flags: this.filterFlags(options.flags, [\"Ephemeral\"]),\n poll: options.poll,\n forward: options.forward,\n stickers: options.stickers\n };\n\n default:\n return baseData;\n }\n }\n\n private static async executeSend(handler: SendHandler, method: SendMethod, data: any): Promise<Message | null> {\n try {\n switch (method) {\n case SendMethod.Reply: {\n const response = await (handler as RepliableInteraction).reply(data);\n return this.isInteractionCallback(response) ? (response.resource?.message ?? null) : null;\n }\n\n case SendMethod.EditReply:\n return await (handler as RepliableInteraction).editReply(data);\n\n case SendMethod.FollowUp:\n return await (handler as RepliableInteraction).followUp(data);\n\n case SendMethod.Channel:\n return await (handler as GuildTextBasedChannel).send(data);\n\n case SendMethod.MessageReply:\n return await (handler as Message).reply(data);\n\n case SendMethod.MessageEdit: {\n const message = handler as Message;\n if (!message.editable) {\n console.warn(\"[DynaSend] Message is not editable\");\n return null;\n }\n return await message.edit(data);\n }\n\n case SendMethod.User:\n return await (handler as GuildMember | User).send(data);\n\n default:\n throw new Error(`[DynaSend] Unknown send method '${method}'`);\n }\n } catch (error) {\n console.error(`[DynaSend] Error with method '${SendMethod[method]}':`, error);\n return null;\n }\n }\n\n private static scheduleDelete(message: Message, delay: number): void {\n if (delay < 1000) {\n console.warn(`[DynaSend] Delete delay is less than 1 second (${delay}ms). Is this intentional?`);\n }\n\n setTimeout(async () => {\n try {\n if (message.deletable) {\n await message.delete();\n }\n } catch (error) {\n console.error(\"[DynaSend] Error deleting message:\", error);\n }\n }, delay);\n }\n\n static async send(handler: SendHandler, options: RequiredDynaSendOptions): Promise<Message | null> {\n // Determine send method\n const sendMethod = options.sendMethod ?? this.detectSendMethod(handler);\n\n // Validate the combination\n this.validateSendMethod(handler, sendMethod);\n\n // Create message data\n const messageData = this.createMessageData(options, sendMethod);\n\n // Execute the send\n const message = await this.executeSend(handler, sendMethod, messageData);\n\n // Schedule deletion if requested\n if (options.deleteAfter && message) {\n this.scheduleDelete(message, options.deleteAfter);\n }\n\n return message;\n }\n}\n\nexport async function dynaSend(handler: SendHandler, options: RequiredDynaSendOptions): Promise<Message | null> {\n return DynaSend.send(handler, options);\n}\n","import {\n CommandInteraction,\n DMChannel,\n EmbedBuilder,\n GuildMember,\n Message,\n NewsChannel,\n RepliableInteraction,\n TextBasedChannel,\n TextChannel,\n ThreadChannel,\n User\n} from \"discord.js\";\nimport { BetterEmbed } from \"./BetterEmbed\";\n\nexport enum SendMethod {\n Reply = 0,\n EditReply = 1,\n FollowUp = 2,\n Channel = 3,\n MessageReply = 4,\n MessageEdit = 5,\n User = 6\n}\n\nexport type SendHandler = CommandInteraction | RepliableInteraction | TextBasedChannel | Message | GuildMember | User;\nexport type InteractionBasedSendHandler = CommandInteraction | RepliableInteraction;\n\nexport type EmbedResolvable = EmbedBuilder | BetterEmbed;\nexport type InteractionResolveable = CommandInteraction | RepliableInteraction;\nexport type UserResolvable = GuildMember | User | string;\n\nexport type SendableTextChannel = DMChannel | TextChannel | NewsChannel | ThreadChannel;\n","export async function retryExponentialBackoff<T>(\n fn: (attempt: number) => Promise<T>,\n maxRetries = 3,\n retryDelay = 1_000\n): Promise<T> {\n let attempts = 0;\n\n while (true) {\n try {\n return await fn(attempts);\n } catch (error) {\n if (attempts >= maxRetries) throw error;\n await new Promise(resolve => setTimeout(resolve, Math.pow(1.75, attempts) * retryDelay + Math.random() * 500));\n attempts++;\n }\n }\n}\n","{\n \"name\": \"vimcord\",\n \"version\": \"1.0.1\",\n \"description\": \"A powerful Discord.js wrapper.\",\n \"license\": \"MIT\",\n \"author\": \"xsqu1znt\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\",\n \"default\": \"./dist/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"check\": \"tsc --noEmit\",\n \"format\": \"prettier --write \\\"./**/*.{ts,json}\\\"\"\n },\n \"dependencies\": {\n \"axios\": \"^1.13.2\",\n \"chalk\": \"^4.1.2\",\n \"discord.js\": \"^14.25.1\",\n \"dotenv\": \"^16.6.1\",\n \"jstools\": \"github:xsqu1znt/jsTools\",\n \"lodash\": \"^4.17.21\",\n \"node-cron\": \"^4.2.1\"\n },\n \"devDependencies\": {\n \"@types/lodash\": \"^4.17.21\",\n \"@types/node\": \"^22.19.2\",\n \"mongoose\": \"^8.20.2\",\n \"prettier\": \"^3.7.4\",\n \"tsup\": \"^8.5.1\",\n \"type-fest\": \"^4.41.0\",\n \"typescript\": \"^5.9.3\"\n },\n \"peerDependencies\": {\n \"discord.js\": \"^14.0.0\",\n \"mongoose\": \"^8.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"discord.js\": {\n \"optional\": false\n },\n \"mongoose\": {\n \"optional\": true\n }\n }\n}\n","/* Check if Mongoose is installed */\ntry {\n import(\"mongoose\");\n} catch {\n throw new Error(\"MongoDatabase requires the mongoose package, install it with `npm install mongoose`\");\n}\n\nimport { retryExponentialBackoff } from \"@/utils/async\";\nimport { randomUUID } from \"node:crypto\";\nimport { type Vimcord } from \"@/client\";\nimport EventEmitter from \"node:events\";\nimport mongoose, { ClientSessionOptions } from \"mongoose\";\n\ninterface MongoConnectionOptions {\n /** The maximum number of attempts to connect to MongoDB @defaultValue `3` */\n maxRetries?: number;\n}\n\nconst globalInstanceEmitter = new EventEmitter<{ created: [MongoDatabase]; connected: [MongoDatabase] }>();\nconst instances: MongoDatabase[] = [];\n\nexport async function useMongoDatabase(instanceIndex?: number) {\n const instance = instances.at(instanceIndex ?? 0);\n\n if (!instance) {\n return new Promise<MongoDatabase>((resolve, reject) => {\n // 45 second timeout\n const timeout = setTimeout(() => reject(\"useMongoDatabase timed out\"), 45_000);\n\n globalInstanceEmitter.once(\"connected\", mdb => {\n clearTimeout(timeout);\n resolve(mdb);\n });\n });\n }\n\n return instance;\n}\n\nexport async function useReadyMongoDatabase(instanceIndex?: number) {\n const instance = await useMongoDatabase(instanceIndex);\n await instance.waitForReady();\n return instance;\n}\n\nexport async function createMongoSession(instanceIndex?: number, options?: ClientSessionOptions) {\n const instance = await useReadyMongoDatabase(instanceIndex);\n return instance.mongoose.startSession(options);\n}\n\nexport class MongoDatabase {\n readonly name: string = \"MongoDatabase\";\n readonly uuid: string = randomUUID();\n readonly index: number;\n private uri: string | undefined;\n\n mongoose: mongoose.Mongoose;\n private eventEmitter = new EventEmitter<{ ready: [] }>();\n\n private isReady = false;\n private isConnecting = false;\n\n constructor(\n public client: Vimcord,\n options?: mongoose.MongooseOptions\n ) {\n this.mongoose = new mongoose.Mongoose(options);\n this.index = instances.length - 1;\n instances.push(this);\n\n globalInstanceEmitter.emit(\"created\", this);\n }\n\n async waitForReady(): Promise<boolean> {\n if (!this.isReady && this.isConnecting) {\n return new Promise(resolve => this.eventEmitter.once(\"ready\", () => resolve(this.isReady)));\n }\n return this.isReady;\n }\n\n async connect(\n uri?: string,\n connectionOptions?: mongoose.ConnectOptions,\n options?: MongoConnectionOptions\n ): Promise<boolean> {\n if (!this.isReady && this.isConnecting) {\n return new Promise(resolve => this.eventEmitter.once(\"ready\", () => resolve(true)));\n }\n\n // If already connected, return the existing connection\n if (this.mongoose.connection?.readyState === 1) {\n return true;\n }\n\n uri ??= this.uri || this.client.config.app.devMode ? process.env.MONGO_URI_DEV : process.env.MONGO_URI;\n options = { ...options, maxRetries: options?.maxRetries ?? 3 };\n\n if (!uri) {\n throw new Error(\n `MONGO_URI Missing: ${this.client.config.app.devMode ? \"DEV MODE is enabled, but MONGO_URI_DEV is not set\" : \"MONGO_URI not set\"}`\n );\n }\n\n this.uri = uri;\n this.isReady = false;\n this.isConnecting = true;\n\n try {\n const stopLoader = this.client.logger.loader(\"Connecting to MongoDB...\");\n await retryExponentialBackoff(\n attempt => {\n return this.mongoose.connect(uri, {\n serverSelectionTimeoutMS: 30000,\n socketTimeoutMS: 45000,\n connectTimeoutMS: 30000,\n maxPoolSize: 10,\n minPoolSize: 5,\n bufferCommands: false,\n ...connectionOptions\n });\n },\n options.maxRetries,\n 1_000\n );\n\n this.isReady = true;\n this.eventEmitter.emit(\"ready\");\n globalInstanceEmitter.emit(\"connected\", this);\n stopLoader(\"Connected to MongoDB \");\n } catch (err) {\n this.client.logger.error(`Failed to connect to MongoDB after ${options.maxRetries} attempt(s)`, err as Error);\n }\n\n this.isConnecting = false;\n return true;\n }\n}\n","/* Check if Mongoose is installed */\ntry {\n import(\"mongoose\");\n} catch {\n throw new Error(\"MongoSchemaBuilder requires the mongoose package, install it with `npm install mongoose`\");\n}\n\nimport mongoose, {\n AggregateOptions,\n CreateOptions,\n HydratedDocument,\n Model,\n mongo,\n MongooseBaseQueryOptions,\n MongooseUpdateQueryOptions,\n PipelineStage,\n ProjectionType,\n QueryOptions,\n Require_id,\n RootFilterQuery,\n Schema,\n SchemaDefinition,\n UpdateQuery\n} from \"mongoose\";\nimport { type MongoDatabase, useMongoDatabase } from \"@/modules/db/mongo/mongo\";\nimport { retryExponentialBackoff } from \"@/utils/async\";\nimport { randomBytes } from \"node:crypto\";\nimport { Logger } from \"@/tools/Logger\";\nimport EventEmitter from \"node:events\";\n\nexport type ExtractReturn<T> = T extends (this: any, ...args: any) => infer R ? Awaited<R> : never;\nexport type LeanOrHydratedDocument<T, O extends QueryOptions<T>> = O[\"lean\"] extends false\n ? HydratedDocument<T>\n : Require_id<T>;\n\nexport interface MongoSchemaEvents {\n initialized: [];\n ready: [boolean];\n error: [Error];\n}\n\nexport interface MongoSchemaOptions {\n connectionIndex?: number;\n}\n\nexport function createMongoSchema<Definition extends object>(\n collection: string,\n definition: SchemaDefinition<Definition>,\n options?: MongoSchemaOptions\n): MongoSchemaBuilder<Definition> {\n return new MongoSchemaBuilder(collection, definition, options);\n}\n\nexport class MongoSchemaBuilder<Definition extends object> {\n schema!: Schema<Definition>;\n model!: Model<Definition>;\n\n database: MongoDatabase | null = null;\n connectionIndex: number = 0;\n\n isReady: boolean = false;\n isInitializing: boolean = false;\n eventEmitter = new EventEmitter<MongoSchemaEvents>();\n\n logger: Logger;\n\n constructor(collection: string, definition: SchemaDefinition<Definition>, options?: MongoSchemaOptions) {\n this.connectionIndex = options?.connectionIndex ?? this.connectionIndex;\n\n // Initialize a custom logger instance\n this.logger = new Logger({\n prefixEmoji: \"🥭\",\n prefix: `MongoSchema (c${this.connectionIndex}) [${collection}]`,\n colors: { primary: \"#F29B58\" }\n });\n\n /* Set up event handlers */\n this.eventEmitter.once(\"initialized\", () => {\n if (this.database) {\n /* Create the schema and model */\n this.schema = new Schema(definition, { versionKey: false });\n this.model = this.database.mongoose.model(collection, this.schema) as Model<Definition>;\n this.eventEmitter.emit(\"ready\", true);\n } else {\n this.eventEmitter.emit(\"error\", new Error(`MongoDatabase (c${this.connectionIndex}) not found`));\n }\n });\n\n this.eventEmitter.on(\"ready\", ready => {\n this.isReady = ready;\n\n // Verbose logging\n if (this.database?.client.config.app.verbose) {\n this.logger.debug(`Loaded! | ${this.database?.client.config.app.name}`);\n }\n });\n\n this.eventEmitter.on(\"error\", error => this.logger.error(\"Error:\", error));\n\n // Finish initialization\n this.init().catch(error => {\n this.eventEmitter.emit(\"error\", error);\n });\n }\n\n private async init() {\n if (this.isInitializing) return;\n this.isInitializing = true;\n\n try {\n const database = await useMongoDatabase(this.connectionIndex);\n if (!database) {\n throw new Error(\"Could not use MongoDatabase\");\n }\n\n // Set our database reference\n this.database = database;\n\n this.eventEmitter.emit(\"initialized\");\n } catch (err) {\n this.eventEmitter.emit(\"error\", err as Error);\n } finally {\n this.isInitializing = false;\n }\n }\n\n extend<Extra extends Record<string, (...args: any) => any>>(\n extras: Extra & ThisType<MongoSchemaBuilder<Definition>>\n ): MongoSchemaBuilder<Definition> & Extra {\n for (const [key, fn] of Object.entries(extras as any)) {\n if (typeof fn === \"function\") {\n (this as any)[key] = function (...args: any[]) {\n return fn.call(this, ...args);\n };\n }\n }\n\n return this as any as MongoSchemaBuilder<Definition> & Extra;\n }\n\n on<K extends keyof MongoSchemaEvents>(event: K, listener: (...args: MongoSchemaEvents[K]) => void) {\n this.eventEmitter.on(event, listener as any);\n return this;\n }\n\n once<K extends keyof MongoSchemaEvents>(event: K, listener: (...args: MongoSchemaEvents[K]) => void) {\n this.eventEmitter.once(event, listener as any);\n return this;\n }\n\n off<K extends keyof MongoSchemaEvents>(event: K, listener: (...args: MongoSchemaEvents[K]) => void) {\n this.eventEmitter.off(event, listener as any);\n return this;\n }\n\n /** Execute a function while ensuring the connection is ready. On error it will retry using an exponential backoff. */\n async execute<T extends (...args: any) => any>(fn: T) {\n try {\n // Check ready\n if (!this.isReady) {\n await new Promise<void>((resolve, reject) => {\n // 45 second timeout\n const timeout = setTimeout(() => reject(\"execution wait for ready timed out\"), 45_000);\n\n this.eventEmitter.once(\"ready\", () => {\n clearTimeout(timeout);\n resolve();\n });\n\n this.eventEmitter.once(\"error\", error => {\n clearTimeout(timeout);\n reject(error);\n });\n });\n }\n\n // Check our database reference\n if (!this.database) {\n throw new Error(\"MongoDB connection not found\");\n }\n\n return await retryExponentialBackoff(async () => (await fn()) as ExtractReturn<T>);\n } catch (err) {\n this.eventEmitter.emit(\"error\", err as Error);\n }\n }\n\n async createHexId(bytes: number, path: keyof Require_id<Definition>, maxRetries: number = 10) {\n return await this.execute(async () => {\n const createHex = () => Buffer.from(randomBytes(bytes)).toString(\"hex\");\n\n let id = createHex();\n let tries = 0;\n\n while (await this.model.exists({ [path]: id } as Partial<Require_id<Definition>>)) {\n if (tries >= maxRetries) throw Error(`Failed to generate a unique hex ID after ${tries} attempt(s)`);\n id = createHex();\n tries++;\n }\n\n return id;\n });\n }\n\n async count(\n filter?: RootFilterQuery<Definition>,\n options?: mongo.CountOptions & MongooseBaseQueryOptions<Definition> & mongo.Abortable\n ) {\n return await this.execute(async () => {\n return this.model.countDocuments(filter, options);\n });\n }\n\n async exists(filter: RootFilterQuery<Definition>) {\n return await this.execute(async () => {\n return (await this.model.exists(filter)) ? true : false;\n });\n }\n\n async create(query: Partial<Require_id<Definition>>[], options?: CreateOptions) {\n return (\n (await this.execute(async () => {\n return this.model.create(query, options);\n })) ?? []\n );\n }\n\n async upsert(\n filter: RootFilterQuery<Definition>,\n query: Partial<Require_id<Definition>>,\n options?: QueryOptions<Definition>\n ) {\n return await this.execute(async () => {\n return this.model.findOneAndUpdate(filter, query, { ...options, upsert: true, new: true });\n });\n }\n\n async delete(filter: RootFilterQuery<Definition>, options?: mongo.DeleteOptions & MongooseBaseQueryOptions<Definition>) {\n return await this.execute(async () => {\n return this.model.deleteOne(filter, options);\n });\n }\n\n async deleteAll(\n filter: RootFilterQuery<Definition>,\n options?: mongo.DeleteOptions & MongooseBaseQueryOptions<Definition>\n ) {\n return await this.execute(async () => {\n return this.model.deleteMany(filter, options);\n });\n }\n\n async distinct<K extends keyof Require_id<Definition> & string>(\n key: K,\n filter?: RootFilterQuery<Definition>,\n options?: QueryOptions<Definition>\n ) {\n return await this.execute(async () => {\n return this.model.distinct(key, filter, options);\n });\n }\n\n async fetch<Options extends QueryOptions<Definition>>(\n filter?: RootFilterQuery<Definition>,\n projection?: ProjectionType<Definition>,\n options?: Options\n ): Promise<LeanOrHydratedDocument<Definition, Options> | null | undefined> {\n return await this.execute(async () => {\n return this.model.findOne(filter, projection, { ...options, lean: options?.lean ?? true });\n });\n }\n\n async fetchAll<Options extends QueryOptions<Definition>>(\n filter: RootFilterQuery<Definition>,\n projection?: ProjectionType<Definition>,\n options?: Options\n ): Promise<LeanOrHydratedDocument<Definition, Options>[]> {\n return (\n (await this.execute(async () => {\n return this.model.find(filter, projection, { ...options, lean: options?.lean ?? true });\n })) || []\n );\n }\n\n async update<Options extends QueryOptions<Definition>>(\n filter: RootFilterQuery<Definition>,\n update: UpdateQuery<Definition>,\n options?: Options\n ): Promise<LeanOrHydratedDocument<Definition, Options> | null | undefined> {\n return await this.execute(async () => {\n return this.model.findOneAndUpdate(filter, update, { ...options, lean: options?.lean ?? true });\n });\n }\n\n async updateAll(\n filter: RootFilterQuery<Definition>,\n update: UpdateQuery<Definition>,\n options?: mongo.UpdateOptions & MongooseUpdateQueryOptions<Definition>\n ) {\n return await this.execute(async () => {\n return this.model.updateMany(filter, update, options);\n });\n }\n\n async aggregate<T extends any>(pipeline: PipelineStage[], options?: AggregateOptions): Promise<T[]> {\n return (await this.execute(async () => {\n const result = await this.model.aggregate(pipeline, options);\n return result?.length ? result : [];\n })) as T[];\n }\n}\n","import { globalVimcordToolsConfig, VimcordToolsConfig } from \"@/configs/tools.config\";\nimport {\n CollectedMessageInteraction,\n InteractionCollector,\n MappedInteractionTypes,\n Message,\n MessageComponentType,\n UserResolvable\n} from \"discord.js\";\n\ntype Func = (...args: any[]) => any;\ntype Listener = { fn: Func; options?: ListenerOptions };\n\nexport interface BetterCollectorOptions<T extends MessageComponentType> {\n type?: T;\n participants?: UserResolvable[];\n idle?: number;\n timeout?: number;\n /** Run listeners in sequence, awaiting each other */\n sequential?: boolean;\n /** Prevent a user from triggering another interaction until their previous one is resolved */\n userLock?: boolean;\n max?: number;\n maxComponents?: number;\n maxUsers?: number;\n onTimeout?: CollectorTimeoutType;\n config?: VimcordToolsConfig;\n}\n\nexport interface ListenerOptions {\n participants?: UserResolvable[];\n defer?: boolean | { update?: boolean; ephemeral?: boolean };\n}\n\nexport enum CollectorTimeoutType {\n DisableComponents = 0,\n DeleteMessage = 1,\n DoNothing = 2\n}\n\nexport class BetterCollector<ComponentType extends MessageComponentType, InGuild extends boolean = boolean> {\n message?: Message;\n collector?: InteractionCollector<MappedInteractionTypes<InGuild>[ComponentType]>;\n options?: BetterCollectorOptions<ComponentType>;\n\n private activeUsers = new Set<string>();\n private participantWarningCooldowns = new Map<string, number>();\n private config: VimcordToolsConfig;\n\n private events: { collectId: Map<string, Listener[]>; collect: Listener[]; end: Listener[]; timeout: Listener[] } = {\n collectId: new Map(),\n collect: [],\n end: [],\n timeout: []\n };\n\n static create<T extends MessageComponentType>(message: Message | undefined | null, options: BetterCollectorOptions<T>) {\n return new BetterCollector<T, boolean>(message, options);\n }\n\n private async validateParticipant(interaction: CollectedMessageInteraction, participants?: UserResolvable[]) {\n const allowedParticipants = participants || this.options?.participants || [];\n if (!allowedParticipants.length) return true;\n\n const isAllowed = allowedParticipants.some(user => {\n if (typeof user === \"string\") return user === interaction.user.id;\n if (typeof user === \"object\" && \"id\" in user) return user.id === interaction.user.id;\n return false;\n });\n\n if (!isAllowed) {\n const now = Date.now();\n const lastWarned = this.participantWarningCooldowns.get(interaction.user.id) || 0;\n\n if (now - lastWarned > this.config.collector.notAParticipantWarningCooldown) {\n this.participantWarningCooldowns.set(interaction.user.id, now);\n\n if (this.config.collector.notAParticipantMessage) {\n await interaction\n .reply({\n content: this.config.collector.notAParticipantMessage,\n flags: \"Ephemeral\"\n })\n .catch(() => {});\n } else {\n await interaction.deferUpdate().catch(() => {});\n }\n } else {\n // NOTE: They are spamming, acknowledge silently\n await interaction.deferUpdate().catch(() => {});\n }\n }\n\n return isAllowed;\n }\n\n private build() {\n if (!this.message) return;\n if (this.collector) return;\n\n // Build and configure the collector\n this.collector = this.message.createMessageComponentCollector({\n idle: this.options?.idle ?? this.config.timeouts.collectorIdle,\n time: this.options?.timeout ?? this.config.timeouts.collectorTimeout,\n componentType: this.options?.type,\n max: this.options?.max,\n maxComponents: this.options?.maxComponents,\n maxUsers: this.options?.maxUsers\n });\n\n this.setupListeners();\n }\n\n private setupListeners() {\n if (!this.collector) return;\n\n this.collector.on(\"collect\", async interaction => {\n // Check if user is locked\n if (this.options?.userLock && this.activeUsers.has(interaction.user.id)) {\n return interaction\n .reply({ content: this.config.collector.userLockMessage, flags: \"Ephemeral\" })\n .catch(() => {});\n }\n\n if (this.options?.userLock) {\n this.activeUsers.add(interaction.user.id);\n }\n\n const globalListeners = this.events.collect;\n const idListeners = this.events.collectId.get(interaction.customId) || [];\n const allListeners = [...globalListeners, ...idListeners];\n\n const shouldBeDeferred = allListeners.find(l => l.options?.defer)?.options?.defer;\n\n /* Identify who is allowed to run */\n const validListeners = [];\n for (const listener of allListeners) {\n const isAllowed = await this.validateParticipant(interaction, listener.options?.participants);\n if (isAllowed) validListeners.push(listener);\n }\n\n // Nobody is allowed to run this interaction\n if (validListeners.length === 0) return;\n\n try {\n if (shouldBeDeferred) {\n if (typeof shouldBeDeferred === \"object\") {\n if (shouldBeDeferred.update) {\n await interaction.deferUpdate().catch(Boolean);\n } else {\n await interaction.deferReply({ ephemeral: shouldBeDeferred.ephemeral }).catch(Boolean);\n }\n } else {\n await interaction.deferReply().catch(Boolean);\n }\n }\n\n // Sequential Execution\n if (this.options?.sequential) {\n for (const listener of allListeners) {\n try {\n const isAllowed = await this.validateParticipant(interaction, listener.options?.participants);\n if (!isAllowed) return;\n await listener.fn(interaction);\n } catch (err) {\n this.handleListenerError(err);\n }\n }\n }\n // Parallel Execution\n else {\n Promise.all(\n allListeners.map(l => {\n const isAllowed = this.validateParticipant(interaction, l.options?.participants);\n if (!isAllowed) return;\n return l.fn(interaction).catch(this.handleListenerError);\n })\n );\n }\n } finally {\n if (this.options?.userLock) {\n this.activeUsers.delete(interaction.user.id);\n }\n }\n });\n\n this.collector.on(\"end\", async (collected, reason) => {\n // Sequential Execution\n if (this.options?.sequential) {\n for (const listener of this.events.end) {\n try {\n await listener.fn(collected, reason);\n } catch (err) {\n this.handleListenerError(err);\n }\n }\n }\n // Parallel Execution\n else {\n Promise.all(this.events.end.map(l => l.fn(collected, reason).catch(this.handleListenerError)));\n }\n\n switch (this.options?.onTimeout) {\n case CollectorTimeoutType.DisableComponents:\n if (!this.message?.editable) break;\n\n try {\n // Map through rows and components to set disabled: true\n const disabledRows = this.message.components.map(row => {\n // We use toJSON() to get a plain object we can modify\n const updatedRow = row.toJSON();\n if (\"components\" in updatedRow) {\n updatedRow.components = updatedRow.components.map(component => ({\n ...component,\n disabled: true\n })) as any;\n }\n return updatedRow;\n });\n\n await this.message.edit({ components: disabledRows });\n } catch (err) {\n // Fail silently if the message was deleted\n if (!(err instanceof Error && err.message.includes(\"Unknown Message\"))) {\n this.handleListenerError(err);\n }\n }\n break;\n\n case CollectorTimeoutType.DeleteMessage:\n if (!this.message?.deletable) break;\n await this.message.delete().catch(Boolean);\n break;\n\n case CollectorTimeoutType.DoNothing:\n default:\n break;\n }\n });\n }\n\n private handleListenerError(err: unknown) {\n console.error(\"[BetterCollector] Listener Error:\", err);\n }\n\n constructor(message: Message | undefined | null, options?: BetterCollectorOptions<ComponentType>) {\n this.config = options?.config || globalVimcordToolsConfig;\n this.message = message || undefined;\n this.options = options;\n this.build();\n }\n\n /** Triggers on any interaction */\n on(fn: (interaction: MappedInteractionTypes<InGuild>[ComponentType]) => any, options?: ListenerOptions): this;\n /** Triggers when the interaction's customId matches */\n on(\n customId: string,\n fn: (interaction: MappedInteractionTypes<InGuild>[ComponentType]) => any,\n options?: ListenerOptions\n ): this;\n on(idOrFunc: string | Func, fnOrOptions?: Func | ListenerOptions, options?: ListenerOptions): this {\n let finalFn: Func;\n let finalOptions: ListenerOptions | undefined;\n let customId: string | undefined;\n\n if (typeof idOrFunc === \"function\") {\n // Handles: on(fn, options)\n finalFn = idOrFunc;\n finalOptions = fnOrOptions as ListenerOptions;\n } else {\n // Handles: on(customId, fn, options)\n if (typeof fnOrOptions !== \"function\") {\n throw new Error(\"[BetterCollector] Second argument must be a function when a customId is provided.\");\n }\n customId = idOrFunc;\n finalFn = fnOrOptions;\n finalOptions = options;\n }\n\n if (customId) {\n const listeners = this.events.collectId.get(customId) || [];\n listeners.push({ fn: finalFn, options: finalOptions });\n this.events.collectId.set(customId, listeners);\n } else {\n this.events.collect.push({ fn: finalFn, options: finalOptions });\n }\n\n return this;\n }\n\n onEnd(\n fn: (collected: MappedInteractionTypes<InGuild>[ComponentType][], reason: string) => any,\n options?: ListenerOptions\n ) {\n this.events.end.push({ fn, options });\n return this;\n }\n\n /** Manually stop the collector and trigger cleanup */\n stop(reason: string = \"manual\") {\n this.collector?.stop(reason);\n }\n}\n","import {\n ActionRowBuilder,\n APIThumbnailComponent,\n ButtonBuilder,\n ButtonComponentData,\n ContainerBuilder,\n Message,\n MessageActionRowComponentBuilder,\n ThumbnailBuilder\n} from \"discord.js\";\nimport { globalVimcordToolsConfig, VimcordToolsConfig } from \"@/configs/tools.config\";\nimport { DynaSendOptions, dynaSend } from \"./dynaSend\";\nimport { SendHandler } from \"./types\";\n\nexport interface BetterContainerData {\n color?: string | string[] | null;\n config?: VimcordToolsConfig;\n}\n\nexport class BetterContainer {\n private container = new ContainerBuilder();\n private data: Required<Omit<BetterContainerData, \"config\">>;\n private config: VimcordToolsConfig;\n\n constructor(data: BetterContainerData = {}) {\n this.config = data.config || globalVimcordToolsConfig;\n\n this.data = {\n color:\n data.color ??\n (this.config.devMode ? (this.config.embedColorDev as string[]) : (this.config.embedColor as string[])),\n ...data\n };\n\n this.build();\n }\n\n private configure() {\n // Color\n if (this.data.color) {\n try {\n const color = Array.isArray(this.data.color)\n ? (this.data.color[Math.floor(Math.random() * this.data.color.length)] ?? null)\n : this.data.color;\n\n if (color) {\n this.container.setAccentColor(parseInt(color.replace(\"#\", \"\"), 16));\n } else {\n this.container.clearAccentColor();\n }\n } catch (error) {\n console.error(\"[BetterContainer] Invalid color:\", error);\n }\n }\n }\n\n build() {\n this.configure();\n }\n\n addSeparator(options?: { divider?: boolean; spacing?: number }): this {\n this.container.addSeparatorComponents(sb => {\n if (options?.divider !== undefined) sb.setDivider(options.divider);\n if (options?.spacing !== undefined) sb.setSpacing(options.spacing);\n return sb;\n });\n return this;\n }\n\n addText(text: string | (string | null | undefined)[]): this {\n this.container.addTextDisplayComponents(tdb =>\n tdb.setContent(Array.isArray(text) ? text.filter(t => t !== null && t !== undefined).join(\"\\n\") : text)\n );\n return this;\n }\n\n addMedia(...media: { url: string | string[]; spoiler?: boolean; description?: string }[]): this {\n this.container.addMediaGalleryComponents(mb => {\n for (const m of media) {\n const urls = Array.isArray(m.url) ? m.url : [m.url];\n for (const u of urls) {\n mb.addItems(mgb => {\n mgb.setURL(u);\n if (m.spoiler) mgb.setSpoiler(true);\n if (m.description) mgb.setDescription(m.description);\n return mgb;\n });\n }\n }\n\n return mb;\n });\n return this;\n }\n\n addSection(data: {\n text?: string | (string | null | undefined)[];\n button?: Partial<ButtonComponentData>;\n thumbnail?: Partial<APIThumbnailComponent>;\n }): this {\n this.container.addSectionComponents(sb => {\n // Text\n if (data.text) {\n sb.addTextDisplayComponents(tdb =>\n tdb.setContent(\n Array.isArray(data.text)\n ? data.text.filter(t => t !== null && t !== undefined).join(\"\\n\")\n : data.text!\n )\n );\n }\n\n // Thumbnail\n if (data.thumbnail) sb.setThumbnailAccessory(new ThumbnailBuilder(data.thumbnail));\n\n // Button\n if (data.button) sb.setButtonAccessory(new ButtonBuilder(data.button));\n\n return sb;\n });\n\n return this;\n }\n\n addActionRow(...components: ActionRowBuilder<MessageActionRowComponentBuilder>[]): this {\n this.container.addActionRowComponents(...components);\n return this;\n }\n\n toJSON() {\n return this.container.toJSON();\n }\n\n async send(handler: SendHandler, options: DynaSendOptions = {}): Promise<Message | null> {\n this.build();\n\n return await dynaSend(handler, {\n ...options,\n withResponse: true,\n components: [this.container],\n flags: Array.isArray(options.flags)\n ? [...options.flags, \"IsComponentsV2\"]\n : options.flags\n ? [options.flags, \"IsComponentsV2\"]\n : \"IsComponentsV2\"\n });\n }\n}\n","import {\n APIChannelSelectComponent,\n APIFileUploadComponent,\n APIMentionableSelectComponent,\n APIModalInteractionResponseCallbackData,\n APIRoleSelectComponent,\n APIStringSelectComponent,\n APITextInputComponent,\n APIUserSelectComponent,\n AwaitModalSubmitOptions,\n ChannelSelectMenuBuilder,\n FileUploadBuilder,\n Interaction,\n LabelBuilder,\n MentionableSelectMenuBuilder,\n ModalBuilder,\n ModalSubmitInteraction,\n RoleSelectMenuBuilder,\n StringSelectMenuBuilder,\n TextInputBuilder,\n TextInputStyle,\n UserSelectMenuBuilder\n} from \"discord.js\";\nimport { globalVimcordToolsConfig, VimcordToolsConfig } from \"@/configs/tools.config\";\n\ntype _TextInputComponentData = Partial<APITextInputComponent> & _LabelComponentData;\ntype _StringSelectComponentData = Partial<APIStringSelectComponent> & _LabelComponentData;\ntype _ChannelSelectComponentData = Partial<APIChannelSelectComponent> & _LabelComponentData;\ntype _UserSelectComponentData = Partial<APIUserSelectComponent> & _LabelComponentData;\ntype _RoleSelectComponentData = Partial<APIRoleSelectComponent> & _LabelComponentData;\ntype _MentionableSelectComponentData = Partial<APIMentionableSelectComponent> & _LabelComponentData;\ntype _FileUploadComponentData = Partial<APIFileUploadComponent> & _LabelComponentData;\n\nexport type BetterTextInputComponent = { textInput: _TextInputComponentData };\nexport type BetterStringSelectComponent = { stringSelect: _StringSelectComponentData };\nexport type BetterChannelSelectComponent = { channelSelect: _ChannelSelectComponentData };\nexport type BetterUserSelectComponent = { userSelect: _UserSelectComponentData };\nexport type BetterRoleSelectComponent = { roleSelect: _RoleSelectComponentData };\nexport type BetterMentionableSelectComponent = { mentionableSelect: _MentionableSelectComponentData };\nexport type BetterFileUploadSelectComponent = { fileUpload: _FileUploadComponentData };\n\nexport type BetterModalComponent =\n | BetterTextInputComponent\n | BetterStringSelectComponent\n | BetterChannelSelectComponent\n | BetterUserSelectComponent\n | BetterRoleSelectComponent\n | BetterMentionableSelectComponent\n | BetterFileUploadSelectComponent;\n\ninterface _LabelComponentData {\n label: string;\n description?: string;\n}\n\nexport interface BetterModalOptions {\n /** The ID of the modal, if not provided will generate a time-based ID */\n id?: string;\n /** The title of the modal */\n title?: string;\n /** Max 5 components */\n components?: BetterModalComponent[];\n config?: VimcordToolsConfig;\n}\n\nexport interface ModalSubmitResult<T extends Record<string, any> = Record<string, any>> {\n /** Modal fields by custom_id */\n fields: T;\n /** Modal fields in the order components were added */\n values: any[];\n /** The modal submit interaction for replying */\n interaction: ModalSubmitInteraction;\n}\n\nfunction randomCharString(length: number) {\n const chars = \"ABCDEFGHJKLMOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n return Array.from({ length }, () => chars.charAt(Math.floor(Math.random() * chars.length))).join(\"\");\n}\n\nexport class BetterModal {\n id: string;\n options: BetterModalOptions;\n private modal: ModalBuilder;\n private components = new Map<string, LabelBuilder>();\n private config: VimcordToolsConfig;\n\n constructor(options: BetterModalOptions = {}) {\n this.id = options.id || this.createModalId();\n this.options = options;\n this.modal = new ModalBuilder().setCustomId(this.id);\n this.config = options.config || globalVimcordToolsConfig;\n\n if (options.title) {\n this.setTitle(options.title);\n }\n\n if (options.components?.length) {\n this.addComponents(...options.components);\n }\n }\n\n private createModalId() {\n return `modal:${randomCharString(10)}-${Date.now()}`;\n }\n\n private createComponentId() {\n return `modal-component:${randomCharString(4)}-${Date.now().toString().slice(-4)}`;\n }\n\n private validateComponentLength() {\n if (this.components.size >= 5) throw new Error(\"Modal can only have 5 components\");\n }\n\n toJSON(): APIModalInteractionResponseCallbackData {\n return this.modal.toJSON();\n }\n\n build(): ModalBuilder {\n this.modal.setLabelComponents(Array.from(this.components.values()));\n return this.modal;\n }\n\n setTitle(title: string): this {\n this.modal.setTitle(title);\n return this;\n }\n\n addComponents(...components: BetterModalComponent[]): this {\n for (const component of components) {\n if (\"textInput\" in component) {\n this.addTextInput(component.textInput);\n } else if (\"stringSelect\" in component) {\n this.addStringSelect(component.stringSelect);\n } else if (\"channelSelect\" in component) {\n this.addChannelSelect(component.channelSelect);\n } else if (\"userSelect\" in component) {\n this.addUserSelect(component.userSelect);\n } else if (\"roleSelect\" in component) {\n this.addRoleSelect(component.roleSelect);\n } else if (\"mentionableSelect\" in component) {\n this.addMentionableSelect(component.mentionableSelect);\n } else if (\"fileUpload\" in component) {\n this.addFileUpload(component.fileUpload);\n }\n }\n return this;\n }\n\n setComponents(...components: BetterModalComponent[]): this {\n this.modal.spliceLabelComponents(0, this.modal.components.length);\n this.addComponents(...components);\n return this;\n }\n\n addTextInput(data: _TextInputComponentData): this {\n this.validateComponentLength();\n let { label, description, custom_id, ...rest } = data;\n custom_id ||= this.createComponentId();\n const textInputComponent = new TextInputBuilder(rest).setCustomId(custom_id);\n if (!rest.style) textInputComponent.setStyle(TextInputStyle.Short);\n const labelComponent = new LabelBuilder().setLabel(label).setTextInputComponent(textInputComponent);\n if (description) labelComponent.setDescription(description);\n this.components.set(custom_id, labelComponent);\n return this;\n }\n\n addStringSelect(data: _StringSelectComponentData): this {\n this.validateComponentLength();\n let { label, description, custom_id, ...rest } = data;\n custom_id ||= this.createComponentId();\n const stringSelectComponent = new StringSelectMenuBuilder(rest).setCustomId(custom_id);\n const labelComponent = new LabelBuilder().setLabel(label).setStringSelectMenuComponent(stringSelectComponent);\n if (description) labelComponent.setDescription(description);\n this.components.set(custom_id, labelComponent);\n return this;\n }\n\n addChannelSelect(data: _ChannelSelectComponentData): this {\n this.validateComponentLength();\n let { label, description, custom_id, ...rest } = data;\n custom_id ||= this.createComponentId();\n const channelSelectComponent = new ChannelSelectMenuBuilder(rest).setCustomId(custom_id);\n const labelComponent = new LabelBuilder().setLabel(label).setChannelSelectMenuComponent(channelSelectComponent);\n if (description) labelComponent.setDescription(description);\n this.components.set(custom_id, labelComponent);\n return this;\n }\n\n addUserSelect(data: _UserSelectComponentData): this {\n this.validateComponentLength();\n let { label, description, custom_id, ...rest } = data;\n custom_id ||= this.createComponentId();\n const userSelectComponent = new UserSelectMenuBuilder(rest).setCustomId(custom_id);\n const labelComponent = new LabelBuilder().setLabel(label).setUserSelectMenuComponent(userSelectComponent);\n if (description) labelComponent.setDescription(description);\n this.components.set(custom_id, labelComponent);\n return this;\n }\n\n addRoleSelect(data: _RoleSelectComponentData): this {\n this.validateComponentLength();\n let { label, description, custom_id, ...rest } = data;\n custom_id ||= this.createComponentId();\n const roleSelectComponent = new RoleSelectMenuBuilder(rest).setCustomId(custom_id);\n const labelComponent = new LabelBuilder().setLabel(label).setRoleSelectMenuComponent(roleSelectComponent);\n if (description) labelComponent.setDescription(description);\n this.components.set(custom_id, labelComponent);\n return this;\n }\n\n addMentionableSelect(data: _MentionableSelectComponentData): this {\n this.validateComponentLength();\n let { label, description, custom_id, ...rest } = data;\n custom_id ||= this.createComponentId();\n const mentionableSelectComponent = new MentionableSelectMenuBuilder(rest).setCustomId(custom_id);\n const labelComponent = new LabelBuilder()\n .setLabel(label)\n .setMentionableSelectMenuComponent(mentionableSelectComponent);\n if (description) labelComponent.setDescription(description);\n this.components.set(custom_id, labelComponent);\n return this;\n }\n\n addFileUpload(data: _FileUploadComponentData): this {\n this.validateComponentLength();\n let { label, description, custom_id, ...rest } = data;\n custom_id ||= this.createComponentId();\n const fileUploadComponent = new FileUploadBuilder(rest).setCustomId(custom_id);\n const labelComponent = new LabelBuilder().setLabel(label).setFileUploadComponent(fileUploadComponent);\n if (description) labelComponent.setDescription(description);\n this.components.set(custom_id, labelComponent);\n return this;\n }\n\n /** Show the modal via interaction */\n async show(interaction: Interaction): Promise<void> {\n if (!(\"showModal\" in interaction)) throw new Error(\"Interaction does not support showing modals\");\n if (!this.modal.data.title) throw new Error(\"Modal must have a title\");\n this.build();\n await interaction.showModal(this.modal).catch(err => {\n console.error(\"Modal failed to send\", err);\n });\n }\n\n /** Waits for the modal to be submitted and returns the component data\n * @param interaction The interaction used to show the modal\n * @param options Options */\n async awaitSubmit<T extends Record<string, any> = Record<string, string>>(\n interaction: Interaction,\n options?: Omit<AwaitModalSubmitOptions<ModalSubmitInteraction>, \"filter\">\n ): Promise<ModalSubmitResult<T> | null> {\n if (!(\"showModal\" in interaction)) throw new Error(\"Interaction does not support showing modals\");\n try {\n const modalSubmit = await interaction.awaitModalSubmit({\n time: this.config.timeouts.modalSubmit,\n ...options,\n filter: i => i.customId === this.id\n });\n\n const fields: Record<string, any> = {};\n const values: any[] = [];\n\n // Iterate in order\n for (const [customId] of this.components) {\n let value: any = null;\n\n try {\n // Try text input\n value = modalSubmit.fields.getTextInputValue(customId);\n } catch {\n try {\n // Try to get field from fields map\n const field = modalSubmit.fields.fields.get(customId);\n if (field && \"values\" in field) {\n value = field.values;\n }\n } catch {}\n }\n\n fields[customId] = value;\n values.push(value);\n }\n\n return { fields: fields as T, values, interaction: modalSubmit };\n } catch (error) {\n return null;\n }\n }\n\n async showAndAwait<T extends Record<string, any> = Record<string, string>>(\n interaction: Interaction,\n options?: Omit<AwaitModalSubmitOptions<ModalSubmitInteraction>, \"filter\">\n ): Promise<ModalSubmitResult<T> | null> {\n if (!(\"showModal\" in interaction)) throw new Error(\"Interaction does not support showing modals\");\n await this.show(interaction);\n return this.awaitSubmit<T>(interaction, options);\n }\n}\n","import { globalVimcordToolsConfig, VimcordToolsConfig } from \"@/configs/tools.config\";\nimport {\n ActionRowBuilder,\n AttachmentBuilder,\n ButtonBuilder,\n ButtonInteraction,\n ButtonStyle,\n ComponentType,\n ContainerBuilder,\n EmbedBuilder,\n InteractionCollector,\n Message,\n MessageReaction,\n ReactionCollector,\n SelectMenuComponentOptionData,\n StringSelectMenuBuilder,\n StringSelectMenuInteraction,\n StringSelectMenuOptionBuilder,\n User,\n UserResolvable\n} from \"discord.js\";\nimport EventEmitter from \"node:events\";\nimport { BetterContainer } from \"./BetterContainer\";\nimport { BetterEmbed } from \"./BetterEmbed\";\nimport { dynaSend, DynaSendOptions, RequiredDynaSendOptions } from \"./dynaSend\";\nimport { EmbedResolvable, SendHandler, SendMethod } from \"./types\";\n\n/* NOTE: SinglePageResolvable now supports AttachmentBuilder for image-only pages */\nexport type SinglePageResolvable = string | EmbedResolvable | ContainerBuilder | BetterContainer | AttachmentBuilder;\n/* NOTE: A PageResolvable can now be a single item OR an array of embeds (which counts as 1 page) */\nexport type PageResolvable = SinglePageResolvable | EmbedResolvable[];\nexport type Chapter = PageResolvable[];\n\nexport interface PageIndex {\n chapter: number;\n nested: number;\n}\n\nexport interface ChapterData extends Omit<SelectMenuComponentOptionData, \"value\"> {\n value?: string;\n /** Optional attachments mapped to each nested page index */\n files?: (AttachmentBuilder | undefined)[];\n}\n\nexport interface PaginationEvent {\n beforeChapterChange: [chapterIndex: number];\n chapterChange: [option: StringSelectMenuOptionBuilder, page: PageResolvable, index: PageIndex];\n beforePageChange: [nestedIndex: number];\n pageChange: [page: PageResolvable, index: PageIndex];\n first: [page: PageResolvable, index: PageIndex];\n back: [page: PageResolvable, index: PageIndex];\n jump: [page: PageResolvable, index: PageIndex];\n next: [page: PageResolvable, index: PageIndex];\n last: [page: PageResolvable, index: PageIndex];\n collect: [interaction: StringSelectMenuInteraction | ButtonInteraction, page: PageResolvable, index: PageIndex];\n react: [reaction: MessageReaction, user: User, page: PageResolvable, index: PageIndex];\n preTimeout: [message: Message];\n postTimeout: [message: Message];\n}\n\nexport interface PaginatorOptions {\n /** @default {@link PaginationType.Short} */\n type?: PaginationType;\n participants?: UserResolvable[];\n /** Shorthand to create the Paginator with only 1 chapter */\n pages?: PageResolvable[];\n /** @default false */\n useReactions?: boolean;\n /** @default false */\n dynamic?: boolean;\n timeout?: number;\n onTimeout?: PaginationTimeoutType;\n config?: VimcordToolsConfig;\n}\n\nexport interface PaginatorData {\n message: Message | null;\n messageActionRows: ActionRowBuilder<StringSelectMenuBuilder | ButtonBuilder>[];\n messageSendOptions: DynaSendOptions | undefined;\n extraButtons: { index: number; component: ButtonBuilder }[];\n\n page: {\n current: PageResolvable | null;\n index: PageIndex;\n };\n\n navigation: {\n reactions: { name: string; id: string }[];\n isRequired: boolean;\n isLong: boolean;\n canJump: boolean;\n };\n\n collectors: {\n component: InteractionCollector<StringSelectMenuInteraction | ButtonInteraction> | null;\n reaction: ReactionCollector | null;\n };\n\n components: {\n chapterSelect: StringSelectMenuBuilder;\n navigation: Record<keyof VimcordToolsConfig[\"paginator\"][\"buttons\"], ButtonBuilder>;\n\n actionRows: {\n chapterSelect: ActionRowBuilder<StringSelectMenuBuilder>;\n navigation: ActionRowBuilder<ButtonBuilder>;\n };\n };\n}\n\nexport enum PaginationType {\n Short = 0,\n ShortJump = 1,\n Long = 2,\n LongJump = 3\n}\n\nexport enum PaginationTimeoutType {\n DisableComponents = 0,\n ClearComponents = 1,\n DeleteMessage = 2,\n DoNothing = 3\n}\n\nfunction wrapPositive(num: number, max: number) {\n return ((num % (max + 1)) + (max + 1)) % (max + 1);\n}\n\nfunction createNavButton(id: keyof VimcordToolsConfig[\"paginator\"][\"buttons\"], config: VimcordToolsConfig): ButtonBuilder {\n const data = config.paginator.buttons[id];\n const btn = new ButtonBuilder({ customId: `btn_${id}`, style: ButtonStyle.Secondary });\n\n if (data.label) {\n btn.setLabel(data.label);\n } else {\n btn.setEmoji(data.emoji.name);\n }\n\n return btn;\n}\n\nfunction isEmbed(item: any): item is EmbedResolvable {\n return item instanceof EmbedBuilder || item instanceof BetterEmbed;\n}\n\n// Helper to normalize pages input\n// [Embed1, Embed2] -> treated as 2 pages\n// [[Embed1, Embed2]] -> treated as 1 page (group)\nfunction resolvePages(pages: PageResolvable | PageResolvable[]): PageResolvable[] {\n if (Array.isArray(pages)) {\n if (pages.length === 0) return [];\n // If the first item is an Array, it is a list of Groups [[E1, E2], [E3]]\n if (Array.isArray(pages[0])) return pages as PageResolvable[];\n // If the first item is an Embed/String, it is a list of Single Pages [E1, E2]\n // This means we treat top-level arrays of embeds as MULTIPLE pages\n return pages as PageResolvable[];\n }\n // Single item passed (String, Embed, or Group if manually typed but unlikely here)\n return [pages];\n}\n\nexport class Paginator {\n chapters: { id: string; pages: Chapter; files?: (AttachmentBuilder | undefined)[] }[] = [];\n\n private options: Required<Omit<PaginatorOptions, \"config\">>;\n private config: VimcordToolsConfig;\n private data: PaginatorData;\n private events: Record<keyof PaginationEvent, { listener: (...args: any[]) => any; once: boolean }[]>;\n\n eventEmitter = new EventEmitter<PaginationEvent>();\n\n constructor(options: PaginatorOptions = {}) {\n this.config = options.config || globalVimcordToolsConfig;\n\n this.options = {\n type: options.type ?? PaginationType.Short,\n participants: options.participants ?? [],\n pages: options.pages ?? [],\n useReactions: options.useReactions ?? false,\n dynamic: options.dynamic ?? false,\n timeout: options.timeout ?? this.config.timeouts.pagination,\n onTimeout: options.onTimeout ?? PaginationTimeoutType.ClearComponents\n };\n\n this.data = {\n message: null,\n messageActionRows: [],\n messageSendOptions: undefined,\n extraButtons: [],\n\n page: { current: null, index: { chapter: 0, nested: 0 } },\n\n navigation: { reactions: [], isRequired: false, isLong: false, canJump: false },\n collectors: { component: null, reaction: null },\n\n components: {\n chapterSelect: new StringSelectMenuBuilder({ customId: \"ssm_chapterSelect\" }),\n navigation: {\n first: createNavButton(\"first\", this.config),\n back: createNavButton(\"back\", this.config),\n jump: createNavButton(\"jump\", this.config),\n next: createNavButton(\"next\", this.config),\n last: createNavButton(\"last\", this.config)\n },\n\n actionRows: {\n chapterSelect: new ActionRowBuilder<StringSelectMenuBuilder>(),\n navigation: new ActionRowBuilder<ButtonBuilder>()\n }\n }\n };\n\n this.data.components.actionRows.chapterSelect.setComponents(this.data.components.chapterSelect);\n\n this.events = {\n beforeChapterChange: [],\n chapterChange: [],\n beforePageChange: [],\n pageChange: [],\n first: [],\n back: [],\n jump: [],\n next: [],\n last: [],\n collect: [],\n react: [],\n preTimeout: [],\n postTimeout: []\n };\n\n if (this.options.pages.length) {\n this.addChapter(this.options.pages, { label: \"Default\" });\n }\n\n /* Error Checking */\n for (const [key, val] of Object.entries(this.config.paginator.buttons)) {\n if (!val.emoji.id) throw new Error(`[Paginator] Button '${key}.id' is not defined`);\n if (!val.emoji.name) throw new Error(`[Paginator] Button '${key}.name' is not defined`);\n }\n }\n\n private async build(): Promise<void> {\n await this.setPage();\n\n this.data.components.actionRows.navigation.setComponents([]);\n this.data.navigation.reactions = [];\n this.data.messageActionRows = [];\n\n if (this.data.navigation.isRequired) {\n let navTypes: (keyof VimcordToolsConfig[\"paginator\"][\"buttons\"])[] = [];\n\n if (this.options.dynamic) {\n const isLong = this.data.navigation.isLong;\n const isJump =\n this.options.type === PaginationType.ShortJump || this.options.type === PaginationType.LongJump;\n\n if (isLong) {\n this.options.type = isJump ? PaginationType.LongJump : PaginationType.Long;\n } else {\n this.options.type = isJump ? PaginationType.ShortJump : PaginationType.Short;\n }\n }\n\n switch (this.options.type) {\n case PaginationType.Short:\n navTypes = [\"back\", \"next\"];\n break;\n case PaginationType.ShortJump:\n navTypes = [\"back\", \"jump\", \"next\"];\n break;\n case PaginationType.Long:\n navTypes = [\"first\", \"back\", \"next\", \"last\"];\n break;\n case PaginationType.LongJump:\n navTypes = [\"first\", \"back\", \"jump\", \"next\", \"last\"];\n break;\n }\n\n if (this.options.useReactions) {\n this.data.navigation.reactions = navTypes.map(type => {\n const data = this.config.paginator.buttons[type]!;\n return { name: data.emoji.name, id: data.emoji.id };\n });\n } else {\n this.data.components.actionRows.navigation.setComponents(\n navTypes.map(type => this.data.components.navigation[type])\n );\n }\n }\n\n if (this.chapters.length > 1) {\n this.data.messageActionRows.push(this.data.components.actionRows.chapterSelect);\n }\n\n if ((this.data.navigation.isRequired && !this.options.useReactions) || this.data.extraButtons.length) {\n for (const btn of this.data.extraButtons) {\n this.data.components.actionRows.navigation.components.splice(btn.index, 0, btn.component);\n }\n this.data.messageActionRows.push(this.data.components.actionRows.navigation);\n }\n }\n\n private buildSendOptions(options: DynaSendOptions = {}): RequiredDynaSendOptions {\n const sendOptions: RequiredDynaSendOptions = {\n content: \"\",\n embeds: [],\n components: [],\n flags: [],\n files: [], // Explicitly empty to clear previous files on page switch\n ...options,\n withResponse: true\n };\n\n const page = this.data.page.current;\n\n /* Logic for AttachmentBuilder augmentation via ChapterData */\n const currentChapter = this.chapters[this.data.page.index.chapter];\n const chapterFile = currentChapter?.files?.[this.data.page.index.nested];\n if (chapterFile) sendOptions.files!.push(chapterFile);\n\n if (Array.isArray(page)) {\n // Handle array of embeds (Group of Embeds per page)\n sendOptions.embeds!.push(...page);\n } else if (typeof page === \"string\") {\n sendOptions.content = page;\n } else if (isEmbed(page)) {\n sendOptions.embeds!.push(page);\n } else if (page instanceof AttachmentBuilder) {\n /* Logic for Image-only pages */\n sendOptions.files!.push(page);\n } else if (page instanceof ContainerBuilder || page instanceof BetterContainer) {\n sendOptions.components!.push(page);\n\n if (!(sendOptions.flags as string[]).includes(\"IsComponentsV2\")) {\n (sendOptions.flags as string[]).push(\"IsComponentsV2\");\n }\n }\n\n sendOptions.components!.push(...this.data.messageActionRows);\n return sendOptions;\n }\n\n private async handlePostTimeout(): Promise<void> {\n if (!this.data.message) return;\n\n this.callEventStack(\"preTimeout\", this.data.message);\n\n // Stop component and reaction collectors\n this.data.collectors.component?.stop();\n this.data.collectors.reaction?.stop();\n\n // Handle the configured timeout action\n switch (this.options.onTimeout) {\n case PaginationTimeoutType.DisableComponents:\n if (!this.data.message.editable) break;\n\n const disabledNavComponents = this.data.components.actionRows.navigation.components.map(component => {\n if (\"setDisabled\" in component) {\n return component.setDisabled(true);\n }\n return component;\n });\n\n const disabledNavRow = ActionRowBuilder.from(this.data.components.actionRows.navigation).setComponents(\n disabledNavComponents\n );\n\n const newComponents: ActionRowBuilder<any>[] = [];\n\n const currentPage = this.data.page.current;\n if (currentPage instanceof ContainerBuilder || currentPage instanceof BetterContainer) {\n // To maintain the message appearance, add the container back at the end\n // Note: The components *inside* this container are NOT being disabled,\n // as that was the source of the type error.\n newComponents.push(currentPage as unknown as ActionRowBuilder<any>);\n }\n\n if (this.chapters.length > 1) {\n // Ensure the chapter select is also disabled if required\n const disabledSelect = StringSelectMenuBuilder.from(this.data.components.chapterSelect).setDisabled(\n true\n );\n newComponents.push(\n ActionRowBuilder.from(this.data.components.actionRows.chapterSelect).setComponents(disabledSelect)\n );\n }\n\n if (disabledNavRow.components.length > 0) {\n newComponents.push(disabledNavRow);\n }\n\n await this.data.message.edit({ components: newComponents }).catch(Boolean);\n\n // If using reactions, remove them\n if (this.options.useReactions) {\n await this.nav_removeFromMessage();\n }\n break;\n\n case PaginationTimeoutType.ClearComponents:\n if (this.data.message.editable) {\n // nav_removeFromMessage handles removing both components and reactions\n await this.nav_removeFromMessage();\n }\n break;\n\n case PaginationTimeoutType.DeleteMessage:\n await this.data.message.delete().catch(Boolean);\n break;\n\n case PaginationTimeoutType.DoNothing:\n break;\n }\n\n this.callEventStack(\"postTimeout\", this.data.message);\n }\n\n private async nav_removeFromMessage(): Promise<void> {\n if (!this.data.message?.editable) return;\n\n if (this.options.useReactions) {\n await this.data.message.reactions.removeAll().catch(Boolean);\n } else {\n const newComponents = this.data.message.components.filter(c => c.type !== ComponentType.Container);\n await this.data.message.edit({ components: newComponents }).catch(Boolean);\n }\n }\n\n private async nav_addReactions(): Promise<void> {\n if (!this.data.message || !this.options.useReactions || !this.data.navigation.reactions.length) return;\n for (const r of this.data.navigation.reactions) {\n await this.data.message.react(r.id).catch(Boolean);\n }\n }\n\n private async collect_components(): Promise<void> {\n if (!this.data.message || !this.data.messageActionRows.length) return;\n if (this.data.collectors.component) {\n this.data.collectors.component.resetTimer();\n return;\n }\n\n const participantIds = this.options.participants.map(p => (typeof p === \"string\" ? p : p.id));\n\n const collector = this.data.message.createMessageComponentCollector({\n filter: async i => {\n if (!participantIds.length) return true;\n\n if (participantIds.includes(i.user.id)) {\n return true;\n } else {\n await i.reply({ content: this.config.paginator.notAParticipantMessage, flags: \"Ephemeral\" });\n return false;\n }\n },\n ...(this.options.timeout ? { idle: this.options.timeout } : {})\n }) as InteractionCollector<StringSelectMenuInteraction | ButtonInteraction>;\n\n this.data.collectors.component = collector;\n\n collector.on(\"collect\", async i => {\n if (!i.isStringSelectMenu() && !i.isButton()) return;\n collector.resetTimer();\n\n this.callEventStack(\"collect\", i, this.data.page.current!, this.data.page.index);\n\n try {\n if (i.customId === \"btn_jump\") {\n this.callEventStack(\"jump\", this.data.page.current!, this.data.page.index);\n await i.reply({ content: \"Jump not implemented yet.\", flags: \"Ephemeral\" });\n return;\n }\n\n switch (i.customId) {\n case \"ssm_chapterSelect\":\n await i.deferUpdate().catch(Boolean);\n const chapterIndex = this.chapters.findIndex(\n c => c.id === (i as StringSelectMenuInteraction).values[0]\n );\n await this.setPage(chapterIndex, 0);\n await this.refresh();\n break;\n\n case \"btn_first\":\n await i.deferUpdate().catch(Boolean);\n this.callEventStack(\"first\", this.data.page.current!, this.data.page.index);\n await this.setPage(this.data.page.index.chapter, 0);\n await this.refresh();\n break;\n\n case \"btn_back\":\n await i.deferUpdate().catch(Boolean);\n this.callEventStack(\"back\", this.data.page.current!, this.data.page.index);\n await this.setPage(this.data.page.index.chapter, this.data.page.index.nested - 1);\n await this.refresh();\n break;\n\n case \"btn_next\":\n await i.deferUpdate().catch(Boolean);\n this.callEventStack(\"next\", this.data.page.current!, this.data.page.index);\n await this.setPage(this.data.page.index.chapter, this.data.page.index.nested + 1);\n await this.refresh();\n break;\n\n case \"btn_last\":\n await i.deferUpdate().catch(Boolean);\n this.callEventStack(\"last\", this.data.page.current!, this.data.page.index);\n await this.setPage(\n this.data.page.index.chapter,\n this.chapters[this.data.page.index.chapter]!.pages.length - 1\n );\n await this.refresh();\n break;\n }\n } catch (err) {\n console.error(\"[Paginator] Component navigation error\", err);\n }\n });\n\n collector.on(\"end\", async () => {\n this.data.collectors.component = null;\n this.handlePostTimeout();\n });\n }\n\n private async callEventStack<T extends keyof PaginationEvent>(event: T, ...args: PaginationEvent[T]): Promise<void> {\n if (!this.events[event].length) return;\n const listeners = [...this.events[event]];\n for (const _event of listeners) {\n await _event.listener(...args);\n if (_event.once) {\n const originalIndex = this.events[event].indexOf(_event);\n if (originalIndex > -1) this.events[event].splice(originalIndex, 1);\n }\n }\n }\n\n on<T extends keyof PaginationEvent>(event: T, listener: (...args: PaginationEvent[T]) => void, once = false): this {\n this.events[event].push({ listener, once });\n return this;\n }\n\n /** Adds a chapter to the paginator.\n * @param pages The pages for this chapter.\n * Note: `[Embed1, Embed2]` = 2 Pages. `[[Embed1, Embed2]]` = 1 Page (Group of 2).\n * @param data Metadata for the chapter select menu. */\n addChapter(pages: PageResolvable | PageResolvable[], data: ChapterData): this {\n if (data.default === undefined && !this.chapters.length) {\n data.default = true;\n }\n\n if (data.default) {\n this.data.components.chapterSelect.options.forEach(opt => opt.setDefault(false));\n }\n\n if (!data.value) {\n data.value = `ssm_c:${this.chapters.length}`;\n }\n\n // Normalize pages to standard array\n const normalizedPages = resolvePages(pages);\n\n this.chapters.push({ id: data.value, pages: normalizedPages, files: data.files });\n this.data.components.chapterSelect.addOptions(data as SelectMenuComponentOptionData);\n return this;\n }\n\n spliceChapters(index: number, deleteCount: number): this {\n this.chapters.splice(index, deleteCount);\n this.data.components.chapterSelect.spliceOptions(index, deleteCount);\n return this;\n }\n\n hydrateChapter(index: number, pages: PageResolvable | PageResolvable[], set?: boolean): this {\n if (!this.chapters[index]) {\n throw new Error(`[Paginator] Could not find chapter at index ${index}`);\n }\n\n const normalizedPages = resolvePages(pages);\n\n if (set) {\n this.chapters[index].pages = normalizedPages;\n } else {\n this.chapters[index].pages.push(...normalizedPages);\n }\n\n return this;\n }\n\n setPaginationType(type: PaginationType): this {\n this.options.type = type;\n return this;\n }\n\n insertButtonAt(index: number, component: ButtonBuilder): this {\n if (this.data.components.actionRows.navigation.components.length >= 5) {\n throw new Error(\"[Paginator] You cannot have more than 5 components in 1 action row. Use a separate ActionRow\");\n }\n this.data.extraButtons.push({ index, component });\n return this;\n }\n\n removeButtonAt(...index: number[]): this {\n index.forEach(i => this.data.extraButtons.splice(i, 1));\n return this;\n }\n\n async setPage(\n chapterIndex: number = this.data.page.index.chapter,\n nestedIndex: number = this.data.page.index.nested\n ): Promise<void> {\n const _oldChapterIndex = this.data.page.index.chapter;\n this.data.page.index.chapter = wrapPositive(chapterIndex, this.chapters.length - 1);\n\n const currentChapter = this.chapters[this.data.page.index.chapter];\n if (!currentChapter) {\n throw new Error(`[Paginator] Could not find chapter at index ${this.data.page.index.chapter}`);\n }\n\n await this.callEventStack(\"beforeChapterChange\", this.data.page.index.chapter);\n await this.callEventStack(\"beforePageChange\", nestedIndex);\n\n const _oldNestedIndex = this.data.page.index.nested;\n this.data.page.index.nested =\n this.data.page.index.chapter !== _oldChapterIndex\n ? 0\n : wrapPositive(nestedIndex, currentChapter.pages.length - 1);\n\n const currentPage = currentChapter.pages[this.data.page.index.nested];\n if (!currentPage) {\n throw new Error(`[Paginator] Could not find page at index ${this.data.page.index.nested}`);\n }\n\n this.data.page.current = currentPage;\n\n this.data.components.chapterSelect.options.forEach(opt => opt.setDefault(false));\n this.data.components.chapterSelect.options.at(this.data.page.index.chapter)?.setDefault(true);\n\n const { jumpableThreshold, longThreshold } = this.config.paginator;\n this.data.navigation.isRequired = currentChapter.pages.length >= 2;\n this.data.navigation.canJump = currentChapter.pages.length >= jumpableThreshold;\n this.data.navigation.isLong = currentChapter.pages.length >= longThreshold;\n\n if (this.data.page.index.chapter !== _oldChapterIndex) {\n this.callEventStack(\n \"chapterChange\",\n this.data.components.chapterSelect.options.at(this.data.page.index.chapter)!,\n this.data.page.current,\n this.data.page.index\n );\n this.callEventStack(\"pageChange\", this.data.page.current, this.data.page.index);\n } else if (this.data.page.index.nested !== _oldNestedIndex) {\n this.callEventStack(\"pageChange\", this.data.page.current, this.data.page.index);\n }\n }\n\n async refresh(): Promise<Message | null> {\n if (!this.data.message) {\n throw new Error(\"[Paginator] Cannot refresh, message not sent\");\n }\n\n if (!this.data.message.editable) {\n throw new Error(\"[Paginator] Cannot refresh, message is not editable\");\n }\n\n await this.build();\n\n this.data.message = await dynaSend(this.data.message, {\n sendMethod: SendMethod.MessageEdit,\n ...this.buildSendOptions(this.data.messageSendOptions)\n });\n\n return this.data.message;\n }\n\n async send(handler: SendHandler, options?: DynaSendOptions): Promise<Message | null> {\n this.data.messageSendOptions = options;\n await this.build();\n\n this.data.message = await dynaSend(handler, this.buildSendOptions(options));\n if (!this.data.message) return null;\n\n this.collect_components();\n return this.data.message;\n }\n}\n","import {\n ActionRowBuilder,\n APIButtonComponent,\n ButtonBuilder,\n ButtonStyle,\n ComponentType,\n ContainerBuilder,\n Message,\n UserResolvable,\n ButtonInteraction\n} from \"discord.js\";\nimport { globalVimcordToolsConfig, VimcordToolsConfig } from \"@/configs/tools.config\";\nimport { dynaSend, DynaSendOptions, RequiredDynaSendOptions } from \"./dynaSend\";\nimport { EmbedResolvable, SendHandler } from \"./types\";\nimport { BetterContainer } from \"./BetterContainer\";\nimport { BetterEmbed } from \"./BetterEmbed\";\n\nexport enum PromptResolveType {\n DisableComponents = 0,\n ClearComponents = 1,\n DeleteOnConfirm = 3,\n DeleteOnReject = 4\n}\n\nexport type ButtonHandler = (interaction: ButtonInteraction) => void | Promise<void>;\n\nexport interface CustomButton {\n builder: ButtonBuilder | ((builder: ButtonBuilder) => ButtonBuilder) | Partial<APIButtonComponent>;\n handler?: ButtonHandler;\n /** Position index: 0 = before confirm, 1 = between confirm/reject, 2+ = after reject\n * @default 2 */\n index?: number;\n}\n\nexport interface PromptOptions {\n participants?: UserResolvable[];\n content?: string;\n embed?: EmbedResolvable;\n container?: ContainerBuilder | BetterContainer;\n buttons?: {\n confirm?: ButtonBuilder | ((builder: ButtonBuilder) => ButtonBuilder) | Partial<APIButtonComponent>;\n reject?: ButtonBuilder | ((builder: ButtonBuilder) => ButtonBuilder) | Partial<APIButtonComponent>;\n };\n customButtons?: Record<string, CustomButton>;\n /** @default [PromptResolveType.DeleteOnConfirm, PromptResolveType.DeleteOnReject] */\n onResolve?: PromptResolveType[];\n timeout?: number;\n config?: VimcordToolsConfig;\n}\n\nexport interface PromptResult {\n message: Message | null;\n confirmed: boolean | null;\n customId: string | null;\n timedOut: boolean;\n}\n\nexport class Prompt {\n readonly participants: UserResolvable[];\n readonly content?: string;\n readonly embed: EmbedResolvable;\n readonly container?: ContainerBuilder | BetterContainer;\n readonly buttons: { confirm: ButtonBuilder; reject: ButtonBuilder };\n readonly customButtons: Map<string, { button: ButtonBuilder; handler?: ButtonHandler; index: number }>;\n readonly onResolve: PromptResolveType[];\n readonly timeout: number;\n readonly config: VimcordToolsConfig;\n\n private message: Message | null = null;\n\n constructor(options: PromptOptions = {}) {\n this.config = options.config ?? globalVimcordToolsConfig;\n this.participants = options.participants ?? [];\n this.timeout = options.timeout ?? this.config.timeouts.prompt;\n this.content = options.content;\n this.embed = options.embed ?? this.createDefaultForm();\n this.container = options?.container;\n this.buttons = this.createButtons(options.buttons);\n this.customButtons = this.createCustomButtons(options.customButtons);\n this.onResolve = options.onResolve ?? [PromptResolveType.DeleteOnConfirm, PromptResolveType.DeleteOnReject];\n }\n\n private createDefaultForm(): BetterEmbed {\n return new BetterEmbed({\n title: this.config.prompt.defaultTitle,\n description: this.config.prompt.defaultDescription\n });\n }\n\n private createButtons(buttonOptions?: PromptOptions[\"buttons\"]): {\n confirm: ButtonBuilder;\n reject: ButtonBuilder;\n } {\n const confirm = this.buildButton(\n buttonOptions?.confirm,\n \"btn_confirm\",\n this.config.prompt.confirmLabel,\n ButtonStyle.Success\n );\n\n const reject = this.buildButton(\n buttonOptions?.reject,\n \"btn_reject\",\n this.config.prompt.rejectLabel,\n ButtonStyle.Danger\n );\n\n return { confirm, reject };\n }\n\n private createCustomButtons(\n customOptions?: Record<string, CustomButton>\n ): Map<string, { button: ButtonBuilder; handler?: ButtonHandler; index: number }> {\n const map = new Map<string, { button: ButtonBuilder; handler?: ButtonHandler; index: number }>();\n\n if (!customOptions) return map;\n\n for (const [customId, { builder, handler, index = 2 }] of Object.entries(customOptions)) {\n const button = this.buildButton(builder, customId, customId, ButtonStyle.Primary);\n map.set(customId, { button, handler, index });\n }\n\n return map;\n }\n\n private buildButton(\n option: ButtonBuilder | ((builder: ButtonBuilder) => ButtonBuilder) | Partial<APIButtonComponent> | undefined,\n customId: string,\n defaultLabel: string,\n defaultStyle: ButtonStyle\n ): ButtonBuilder {\n if (typeof option === \"function\") {\n return option(new ButtonBuilder());\n }\n\n if (option instanceof ButtonBuilder) {\n return option;\n }\n\n return new ButtonBuilder({\n customId,\n label: defaultLabel,\n style: defaultStyle,\n ...option\n });\n }\n\n private buildActionRow(disable: Record<string, boolean> = {}): ActionRowBuilder<ButtonBuilder> {\n const confirmBtn = disable.confirm\n ? new ButtonBuilder(this.buttons.confirm.data).setDisabled(true)\n : this.buttons.confirm;\n\n const rejectBtn = disable.reject\n ? new ButtonBuilder(this.buttons.reject.data).setDisabled(true)\n : this.buttons.reject;\n\n const buttons: ButtonBuilder[] = [];\n\n // Collect custom buttons with their indices\n const customButtonsArray = Array.from(this.customButtons.entries()).map(([customId, data]) => ({\n customId,\n button: disable[customId] ? new ButtonBuilder(data.button.data).setDisabled(true) : data.button,\n index: data.index\n }));\n\n // Sort by index\n customButtonsArray.sort((a, b) => a.index - b.index);\n\n // Build button array in order\n for (const custom of customButtonsArray) {\n if (custom.index === 0) {\n buttons.push(custom.button);\n }\n }\n\n buttons.push(confirmBtn);\n\n for (const custom of customButtonsArray) {\n if (custom.index === 1) {\n buttons.push(custom.button);\n }\n }\n\n buttons.push(rejectBtn);\n\n for (const custom of customButtonsArray) {\n if (custom.index >= 2) {\n buttons.push(custom.button);\n }\n }\n\n return new ActionRowBuilder<ButtonBuilder>({ components: buttons });\n }\n\n private buildSendOptions(options?: DynaSendOptions): RequiredDynaSendOptions {\n const sendData: DynaSendOptions = { ...options };\n\n if (this.container) {\n sendData.components = Array.isArray(sendData.components)\n ? [...sendData.components, this.container]\n : [this.container];\n\n const existingFlags = sendData.flags ? (Array.isArray(sendData.flags) ? sendData.flags : [sendData.flags]) : [];\n\n if (!existingFlags.includes(\"IsComponentsV2\")) {\n sendData.flags = [...existingFlags, \"IsComponentsV2\"];\n } else {\n sendData.flags = existingFlags;\n }\n } else {\n sendData.embeds = Array.isArray(sendData.embeds) ? [this.embed, ...sendData.embeds] : [this.embed];\n }\n\n if (this.content) {\n sendData.content = this.content;\n }\n\n sendData.components = Array.isArray(sendData.components)\n ? [...sendData.components, this.buildActionRow()]\n : [this.buildActionRow()];\n\n return sendData as RequiredDynaSendOptions;\n }\n\n private isParticipant(userId: string): boolean {\n if (this.participants.length === 0) return true;\n return this.participants.some(p => {\n if (typeof p === \"string\") return p === userId;\n if (typeof p === \"object\" && \"id\" in p) return p.id === userId;\n return false;\n });\n }\n\n private async handleResolve(confirmed: boolean | null): Promise<void> {\n if (!this.message) return;\n\n const shouldDelete =\n (confirmed === true && this.onResolve.includes(PromptResolveType.DeleteOnConfirm)) ||\n (confirmed === false && this.onResolve.includes(PromptResolveType.DeleteOnReject));\n\n if (shouldDelete) {\n await this.message.delete().catch(Boolean);\n return;\n }\n\n if (this.onResolve.includes(PromptResolveType.ClearComponents)) {\n await this.message.edit({ components: [] }).catch(Boolean);\n } else if (this.onResolve.includes(PromptResolveType.DisableComponents)) {\n const disableAll: Record<string, boolean> = { confirm: true, reject: true };\n for (const customId of this.customButtons.keys()) {\n disableAll[customId] = true;\n }\n await this.message.edit({ components: [this.buildActionRow(disableAll)] }).catch(Boolean);\n }\n }\n\n async send(handler: SendHandler, options?: DynaSendOptions): Promise<Message | null> {\n const sendData = this.buildSendOptions(options);\n this.message = await dynaSend(handler, sendData);\n return this.message;\n }\n\n async awaitResponse(): Promise<PromptResult> {\n if (!this.message) {\n throw new Error(\"Prompt must be sent before awaiting response\");\n }\n\n const validCustomIds = new Set([\"btn_confirm\", \"btn_reject\", ...this.customButtons.keys()]);\n\n try {\n const interaction = await this.message.awaitMessageComponent({\n componentType: ComponentType.Button,\n filter: i => validCustomIds.has(i.customId) && this.isParticipant(i.user.id),\n time: this.timeout\n });\n\n await interaction.deferUpdate().catch(Boolean);\n\n let confirmed: boolean | null = null;\n if (interaction.customId === \"btn_confirm\") {\n confirmed = true;\n } else if (interaction.customId === \"btn_reject\") {\n confirmed = false;\n }\n\n const customButton = this.customButtons.get(interaction.customId);\n if (customButton?.handler) {\n await customButton.handler(interaction);\n }\n\n await this.handleResolve(confirmed);\n\n return {\n message: this.message,\n confirmed,\n customId: interaction.customId,\n timedOut: false\n };\n } catch (error) {\n await this.handleResolve(false);\n\n return {\n message: this.message,\n confirmed: null,\n customId: null,\n timedOut: true\n };\n }\n }\n}\n\n/** Create and send a prompt, awaiting its response\n * @param handler - The send handler\n * @param options - Prompt options\n * @param sendOptions - Additional send options */\nexport async function prompt(\n handler: SendHandler,\n options?: PromptOptions,\n sendOptions?: DynaSendOptions\n): Promise<PromptResult> {\n const p = new Prompt(options);\n await p.send(handler, sendOptions);\n return await p.awaitResponse();\n}\n","import { createInterface, Interface } from \"node:readline\";\nimport { clientInstances } from \"@/client\";\nimport { Logger } from \"@/tools/Logger\";\nimport jsTools from \"jstools\";\n\nexport interface VimcordCLIOptions {\n prefix: string;\n}\n\nexport class VimcordCLI {\n rl: Interface;\n options: VimcordCLIOptions;\n\n commands = new Map<string, { description: string; fn: (args: string[], content: string) => void }>();\n logger = new Logger({ prefixEmoji: \"🚀\", prefix: \"CLI\", showTimestamp: false });\n\n constructor(options: VimcordCLIOptions) {\n this.options = options;\n\n this.rl = createInterface({\n input: process.stdin as any as NodeJS.ReadableStream,\n output: process.stdout as any as NodeJS.WritableStream,\n terminal: false\n });\n\n this.rl.on(\"line\", line => {\n const { isCommand, commandName, content, args } = this.parseLine(line);\n if (!isCommand) return;\n const command = this.commands.get(commandName!);\n if (!command) {\n const nearestMatches = Array.from(this.commands.keys()).filter(cmd =>\n cmd.toLowerCase().includes(commandName!.toLowerCase())\n );\n return this.logger.error(\n `Unknown command '${commandName}'${nearestMatches.length ? `. Did you mean ${nearestMatches.length > 1 ? `[${nearestMatches.map(m => `'${this.options.prefix}${m}'`).join(\", \")}]` : `'${this.options.prefix}${nearestMatches[0]}'`}?` : \"\"}`\n );\n }\n command.fn(args!, content!);\n });\n }\n\n private parseLine(line: string) {\n if (line.startsWith(this.options.prefix)) {\n // Remove the prefix\n line = line.slice(this.options.prefix.length);\n } else {\n return { isCommand: false };\n }\n\n const args = line.split(\" \").map(s => s.trim());\n const commandName = args.shift();\n\n return { isCommand: true, commandName, content: args.join(\" \"), args };\n }\n\n getClientInstance(line: string) {\n const clientIndex = jsTools.getFlagSubstring(line, \"--client\", 1) || jsTools.getFlagSubstring(line, \"-c\", 1);\n\n if (clientIndex) {\n const idx = Number(clientIndex);\n if (isNaN(idx)) {\n CLI.logger.error(`'${clientIndex}' is not a valid number`);\n return undefined;\n }\n const client = clientInstances[idx];\n if (!client) {\n CLI.logger.error(\"Client instance not found\");\n return undefined;\n }\n return client;\n } else {\n // Fallback to the first client\n const client = clientInstances[0];\n if (!client) {\n CLI.logger.error(\"Client instance not found\");\n return undefined;\n }\n return client;\n }\n }\n\n addCommand(commandName: string, description: string, fn: (args: string[], content: string) => void) {\n this.commands.set(commandName, { description, fn });\n }\n\n removeCommand(commandName: string) {\n if (!this.commands.has(commandName)) return false;\n this.commands.delete(commandName);\n return true;\n }\n}\n\n/* Create and export a singleton instance */\nlet initCalled = false;\nexport const CLI = new VimcordCLI({ prefix: \"/\" });\n\n// TODO: Add /events ~ List loaded events\nCLI.addCommand(\"help\", \"View information about a command, or the available CLI options\", args => {\n const prefix = CLI.options.prefix;\n const helpList: Record<string, string> = {};\n\n for (const cmd of CLI.commands.entries()) {\n const commandName = cmd[0];\n const commandDescription = cmd[1].description;\n helpList[`${prefix}${commandName}`] = `~ ${commandDescription}`;\n }\n\n CLI.logger.table(\"(help)\", helpList);\n});\n\nCLI.addCommand(\"register\", \"Register app commands (slash & context) globally, or per guild\", async (args, content) => {\n const client = CLI.getClientInstance(content);\n if (!client) return;\n\n const mode = args[0]?.toLowerCase() || \"\";\n if (![\"guild\", \"global\"].includes(mode)) {\n return CLI.logger.error(`'${mode}' is not a valid option. Your options are [guild|global]`);\n }\n\n // Parse guild flags\n let guildIds = (jsTools.getFlagSubstring(content, \"--guilds\", 1) || jsTools.getFlagSubstring(content, \"-g\", 1) || \"\")\n .replaceAll(/[\"']/g, \"\")\n .split(\" \")\n .filter(Boolean)\n .map(s => s.replaceAll(\",\", \"\").trim());\n\n if (!guildIds.length) guildIds = client.guilds.cache.map(g => g.id);\n\n switch (mode) {\n case \"guild\":\n CLI.logger.info(\"Registering guild commands...\");\n await client.commands.slash.registerGuild({ guilds: guildIds });\n await client.commands.context.registerGuild({ guilds: guildIds });\n break;\n\n case \"global\":\n CLI.logger.info(\"Registering global commands...\");\n await client.commands.slash.registerGlobal();\n await client.commands.context.registerGlobal();\n break;\n }\n});\n\nCLI.addCommand(\"unregister\", \"Unregister app commands globally, or per guild\", async (args, content) => {\n const client = CLI.getClientInstance(content);\n if (!client) return;\n\n const mode = args[0]?.toLowerCase() || \"\";\n if (![\"guild\", \"global\"].includes(mode)) {\n return CLI.logger.error(`'${mode}' is not a valid option. Your options are [guild|global]`);\n }\n\n let guildIds = (jsTools.getFlagSubstring(content, \"--guilds\", 1) || jsTools.getFlagSubstring(content, \"-g\", 1) || \"\")\n .replaceAll(/[\"']/g, \"\")\n .split(\" \")\n .filter(Boolean)\n .map(s => s.replaceAll(\",\", \"\").trim());\n\n if (!guildIds.length) guildIds = client.guilds.cache.map(g => g.id);\n\n switch (mode) {\n case \"guild\":\n CLI.logger.info(\"Unregistering guild commands...\");\n await client.commands.slash.unregisterGuild({ guilds: guildIds });\n await client.commands.context.unregisterGuild({ guilds: guildIds });\n break;\n\n case \"global\":\n CLI.logger.info(\"Unregistering global commands...\");\n // We'll use the managers' unregisterGlobal if you added it,\n // otherwise these call the REST routes for global deletion.\n await client.commands.slash.unregisterGlobal();\n await client.commands.context.unregisterGlobal();\n break;\n }\n});\n\nCLI.addCommand(\"stats\", \"View statistics about a client instance\", (args, content) => {\n const client = CLI.getClientInstance(content);\n if (!client) return;\n\n CLI.logger.table(`(stats) ~ ${client.config.app.name}`, {\n \"Guilds:\": jsTools.formatThousands(client.guilds.cache.size),\n \"Ping:\": `${client.ws.ping || 0}ms`,\n \"Uptime:\": `${jsTools.msToSec(client.uptime || 0)}s`,\n \"Process Uptime:\": `${Math.floor(process.uptime())}s`,\n \"Memory Usage:\": `${(process.memoryUsage().rss / 1024 / 1024).toFixed(2)} MB`\n });\n});\n\nCLI.addCommand(\"cmds\", \"List the loaded commands\", async (args, content) => {\n const client = CLI.getClientInstance(content);\n if (!client) return;\n\n // Default to slash if no mode is provided\n const mode = (args[0] || \"slash\").toLowerCase();\n\n switch (mode) {\n case \"slash\": {\n const commands = Array.from(client.commands.slash.commands.values());\n // Sort by builder name\n commands.sort((a, b) => a.builder.name.localeCompare(b.builder.name));\n\n const tableData: Record<string, string> = {};\n for (const cmd of commands) {\n tableData[`/${cmd.builder.name}`] = `~ ${cmd.builder.description || \"No description\"}`;\n }\n\n return CLI.logger.table(`(cmds) ~ slash (${jsTools.formatThousands(commands.length)})`, tableData);\n }\n\n case \"prefix\": {\n const commands = Array.from(client.commands.prefix.commands.values());\n commands.sort((a, b) => {\n const nameA = a.toConfig().name;\n const nameB = b.toConfig().name;\n return nameA.localeCompare(nameB);\n });\n\n const tableData: Record<string, string> = {};\n const defaultPrefix = client.config.prefixCommands.defaultPrefix;\n\n for (const cmd of commands) {\n const config = cmd.toConfig();\n const aliasIndicator = config.aliases?.length ? ` [${config.aliases.join(\", \")}]` : \"\";\n\n tableData[`${defaultPrefix}${config.name}${aliasIndicator}`] = `~ ${config.description || \"No description\"}`;\n }\n\n return CLI.logger.table(`(cmds) ~ prefix (${jsTools.formatThousands(commands.length)})`, tableData);\n }\n\n case \"ctx\": {\n const commands = Array.from(client.commands.context.commands.values());\n commands.sort((a, b) => a.builder.name.localeCompare(b.builder.name));\n\n const tableData: Record<string, string> = {};\n for (const cmd of commands) {\n // Context menus don't have descriptions, but they do have types (User/Message)\n const type = cmd.builder.type === 2 ? \"User\" : \"Msg\";\n tableData[`[${type}] ${cmd.builder.name}`] = \"\";\n }\n\n return CLI.logger.table(`(cmds) ~ ctx (${jsTools.formatThousands(commands.length)})`, tableData);\n }\n\n default:\n return CLI.logger.error(`'${mode}' is not a valid option. Valid options: [slash|prefix|ctx]`);\n }\n});\n\n/** One-time function to be called during client creation */\nexport function initCLI() {\n if (initCalled) return;\n CLI.logger.log(`~ Type ${CLI.options.prefix}help to view available commands`);\n initCalled = true;\n}\n","import { clientInstances, Vimcord, VimcordConfig, VimcordFeatures } from \"@/client\";\nimport { ClientOptions } from \"discord.js\";\nimport { PartialDeep } from \"type-fest\";\nimport * as VimcordCLI from \"./VimcordCLI\";\n\nexport type VimcordConfigOptions = PartialDeep<VimcordConfig>;\n\nexport function useClient(index: number = 0) {\n return clientInstances.at(index);\n}\n\nexport async function useReadyClient(index: number = 0) {\n return useClient(index)?.whenReady();\n}\n\n/** Automatically bundles **🚀 {@link VimcordCLI}** with client creation */\nexport function createClient(options: ClientOptions, features: VimcordFeatures = {}, config: VimcordConfigOptions = {}) {\n const client = new Vimcord(options, features, config);\n VimcordCLI.initCLI();\n return client;\n}\n\nexport function getClientInstances() {\n return clientInstances;\n}\n"],"mappings":"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","names":["CommandType","MissingPermissionReason","RateLimitScope","_","randomUUID","_","_","Client","_","_","_","defaultConfig","_","defaultConfig","_","defaultConfig","_","defaultConfig","LogLevel","userMention","_","StatusType","dir","ActionRowBuilder","Message","GuildMember","User","BaseInteraction","GuildMember","User","SendMethod","BaseInteraction","GuildMember","User","GuildMember","User","str","ActionRowBuilder","Message","randomUUID","chalk","Client","randomUUID","randomUUID","EventEmitter","EventEmitter","path","CollectorTimeoutType","ButtonBuilder","ContainerBuilder","ContainerBuilder","ButtonBuilder","ActionRowBuilder","AttachmentBuilder","ButtonBuilder","ButtonStyle","ComponentType","ContainerBuilder","EmbedBuilder","StringSelectMenuBuilder","EventEmitter","PaginationType","PaginationTimeoutType","ButtonBuilder","ButtonStyle","EmbedBuilder","EventEmitter","StringSelectMenuBuilder","ActionRowBuilder","AttachmentBuilder","ContainerBuilder","ComponentType","ActionRowBuilder","ButtonBuilder","ButtonStyle","ComponentType","PromptResolveType","ButtonStyle","ButtonBuilder","ActionRowBuilder","ComponentType","jsTools"]}
1
+ {"version":3,"sources":["../src/types/command.base.ts","../src/validators/permissions.validator.ts","../src/builders/baseCommand.builder.ts","../src/builders/contextCommand.builder.ts","../src/utils/dir.ts","../src/builders/event.builder.ts","../src/builders/prefixCommand.builder.ts","../src/builders/slashCommand.builder.ts","../src/client.ts","../src/configs/tools.config.ts","../src/configs/app.config.ts","../src/configs/staff.config.ts","../src/configs/slashCommand.config.ts","../src/configs/prefixCommand.config.ts","../src/configs/contextCommand.config.ts","../src/tools/Logger.ts","../src/tools/utils.ts","../src/types/status.ts","../src/utils/number.ts","../src/modules/status.manager.ts","../src/modules/command.manager.ts","../src/modules/event.manager.ts","../src/utils/sendCommandErrorEmbed.ts","../src/tools/BetterEmbed.ts","../src/tools/dynaSend.ts","../src/tools/types.ts","../src/utils/async.ts","../package.json","../src/modules/db/mongo/mongo.ts","../src/modules/db/mongo/mongoSchema.builder.ts","../src/tools/BetterCollector.ts","../src/tools/BetterContainer.ts","../src/tools/BetterModal.ts","../src/tools/Paginator.ts","../src/tools/Prompt.ts","../src/utils/VimcordCLI.ts","../src/utils/clientUtils.ts","../src/utils/random.ts"],"sourcesContent":["import {\n AppCommandDeployment,\n CommandMetadata,\n CommandPermissionResults,\n CommandPermissions,\n CommandRateLimitOptions\n} from \"./command.options\";\nimport { ChatInputCommandInteraction, ContextMenuCommandInteraction, Message } from \"discord.js\";\nimport { type Vimcord } from \"@/client\";\n\nexport enum CommandType {\n Slash = 0,\n Prefix = 1,\n Context = 2\n}\n\nexport enum MissingPermissionReason {\n User = 0,\n Bot = 1,\n Role = 2,\n UserBlacklisted = 3,\n RoleBlacklisted = 4,\n NotInGuild = 5,\n NotGuildOwner = 6,\n NotBotOwner = 7,\n NotBotStaff = 8\n}\n\nexport enum RateLimitScope {\n User = 0,\n Guild = 1,\n Channel = 2,\n Global = 3\n}\n\nexport type BaseCommandParameters<T extends CommandType> = T extends CommandType.Slash\n ? [client: Vimcord<true>, interaction: ChatInputCommandInteraction]\n : T extends CommandType.Prefix\n ? [client: Vimcord<true>, message: Message]\n : T extends CommandType.Context\n ? [client: Vimcord<true>, interaction: ContextMenuCommandInteraction]\n : never;\n\nexport interface BaseCommandConfig<T extends CommandType> {\n /** Is this command enabled? @default true */\n enabled?: boolean;\n /** Custom conditions that must be met for this command to execute */\n conditions?: Array<(...args: BaseCommandParameters<T>) => boolean | Promise<boolean>>;\n /** Command permission requirements */\n permissions?: CommandPermissions;\n /** Command metadata configuration */\n metadata?: CommandMetadata;\n /** Rate limiting options */\n rateLimit?: CommandRateLimitOptions<(...args: BaseCommandParameters<T>) => any>;\n /** Log whenever a command is executed? @default true */\n logExecution?: boolean;\n\n /** Executed before the main command logic */\n beforeExecute?: (...args: BaseCommandParameters<T>) => any;\n /** The main command function that will be executed */\n execute?: (...args: BaseCommandParameters<T>) => any;\n /** Executed after successful execution */\n afterExecute?: (result: any, ...args: BaseCommandParameters<T>) => any;\n /** Executed when the required permissions are not met */\n onMissingPermissions?: (results: CommandPermissionResults, ...args: BaseCommandParameters<T>) => any;\n /** Executed when the required conditions are not met */\n onConditionsNotMet?: (...args: BaseCommandParameters<T>) => any;\n /** Executed when this command is used when its disabled */\n onUsedWhenDisabled?: (...args: BaseCommandParameters<T>) => any;\n /** Executed when the rate limit is hit */\n onRateLimit?: (...args: BaseCommandParameters<T>) => any;\n /** Custom error handler */\n onError?: (error: Error, ...args: BaseCommandParameters<T>) => any;\n}\n\nexport interface BaseAppCommandConfig {\n /** Command deployment configuration */\n deployment?: AppCommandDeployment;\n}\n\nexport interface CommandInternalRateLimitData {\n /** Number of times executed */\n executions: number;\n /** Timestamp of latest execution */\n timestamp: number;\n}\n","import { BaseInteraction, CommandInteraction, GuildMember, PermissionResolvable, User } from \"discord.js\";\nimport { CommandPermissionResults, CommandPermissions } from \"@ctypes/command.options\";\nimport { MissingPermissionReason } from \"@ctypes/command.base\";\nimport { type Vimcord } from \"@/client\";\n\nfunction __existsAndTrue(value: boolean | undefined) {\n return value !== undefined && value;\n}\n\nexport function validateCommandPermissions(\n permissions: CommandPermissions,\n client: Vimcord<true>,\n user: GuildMember | User,\n command: CommandInteraction | string\n): CommandPermissionResults {\n const inGuild = \"guild\" in user;\n\n const missingUserPermissions: PermissionResolvable[] = [];\n const missingBotPermissions: PermissionResolvable[] = [];\n const missingRoles: string[] = [];\n\n if (permissions.user?.length && inGuild) {\n for (const permission of permissions.user) {\n if (!user.permissions.has(permission)) {\n missingUserPermissions.push(permission);\n }\n }\n\n if (missingUserPermissions.length) {\n return { validated: false, failReason: MissingPermissionReason.User, missingUserPermissions };\n }\n }\n\n if (permissions.bot?.length && inGuild && user.guild.members.me) {\n for (const permission of permissions.bot) {\n if (!user.guild.members.me!.permissions.has(permission)) {\n missingBotPermissions.push(permission);\n }\n }\n\n if (missingBotPermissions.length) {\n return { validated: false, failReason: MissingPermissionReason.Bot, missingBotPermissions };\n }\n }\n\n if (permissions.roles?.length && inGuild) {\n for (const role of permissions.roles) {\n if (!user.roles.cache.has(role)) {\n missingRoles.push(role);\n }\n }\n\n if (missingRoles.length) {\n return { validated: false, failReason: MissingPermissionReason.Role, missingRoles };\n }\n }\n\n if (permissions.userBlacklist?.length) {\n if (permissions.userBlacklist.includes(user.id)) {\n return { validated: false, failReason: MissingPermissionReason.UserBlacklisted, blacklistedUser: user.id };\n }\n }\n\n if (permissions.roleBlacklist?.length && inGuild) {\n if (user.roles.cache.some(role => permissions.roleBlacklist!.includes(role.id))) {\n return { validated: false, failReason: MissingPermissionReason.RoleBlacklisted, blacklistedRole: user.id };\n }\n }\n\n if (__existsAndTrue(permissions.guildOnly) && !inGuild) {\n return { validated: false, failReason: MissingPermissionReason.NotInGuild };\n }\n\n if (__existsAndTrue(permissions.guildOwnerOnly) && inGuild && user.id !== user.guild.ownerId) {\n return { validated: false, failReason: MissingPermissionReason.NotGuildOwner };\n }\n\n if (__existsAndTrue(permissions.botOwnerOnly) && user.id !== client.config.staff.ownerId) {\n return { validated: false, failReason: MissingPermissionReason.NotBotOwner };\n }\n\n if (__existsAndTrue(permissions.botStaffOnly)) {\n if (!client.config.staff.superUsers.includes(user.id)) {\n return { validated: false, failReason: MissingPermissionReason.NotBotStaff };\n }\n\n if (inGuild) {\n for (const [k, role] of user.roles.cache) {\n if (!user.roles.cache.has(role.id)) {\n missingRoles.push(role.id);\n }\n }\n\n if (missingRoles.length) {\n return { validated: false, failReason: MissingPermissionReason.NotBotStaff, missingRoles };\n }\n }\n\n if (command instanceof BaseInteraction && command.isCommand()) {\n let commandName: string | null = null;\n\n if (command.isChatInputCommand()) {\n const subcommand = command.options.getSubcommand();\n commandName = `${command.commandName}${subcommand ? ` ${subcommand}` : \"\"}`;\n } else {\n commandName = command.commandName;\n }\n\n if (\n !client.config.staff.bypassers.some(\n bypass =>\n bypass.commandName.toLowerCase() === commandName.toLowerCase() && bypass.userIds.includes(user.id)\n )\n ) {\n return { validated: false, failReason: MissingPermissionReason.NotBotStaff };\n }\n }\n\n if (\n typeof command === \"string\" &&\n !client.config.staff.bypassers.some(\n bypass => bypass.commandName.toLowerCase() === command.toLowerCase() && bypass.userIds.includes(user.id)\n )\n ) {\n return { validated: false, failReason: MissingPermissionReason.NotBotStaff };\n }\n }\n\n return { validated: true };\n}\n","import {\n CommandType,\n RateLimitScope,\n BaseCommandParameters,\n BaseCommandConfig,\n CommandInternalRateLimitData\n} from \"@ctypes/command.base\";\nimport {\n CommandMetadata,\n CommandPermissionResults,\n CommandPermissions,\n CommandRateLimitOptions\n} from \"@ctypes/command.options\";\nimport { Guild, GuildMember, TextBasedChannel, User } from \"discord.js\";\nimport { validateCommandPermissions } from \"@validators/permissions.validator\";\nimport { randomUUID } from \"node:crypto\";\nimport { type Vimcord } from \"@/client\";\nimport _ from \"lodash\";\n\nexport abstract class BaseCommandBuilder<T extends CommandType, O extends BaseCommandConfig<T> = BaseCommandConfig<T>> {\n readonly uuid: string = randomUUID();\n readonly commandType: T;\n\n /** Local command configuration and hooks */\n protected options: O;\n\n /** Internal state for rate limiting across different scopes */\n private readonly rlStores = {\n [RateLimitScope.Global]: { executions: 0, timestamp: 0 } as CommandInternalRateLimitData,\n [RateLimitScope.User]: new Map<string, CommandInternalRateLimitData>(),\n [RateLimitScope.Guild]: new Map<string, CommandInternalRateLimitData>(),\n [RateLimitScope.Channel]: new Map<string, CommandInternalRateLimitData>()\n };\n\n /** * Mapping of CommandTypes to their respective config keys in the Vimcord client\n */\n private readonly typeConfigMapping: Record<CommandType, string> = {\n [CommandType.Slash]: \"slashCommands\",\n [CommandType.Prefix]: \"prefixCommands\",\n [CommandType.Context]: \"contextCommands\"\n };\n\n constructor(type: T, options: O = {} as O) {\n this.commandType = type;\n this.options = { enabled: true, ...options };\n }\n\n private validateBaseConfig() {\n if (this.options.rateLimit) {\n const { max, interval } = this.options.rateLimit;\n if (max <= 0 || interval <= 0) {\n throw new Error(`[Vimcord:${this.constructor.name}] Rate limit values must be positive.`);\n }\n }\n }\n\n /**\n * Resolves the final configuration by merging layers:\n * Client Defaults < Client Type-Specific < Local Command Options\n */\n protected resolveConfig(client: Vimcord): O {\n const typeKey = this.typeConfigMapping[this.commandType];\n const typeSpecificGlobals = (client.config as any)?.[typeKey] || {};\n\n return _.merge({}, typeSpecificGlobals, this.options);\n }\n\n /**\n * Executes the command lifecycle.\n * Merges global client config with local command options at runtime.\n */\n async run(client: Vimcord<true>, ...args: BaseCommandParameters<T>): Promise<void> {\n const config = this.resolveConfig(client);\n const ctx = this.extractContext(args);\n\n try {\n // 1. Availability\n if (!config.enabled) {\n return await config.onUsedWhenDisabled?.(...args);\n }\n\n // 2. Rate Limiting\n if (this.isRateLimited(config, ctx)) {\n return await config.onRateLimit?.(...args);\n }\n\n // 3. Permissions\n const perms = this.checkPermissions(client, ctx.member || ctx.user, args[1] as any);\n if (!perms.validated) {\n return await config.onMissingPermissions?.(perms, ...args);\n }\n\n // 4. Custom Conditions\n if (!(await this.checkConditions(config, ...args))) {\n return await config.onConditionsNotMet?.(...args);\n }\n\n // 5. Execution Pipeline\n await config.beforeExecute?.(...args);\n\n if (config.logExecution !== false) {\n // Resolve name based on builder type\n const cmdName = (this.options as any).name || (this as any).builder?.name || \"Unknown\";\n const location = ctx.guild ? `${ctx.guild.name} (${ctx.guild.id})` : \"Direct Messages\";\n\n client.logger.commandExecuted(cmdName, ctx.user.username, location);\n }\n\n const result = await config.execute?.(...args);\n await config.afterExecute?.(result, ...args);\n } catch (error) {\n await this.handleError(error as Error, config, ...args);\n }\n }\n\n /**\n * Internal logic to determine if a command execution should be throttled.\n * @param config The merged configuration to use for limits.\n * @param ctx Extracted Discord context (User, Guild, Channel).\n */\n private isRateLimited(config: BaseCommandConfig<T>, ctx: ReturnType<typeof this.extractContext>): boolean {\n if (!config.rateLimit) return false;\n\n const { scope, interval, max } = config.rateLimit;\n const now = Date.now();\n const key = this.getScopeKey(scope, ctx);\n\n if (scope !== RateLimitScope.Global && !key) return false;\n\n let data: CommandInternalRateLimitData;\n if (scope === RateLimitScope.Global) {\n data = this.rlStores[RateLimitScope.Global];\n } else {\n const store = this.rlStores[scope] as Map<string, CommandInternalRateLimitData>;\n data = store.get(key!) ?? { executions: 0, timestamp: now };\n store.set(key!, data);\n }\n\n if (now - data.timestamp > interval) {\n data.executions = 0;\n data.timestamp = now;\n }\n\n if (data.executions >= max) return true;\n\n data.executions++;\n return false;\n }\n\n /**\n * Validates if the user has required permissions.\n */\n private checkPermissions(client: Vimcord<true>, user: GuildMember | User, target: any): CommandPermissionResults {\n if (!this.options.permissions) return { validated: true };\n return validateCommandPermissions(this.options.permissions, client, user, target);\n }\n\n /**\n * Evaluates all custom conditions defined for the command.\n */\n private async checkConditions(config: BaseCommandConfig<T>, ...args: BaseCommandParameters<T>): Promise<boolean> {\n if (!config.conditions?.length) return true;\n const results = await Promise.all(config.conditions.map(c => c(...args)));\n return results.every(Boolean);\n }\n\n /**\n * Normalizes the trigger arguments into a standard context object.\n */\n private extractContext(args: BaseCommandParameters<T>) {\n const event = args[1] as any;\n return {\n user: (event.user || event.author) as User,\n member: event.member as GuildMember | null,\n guild: event.guild as Guild | null,\n channel: event.channel as TextBasedChannel | null\n };\n }\n\n /**\n * Resolves the storage key based on the RateLimit scope.\n */\n private getScopeKey(scope: RateLimitScope, ctx: ReturnType<typeof this.extractContext>): string | null {\n switch (scope) {\n case RateLimitScope.User:\n return ctx.user.id;\n case RateLimitScope.Guild:\n return ctx.guild?.id ?? null;\n case RateLimitScope.Channel:\n return ctx.channel?.id ?? null;\n default:\n return null;\n }\n }\n\n /**\n * Handles command errors by checking local handlers before falling back to global handlers.\n */\n private async handleError(err: Error, config: BaseCommandConfig<T>, ...args: BaseCommandParameters<T>) {\n if (config.onError) return config.onError(err, ...args);\n throw err;\n }\n\n /** Toggle command availability */\n setEnabled(enabled: boolean): this {\n this.options.enabled = enabled;\n return this;\n }\n\n /** Merge new permission requirements into the existing ones */\n setPermissions(perms: CommandPermissions): this {\n this.options.permissions = _.merge(this.options.permissions || {}, perms);\n return this;\n }\n\n /** Add custom logic checks that run before execution */\n addConditions(...conditions: Array<(...args: BaseCommandParameters<T>) => boolean | Promise<boolean>>): this {\n this.options.conditions = [...(this.options.conditions || []), ...conditions];\n return this;\n }\n\n /** Set the primary command execution logic */\n setExecute(fn: (...args: BaseCommandParameters<T>) => any): this {\n this.options.execute = fn;\n return this;\n }\n\n /** * Set the custom conditions that must be met for this command to execute\n */\n setConditions(conditions: Array<(...args: BaseCommandParameters<T>) => boolean | Promise<boolean>>): this {\n this.options.conditions = conditions;\n return this;\n }\n\n /** * Set the command metadata configuration\n */\n setMetadata(metadata: CommandMetadata): this {\n this.options.metadata = _.merge(this.options.metadata || {}, metadata);\n return this;\n }\n\n /** * Set the rate limiting options for this command\n */\n setRateLimit(options: CommandRateLimitOptions<(...args: BaseCommandParameters<T>) => any>): this {\n this.options.rateLimit = options;\n this.validateBaseConfig();\n return this;\n }\n\n /** * Set whether to log whenever this command is executed\n * @default true\n */\n setLogExecution(log: boolean): this {\n this.options.logExecution = log;\n return this;\n }\n\n /** * Set the function to execute before the main command logic\n */\n setBeforeExecute(callback: (...args: BaseCommandParameters<T>) => any): this {\n this.options.beforeExecute = callback;\n return this;\n }\n\n /** * Set the function to execute after successful command execution\n */\n setAfterExecute(callback: (result: any, ...args: BaseCommandParameters<T>) => any): this {\n this.options.afterExecute = callback;\n return this;\n }\n\n /** * Set the function to execute when the required permissions are not met\n */\n setOnMissingPermissions(callback: (results: CommandPermissionResults, ...args: BaseCommandParameters<T>) => any): this {\n this.options.onMissingPermissions = callback;\n return this;\n }\n\n /** * Set the function to execute when the required conditions are not met\n */\n setOnConditionsNotMet(callback: (...args: BaseCommandParameters<T>) => any): this {\n this.options.onConditionsNotMet = callback;\n return this;\n }\n\n /** * Set the function to execute when this command is used when its disabled\n */\n setOnUsedWhenDisabled(callback: (...args: BaseCommandParameters<T>) => any): this {\n this.options.onUsedWhenDisabled = callback;\n return this;\n }\n\n /** * Set the function to execute when the rate limit is hit\n */\n setOnRateLimit(callback: (...args: BaseCommandParameters<T>) => any): this {\n this.options.onRateLimit = callback;\n return this;\n }\n\n /** * Set a custom error handler for this command\n */\n setOnError(callback: (error: Error, ...args: BaseCommandParameters<T>) => any): this {\n this.options.onError = callback;\n return this;\n }\n}\n","import { BaseAppCommandConfig, BaseCommandConfig, CommandType } from \"@ctypes/command.base\";\nimport { ContextMenuCommandBuilder, ContextMenuCommandInteraction } from \"discord.js\";\nimport { BaseCommandBuilder } from \"@builders/baseCommand.builder\";\nimport { AppCommandDeployment } from \"@ctypes/command.options\";\nimport { type Vimcord } from \"@/client\";\nimport _ from \"lodash\";\n\nexport interface ContextCommandConfig extends BaseCommandConfig<CommandType.Context>, BaseAppCommandConfig {\n builder: ContextMenuCommandBuilder | ((builder: ContextMenuCommandBuilder) => ContextMenuCommandBuilder);\n deferReply?: boolean | { ephemeral?: boolean };\n}\n\nexport class ContextCommandBuilder extends BaseCommandBuilder<CommandType.Context, ContextCommandConfig> {\n public builder!: ContextMenuCommandBuilder;\n\n constructor(config: ContextCommandConfig) {\n super(CommandType.Context, config);\n this.setBuilder(config.builder);\n\n const originalExecute = this.options.execute;\n this.options.execute = async (client, interaction) => {\n return await this.handleExecution(client, interaction, originalExecute);\n };\n }\n\n private async handleExecution(\n client: Vimcord<true>,\n interaction: ContextMenuCommandInteraction,\n originalExecute?: ContextCommandConfig[\"execute\"]\n ) {\n const config = this.resolveConfig(client);\n\n if (config.deferReply && !interaction.replied && !interaction.deferred) {\n await interaction.deferReply(typeof config.deferReply === \"object\" ? config.deferReply : undefined);\n }\n\n return await originalExecute?.(client, interaction);\n }\n\n private validateBuilder() {\n if (!this.builder.name) throw new Error(`[Vimcord] ContextCommandBuilder: Command name is required.`);\n this.builder.toJSON();\n }\n\n // --- Specialized Fluent API ---\n\n setBuilder(builder: ContextCommandConfig[\"builder\"]): this {\n this.builder = typeof builder === \"function\" ? builder(new ContextMenuCommandBuilder()) : builder;\n this.validateBuilder();\n return this;\n }\n\n setDeferReply(defer: ContextCommandConfig[\"deferReply\"]): this {\n this.options.deferReply = defer;\n return this;\n }\n\n setDeployment(deployment: AppCommandDeployment): this {\n this.options.deployment = _.merge(this.options.deployment || {}, deployment);\n return this;\n }\n\n setExecute(fn: ContextCommandConfig[\"execute\"]): this {\n const originalExecute = fn;\n this.options.execute = async (client, interaction) => {\n return await this.handleExecution(client, interaction, originalExecute);\n };\n return this;\n }\n\n toConfig(): ContextCommandConfig {\n return { ...this.options, builder: this.builder };\n }\n}\n","import path from \"node:path\";\nimport { $ } from \"qznt\";\n\nexport function getProcessDir() {\n const mainPath = process.argv[1];\n if (!mainPath) return \"\";\n return path.dirname(mainPath);\n}\n\nexport async function importModulesFromDir<T extends any>(dir: string, fnPrefix?: string) {\n const cwd = getProcessDir();\n const MODULE_RELATIVE_PATH = path.join(cwd, dir);\n const MODULE_LOG_PATH = dir;\n\n /* Search the directory for event modules */\n const files = $.fs\n .readDir(MODULE_RELATIVE_PATH)\n .filter(\n fn => fn.endsWith(`${fnPrefix ? `.${fnPrefix}` : \"\"}.js`) || fn.endsWith(`${fnPrefix ? `.${fnPrefix}` : \"\"}.ts`)\n );\n\n if (!files.length) {\n return [];\n }\n\n // Import the modules found in the given directory\n const modules = await Promise.all(\n files.map(async fn => {\n let _path = path.join(MODULE_RELATIVE_PATH, fn);\n let _logPath = `./${path.join(MODULE_LOG_PATH, fn)}`;\n\n let _module;\n try {\n delete require.cache[require.resolve(_path)];\n _module = require(_path);\n } catch (err: any) {\n // Log the warning to the console\n console.warn(`Failed to import module at '${_logPath}'`, err);\n _module = null;\n }\n\n return { module: _module, path: _logPath };\n })\n );\n\n /* Filter out modules that failed to import and return */\n const filteredModules = modules.filter(m => m.module) as { module: T; path: string }[];\n\n if (!filteredModules.length) {\n console.warn(`No valid modules were found in directory '${dir}'`);\n }\n\n // Return the filtered modules\n return filteredModules;\n}\n\nexport function getCallerFileName() {\n const stack = new Error().stack?.split(\"\\n\");\n return stack?.at(4)?.split(\"at file\")?.at(1)?.split(\"/\").at(-1)?.split(\":\").at(0)?.split(\".\").at(0);\n}\n","import { EventDeployment, EventMetadata, EventRateLimitOptions } from \"@ctypes/event.options\";\nimport { EventParameters } from \"@ctypes/event.helpers\";\nimport { EventConfig } from \"@ctypes/event.base\";\nimport { getCallerFileName } from \"@utils/dir\";\nimport { ClientEvents } from \"discord.js\";\nimport { randomUUID } from \"node:crypto\";\nimport _ from \"lodash\";\n\nexport class EventBuilder<T extends keyof ClientEvents = keyof ClientEvents> implements EventConfig<T> {\n readonly uuid: string = randomUUID();\n\n event: T;\n name: string = getCallerFileName() || this.uuid;\n enabled;\n once;\n priority;\n conditions;\n metadata;\n deployment;\n rateLimit;\n beforeExecute;\n execute;\n afterExecute;\n onError;\n\n private rateLimitData: { executions: number; timestamp: number } = { executions: 0, timestamp: 0 };\n\n static create<T extends keyof ClientEvents>(event: T, name?: string): EventBuilder<T> {\n return new EventBuilder<T>({ event, name });\n }\n\n constructor(config: EventConfig<T>) {\n this.event = config.event;\n this.name = config.name || this.name;\n this.enabled = config.enabled ?? true;\n this.once = config.once ?? false;\n this.priority = config.priority ?? 0;\n this.conditions = config.conditions;\n this.metadata = config.metadata;\n this.deployment = config.deployment;\n this.rateLimit = config.rateLimit;\n this.beforeExecute = config.beforeExecute;\n this.execute = config.execute;\n this.afterExecute = config.afterExecute;\n this.onError = config.onError;\n\n this.validate();\n }\n\n validate() {\n // Validate event name\n if (!this.event) {\n throw new Error(\"Event name is required\");\n }\n\n // Validate priority\n if (this.priority !== undefined && this.priority < 0) {\n throw new Error(\"Priority must be non-negative\");\n }\n\n // Validate rateLimit\n if (this.rateLimit) {\n if (this.rateLimit.max <= 0) {\n throw new Error(\"Rate limit max must be greater than 0\");\n }\n if (this.rateLimit.interval <= 0) {\n throw new Error(\"Rate limit interval must be greater than 0\");\n }\n }\n\n // Validate that at least execute is provided\n if (!this.execute) {\n throw new Error(\"Execute function is required\");\n }\n }\n\n clone(): EventBuilder<T> {\n return new EventBuilder<T>(this.toConfig());\n }\n\n toConfig(): EventConfig<T> {\n return {\n event: this.event,\n name: this.name,\n enabled: this.enabled,\n once: this.once,\n priority: this.priority,\n conditions: this.conditions,\n metadata: this.metadata,\n deployment: this.deployment,\n rateLimit: this.rateLimit,\n beforeExecute: this.beforeExecute,\n execute: this.execute,\n afterExecute: this.afterExecute,\n onError: this.onError\n };\n }\n\n setEvent(event: T): this {\n this.event = event;\n return this;\n }\n\n setName(name: string): this {\n this.name = name;\n return this;\n }\n\n setEnabled(enabled: boolean): this {\n this.enabled = enabled;\n return this;\n }\n\n enable(): this {\n return this.setEnabled(true);\n }\n\n disable(): this {\n return this.setEnabled(false);\n }\n\n setOnce(once: boolean = true): this {\n this.once = once;\n return this;\n }\n\n setPriority(priority: number): this {\n this.priority = priority;\n return this;\n }\n\n addCondition(condition: (...args: EventParameters<T>) => boolean): this {\n if (!this.conditions) this.conditions = [];\n this.conditions.push(condition);\n return this;\n }\n\n setConditions(conditions: Array<(...args: EventParameters<T>) => boolean>): this {\n this.conditions = conditions;\n return this;\n }\n\n setMetadata(metadata: EventMetadata): this {\n this.metadata = _.merge(this.metadata, metadata);\n return this;\n }\n\n setDeployment(deployment: EventDeployment): this {\n this.deployment = _.merge(this.deployment, deployment);\n return this;\n }\n\n setRateLimit(options: EventRateLimitOptions<T>): this {\n this.rateLimit = options;\n return this;\n }\n\n setBeforeExecute(beforeExecute: (...args: EventParameters<T>) => Promise<any> | any): this {\n this.beforeExecute = beforeExecute;\n return this;\n }\n\n setExecute(execute: (...args: EventParameters<T>) => Promise<any> | any): this {\n this.execute = execute;\n return this;\n }\n\n setAfterExecute(afterExecute: (result: any, ...args: EventParameters<T>) => Promise<any> | any): this {\n this.afterExecute = afterExecute;\n return this;\n }\n\n setOnError(onError: (error: Error, ...args: EventParameters<T>) => Promise<any> | any): this {\n this.onError = onError;\n return this;\n }\n\n getRateLimitInfo(): { executions: number; timestamp: number; isLimited: boolean } | null {\n if (!this.rateLimit) return null;\n return { ...this.rateLimitData, isLimited: this.isRateLimited(false) };\n }\n\n resetRateLimit(): this {\n this.rateLimitData = { executions: 0, timestamp: 0 };\n return this;\n }\n\n isRateLimited(updateExecutions: boolean = true): boolean {\n if (!this.rateLimit) return false;\n\n const now = Date.now();\n\n // Reset if interval has passed\n if (now - this.rateLimitData.timestamp >= this.rateLimit.interval) {\n this.rateLimitData.executions = 0;\n this.rateLimitData.timestamp = now;\n }\n\n if (updateExecutions) {\n this.rateLimitData.executions++;\n }\n\n return this.rateLimitData.executions >= this.rateLimit.max;\n }\n\n async checkConditions(...args: EventParameters<T>): Promise<boolean> {\n if (!this.conditions?.length) return true;\n\n const results = await Promise.all(this.conditions.map(condition => condition(...args)));\n return results.every(Boolean);\n }\n\n async executeEvent(...args: EventParameters<T>): Promise<any> {\n try {\n // Check if event is enabled\n if (!this.enabled) {\n // TODO: Implement disabled console error\n return;\n }\n\n // Check rate limits\n if (this.isRateLimited()) {\n if (this.rateLimit?.onRateLimit) {\n return await this.rateLimit.onRateLimit(...args);\n }\n // TODO: Implement rate-limited console error\n return;\n }\n\n // Check conditions\n if (!(await this.checkConditions(...args))) {\n // TODO: Implement missing conditions console error\n return;\n }\n\n // Execute beforeExecute hook\n if (this.beforeExecute) {\n await this.beforeExecute(...args);\n }\n\n // Execute main event\n const result = await this.execute?.(...args);\n\n // Execute afterExecute hook\n if (this.afterExecute) {\n await this.afterExecute(result, ...args);\n }\n\n return result;\n } catch (err) {\n if (this.onError) {\n return await this.onError(err as Error, ...args);\n }\n\n // Log error if no custom handler\n console.error(`Error in event '${this.name}':`, err);\n throw err;\n }\n }\n}\n","import { BaseCommandConfig, CommandType } from \"@ctypes/command.base\";\nimport { BaseCommandBuilder } from \"@builders/baseCommand.builder\";\nimport { Message } from \"discord.js\";\nimport { type Vimcord } from \"@/client\";\n\n/**\n * Configuration specific to Prefix-based commands\n */\nexport interface PrefixCommandConfig extends BaseCommandConfig<CommandType.Prefix> {\n /** The primary name of the command */\n name: string;\n /** Alternative triggers for this command */\n aliases?: string[];\n /** A brief explanation of what the command does */\n description?: string;\n}\n\nexport class PrefixCommandBuilder extends BaseCommandBuilder<CommandType.Prefix, PrefixCommandConfig> {\n constructor(config: PrefixCommandConfig) {\n super(CommandType.Prefix, config);\n\n // Standardize the wrapping pattern:\n // We capture the original execute and wrap it with prefix-specific logic\n const originalExecute = this.options.execute;\n this.options.execute = async (client, message) => {\n return await this.handleExecution(client, message, originalExecute);\n };\n\n this.validatePrefixConfig();\n }\n\n /**\n * Specialized execution logic for Prefix Commands.\n */\n private async handleExecution(\n client: Vimcord<true>,\n message: Message,\n originalExecute?: PrefixCommandConfig[\"execute\"]\n ) {\n // Future hooks for prefix commands (like auto-parsing args) go here\n return await originalExecute?.(client, message);\n }\n\n private validatePrefixConfig() {\n if (!this.options.name) {\n throw new Error(`[Vimcord] PrefixCommandBuilder: Command name is required.`);\n }\n }\n\n // --- Fluent API (Prefix Specific Only) ---\n\n /**\n * Set the primary name of the command.\n */\n setName(name: string): this {\n this.options.name = name;\n return this;\n }\n\n /**\n * Set or replace the command aliases.\n */\n setAliases(aliases: string[]): this {\n this.options.aliases = aliases;\n return this;\n }\n\n /**\n * Add additional aliases without clearing existing ones.\n */\n addAliases(...aliases: string[]): this {\n this.options.aliases = [...(this.options.aliases || []), ...aliases];\n return this;\n }\n\n /**\n * Set the command description.\n */\n setDescription(description: string): this {\n this.options.description = description;\n return this;\n }\n\n // --- Overrides ---\n\n /**\n * Override setExecute to ensure handleExecution remains the entry point.\n * This is the only base method we need to redefine.\n */\n setExecute(fn: PrefixCommandConfig[\"execute\"]): this {\n const originalExecute = fn;\n this.options.execute = async (client, message) => {\n return await this.handleExecution(client, message, originalExecute);\n };\n return this;\n }\n\n /**\n * Converts the current builder state back into a config object.\n */\n toConfig(): PrefixCommandConfig {\n return {\n ...this.options\n };\n }\n}\n","import { BaseAppCommandConfig, BaseCommandConfig, CommandType } from \"@ctypes/command.base\";\nimport { ChatInputCommandInteraction, SlashCommandBuilder as DJSSlashCommandBuilder } from \"discord.js\";\nimport { AnySlashCommandBuilder, AppCommandDeployment } from \"@ctypes/command.options\";\nimport { BaseCommandBuilder } from \"@builders/baseCommand.builder\";\nimport { type Vimcord } from \"@/client\";\nimport _ from \"lodash\";\n\nexport interface SlashCommandConfig extends BaseCommandConfig<CommandType.Slash>, BaseAppCommandConfig {\n builder: AnySlashCommandBuilder | ((builder: DJSSlashCommandBuilder) => AnySlashCommandBuilder);\n deferReply?: boolean | { ephemeral?: boolean };\n routes?: Array<{ name: string; handler: (client: Vimcord<true>, interaction: ChatInputCommandInteraction) => any }>;\n onUnknownRouteHandler?: (client: Vimcord<true>, interaction: ChatInputCommandInteraction) => any;\n}\n\nexport class SlashCommandBuilder extends BaseCommandBuilder<CommandType.Slash, SlashCommandConfig> {\n public builder!: AnySlashCommandBuilder;\n private readonly routes: Map<string, (client: Vimcord<true>, interaction: ChatInputCommandInteraction) => any> =\n new Map();\n\n constructor(config: SlashCommandConfig) {\n super(CommandType.Slash, config);\n this.setBuilder(config.builder);\n if (config.routes) this.addRoutes(...config.routes);\n\n const originalExecute = this.options.execute;\n this.options.execute = async (client, interaction) => {\n return await this.handleExecution(client, interaction, originalExecute);\n };\n }\n\n private async handleExecution(\n client: Vimcord<true>,\n interaction: ChatInputCommandInteraction,\n originalExecute?: SlashCommandConfig[\"execute\"]\n ) {\n const config = this.resolveConfig(client);\n\n if (config.deferReply && !interaction.replied && !interaction.deferred) {\n await interaction.deferReply(typeof config.deferReply === \"object\" ? config.deferReply : undefined);\n }\n\n const subCommand = interaction.options.getSubcommand(false);\n if (subCommand) {\n const handler = this.routes.get(subCommand.toLowerCase());\n if (handler) return await handler(client, interaction);\n if (config.onUnknownRouteHandler) return await config.onUnknownRouteHandler(client, interaction);\n }\n\n return await originalExecute?.(client, interaction);\n }\n\n private validateBuilder() {\n if (!this.builder.name) throw new Error(`[Vimcord] SlashCommandBuilder: Command name is required.`);\n if (!this.builder.description) throw new Error(`[Vimcord] SlashCommandBuilder: Command description is required.`);\n this.builder.toJSON();\n }\n\n // --- Specialized Fluent API ---\n\n setBuilder(builder: SlashCommandConfig[\"builder\"]): this {\n this.builder = typeof builder === \"function\" ? builder(new DJSSlashCommandBuilder()) : builder;\n this.validateBuilder();\n return this;\n }\n\n setDeferReply(defer: SlashCommandConfig[\"deferReply\"]): this {\n this.options.deferReply = defer;\n return this;\n }\n\n setDeployment(deployment: AppCommandDeployment): this {\n this.options.deployment = _.merge(this.options.deployment || {}, deployment);\n return this;\n }\n\n setRoutes(...routes: NonNullable<SlashCommandConfig[\"routes\"]>): this {\n this.routes.clear();\n this.addRoutes(...routes);\n return this;\n }\n\n addRoutes(...routes: NonNullable<SlashCommandConfig[\"routes\"]>): this {\n if (!this.options.routes) this.options.routes = [];\n for (const route of routes) {\n const name = route.name.toLowerCase();\n this.routes.set(name, route.handler);\n const existingIndex = this.options.routes.findIndex(r => r.name.toLowerCase() === name);\n if (existingIndex > -1) this.options.routes[existingIndex] = route;\n else this.options.routes.push(route);\n }\n return this;\n }\n\n setUnknownRouteHandler(handler: SlashCommandConfig[\"onUnknownRouteHandler\"]): this {\n this.options.onUnknownRouteHandler = handler;\n return this;\n }\n\n setExecute(fn: SlashCommandConfig[\"execute\"]): this {\n const originalExecute = fn;\n this.options.execute = async (client, interaction) => {\n return await this.handleExecution(client, interaction, originalExecute);\n };\n return this;\n }\n\n toConfig(): SlashCommandConfig {\n return {\n ...this.options,\n builder: this.builder,\n routes: Array.from(this.routes.entries()).map(([name, handler]) => ({ name, handler }))\n };\n }\n}\n","import { Client, ClientOptions, Guild, User, userMention } from \"discord.js\";\nimport dotEnv, { DotenvConfigOptions } from \"dotenv\";\n\nimport { VimcordDatabaseManager } from \"@ctypes/database\";\nimport { PartialDeep } from \"type-fest\";\n\nimport { globalVimcordToolsConfig } from \"@configs/tools.config\";\nimport { createVimcordAppConfig, VimcordAppConfig } from \"@/configs/app.config\";\nimport { createVimcordStaffConfig, VimcordStaffConfig } from \"@configs/staff.config\";\nimport { createVimcordSlashCommandConfig, VimcordSlashCommandConfig } from \"@configs/slashCommand.config\";\nimport { createVimcordPrefixCommandConfig, VimcordPrefixCommandConfig } from \"@configs/prefixCommand.config\";\nimport { createVimcordContextCommandConfig, VimcordContextCommandConfig } from \"@configs/contextCommand.config\";\n\nimport { VimcordStatusManager } from \"./modules/status.manager\";\nimport { VimcordCommandManager } from \"@modules/command.manager\";\nimport { VimcordEventManager } from \"@modules/event.manager\";\nimport { EventBuilder } from \"@builders/event.builder\";\n\nimport { sendCommandErrorEmbed } from \"./utils/sendCommandErrorEmbed\";\nimport { retryExponentialBackoff } from \"@utils/async\";\nimport { fetchGuild, fetchUser } from \"./tools/utils\";\nimport { BetterEmbed } from \"./tools/BetterEmbed\";\nimport { version } from \"../package.json\";\nimport { randomUUID } from \"node:crypto\";\nimport { Logger } from \"./tools/Logger\";\nimport chalk from \"chalk\";\n\nexport interface CommandErrorMessageConfig {\n /** Use a custom embed */\n embed?: (embed: BetterEmbed, error: Error, guild: Guild | null | undefined) => BetterEmbed;\n /** @default config.staff.mainServer.inviteUrl */\n inviteUrl?: string;\n /** The support server invite button label @default \"Support Server\" */\n inviteButtonLabel?: string;\n /** The error details button label @default \"Details\" */\n detailButtonLabel?: string;\n /** @default 30_000 // 30 seconds */\n detailButtonIdleTimeout?: number;\n /** Should the message be ephemeral? */\n ephemeral?: boolean;\n /** Should the message be deleted after a certain amount of time? */\n deleteAfter?: number;\n}\n\nexport interface VimcordFeatures {\n /** Use global process error handlers @defaultValue `false` */\n useGlobalErrorHandlers?: boolean;\n /** Use our default prefix command handler @defaultValue `true` */\n useDefaultPrefixCommandHandler?: boolean;\n /** Use our default slash command handler @defaultValue `true` */\n useDefaultSlashCommandHandler?: boolean;\n /** Use our default context command handler @defaultValue `true` */\n useDefaultContextCommandHandler?: boolean;\n\n /** Reply to the user with an Uh-oh! embed when a command fails. If not using our default command handlers, you will have to implement this yourself using {@link sendCommandErrorEmbed}\n * @example\n * ```ts\n * try {\n * // Execute the command\n * return command.executeCommand(client, message);\n * } catch (err) {\n * // Send the error embed, this already handles the feature configuration\n * sendCommandErrorEmbed(client, err as Error, message.guild, message);\n * // Re-throw the error so it can be handled by an error handler\n * throw err;\n * }\n * ``` */\n enableCommandErrorMessage?: boolean | CommandErrorMessageConfig;\n\n /** Update the state of {@link globalVimcordToolsConfig.devMode} whenever {@link VimcordAppConfig.devMode} is updated in the client. This is mainly useful for {@link BetterEmbed} to switch between devMode and production colors during runtime without having to update the global config manually @defaultValue `false` */\n hookToolsDevMode?: boolean;\n\n /** Setup and configure `dotenv` @defaultValue `false` */\n useEnv?: boolean | DotenvConfigOptions;\n\n /** The maximum number of attempts to log into Discord @defaultValue `3` */\n loginAttempts?: number;\n\n /** Import modules from directories */\n importModules?: {\n events?: string | string[];\n slashCommands?: string | string[];\n prefixCommands?: string | string[];\n contextCommands?: string | string[];\n };\n}\n\nexport interface VimcordConfig {\n app: VimcordAppConfig;\n staff: VimcordStaffConfig;\n slashCommands: VimcordSlashCommandConfig;\n prefixCommands: VimcordPrefixCommandConfig;\n contextCommands: VimcordContextCommandConfig;\n}\n\nexport const clientInstances: Vimcord[] = [];\n\nexport class Vimcord<Ready extends boolean = boolean> extends Client<Ready> {\n readonly uuid: string = randomUUID();\n readonly index: number = clientInstances.length;\n\n readonly clientOptions: ClientOptions;\n readonly features: VimcordFeatures;\n readonly config: VimcordConfig;\n\n status: VimcordStatusManager;\n events: VimcordEventManager;\n commands: VimcordCommandManager;\n database?: VimcordDatabaseManager;\n\n // Configure custom logger\n logger = new Logger({ prefixEmoji: \"⚡\", prefix: `vimcord (i${this.index})` }).extend({\n clientBanner(client: Vimcord) {\n if (client.config.app.disableBanner) return;\n\n const border = \"═\".repeat(50);\n console.log(chalk.hex(this.colors.primary)(`\\n╔${border}╗`));\n console.log(\n chalk.hex(this.colors.primary)(\"║\") +\n chalk.bold.hex(this.colors.text)(\n ` 🚀 ${client.config.app.name} v${client.config.app.appVersion}`.padEnd(\n 50 - (client.config.app.devMode ? 12 : 0)\n )\n ) +\n chalk.hex(this.colors.primary)(\n `${client.config.app.devMode ? chalk.hex(this.colors.warn)(\"devMode ⚠️ \") : \"\"}║`\n )\n );\n\n console.log(chalk.hex(this.colors.primary)(`║${\"\".padEnd(50)}║`));\n\n console.log(\n chalk.hex(this.colors.primary)(\"║\") +\n chalk.hex(this.colors.muted)(\n ` # Powered by Vimcord v${version}`.padEnd(50 - 3 - `${client.index}`.length)\n ) +\n chalk.hex(this.colors.primary)(`${chalk.hex(this.colors.muted)(`i${client.index}`)} ║`)\n );\n console.log(chalk.hex(this.colors.primary)(`╚${border}╝\\n`));\n },\n\n clientReady(clientTag: string, guildCount: number) {\n console.log(\n this.formatTimestamp(),\n this.formatPrefix(),\n chalk.hex(this.colors.success)(\"🤖 READY\"),\n chalk.white(`Connected as ${chalk.bold.hex(this.colors.primary)(clientTag)}`),\n chalk.hex(this.colors.muted)(`• ${guildCount} guilds`)\n );\n },\n\n moduleLoaded(moduleName: string, count?: number, ignoredCount?: number): void {\n const countText = count ? chalk.hex(this.colors.muted)(`(${count} items)`) : \"\";\n console.log(\n this.formatTimestamp(),\n this.formatPrefix(),\n chalk.hex(\"#9B59B6\")(\"📦 MODULE\"),\n chalk.hex(this.colors.warn)(`${moduleName} loaded`),\n ignoredCount ? chalk.hex(this.colors.muted)(`(${ignoredCount} ignored)`) : \"\",\n countText\n );\n },\n\n commandExecuted(commandName: string, username: string, guildName?: string) {\n const location = guildName ? `in ${chalk.hex(this.colors.muted)(guildName)}` : \"in DMs\";\n console.log(\n this.formatTimestamp(),\n this.formatPrefix(),\n chalk.hex(\"#87CEEB\")(\"📝 COMMAND\"),\n chalk.hex(this.colors.warn)(`/${commandName}`),\n chalk.white(`used by ${chalk.bold(username)}`),\n chalk.hex(this.colors.muted)(location)\n );\n },\n\n database(action: string, details?: string) {\n console.log(\n this.formatTimestamp(),\n this.formatPrefix(),\n chalk.hex(\"#FF6B9D\")(\"🗄️ DATABASE\"),\n chalk.white(action),\n details ? chalk.hex(this.colors.muted)(details) : \"\"\n );\n }\n });\n\n private clientStartingPromise: Promise<string | null> | null = null;\n\n constructor(options: ClientOptions, features: VimcordFeatures = {}, config: PartialDeep<VimcordConfig> = {}) {\n super(options);\n\n this.clientOptions = options;\n this.features = features;\n\n this.config = {\n app: createVimcordAppConfig(config.app),\n staff: createVimcordStaffConfig(config.staff),\n slashCommands: createVimcordSlashCommandConfig(config.slashCommands),\n prefixCommands: createVimcordPrefixCommandConfig(config.prefixCommands),\n contextCommands: createVimcordContextCommandConfig(config.contextCommands)\n };\n\n // Configure the status manager\n this.status = new VimcordStatusManager(this);\n // Configure the event manager\n this.events = new VimcordEventManager(this);\n // Configure the command manager\n this.commands = new VimcordCommandManager(this);\n\n /* - - - - - { Features } - - - - - */\n if (this.features.useEnv) {\n if (typeof this.features.useEnv === \"object\") {\n dotEnv.config({ quiet: true, ...this.features.useEnv });\n } else {\n dotEnv.config({ quiet: true });\n }\n }\n\n // Configure default error handlers\n if (this.features.useGlobalErrorHandlers) {\n process.on(\"uncaughtException\", err => this.logger.error(\"Uncaught Exception\", err));\n process.on(\"unhandledRejection\", err => this.logger.error(\"Unhandled Rejection\", err as Error));\n process.on(\"exit\", code => this.logger.debug(`Process exited with code ${code}`));\n this.on(\"error\", err => this.logger.error(\"Client Error\", err));\n this.on(\"shardError\", err => this.logger.error(\"Client Shard Error\", err));\n }\n\n /* - - - - - { Client } - - - - - */\n this.logger.clientBanner(this);\n\n // Handle client ready\n this.once(\"clientReady\", client => {\n this.logger.clientReady(client.user.tag, client.guilds.cache.size);\n });\n\n // Add to global instances\n clientInstances.push(this);\n }\n\n /** Returns the options, features, and config of this client */\n toJSON() {\n return {\n options: this.clientOptions,\n features: this.features,\n config: this.config\n };\n }\n\n /** Make a clone of this client */\n clone() {\n const { options, features, config } = this.toJSON();\n return new Vimcord(options, features, config);\n }\n\n configureApp(options: PartialDeep<VimcordAppConfig> = {}) {\n this.config.app = createVimcordAppConfig(options);\n if (this.features.hookToolsDevMode) {\n globalVimcordToolsConfig.devMode = this.config.app.devMode;\n }\n return this;\n }\n\n configureStaff(options: PartialDeep<VimcordStaffConfig> = {}) {\n this.config.staff = createVimcordStaffConfig(options);\n return this;\n }\n\n configureSlashCommands(options: PartialDeep<VimcordSlashCommandConfig>) {\n this.config.slashCommands = createVimcordSlashCommandConfig(options);\n return this;\n }\n\n configurePrefixCommands(options: PartialDeep<VimcordPrefixCommandConfig>) {\n this.config.prefixCommands = createVimcordPrefixCommandConfig(options);\n return this;\n }\n\n configureContextCommands(options: PartialDeep<VimcordContextCommandConfig>) {\n this.config.contextCommands = createVimcordContextCommandConfig(options);\n return this;\n }\n\n async addEventModules(dir: string | string[], replaceAll?: boolean) {\n await this.events.importFrom(dir, replaceAll);\n return this;\n }\n\n async addSlashCommandModules(dir: string | string[], replaceAll?: boolean) {\n await this.commands.slash.importFrom(dir, replaceAll);\n return this;\n }\n\n async addPrefixCommandModules(dir: string | string[], replaceAll?: boolean) {\n await this.commands.prefix.importFrom(dir, replaceAll);\n return this;\n }\n\n async addContextCommandModules(dir: string | string[], replaceAll?: boolean) {\n await this.commands.context.importFrom(dir, replaceAll);\n return this;\n }\n\n async useDatabase(database: VimcordDatabaseManager): Promise<boolean> {\n this.database = database;\n this.logger.database(\"Using\", database.name);\n return this.database.connect();\n }\n\n async whenReady(): Promise<Vimcord<true>> {\n if (this.isReady()) return this as Vimcord<true>;\n\n return new Promise((resolve, reject) => {\n // Force timeout after 45 seconds\n const timeout = setTimeout(() => reject(new Error(\"Client is not ready\")), 45_000);\n\n this.once(\"clientReady\", () => {\n clearTimeout(timeout);\n resolve(this as Vimcord<true>);\n });\n });\n }\n\n async build() {\n /* Ensure updated configuration */\n this.configureApp(this.config.app);\n this.configureStaff(this.config.staff);\n this.configureSlashCommands(this.config.slashCommands);\n this.configurePrefixCommands(this.config.prefixCommands);\n this.configureContextCommands(this.config.contextCommands);\n\n // Automatically import external modules\n if (this.features.importModules) {\n const importModules = this.features.importModules;\n\n await Promise.all([\n importModules.events && this.addEventModules(importModules.events),\n importModules.slashCommands && this.addSlashCommandModules(importModules.slashCommands),\n importModules.prefixCommands && this.addPrefixCommandModules(importModules.prefixCommands),\n importModules.contextCommands && this.addContextCommandModules(importModules.contextCommands)\n ]);\n }\n\n // Configure default slash command handler\n if (this.features.useDefaultSlashCommandHandler) {\n this.events.register(defaultSlashCommandHandler);\n }\n\n // Configure default prefix command handler\n if (this.features.useDefaultPrefixCommandHandler) {\n this.events.register(defaultPrefixCommandHandler);\n }\n\n // Configure default context command handler\n if (this.features.useDefaultContextCommandHandler) {\n this.events.register(defaultContextCommandHandler);\n }\n\n return this;\n }\n\n /** Automatically uses `process.env.TOKEN` or `process.env.TOKEN_DEV` if token isn't provided */\n async start(token?: string): Promise<string | null>;\n async start(preHook?: (client: Vimcord) => any): Promise<string | null>;\n async start(token?: string, preHook?: (client: Vimcord) => any): Promise<string | null>;\n async start(\n tokenOrPreHook?: string | ((client: Vimcord) => any),\n preHook?: (client: Vimcord) => any\n ): Promise<string | null> {\n if (this.clientStartingPromise) return this.clientStartingPromise;\n\n const main = async () => {\n let token = typeof tokenOrPreHook === \"string\" ? tokenOrPreHook : undefined;\n token ??= this.config.app.devMode ? process.env.TOKEN_DEV : process.env.TOKEN;\n\n if (!token) {\n throw new Error(\n `TOKEN Missing: ${this.config.app.devMode ? \"devMode is enabled, but TOKEN_DEV is not set\" : \"TOKEN not set\"}`\n );\n }\n\n // Build the client\n await this.build();\n\n try {\n // Run the pre-hook\n if (typeof tokenOrPreHook === \"function\") {\n await tokenOrPreHook(this);\n } else {\n await preHook?.(this as Vimcord<true>);\n }\n\n const stopLoader = this.logger.loader(\"Connecting to Discord...\");\n const loginResult = await retryExponentialBackoff(\n () => super.login(token),\n this.features.loginAttempts ?? 3,\n 1_000\n );\n stopLoader(\"Connected to Discord \");\n this.config.app.verbose && this.logger.debug(\"⏳ Waiting for ready...\");\n return loginResult;\n } catch (err) {\n this.logger.error(\n `Failed to log into Discord after ${this.features.loginAttempts} attempt(s))`,\n err as Error\n );\n return null;\n } finally {\n this.clientStartingPromise = null;\n }\n };\n\n this.clientStartingPromise = main();\n return this.clientStartingPromise;\n }\n\n async kill() {\n await super.destroy();\n const idx = clientInstances.indexOf(this);\n if (idx >= 0) clientInstances.splice(idx, 1);\n this.logger.debug(\"🚪 Logged out of Discord\");\n }\n\n /** Shortcut for {@link fetchUser tools.fetchUser} */\n async fetchUser(id: string | undefined | null): Promise<User | null> {\n const client = await this.whenReady();\n return fetchUser(client, id);\n }\n\n /** Shortcut for {@link fetchGuild tools.fetchGuild} */\n async fetchGuild(id: string | undefined | null): Promise<Guild | null> {\n const client = await this.whenReady();\n return fetchGuild(client, id);\n }\n}\n\nconst defaultPrefixCommandHandler = new EventBuilder({\n event: \"messageCreate\",\n name: \"PrefixCommandHandler\",\n async execute(client, message) {\n if (message.author.bot || !message.guild) return;\n\n const config = client.config.prefixCommands;\n\n // 1. Resolve the active prefix for this guild\n let activePrefix = config.defaultPrefix;\n\n if (config.guildPrefixResolver) {\n try {\n const customPrefix = await config.guildPrefixResolver(client, message.guild.id);\n if (customPrefix) activePrefix = customPrefix;\n } catch (err) {\n client.logger.error(`Error in guildPrefixResolver for guild ${message.guild.id}:`, err as Error);\n // Fallback to defaultPrefix on error\n }\n }\n\n let prefixUsed: string | undefined;\n\n // 2. Determine if a valid prefix was used (Custom/Default vs Mention)\n if (message.content.startsWith(activePrefix)) {\n prefixUsed = activePrefix;\n } else if (config.allowMentionAsPrefix) {\n const mention = userMention(client.user.id);\n if (message.content.startsWith(mention)) {\n prefixUsed = message.content.startsWith(`${mention} `) ? `${mention} ` : mention;\n }\n }\n\n if (!prefixUsed) return;\n\n // 3. Extract trigger and raw arguments\n const contentWithoutPrefix = message.content.slice(prefixUsed.length).trim();\n const args = contentWithoutPrefix.split(/\\s+/);\n const trigger = args.shift();\n\n if (!trigger) return;\n\n // 4. Resolve the builder\n const command = client.commands.prefix.resolve(trigger);\n if (!command) return;\n\n // 5. Cleanup content and Run\n message.content = args.join(\" \");\n\n try {\n return await command.run(client, client, message);\n } catch (err) {\n await sendCommandErrorEmbed(client, err as Error, message.guild, message);\n throw err;\n }\n }\n});\n\nconst defaultSlashCommandHandler = new EventBuilder({\n event: \"interactionCreate\",\n name: \"SlashCommandHandler\",\n async execute(client, interaction) {\n // 1. Ensure it's a Chat Input (Slash) command\n if (!interaction.isChatInputCommand()) return;\n\n // 2. Fetch the builder from our refactored manager\n const command = client.commands.slash.get(interaction.commandName);\n\n // 3. Handle unknown commands\n if (!command) {\n const content = `**/\\`${interaction.commandName}\\`** is not a registered command.`;\n\n // Safety check: if the interaction was somehow already deferred/replied\n if (interaction.replied || interaction.deferred) {\n return interaction.followUp({ content, flags: \"Ephemeral\" });\n }\n return interaction.reply({ content, flags: \"Ephemeral\" });\n }\n\n try {\n return await command.run(client, client, interaction);\n } catch (err) {\n await sendCommandErrorEmbed(client, err as Error, interaction.guild, interaction);\n throw err;\n }\n }\n});\n\nconst defaultContextCommandHandler = new EventBuilder({\n event: \"interactionCreate\",\n name: \"ContextCommandHandler\",\n async execute(client, interaction) {\n // 1. Ensure it is a Context Menu interaction (User or Message)\n if (!interaction.isContextMenuCommand()) return;\n\n // 2. Resolve the builder from our Context Manager\n const command = client.commands.context.get(interaction.commandName);\n\n // 3. Handle unknown context commands\n if (!command) {\n const content = `**${interaction.commandName}** is not a registered context command.`;\n\n // Standard safety check for deferred/replied states\n if (interaction.replied || interaction.deferred) {\n return interaction.followUp({ content, flags: \"Ephemeral\" });\n }\n return interaction.reply({ content, flags: \"Ephemeral\" });\n }\n\n try {\n return await command.run(client, client, interaction);\n } catch (err) {\n await sendCommandErrorEmbed(client, err as Error, interaction.guild, interaction);\n throw err;\n }\n }\n});\n","import { ColorResolvable } from \"discord.js\";\nimport { PartialDeep } from \"type-fest\";\nimport _ from \"lodash\";\n\nexport interface VimcordToolsConfig {\n devMode: boolean;\n\n embedColor: ColorResolvable[];\n embedColorDev: ColorResolvable[];\n\n timeouts: {\n collectorTimeout: number;\n collectorIdle: number;\n pagination: number;\n prompt: number;\n modalSubmit: number;\n };\n\n collector: {\n notAParticipantMessage: string;\n userLockMessage: string;\n notAParticipantWarningCooldown: number;\n };\n\n paginator: {\n notAParticipantMessage: string;\n\n jumpableThreshold: number;\n longThreshold: number;\n\n buttons: Record<\n \"first\" | \"back\" | \"jump\" | \"next\" | \"last\",\n { label: string; emoji: { animated?: boolean; name: string; id: string } }\n >;\n };\n\n prompt: {\n defaultTitle: string;\n defaultDescription: string;\n confirmLabel: string;\n rejectLabel: string;\n };\n}\n\nexport const globalVimcordToolsConfig: VimcordToolsConfig = {\n devMode: false,\n\n embedColor: [],\n embedColorDev: [],\n\n timeouts: {\n collectorTimeout: 60_000,\n collectorIdle: 60_000,\n pagination: 60_000,\n prompt: 30_000,\n modalSubmit: 60_000\n },\n\n collector: {\n notAParticipantMessage: \"You are not allowed to use this.\",\n userLockMessage: \"Please wait until your current action is finished.\",\n notAParticipantWarningCooldown: 5_000\n },\n\n paginator: {\n notAParticipantMessage: \"You are not allowed to use this.\",\n\n jumpableThreshold: 5,\n longThreshold: 4,\n\n buttons: {\n first: { label: \"◀◀\", emoji: { name: \"⏮️\", id: \"⏮️\" } },\n back: { label: \"◀\", emoji: { name: \"◀️\", id: \"◀️\" } },\n jump: { label: \"📄\", emoji: { name: \"📄\", id: \"📄\" } },\n next: { label: \"▶\", emoji: { name: \"▶️\", id: \"▶️\" } },\n last: { label: \"▶▶\", emoji: { name: \"⏭️\", id: \"⏭️\" } }\n }\n },\n\n prompt: {\n defaultTitle: \"Are you sure?\",\n defaultDescription: \"Make sure you know what you're doing.\",\n confirmLabel: \"Confirm\",\n rejectLabel: \"Cancel\"\n }\n};\n\nexport function defineGlobalToolsConfig(options: PartialDeep<VimcordToolsConfig>) {\n Object.assign(globalVimcordToolsConfig, _.merge(globalVimcordToolsConfig, options));\n}\n\nexport function createToolsConfig(options?: PartialDeep<VimcordToolsConfig>) {\n return _.merge(globalVimcordToolsConfig, options);\n}\n","import { PartialDeep } from \"type-fest\";\nimport _ from \"lodash\";\n\nexport interface VimcordAppConfig {\n devMode: boolean;\n name: string;\n appVersion: string;\n\n /** Enable verbose console logs?\n * @default false */\n verbose: boolean;\n\n /** Disable the vimcord client banner on startup\n * @default false */\n disableBanner: boolean;\n}\n\nconst defaultConfig: VimcordAppConfig = {\n devMode: process.argv.includes(\"--dev\"),\n name: \"Discord Bot\",\n appVersion: \"1.0.0\",\n verbose: false,\n disableBanner: false\n};\n\nexport function createVimcordAppConfig(options: PartialDeep<VimcordAppConfig> = {}): VimcordAppConfig {\n return _.merge(defaultConfig, options);\n}\n","import { PartialDeep } from \"type-fest\";\nimport _ from \"lodash\";\n\nexport interface VimcordStaffConfig {\n ownerId: string | null;\n superUsers: string[];\n superUserRoles: string[];\n bypassers: { commandName: string; userIds: string[] }[];\n bypassesGuildAdmin: {\n allBotStaff: boolean;\n botOwner: boolean;\n superUsers: boolean;\n bypassers: boolean;\n };\n guild: {\n id: string | null;\n inviteUrl: string | null;\n channels: Record<string, string>;\n };\n}\n\nconst defaultConfig: VimcordStaffConfig = {\n ownerId: null,\n superUsers: [],\n superUserRoles: [],\n bypassers: [],\n bypassesGuildAdmin: {\n allBotStaff: false,\n botOwner: false,\n superUsers: false,\n bypassers: false\n },\n guild: {\n id: null,\n inviteUrl: null,\n channels: {}\n }\n};\n\nexport function createVimcordStaffConfig(options: PartialDeep<VimcordStaffConfig> = {}): VimcordStaffConfig {\n return _.merge(defaultConfig, options);\n}\n","import { BaseCommandConfig, CommandType } from \"@ctypes/command.base\";\nimport { PartialDeep } from \"type-fest\";\nimport _ from \"lodash\";\n\nexport interface VimcordSlashCommandConfig extends BaseCommandConfig<CommandType.Slash> {}\n\nconst defaultConfig: VimcordSlashCommandConfig = {\n logExecution: true\n};\n\nexport function createVimcordSlashCommandConfig(\n options: PartialDeep<VimcordSlashCommandConfig> = {}\n): VimcordSlashCommandConfig {\n return _.merge(defaultConfig, options);\n}\n","import { BaseCommandConfig, CommandType } from \"@ctypes/command.base\";\nimport { PartialDeep } from \"type-fest\";\nimport _ from \"lodash\";\nimport { Vimcord } from \"@/client\";\n\nexport interface VimcordPrefixCommandConfig extends BaseCommandConfig<CommandType.Prefix> {\n /** @default ! */\n defaultPrefix: string;\n /** @default true */\n allowMentionAsPrefix: boolean;\n /** @default true */\n allowCaseInsensitiveCommandNames: boolean;\n /**\n * A custom resolver to fetch a guild-specific prefix.\n * Returns a string (the prefix) or null/undefined to fallback to default.\n */\n guildPrefixResolver?: (\n client: Vimcord,\n guildId: string\n ) => Promise<string | null | undefined> | string | null | undefined;\n}\n\nconst defaultConfig: VimcordPrefixCommandConfig = {\n enabled: true,\n defaultPrefix: \"!\",\n allowMentionAsPrefix: true,\n allowCaseInsensitiveCommandNames: true,\n logExecution: true\n};\n\nexport function createVimcordPrefixCommandConfig(\n options: PartialDeep<VimcordPrefixCommandConfig> = {}\n): VimcordPrefixCommandConfig {\n return _.merge(defaultConfig, options);\n}\n","import { BaseCommandConfig, CommandType } from \"@ctypes/command.base\";\nimport { PartialDeep } from \"type-fest\";\nimport _ from \"lodash\";\n\nexport interface VimcordContextCommandConfig extends BaseCommandConfig<CommandType.Context> {}\n\nconst defaultConfig: VimcordContextCommandConfig = {\n enabled: true,\n logExecution: true\n};\n\nexport function createVimcordContextCommandConfig(\n options: PartialDeep<VimcordContextCommandConfig> = {}\n): VimcordContextCommandConfig {\n return _.merge(defaultConfig, options);\n}\n","import chalk from \"chalk\";\n\nexport interface LoggerOptions {\n colors?: Partial<typeof LOGGER_COLORS>;\n prefix?: string | null;\n prefixEmoji?: string | null;\n minLevel?: LogLevel;\n /** @defaultValue `true` */\n showTimestamp?: boolean;\n}\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n SUCCESS = 2,\n WARN = 3,\n ERROR = 4\n}\n\nexport const LOGGER_COLORS = {\n primary: \"#5865F2\",\n success: \"#57F287\",\n warn: \"#FEE75C\",\n danger: \"#ED4245\",\n muted: \"#747F8D\",\n text: \"#FFFFFF\"\n};\n\n/** Reusable functions for using `console.log()`, but in 4k ultra HD retrocolor */\nexport class Logger {\n private logPrefixEmoji: string | null;\n private logPrefix: string | null;\n private minLevel: LogLevel;\n private showTimestamp: boolean;\n private colorScheme: typeof LOGGER_COLORS;\n\n constructor(options?: LoggerOptions) {\n const { prefixEmoji = null, prefix = null, minLevel = LogLevel.DEBUG, showTimestamp = true } = options || {};\n\n this.logPrefixEmoji = prefixEmoji;\n this.logPrefix = prefix;\n this.minLevel = minLevel;\n this.showTimestamp = showTimestamp;\n\n this.colorScheme = {\n ...LOGGER_COLORS,\n ...options?.colors\n };\n }\n\n protected formatTimestamp(): string {\n if (!this.showTimestamp) return \"\";\n const now = new Date();\n const time = now.toLocaleTimeString(\"en-US\", {\n hour12: false,\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\"\n });\n return chalk.hex(this.colorScheme.muted)(`[${time}]`);\n }\n\n protected formatPrefix(): string {\n if (!this.logPrefix) return \"\";\n return chalk.bold.hex(this.colorScheme.primary)(\n `${this.logPrefixEmoji ? `${this.logPrefixEmoji} ` : \"\"}${this.logPrefix}`\n );\n }\n\n protected shouldLog(level: LogLevel): boolean {\n return level >= this.minLevel;\n }\n\n get prefixEmoji() {\n return this.logPrefixEmoji;\n }\n\n get prefix() {\n return this.logPrefix;\n }\n\n get colors() {\n return this.colorScheme;\n }\n\n extend<Extra extends Record<string, (...args: any) => void>>(extras: Extra & ThisType<Logger>): Logger & Extra {\n for (const [key, fn] of Object.entries(extras as any)) {\n if (typeof fn === \"function\") {\n (this as any)[key] = function (...args: any[]) {\n return fn.call(this, ...args);\n };\n }\n }\n\n return this as any as Logger & Extra;\n }\n\n setPrefix(prefix: string | null): this {\n this.logPrefix = prefix;\n return this;\n }\n\n setPrefixEmoji(prefixEmoji: string | null): this {\n this.logPrefixEmoji = prefixEmoji;\n return this;\n }\n\n setMinLevel(minLevel: LogLevel): this {\n this.minLevel = minLevel;\n return this;\n }\n\n setShowTimestamp(show: boolean): this {\n this.showTimestamp = show;\n return this;\n }\n\n setColors(colors: Partial<typeof LOGGER_COLORS>): this {\n this.colorScheme = {\n ...LOGGER_COLORS,\n ...colors\n };\n return this;\n }\n\n log(message: string, ...args: any[]): void {\n console.log(this.formatTimestamp(), this.formatPrefix(), message, ...args);\n }\n\n debug(message: string, ...args: any[]): void {\n if (!this.shouldLog(LogLevel.DEBUG)) return;\n console.log(\n this.formatTimestamp(),\n this.formatPrefix(),\n chalk.hex(this.colorScheme.muted)(\"DEBUG\"),\n chalk.dim(message),\n ...args\n );\n }\n\n info(message: string, ...args: any[]): void {\n if (!this.shouldLog(LogLevel.INFO)) return;\n console.log(this.formatTimestamp(), this.formatPrefix(), chalk.hex(\"#87CEEB\")(\"INFO\"), message, ...args);\n }\n\n success(message: string, ...args: any[]): void {\n if (!this.shouldLog(LogLevel.SUCCESS)) return;\n console.log(\n this.formatTimestamp(),\n this.formatPrefix(),\n chalk.bold.hex(this.colorScheme.success)(\"✓ SUCCESS\"),\n chalk.hex(this.colorScheme.success)(message),\n ...args\n );\n }\n\n warn(message: string, ...args: any[]): void {\n if (!this.shouldLog(LogLevel.WARN)) return;\n console.warn(\n this.formatTimestamp(),\n this.formatPrefix(),\n chalk.bold.hex(this.colorScheme.warn)(\"⚠ WARN\"),\n chalk.hex(this.colorScheme.warn)(message),\n ...args\n );\n }\n\n error(message: string, error?: Error, ...args: any[]): void {\n if (!this.shouldLog(LogLevel.ERROR)) return;\n console.error(\n this.formatTimestamp(),\n this.formatPrefix(),\n chalk.bold.hex(this.colorScheme.danger)(\"✕ ERROR\"),\n chalk.hex(this.colorScheme.danger)(message),\n ...args\n );\n\n if (error && error.stack) {\n console.error(chalk.dim(error.stack));\n }\n }\n\n loader(message: string): (newMessage?: string) => void {\n const frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n let i = 0;\n\n const interval = setInterval(() => {\n process.stdout.write(\n `\\r${this.formatTimestamp()} ${this.formatPrefix()} ${chalk.hex(this.colorScheme.warn)(frames[i])} ${message}`\n );\n i = (i + 1) % frames.length;\n }, 100);\n\n return (newMessage?: string) => {\n clearInterval(interval);\n process.stdout.write(\n `\\r${this.formatTimestamp()} ${this.formatPrefix()} ${chalk.hex(this.colorScheme.success)(\"✓\")} ${newMessage || message}\\n`\n );\n };\n }\n\n table(title: string, data: Record<string, any>): void {\n console.log(this.formatTimestamp(), this.formatPrefix(), chalk.bold(title));\n\n Object.entries(data).forEach(([key, value]) => {\n const formattedKey = chalk.hex(this.colorScheme.warn)(` ${key}`);\n const formattedValue = chalk.hex(this.colorScheme.muted)(value);\n console.log(`${formattedKey.padEnd(25)} ${formattedValue}`);\n });\n }\n\n section(title: string): void {\n const line = \"─\".repeat(Math.max(30, title.length + 4));\n console.log(chalk.hex(this.colorScheme.muted)(`\\n┌─${line}─┐`));\n console.log(\n chalk.hex(this.colorScheme.muted)(\"│ \") +\n chalk.bold.hex(this.colorScheme.text)(title.padEnd(line.length)) +\n chalk.hex(this.colorScheme.muted)(\" │\")\n );\n console.log(chalk.hex(this.colorScheme.muted)(`└─${line}─┘`));\n }\n}\n\n// Export singleton instance\nexport const logger = new Logger();\n","import {\n AnyThreadChannel,\n CategoryChannel,\n Channel,\n ChannelType,\n Client,\n DMChannel,\n Guild,\n GuildBasedChannel,\n GuildMember,\n GuildTextBasedChannel,\n Message,\n PartialDMChannel,\n PartialGroupDMChannel,\n Role,\n TextBasedChannel,\n User,\n VoiceBasedChannel\n} from \"discord.js\";\n\nexport type FetchedChannel<T> = T extends ChannelType.DM\n ? PartialGroupDMChannel | DMChannel | PartialDMChannel\n : T extends ChannelType.GuildText\n ? GuildBasedChannel & TextBasedChannel\n : T extends ChannelType.PublicThread | ChannelType.PrivateThread | ChannelType.AnnouncementThread\n ? AnyThreadChannel\n : T extends ChannelType.GuildVoice\n ? VoiceBasedChannel\n : T extends ChannelType.GuildCategory\n ? CategoryChannel\n : GuildBasedChannel;\n\nexport type FetchedMessageMention<T extends MentionType, InGuild extends boolean> = T extends \"user\"\n ? User\n : T extends \"member\"\n ? GuildMember\n : T extends \"channel\"\n ? InGuild extends true\n ? GuildBasedChannel\n : Channel\n : Role;\n\nexport type MentionType = \"user\" | \"member\" | \"channel\" | \"role\";\n\nexport interface GetMessageMentionOptions {\n cleanContent?: string;\n /** Return the ID instead of the object. */\n parse?: boolean;\n}\n\n/** Returns the string if it's populated, or \"0\" otherwise.\n *\n * Useful for fetching where the provided ID may or may not exist.\n * @param str The string to check. */\nexport function __zero(str?: string | null): string {\n return str?.length ? str : \"0\";\n}\n\n/** Check if the given string is a mention or a snowflake.\n *\n * Looks for formats like `<@123456789>`, or a numeric string with at least 6 digits.\n * @param str The string to check. */\nexport function isMentionOrSnowflake(str: string | undefined): boolean {\n return str ? (str.match(/<@[#&]?[\\d]{6,}>/) || str.match(/\\d{6,}/) ? true : false) : false;\n}\n\n/** Remove mention syntax from a string.\n * @param str The string to clean. */\nexport function cleanMention(str: string | undefined): string | undefined {\n return str ? str.replaceAll(/[<@#&>]/g, \"\").trim() : undefined;\n}\n\n/** Get a mention or snowflake argument of a specified type from a message.\n * @param message - The message to parse.\n * @param content - The message's clean content to parse. Will be used if message.mentions isn't populated.\n * @param type - The type of mention.\n * @param index - The argument index in the content. Default is `0`\n * @param idOnly - Whether to return the ID instead of the fecthed object. */\nexport async function getMessageMention<M extends Message, T extends MentionType>(\n message: M,\n content: string | undefined | null,\n type: T,\n index: number,\n idOnly: true\n): Promise<string | null>;\nexport async function getMessageMention<M extends Message, T extends MentionType>(\n message: M,\n content: string | undefined | null,\n type: T,\n index?: number,\n idOnly?: false\n): Promise<FetchedMessageMention<T, M extends Message<true> ? true : false> | null>;\nexport async function getMessageMention<M extends Message, T extends MentionType>(\n message: M,\n content: string | undefined | null,\n type: T,\n index: number = 0,\n idOnly?: boolean\n) {\n const args = content?.split(\" \");\n const arg = isMentionOrSnowflake(args?.[index]) ? cleanMention(args?.[index]) : undefined;\n\n switch (type) {\n case \"user\":\n const userMention = message.mentions.users.at(index) || null;\n if (!userMention && arg) {\n return idOnly ? arg : ((await fetchUser(message.client, arg)) as any);\n } else {\n return idOnly ? userMention?.id || null : (userMention as any);\n }\n\n case \"member\":\n if (!message.guild) return null;\n const member = await fetchMember(message.guild, message.mentions.users.at(index)?.id ?? arg);\n return idOnly ? member?.id || null : (member as any);\n\n case \"channel\":\n const channelMention = message.mentions.channels.at(index) || null;\n if (!channelMention && arg) {\n return idOnly\n ? arg\n : ((message.guild\n ? await fetchChannel(message.guild, arg)\n : (message.client.channels.cache.get(__zero(arg)) ??\n message.client.channels.fetch(__zero(arg)))) as any);\n } else {\n return idOnly ? channelMention?.id || null : (channelMention as any);\n }\n\n case \"role\":\n const roleMention = message.mentions.roles.at(index) || null;\n if (!roleMention && arg) {\n return idOnly ? arg : message.guild ? ((await fetchRole(message.guild, arg)) as any) : null;\n } else {\n return idOnly ? roleMention?.id || null : (roleMention as any);\n }\n\n default:\n return null;\n }\n}\n\n/** Get the ID of the first mention of a specified type from a message or message content.\n * @param options Optional options that aren't really optional. */\nexport function getFirstMentionId(options: { message?: Message; content?: string; type: MentionType }): string {\n let mentionId = \"\";\n\n if (options.message) {\n switch (options.type) {\n case \"user\":\n mentionId = options.message.mentions.users.first()?.id || \"\";\n break;\n case \"channel\":\n mentionId = options.message.mentions.channels.first()?.id || \"\";\n break;\n case \"role\":\n mentionId = options.message.mentions.roles.first()?.id || \"\";\n break;\n }\n }\n\n const firstArg = options.content?.split(\" \")[0] || \"\";\n return mentionId || isMentionOrSnowflake(firstArg) ? cleanMention(firstArg)! : \"\";\n}\n\n/** Fetch a user from the client, checking the cache first.\n * @param client - The client to fetch the user from.\n * @param userId - The ID of the user to fetch. */\nexport async function fetchUser(client: Client<true>, userId: string | undefined | null): Promise<User | null> {\n if (!userId) return null;\n return client.users.cache.get(__zero(userId)) || (await client.users.fetch(__zero(userId)).catch(() => null));\n}\n\n/** Fetch a guild from the client, checking the cache first.\n * @param client - The client to fetch the guild from.\n * @param guildId - The ID of the guild to fetch. */\nexport async function fetchGuild(client: Client<true>, guildId: string | undefined | null): Promise<Guild | null> {\n if (!guildId) return null;\n return client.guilds.cache.get(__zero(guildId)) || (await client.guilds.fetch(__zero(guildId)).catch(() => null));\n}\n\n/** Fetch a member from a guild, checking the cache first.\n * @param guild - The guild to fetch the member from.\n * @param memberId - The ID of the member to fetch. */\nexport async function fetchMember(guild: Guild, memberId: string | undefined | null): Promise<GuildMember | null> {\n if (!memberId) return null;\n return guild.members.cache.get(__zero(memberId)) || (await guild.members.fetch(__zero(memberId)).catch(() => null));\n}\n\n/** Fetch a channel from a guild, checking the cache first.\n *\n * ***NOTE:*** If the channel type does not match the provided type or the channel is null, null is returned.\n * @param guild - The guild to fetch the channel from.\n * @param channelId - The ID of the channel to fetch.\n * @param type - The type of channel to fetch. */\nexport async function fetchChannel<T extends ChannelType>(\n guild: Guild,\n channelId: string | undefined | null,\n type?: T\n): Promise<FetchedChannel<T> | null> {\n if (!channelId) return null;\n const channel =\n guild.channels.cache.get(__zero(channelId)) || (await guild.channels.fetch(__zero(channelId)).catch(() => null));\n if (type && channel?.type !== type) return null;\n return channel as any;\n}\n\n/** Fetch a role from a guild, checking the cache first.\n * @param guild - The guild to fetch the role from.\n * @param roleId - The ID of the role to fetch. */\nexport async function fetchRole(guild: Guild, roleId: string | undefined | null): Promise<Role | null> {\n if (!roleId) return null;\n return guild.roles.cache.get(__zero(roleId)) || (await guild.roles.fetch(__zero(roleId)).catch(() => null)) || null;\n}\n\n/** Fetch a message from a channel, checking the cache first.\n * @param channel - The channel to fetch the message from.\n * @param messageId - The ID of the message to fetch. */\nexport async function fetchMessage(\n channel: GuildTextBasedChannel | VoiceBasedChannel,\n messageId: string | undefined | null\n): Promise<Message | null> {\n if (!messageId) return null;\n return (\n channel.messages.cache.get(__zero(messageId)) ||\n (await channel.messages.fetch(__zero(messageId)).catch(() => null)) ||\n null\n );\n}\n","import { ActivityType } from \"discord.js\";\nimport { PartialDeep } from \"type-fest\";\nimport _ from \"lodash\";\n\nexport enum StatusType {\n DND = \"dnd\",\n Idle = \"idle\",\n Online = \"online\",\n Invisible = \"invisible\"\n}\n\nexport interface ClientActivity {\n /** Mappings:\n * - `$USER_COUNT` - this.client.users.cache.size\n * - `$GUILD_COUNT` - this.client.guilds.cache.size\n * - `$STAFF_GUILD_MEMBER_COUNT` - self explanatory\n */\n name: string;\n type: ActivityType;\n status: StatusType;\n streamUrl?: string;\n}\n\nexport interface ClientStatus {\n /** In seconds */\n interval?: number;\n randomize?: boolean;\n activity: ClientActivity | ClientActivity[];\n}\n\nexport interface VimcordClientStatus {\n production: ClientStatus;\n development: ClientStatus;\n}\n\nconst defaultPresence: VimcordClientStatus = {\n production: {\n interval: 60_000,\n randomize: false,\n activity: [\n { status: StatusType.Online, type: ActivityType.Custom, name: \"Need help? Use /help or !help\" },\n { status: StatusType.Online, type: ActivityType.Custom, name: \"Join our community!\" },\n { status: StatusType.Online, type: ActivityType.Watching, name: \"✨ $GUILD_COUNT servers\" }\n ]\n },\n development: {\n activity: { status: StatusType.DND, type: ActivityType.Custom, name: \"In development!\" }\n }\n};\n\nexport function createVimcordStatusConfig(options: PartialDeep<VimcordClientStatus> = {}): VimcordClientStatus {\n return _.merge(defaultPresence, options);\n}\n","export function formatThousands(num: number, sep = \",\") {\n return `${num}`.replace(/\\B(?<!\\.\\d*)(?=(\\d{3})+(?!\\d))/g, sep);\n}\n","import { Vimcord } from \"@/client\";\nimport { Logger } from \"@/tools/Logger\";\nimport { fetchGuild } from \"@/tools/utils\";\nimport { ClientActivity, ClientStatus, createVimcordStatusConfig, VimcordClientStatus } from \"@/types/status\";\nimport { formatThousands } from \"@/utils/number\";\nimport { pickRandom } from \"@/utils/random\";\nimport cron, { ScheduledTask } from \"node-cron\";\nimport EventEmitter from \"node:events\";\nimport { $, Loop } from \"qznt\";\nimport { PartialDeep } from \"type-fest\";\n\ntype VimcordStatusManagerEvents = {\n changed: [ClientActivity];\n cleared: [];\n rotation: [ClientActivity];\n paused: [Loop];\n started: [Loop];\n destroyed: [];\n};\n\nexport class VimcordStatusManager {\n client: Vimcord;\n logger: Logger;\n emitter: EventEmitter<VimcordStatusManagerEvents> = new EventEmitter();\n\n lastActivity: ClientActivity | null = null;\n lastActivityIndex: number = 0;\n private task: Loop | null = null;\n\n constructor(client: Vimcord) {\n this.client = client;\n\n // Define custom logger instance\n this.logger = new Logger({ prefixEmoji: \"💬\", prefix: `StatusManager (i${this.client.index})` });\n\n this.emitter.on(\"changed\", activity => {\n if (this.client.config.app.verbose) {\n this.logger.debug(`Status changed to '${activity.name}'`);\n }\n });\n\n this.emitter.on(\"cleared\", () => {\n if (this.client.config.app.verbose) {\n this.logger.debug(\"Status cleared\");\n }\n });\n }\n\n private clearData() {\n this.task?.stop();\n this.task = null;\n this.lastActivity = null;\n this.lastActivityIndex = 0;\n return this;\n }\n\n private async getReadyClient() {\n const client = await this.client.whenReady();\n if (!client.user) throw new Error(\"Cannot manage the client's activity when its user is not hydrated\");\n return client;\n }\n\n private async formatActivityName(name: string) {\n name = name\n .replace(\"$USER_COUNT\", formatThousands(this.client.users.cache.size))\n .replace(\"$GUILD_COUNT\", formatThousands(this.client.guilds.cache.size))\n .replace(\n \"$INVITE\",\n this.client.config.staff.guild.inviteUrl\n ? this.client.config.staff.guild.inviteUrl\n : \"<STAFF_INVITE_URL_NOT_SET>\"\n );\n\n // Staff guild context\n if (name.includes(\"$STAFF_GUILD_MEMBER_COUNT\")) {\n await fetchGuild(this.client as Vimcord<true>, this.client.config.staff.guild.id)\n .then(guild => {\n if (!guild) return (name = name.replace(\"$STAFF_GUILD_MEMBER_COUNT\", \"<STAFF_GUILD_NOT_FOUND>\"));\n\n // Guild member count\n name = name.replace(\"$STAFF_GUILD_MEMBER_COUNT\", formatThousands(guild.members.cache.size));\n })\n .catch(err => this.logger.error(\"Failed to fetch the staff guild\", err));\n }\n\n return name;\n }\n\n private async setActivity(activity: ClientActivity) {\n const client = await this.getReadyClient();\n\n // Format the activity's name\n activity.name = await this.formatActivityName(activity.name);\n\n // Set the status\n client.user.setStatus(activity.status);\n // Set the activity\n client.user.setActivity({ name: activity.name, type: activity.type, url: activity.streamUrl });\n\n this.emitter.emit(\"changed\", activity);\n }\n\n private async statusRotationTask(clientStatus: ClientStatus) {\n let activity: ClientActivity;\n\n // Randomly pick a new activity that wasn't our last one\n if (clientStatus.randomize && Array.isArray(clientStatus.activity)) {\n activity = $.rnd.choice(clientStatus.activity, { not: this.lastActivity });\n\n // Cache the current activity to compare to the next one\n this.lastActivity = activity;\n } else {\n const activityIndex = (this.lastActivityIndex + 1) % (clientStatus.activity as ClientActivity[]).length;\n this.lastActivityIndex = activityIndex;\n\n // Pick the next activity in the list\n activity = (clientStatus.activity as ClientActivity[])[activityIndex]!;\n }\n\n // Set the client's activity to the new activity\n await this.setActivity(activity);\n this.emitter.emit(\"rotation\", activity);\n }\n\n private async scheduleStatusRotation(clientStatus: ClientStatus) {\n if (!clientStatus.interval) throw new Error(\"Cannot create client activity interval without interval time\");\n\n this.task?.stop();\n this.task = null;\n\n // Create a new activity interval\n this.task = new $.Loop(() => this.statusRotationTask(clientStatus), $.math.ms(clientStatus.interval), true);\n\n // Start the rotation task\n this.start();\n }\n\n start(): this {\n if (this.task) {\n this.task.start();\n this.emitter.emit(\"started\", this.task);\n }\n return this;\n }\n\n pause(): this {\n if (this.task) {\n this.task.stop();\n this.emitter.emit(\"paused\", this.task);\n }\n return this;\n }\n\n async set(status: PartialDeep<VimcordClientStatus>): Promise<this> {\n const statusConfig = createVimcordStatusConfig(status);\n\n let clientStatus: ClientStatus;\n\n if (this.client.config.app.devMode) {\n clientStatus = statusConfig.development;\n } else {\n clientStatus = statusConfig.production;\n }\n\n // Just set the status without creating an interval\n if (!clientStatus.interval) {\n await this.setActivity(Array.isArray(clientStatus.activity) ? clientStatus.activity[0]! : clientStatus.activity);\n } else {\n // Create a new activity interval\n await this.scheduleStatusRotation(clientStatus);\n }\n\n return this;\n }\n\n async destroy(): Promise<this> {\n if (this.task) {\n this.task.stop();\n this.task = null;\n this.emitter.emit(\"destroyed\");\n\n // Clear the status and data\n await this.clear();\n }\n return this;\n }\n\n async clear(): Promise<this> {\n const client = await this.getReadyClient();\n this.clearData();\n client.user.setActivity({ name: \"\" });\n this.emitter.emit(\"cleared\");\n return this;\n }\n}\n","import { REST, Routes } from \"discord.js\";\nimport { CommandType } from \"@ctypes/command.base\";\nimport { VimcordCommandBuilderByType } from \"@ctypes/command.helpers\";\nimport { importModulesFromDir } from \"@utils/dir\";\nimport { type Vimcord } from \"@/client\";\n\n/**\n * Shared logic for Application Commands (Slash & Context)\n */\nabstract class VimcordAppCommandManager<T extends CommandType.Slash | CommandType.Context> {\n public commands: Map<string, VimcordCommandBuilderByType<T>> = new Map();\n protected rest!: REST;\n\n constructor(\n protected client: Vimcord,\n protected typeName: string\n ) {\n this.client.whenReady().then(c => (this.rest = new REST().setToken(c.token)));\n }\n\n get(name: string) {\n return this.commands.get(name);\n }\n\n /**\n * Filters and returns commands based on deployment options\n */\n getAll(options?: { names?: string[]; fuzzyNames?: string[]; globalOnly?: boolean; ignoreDeploymentOptions?: boolean }) {\n const matchedCommands = new Map<string, VimcordCommandBuilderByType<T>>();\n const isDev = this.client.config.app.devMode;\n\n for (const cmd of this.commands.values()) {\n const config = cmd.toConfig() as any;\n const name = (cmd.builder as any).name;\n\n // 1. Name Filtering\n if (options?.names || options?.fuzzyNames) {\n const nameMatched = options.names?.includes(name) || options.fuzzyNames?.some(fuzzy => name.includes(fuzzy));\n\n if (!nameMatched) continue;\n }\n\n if (options?.ignoreDeploymentOptions) {\n matchedCommands.set(name, cmd);\n continue;\n }\n\n // 2. Environment/Deployment Filtering\n const deployment = config.deployment || {};\n const isProperEnv =\n !deployment.environments || deployment.environments.includes(isDev ? \"development\" : \"production\");\n\n if (!isProperEnv) continue;\n\n // 3. Global Filter\n if (options?.globalOnly && deployment.global === false) continue;\n\n matchedCommands.set(name, cmd);\n }\n\n return matchedCommands;\n }\n\n async registerGlobal(options?: { commands?: string[]; fuzzyCommands?: string[] }) {\n const client = await this.client.whenReady();\n const commands = Array.from(\n this.getAll({\n names: options?.commands,\n fuzzyNames: options?.fuzzyCommands,\n globalOnly: true\n }).values()\n ).map(cmd => cmd.builder.toJSON());\n\n if (!commands.length) {\n console.log(`[${this.typeName}] No commands to register`);\n return;\n }\n\n console.log(`[${this.typeName}] Registering ${commands.length} commands globally...`);\n\n try {\n await this.rest.put(Routes.applicationCommands(client.user.id), { body: commands });\n console.log(`[${this.typeName}] ✔ Registered app commands globally`);\n } catch (err) {\n console.log(`[${this.typeName}] ✖ Failed to register app commands globally`, err);\n }\n }\n\n async registerGuild(options?: { commands?: string[]; fuzzyCommands?: string[]; guilds?: string[] }) {\n const client = await this.client.whenReady();\n const commands = Array.from(\n this.getAll({\n names: options?.commands,\n fuzzyNames: options?.fuzzyCommands\n }).values()\n ).map(cmd => cmd.builder.toJSON());\n\n if (!commands.length) {\n console.log(`[${this.typeName}] No commands to register`);\n return;\n }\n\n const guildIds = options?.guilds || client.guilds.cache.map(g => g.id);\n console.log(`[${this.typeName}] Registering ${commands.length} commands for ${guildIds.length} guilds...`);\n\n await Promise.all(\n guildIds.map(guildId =>\n this.rest\n .put(Routes.applicationGuildCommands(client.user.id, guildId), { body: commands })\n .then(() => {\n const gName = client.guilds.cache.get(guildId)?.name || \"n/a\";\n console.log(`[${this.typeName}] ✔ Set app commands in guild: ${guildId} (${gName})`);\n })\n .catch(err => {\n const gName = client.guilds.cache.get(guildId)?.name || \"n/a\";\n console.log(`[${this.typeName}] ✖ Failed to set app commands in guild: ${guildId} (${gName})`, err);\n })\n )\n );\n }\n\n async unregisterGuild(options?: { guilds?: string[] }) {\n const client = await this.client.whenReady();\n const guildIds = options?.guilds || client.guilds.cache.map(g => g.id);\n\n console.log(`[${this.typeName}] Unregistering commands from ${guildIds.length} guilds...`);\n\n await Promise.all(\n guildIds.map(guildId =>\n this.rest\n .put(Routes.applicationGuildCommands(client.user.id, guildId), { body: [] })\n .then(() => console.log(`[${this.typeName}] ✔ Removed app commands in guild: ${guildId}`))\n .catch(err =>\n console.log(`[${this.typeName}] ✖ Failed to remove app commands in guild: ${guildId}`, err)\n )\n )\n );\n }\n\n async unregisterGlobal() {\n const client = await this.client.whenReady();\n try {\n await this.rest.put(Routes.applicationCommands(client.user.id), { body: [] });\n console.log(`[${this.typeName}] ✔ Removed app commands globally`);\n } catch (err) {\n console.log(`[${this.typeName}] ✖ Failed to remove app commands globally`, err);\n }\n }\n}\n\nexport class VimcordSlashCommandManager extends VimcordAppCommandManager<CommandType.Slash> {\n constructor(client: Vimcord) {\n super(client, \"SlashCommandManager\");\n }\n\n async importFrom(dir: string | string[], replaceAll = false) {\n if (replaceAll) this.commands.clear();\n const dirs = Array.isArray(dir) ? dir : [dir];\n\n // Map over directories since the utility only takes a string\n const modules = (\n await Promise.all(\n dirs.map(d => importModulesFromDir<{ default: VimcordCommandBuilderByType<CommandType.Slash> }>(d, \"slash\"))\n )\n ).flat();\n\n for (const { module } of modules) {\n this.commands.set(module.default.builder.name, module.default);\n }\n this.client.logger.moduleLoaded(\"Slash Commands\", modules.length);\n return this.commands;\n }\n}\n\nexport class VimcordContextCommandManager extends VimcordAppCommandManager<CommandType.Context> {\n constructor(client: Vimcord) {\n super(client, \"ContextCommandManager\");\n }\n\n async importFrom(dir: string | string[], replaceAll = false) {\n if (replaceAll) this.commands.clear();\n const dirs = Array.isArray(dir) ? dir : [dir];\n\n const modules = (\n await Promise.all(\n dirs.map(d => importModulesFromDir<{ default: VimcordCommandBuilderByType<CommandType.Context> }>(d, \"ctx\"))\n )\n ).flat();\n\n for (const { module } of modules) {\n this.commands.set(module.default.builder.name, module.default);\n }\n this.client.logger.moduleLoaded(\"Context Commands\", modules.length);\n return this.commands;\n }\n}\n\nexport class VimcordPrefixCommandManager {\n public commands: Map<string, VimcordCommandBuilderByType<CommandType.Prefix>> = new Map();\n\n constructor(private client: Vimcord) {}\n\n resolve(trigger: string) {\n const config = this.client.config.prefixCommands;\n const search = config.allowCaseInsensitiveCommandNames ? trigger.toLowerCase() : trigger;\n\n return Array.from(this.commands.values()).find(cmd => {\n const opts = cmd.toConfig();\n const name = config.allowCaseInsensitiveCommandNames ? opts.name.toLowerCase() : opts.name;\n if (name === search) return true;\n return opts.aliases?.some(a =>\n config.allowCaseInsensitiveCommandNames ? a.toLowerCase() === search : a === search\n );\n });\n }\n\n async importFrom(dir: string | string[], replaceAll = false) {\n if (replaceAll) this.commands.clear();\n const dirs = Array.isArray(dir) ? dir : [dir];\n\n const modules = (\n await Promise.all(\n dirs.map(d =>\n importModulesFromDir<{ default: VimcordCommandBuilderByType<CommandType.Prefix> }>(d, \"prefix\")\n )\n )\n ).flat();\n\n for (const { module } of modules) {\n this.commands.set(module.default.toConfig().name, module.default);\n }\n this.client.logger.moduleLoaded(\"Prefix Commands\", modules.length);\n return this.commands;\n }\n}\n\nexport class VimcordCommandManager {\n public readonly slash: VimcordSlashCommandManager;\n public readonly prefix: VimcordPrefixCommandManager;\n public readonly context: VimcordContextCommandManager;\n\n constructor(client: Vimcord) {\n this.slash = new VimcordSlashCommandManager(client);\n this.prefix = new VimcordPrefixCommandManager(client);\n this.context = new VimcordContextCommandManager(client);\n }\n}\n","import { EventBuilder } from \"@builders/event.builder\";\nimport { importModulesFromDir } from \"@utils/dir\";\nimport { ClientEvents, Events } from \"discord.js\";\nimport { type Vimcord } from \"@/client\";\nimport { Logger } from \"@/tools/Logger\";\n\nexport class VimcordEventManager {\n client: Vimcord;\n events: Map<string, EventBuilder<any>> = new Map();\n logger: Logger;\n\n constructor(client: Vimcord) {\n this.client = client;\n\n // Define custom logger instance\n this.logger = new Logger({ prefixEmoji: \"📋\", prefix: `EventManager (i${this.client.index})` });\n\n for (const event of Object.values(Events)) {\n client.on(event.toString(), async (...args) =>\n this.executeEvents.apply(this, [event as keyof ClientEvents, ...(args as ClientEvents[keyof ClientEvents])])\n );\n }\n }\n\n register<T extends keyof ClientEvents>(...events: EventBuilder<T>[]): void {\n for (const event of events) {\n this.events.set(event.name, event);\n\n if (this.client.config.app.verbose) {\n this.logger.debug(`'${event.name}' registered for EventType '${event.event}'`);\n }\n }\n }\n\n unregister(...names: string[]): void {\n for (const name of names) {\n const event = this.events.get(name);\n if (!event) continue;\n\n this.events.delete(name);\n\n if (this.client.config.app.verbose) {\n this.logger.debug(`'${event.name}' unregistered for EventType '${event.event}'`);\n }\n }\n }\n\n clear() {\n this.events.forEach(e => this.unregister(e.name));\n this.events.clear();\n }\n\n get(name: string): EventBuilder | undefined {\n return this.events.get(name);\n }\n\n getByTag(tag: string): EventBuilder[] {\n return Array.from(this.events.values()).filter(event => event.metadata?.tags?.includes(tag));\n }\n\n getByCategory(category: string): EventBuilder[] {\n return Array.from(this.events.values()).filter(event => event.metadata?.category?.includes(category));\n }\n\n getByEvent<T extends keyof ClientEvents>(eventType: T): EventBuilder<T>[] {\n return Array.from(this.events.values()).filter(event => event.event === eventType);\n }\n\n async executeEvents<T extends keyof ClientEvents>(eventType: T, ...args: ClientEvents[T]): Promise<void> {\n const events = this.getByEvent(eventType);\n if (!events.length) return;\n\n const sortedEvents = events.sort((a, b) => b.priority - a.priority);\n\n await Promise.all(\n sortedEvents.map(async event => {\n try {\n await event.execute?.(this.client as Vimcord<true>, ...args);\n if (event.once) {\n this.unregister(event.name);\n }\n } catch (err) {\n this.logger.error(`'${event.name}' failed to execute`, err as Error);\n }\n })\n );\n }\n\n /** Import event modules that end with `.event` */\n async importFrom(dir: string | string[], replaceAll?: boolean) {\n dir = Array.isArray(dir) ? dir : [dir];\n\n const eventModules = await Promise.all(\n dir.map(dir => importModulesFromDir<{ default: EventBuilder<any> }>(dir, \"event\"))\n );\n\n // Clear current registered events\n if (replaceAll) {\n this.clear();\n }\n\n let importedEvents = 0;\n let ignoredEvents = 0;\n\n // Register the imported event modules\n for (const event of eventModules.flat()) {\n if (!event.module.default.enabled) {\n ignoredEvents++;\n } else {\n importedEvents++;\n }\n\n this.register(event.module.default);\n }\n\n this.client.logger.moduleLoaded(\"Event Handlers\", importedEvents, ignoredEvents);\n return this.events;\n }\n}\n","import {\n ActionRowBuilder,\n AttachmentBuilder,\n ButtonBuilder,\n ButtonStyle,\n CommandInteraction,\n ComponentType,\n Guild,\n Message\n} from \"discord.js\";\nimport { BetterEmbed } from \"@/tools/BetterEmbed\";\nimport { SendMethod } from \"@/tools/types\";\nimport { type Vimcord } from \"@/client\";\n\nexport async function sendCommandErrorEmbed(\n client: Vimcord,\n error: Error,\n guild: Guild | null | undefined,\n messageOrInteraction: Message | CommandInteraction\n) {\n if (!client.features.enableCommandErrorMessage) return null;\n\n const config =\n typeof client.features.enableCommandErrorMessage !== \"boolean\"\n ? client.features.enableCommandErrorMessage\n : undefined;\n\n const buttons = {\n supportServer: new ButtonBuilder({\n url: config?.inviteUrl || client.config.staff.guild.inviteUrl || \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\", // may or may not be a rickroll\n label: config?.inviteButtonLabel || \"Support Support\",\n style: ButtonStyle.Link\n }),\n\n details: new ButtonBuilder({\n customId: \"btn_details\",\n label: config?.detailButtonLabel || \"Details\",\n style: ButtonStyle.Secondary\n })\n };\n\n // Action row\n const actionRow = new ActionRowBuilder<ButtonBuilder>({\n components:\n config?.inviteUrl && guild?.id !== (config.inviteUrl || client.config.staff.guild.id)\n ? [buttons.supportServer, buttons.details]\n : [buttons.details]\n });\n\n // Create the embed (Error)\n const embed_error =\n config?.embed?.(new BetterEmbed(), error, guild) ||\n new BetterEmbed({\n color: \"Red\",\n title: \"Something went wrong\",\n description: \"If you keep encountering this error, please report it\"\n });\n\n // Send the embed\n const msg = await embed_error.send(messageOrInteraction, {\n components: [actionRow],\n flags: config?.ephemeral ? \"Ephemeral\" : undefined,\n deleteAfter: config?.deleteAfter\n });\n if (!msg) return null;\n\n // Collect interactions\n const collector = msg.createMessageComponentCollector({\n componentType: ComponentType.Button,\n idle: config?.detailButtonIdleTimeout ?? 30_000,\n filter: i => i.customId === \"btn_details\"\n });\n\n collector.on(\"collect\", i => {\n const attachment = new AttachmentBuilder(Buffer.from(`${error.message}\\n\\n${error.stack}`), {\n name: \"error.txt\"\n });\n\n // Send the error attachment\n i.reply({ files: [attachment], flags: \"Ephemeral\" });\n });\n\n collector.on(\"end\", () => {\n // Disable the details button\n buttons.details.setDisabled(true);\n\n // Update the action row\n embed_error.send(messageOrInteraction, {\n sendMethod: messageOrInteraction instanceof Message ? SendMethod.MessageEdit : undefined,\n components: [actionRow]\n });\n });\n\n return msg;\n}\n","import {\n APIEmbed,\n APIEmbedField,\n Client,\n ColorResolvable,\n EmbedBuilder,\n GuildMember,\n Message,\n TextBasedChannel,\n User\n} from \"discord.js\";\nimport type { InteractionResolveable, SendHandler } from \"./types\";\nimport { globalVimcordToolsConfig, VimcordToolsConfig } from \"@/configs/tools.config\";\nimport { dynaSend, DynaSendOptions } from \"./dynaSend\";\nimport { Vimcord } from \"@/client\";\n\nexport interface BetterEmbedContext {\n client?: Vimcord | Client | null;\n interaction?: InteractionResolveable | null;\n channel?: TextBasedChannel | null;\n message?: Message | null;\n user?: GuildMember | User | null;\n}\n\nexport interface BetterEmbedAuthor {\n text: string;\n icon?: string | boolean | null;\n hyperlink?: string | null;\n}\n\nexport interface BetterEmbedTitle {\n text: string;\n hyperlink?: string | null;\n}\n\nexport interface BetterEmbedFooter {\n text: string;\n icon?: string | boolean | null;\n}\n\nexport interface BetterEmbedData {\n context?: BetterEmbedContext | null;\n author?: string | BetterEmbedAuthor | null;\n title?: string | BetterEmbedTitle | null;\n thumbnailUrl?: string | null;\n description?: string | (string | null | undefined)[] | null;\n imageUrl?: string | null;\n footer?: string | BetterEmbedFooter | null;\n fields?: (APIEmbedField | null | undefined)[];\n color?: ColorResolvable | ColorResolvable[] | null;\n timestamp?: number | boolean | Date | null;\n acf?: boolean;\n config?: VimcordToolsConfig;\n}\n\nexport class BetterEmbed {\n private embed = new EmbedBuilder();\n private data: Required<Omit<BetterEmbedData, \"config\">>;\n private config: VimcordToolsConfig;\n\n /** A powerful wrapper for `EmbedBuilder` that introduces useful features\n *\n * Auto-shorthand context formatting (_ACF_) is enabled by default\n *\n * All functions utilize _ACF_ unless `BetterEmbed.acf` is set to `false`\n *\n * ___Use a blackslash___ `\\` ___to escape any context___\n *\n * \\- - - Author Context - - -\n * - __`$USER`__: _author's mention (@xsqu1znt)_\n * - __`$USER_NAME`__: _author's username_\n * - __`$DISPLAY_NAME`__: _author's display name (requires `GuildMember` context)_\n * - __`$USER_AVATAR`__: _author's avatar_\n *\n * \\- - - Client Context - - -\n *\n * - __`$BOT_AVATAR`__: _bot's avatar_\n *\n * \\- - - Shorthand Context - - -\n * - __`$YEAR`__: _YYYY_\n * - __`$MONTH`__: _MM_\n * - __`$DAY`__: _DD_\n * - __`$year`__: _YY_\n * - __`$month`__: _M or MM_\n * - __`$day`__: _D or DD_ */\n constructor(data: BetterEmbedData = {}) {\n this.config = data.config || globalVimcordToolsConfig;\n\n // Initialize with defaults\n this.data = {\n context: data.context || null,\n author: data.author || null,\n title: data.title || null,\n thumbnailUrl: data.thumbnailUrl || null,\n description: data.description || null,\n imageUrl: data.imageUrl || null,\n footer: data.footer || null,\n fields: data.fields || [],\n color: data.color ?? (this.config.devMode ? this.config.embedColorDev : this.config.embedColor),\n timestamp: data.timestamp || null,\n acf: data.acf ?? true\n };\n\n this.build();\n }\n\n private build(): void {\n this.normalizeData();\n this.applyContextFormatting();\n this.configureEmbed();\n }\n\n private normalizeData(): void {\n if (typeof this.data.author === \"string\") {\n this.data.author = { text: this.data.author };\n }\n\n if (typeof this.data.title === \"string\") {\n this.data.title = { text: this.data.title };\n }\n\n if (typeof this.data.footer === \"string\") {\n this.data.footer = { text: this.data.footer };\n }\n\n if (this.data.timestamp === true) {\n this.data.timestamp = Date.now();\n }\n }\n\n private getContextUser(): GuildMember | User | null {\n const context = this.data.context;\n if (!context) return null;\n\n return (\n context.user ||\n (context.interaction as any)?.member ||\n (context.interaction as any)?.user ||\n context.message?.member ||\n context.message?.author ||\n null\n );\n }\n\n private getContextClient(): Vimcord | Client | null {\n const context = this.data.context;\n if (!context) return null;\n\n return context.client || context.interaction?.client || context.message?.client || null;\n }\n\n private applyContextFormatting(str?: string): string | undefined {\n if (!this.data.acf) return;\n\n const user = this.getContextUser();\n const guildMember = user instanceof GuildMember ? user : null;\n const actualUser = guildMember?.user || (user instanceof User ? user : null);\n const client = this.getContextClient();\n\n const formatString = (str: string): string => {\n if (!str || !str.includes(\"$\")) return str;\n\n return (\n str\n // User context\n .replace(/(?<!\\\\)\\$USER\\b/g, actualUser?.toString() || \"$USER\")\n .replace(/(?<!\\\\)\\$USER_NAME\\b/g, actualUser?.username || \"$USER_NAME\")\n .replace(/(?<!\\\\)\\$USER_AVATAR\\b/g, actualUser?.avatarURL() || \"$USER_AVATAR\")\n .replace(/(?<!\\\\)\\$DISPLAY_NAME\\b/g, guildMember?.displayName || \"$DISPLAY_NAME\")\n\n // Bot context\n .replace(/(?<!\\\\)\\$BOT_AVATAR\\b/g, client?.user?.avatarURL() || \"$BOT_AVATAR\")\n\n // Utility\n .replace(/(?<!\\\\)\\$INVIS\\b/g, \"\\u200B\")\n\n // Date context\n .replace(/(?<!\\\\)\\$YEAR/g, new Date().getFullYear().toString())\n .replace(/(?<!\\\\)\\$MONTH/g, String(new Date().getMonth() + 1).padStart(2, \"0\"))\n .replace(/(?<!\\\\)\\$DAY/g, String(new Date().getDate()).padStart(2, \"0\"))\n .replace(/(?<!\\\\)\\$year/g, String(new Date().getFullYear()).slice(-2))\n .replace(/(?<!\\\\)\\$month/g, String(new Date().getMonth() + 1).padStart(2, \"0\"))\n .replace(/(?<!\\\\)\\$day/g, String(new Date().getDate()).padStart(2, \"0\"))\n\n // Mentions\n .replace(/(?<!\\\\|<)@([0-9]+)(?!>)/g, \"<@$1>\")\n .replace(/(?<!\\\\|<)@&([0-9]+)(?!>)/g, \"<@&$1>\")\n .replace(/(?<!\\\\|<)#([0-9]+)(?!>)/g, \"<#$1>\")\n );\n };\n\n if (str) {\n // Apply context to the given string and return early\n return formatString(str);\n }\n\n // Apply formatting to text fields\n if (this.data.author && typeof this.data.author === \"object\") {\n this.data.author.text = formatString(this.data.author.text);\n\n // Handle author icon\n if (this.data.author.icon === true && actualUser) {\n this.data.author.icon = actualUser.avatarURL();\n } else if (typeof this.data.author.icon === \"string\") {\n this.data.author.icon = formatString(this.data.author.icon);\n }\n }\n\n if (this.data.title && typeof this.data.title === \"object\") {\n this.data.title.text = formatString(this.data.title.text);\n }\n\n if (this.data.description) {\n this.data.description = formatString(\n Array.isArray(this.data.description)\n ? this.data.description.filter(s => s !== null && s !== undefined).join(\"\\n\")\n : this.data.description\n );\n }\n\n if (this.data.footer && typeof this.data.footer === \"object\") {\n this.data.footer.text = formatString(this.data.footer.text);\n }\n\n if (this.data.thumbnailUrl) {\n this.data.thumbnailUrl = formatString(this.data.thumbnailUrl);\n }\n\n if (this.data.imageUrl) {\n this.data.imageUrl = formatString(this.data.imageUrl);\n }\n\n // Apply formatting to fields\n this.data.fields = this.data.fields.filter(Boolean).map(field => ({\n ...field,\n name: formatString(field!.name),\n value: formatString(field!.value)\n }));\n }\n\n private configureEmbed(): void {\n // Set author\n if (this.data.author && typeof this.data.author === \"object\" && this.data.author.text) {\n try {\n this.embed.setAuthor({\n name: this.data.author.text,\n iconURL: typeof this.data.author.icon === \"string\" ? this.data.author.icon : undefined,\n url: this.data.author.hyperlink || undefined\n });\n } catch (error) {\n console.error(\"[BetterEmbed] Invalid author configuration:\", error);\n }\n }\n\n // Set title\n if (this.data.title && typeof this.data.title === \"object\" && this.data.title.text) {\n try {\n this.embed.setTitle(this.data.title.text);\n if (this.data.title.hyperlink) {\n this.embed.setURL(this.data.title.hyperlink);\n }\n } catch (error) {\n console.error(\"[BetterEmbed] Invalid title configuration:\", error);\n }\n }\n\n // Set description\n if (this.data.description) {\n this.embed.setDescription(\n Array.isArray(this.data.description) ? this.data.description.join(\"\\n\") : this.data.description\n );\n }\n\n // Set thumbnail\n if (this.data.thumbnailUrl) {\n try {\n this.embed.setThumbnail(this.data.thumbnailUrl);\n } catch (error) {\n console.error(\"[BetterEmbed] Invalid thumbnail URL:\", error);\n }\n }\n\n // Set image\n if (this.data.imageUrl) {\n try {\n this.embed.setImage(this.data.imageUrl);\n } catch (error) {\n console.error(\"[BetterEmbed] Invalid image URL:\", error);\n }\n }\n\n // Set footer\n if (this.data.footer && typeof this.data.footer === \"object\" && this.data.footer.text) {\n try {\n this.embed.setFooter({\n text: this.data.footer.text,\n iconURL: typeof this.data.footer.icon === \"string\" ? this.data.footer.icon : undefined\n });\n } catch (error) {\n console.error(\"[BetterEmbed] Invalid footer configuration:\", error);\n }\n }\n\n // Set color\n if (this.data.color) {\n try {\n const color = Array.isArray(this.data.color)\n ? (this.data.color[Math.floor(Math.random() * this.data.color.length)] ?? null)\n : this.data.color;\n this.embed.setColor(color);\n } catch (error) {\n console.error(\"[BetterEmbed] Invalid color:\", error);\n }\n }\n\n // Set timestamp\n if (this.data.timestamp && this.data.timestamp !== true) {\n try {\n this.embed.setTimestamp(this.data.timestamp as Date | number);\n } catch (error) {\n console.error(\"[BetterEmbed] Invalid timestamp:\", error);\n }\n }\n\n // Set fields\n if (this.data.fields.length > 0) {\n const validFields = this.data.fields.slice(0, 25); // Discord limit\n if (this.data.fields.length > 25) {\n console.warn(\"[BetterEmbed] Only first 25 fields will be used (Discord limit)\");\n }\n this.embed.setFields(validFields as APIEmbedField[]);\n }\n }\n\n setAuthor(author: string | BetterEmbedAuthor | null): this {\n this.data.author = author;\n this.build();\n return this;\n }\n\n setTitle(title: string | BetterEmbedTitle | null): this {\n this.data.title = title;\n this.build();\n return this;\n }\n\n setDescription(description: string | null): this {\n this.data.description = description;\n this.build();\n return this;\n }\n\n setThumbnail(url: string | null): this {\n this.data.thumbnailUrl = url;\n this.build();\n return this;\n }\n\n setImage(url: string | null): this {\n this.data.imageUrl = url;\n this.build();\n return this;\n }\n\n setFooter(footer: string | BetterEmbedFooter | null): this {\n this.data.footer = footer;\n this.build();\n return this;\n }\n\n setColor(color: ColorResolvable | ColorResolvable[] | null): this {\n this.data.color = color;\n this.build();\n return this;\n }\n\n setTimestamp(timestamp: number | boolean | Date | null): this {\n this.data.timestamp = timestamp;\n this.build();\n return this;\n }\n\n addFields(fields: APIEmbedField[]): this {\n this.data.fields = [...this.data.fields, ...fields];\n this.build();\n return this;\n }\n\n setFields(fields: APIEmbedField[]): this {\n this.data.fields = fields;\n this.build();\n return this;\n }\n\n spliceFields(index: number, deleteCount: number, ...fields: APIEmbedField[]): this {\n this.data.fields.splice(index, deleteCount, ...fields);\n this.build();\n return this;\n }\n\n clone(overrides: Partial<BetterEmbedData> = {}): BetterEmbed {\n return new BetterEmbed({ ...this.data, ...overrides });\n }\n\n toJSON(): APIEmbed {\n return this.embed.toJSON();\n }\n\n async send(\n handler: SendHandler,\n options: DynaSendOptions = {},\n overrides?: Partial<BetterEmbedData>\n ): Promise<Message | null> {\n this.build();\n\n // Apply ACF to message content\n if (options.content && this.data.acf) {\n options.content = this.applyContextFormatting(options.content) as string;\n }\n\n return await dynaSend(handler, {\n ...options,\n embeds: [\n overrides ? this.clone(overrides) : this,\n ...(Array.isArray(options?.embeds) ? options?.embeds : options?.embeds ? [options?.embeds] : [])\n ]\n });\n }\n}\n","import {\n ActionRowBuilder,\n APIContainerComponent,\n BaseChannel,\n BaseInteraction,\n BaseMessageOptions,\n ContainerBuilder,\n ForwardOptions,\n GuildMember,\n GuildTextBasedChannel,\n InteractionCallbackResponse,\n InteractionReplyOptions,\n Message,\n MessageActionRowComponentBuilder,\n MessageMentionOptions,\n PollData,\n RepliableInteraction,\n ReplyOptions,\n StickerResolvable,\n User\n} from \"discord.js\";\nimport { EmbedResolvable, SendHandler, SendMethod } from \"./types\";\nimport { BetterContainer } from \"./BetterContainer\";\n\ntype Mutable<T> = {\n -readonly [P in keyof T]: T[P];\n};\n\nexport type SendableComponent = ContainerBuilder | BetterContainer | ActionRowBuilder<MessageActionRowComponentBuilder>;\nexport type RequiredDynaSendOptions = DynaSendOptions &\n (\n | { content: string }\n | { embeds: DynaSendOptions[\"embeds\"] }\n | { components: DynaSendOptions[\"components\"] }\n | { files: Mutable<BaseMessageOptions[\"files\"]> }\n | { stickers: StickerResolvable[] }\n | { poll: PollData }\n | { forward: ForwardOptions }\n );\n\nexport interface DynaSendOptions {\n /** The method used to send the message - auto-detected if not provided */\n sendMethod?: SendMethod;\n /** Text content to send in the message */\n content?: string;\n /** Embeds to send with the message */\n embeds?: EmbedResolvable[];\n /** Components to send with the message */\n components?: SendableComponent[];\n /** Attachments to send with the message */\n files?: Mutable<BaseMessageOptions[\"files\"]>;\n /** Stickers to send with the message */\n stickers?: StickerResolvable[];\n /** Send a poll */\n poll?: PollData;\n /** Interaction flags */\n flags?: InteractionReplyOptions[\"flags\"];\n /** Return the message after replying to or editing an interaction */\n withResponse?: boolean;\n /** Mention types allowed for the message */\n allowedMentions?: MessageMentionOptions;\n /** The message to reply to */\n reply?: ReplyOptions;\n /** Forward a message */\n forward?: ForwardOptions;\n /** Send as a TTS message */\n tts?: boolean;\n /** Time in milliseconds before deleting the message */\n deleteAfter?: number;\n}\n\nexport class DynaSend {\n private static forceArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n }\n\n private static isInteractionCallback(obj: any): obj is InteractionCallbackResponse {\n return obj instanceof InteractionCallbackResponse;\n }\n\n private static filterFlags(\n flags: InteractionReplyOptions[\"flags\"],\n excludeFlags: string[]\n ): InteractionReplyOptions[\"flags\"] {\n if (!flags) return undefined;\n const flagArray = this.forceArray(flags);\n return flagArray.filter(flag => !excludeFlags.includes(flag as string));\n }\n\n private static detectSendMethod(handler: SendHandler): SendMethod {\n if (handler instanceof BaseInteraction) {\n return handler.replied || handler.deferred ? SendMethod.EditReply : SendMethod.Reply;\n }\n if (handler instanceof BaseChannel) return SendMethod.Channel;\n if (handler instanceof Message) return SendMethod.MessageReply;\n if (handler instanceof GuildMember || handler instanceof User) return SendMethod.User;\n\n throw new Error(\"[DynaSend] Unable to determine send method for handler type\");\n }\n\n private static validateSendMethod(handler: SendHandler, method: SendMethod): void {\n const interactionMethods = [SendMethod.Reply, SendMethod.EditReply, SendMethod.FollowUp];\n\n if (interactionMethods.includes(method) && !(handler instanceof BaseInteraction)) {\n throw new TypeError(`[DynaSend] SendMethod '${SendMethod[method]}' requires BaseInteraction handler`);\n }\n\n if (method === SendMethod.Channel && !(handler instanceof BaseChannel)) {\n throw new TypeError(`[DynaSend] SendMethod '${SendMethod[method]}' requires BaseChannel handler`);\n }\n\n if ([SendMethod.MessageReply, SendMethod.MessageEdit].includes(method) && !(handler instanceof Message)) {\n throw new TypeError(`[DynaSend] SendMethod '${SendMethod[method]}' requires Message handler`);\n }\n\n if (method === SendMethod.User && !(handler instanceof GuildMember || handler instanceof User)) {\n throw new TypeError(`[DynaSend] SendMethod '${SendMethod[method]}' requires User or GuildMember handler`);\n }\n }\n\n private static createMessageData(options: DynaSendOptions, method: SendMethod): any {\n const baseData = {\n content: options.content,\n embeds: options.embeds,\n components: options.components,\n files: options.files,\n allowedMentions: options.allowedMentions,\n tts: options.tts\n };\n\n switch (method) {\n case SendMethod.Reply:\n return {\n ...baseData,\n flags: options.flags,\n withResponse: options.withResponse,\n poll: options.poll\n };\n\n case SendMethod.EditReply:\n return {\n ...baseData,\n flags: this.filterFlags(options.flags, [\"Ephemeral\", \"SuppressNotifications\"]),\n withResponse: options.withResponse,\n poll: options.poll\n };\n\n case SendMethod.FollowUp:\n return {\n ...baseData,\n flags: options.flags,\n withResponse: options.withResponse,\n poll: options.poll\n };\n\n case SendMethod.Channel:\n return {\n ...baseData,\n flags: this.filterFlags(options.flags, [\"Ephemeral\"]),\n poll: options.poll,\n stickers: options.stickers,\n reply: options.reply\n };\n\n case SendMethod.MessageReply:\n return {\n ...baseData,\n flags: this.filterFlags(options.flags, [\"Ephemeral\"]),\n poll: options.poll,\n stickers: options.stickers\n };\n\n case SendMethod.MessageEdit:\n return {\n ...baseData,\n flags: this.filterFlags(options.flags, [\"Ephemeral\", \"SuppressNotifications\"])\n };\n\n case SendMethod.User:\n return {\n ...baseData,\n flags: this.filterFlags(options.flags, [\"Ephemeral\"]),\n poll: options.poll,\n forward: options.forward,\n stickers: options.stickers\n };\n\n default:\n return baseData;\n }\n }\n\n private static async executeSend(handler: SendHandler, method: SendMethod, data: any): Promise<Message | null> {\n try {\n switch (method) {\n case SendMethod.Reply: {\n const response = await (handler as RepliableInteraction).reply(data);\n return this.isInteractionCallback(response) ? (response.resource?.message ?? null) : null;\n }\n\n case SendMethod.EditReply:\n return await (handler as RepliableInteraction).editReply(data);\n\n case SendMethod.FollowUp:\n return await (handler as RepliableInteraction).followUp(data);\n\n case SendMethod.Channel:\n return await (handler as GuildTextBasedChannel).send(data);\n\n case SendMethod.MessageReply:\n return await (handler as Message).reply(data);\n\n case SendMethod.MessageEdit: {\n const message = handler as Message;\n if (!message.editable) {\n console.warn(\"[DynaSend] Message is not editable\");\n return null;\n }\n return await message.edit(data);\n }\n\n case SendMethod.User:\n return await (handler as GuildMember | User).send(data);\n\n default:\n throw new Error(`[DynaSend] Unknown send method '${method}'`);\n }\n } catch (error) {\n console.error(`[DynaSend] Error with method '${SendMethod[method]}':`, error);\n return null;\n }\n }\n\n private static scheduleDelete(message: Message, delay: number): void {\n if (delay < 1000) {\n console.warn(`[DynaSend] Delete delay is less than 1 second (${delay}ms). Is this intentional?`);\n }\n\n setTimeout(async () => {\n try {\n if (message.deletable) {\n await message.delete();\n }\n } catch (error) {\n console.error(\"[DynaSend] Error deleting message:\", error);\n }\n }, delay);\n }\n\n static async send(handler: SendHandler, options: RequiredDynaSendOptions): Promise<Message | null> {\n // Determine send method\n const sendMethod = options.sendMethod ?? this.detectSendMethod(handler);\n\n // Validate the combination\n this.validateSendMethod(handler, sendMethod);\n\n // Create message data\n const messageData = this.createMessageData(options, sendMethod);\n\n // Execute the send\n const message = await this.executeSend(handler, sendMethod, messageData);\n\n // Schedule deletion if requested\n if (options.deleteAfter && message) {\n this.scheduleDelete(message, options.deleteAfter);\n }\n\n return message;\n }\n}\n\nexport async function dynaSend(handler: SendHandler, options: RequiredDynaSendOptions): Promise<Message | null> {\n return DynaSend.send(handler, options);\n}\n","import {\n CommandInteraction,\n DMChannel,\n EmbedBuilder,\n GuildMember,\n Message,\n NewsChannel,\n RepliableInteraction,\n TextBasedChannel,\n TextChannel,\n ThreadChannel,\n User\n} from \"discord.js\";\nimport { BetterEmbed } from \"./BetterEmbed\";\n\nexport enum SendMethod {\n Reply = 0,\n EditReply = 1,\n FollowUp = 2,\n Channel = 3,\n MessageReply = 4,\n MessageEdit = 5,\n User = 6\n}\n\nexport type SendHandler = CommandInteraction | RepliableInteraction | TextBasedChannel | Message | GuildMember | User;\nexport type InteractionBasedSendHandler = CommandInteraction | RepliableInteraction;\n\nexport type EmbedResolvable = EmbedBuilder | BetterEmbed;\nexport type InteractionResolveable = CommandInteraction | RepliableInteraction;\nexport type UserResolvable = GuildMember | User | string;\n\nexport type SendableTextChannel = DMChannel | TextChannel | NewsChannel | ThreadChannel;\n","export async function retryExponentialBackoff<T>(\n fn: (attempt: number) => Promise<T>,\n maxRetries = 3,\n retryDelay = 1_000\n): Promise<T> {\n let attempts = 0;\n\n while (true) {\n try {\n return await fn(attempts);\n } catch (error) {\n if (attempts >= maxRetries) throw error;\n await new Promise(resolve => setTimeout(resolve, Math.pow(1.75, attempts) * retryDelay + Math.random() * 500));\n attempts++;\n }\n }\n}\n","{\n \"name\": \"vimcord\",\n \"version\": \"1.0.1\",\n \"description\": \"A powerful Discord.js wrapper.\",\n \"license\": \"MIT\",\n \"author\": \"xsqu1znt\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"packageManager\": \"pnpm@10.27.0\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\",\n \"default\": \"./dist/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"check\": \"tsc --noEmit\",\n \"format\": \"prettier --write \\\"./**/*.{ts,json}\\\"\"\n },\n \"dependencies\": {\n \"axios\": \"^1.13.2\",\n \"chalk\": \"^4.1.2\",\n \"discord.js\": \"^14.25.1\",\n \"dotenv\": \"^16.6.1\",\n \"lodash\": \"^4.17.21\",\n \"node-cron\": \"^4.2.1\",\n \"qznt\": \"^1.0.34\"\n },\n \"devDependencies\": {\n \"@types/lodash\": \"^4.17.21\",\n \"@types/node\": \"^22.19.2\",\n \"mongoose\": \"^8.20.2\",\n \"prettier\": \"^3.7.4\",\n \"tsup\": \"^8.5.1\",\n \"type-fest\": \"^4.41.0\",\n \"typescript\": \"^5.9.3\"\n },\n \"peerDependencies\": {\n \"discord.js\": \"^14.0.0\",\n \"mongoose\": \"^8.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"discord.js\": {\n \"optional\": false\n },\n \"mongoose\": {\n \"optional\": true\n }\n }\n}\n","/* Check if Mongoose is installed */\ntry {\n import(\"mongoose\");\n} catch {\n throw new Error(\"MongoDatabase requires the mongoose package, install it with `npm install mongoose`\");\n}\n\nimport { retryExponentialBackoff } from \"@/utils/async\";\nimport { randomUUID } from \"node:crypto\";\nimport { type Vimcord } from \"@/client\";\nimport EventEmitter from \"node:events\";\nimport mongoose, { ClientSessionOptions } from \"mongoose\";\n\ninterface MongoConnectionOptions {\n /** The maximum number of attempts to connect to MongoDB @defaultValue `3` */\n maxRetries?: number;\n}\n\nconst globalInstanceEmitter = new EventEmitter<{ created: [MongoDatabase]; connected: [MongoDatabase] }>();\nconst instances: MongoDatabase[] = [];\n\nexport async function useMongoDatabase(instanceIndex?: number) {\n const instance = instances.at(instanceIndex ?? 0);\n\n if (!instance) {\n return new Promise<MongoDatabase>((resolve, reject) => {\n // 45 second timeout\n const timeout = setTimeout(() => reject(\"useMongoDatabase timed out\"), 45_000);\n\n globalInstanceEmitter.once(\"connected\", mdb => {\n clearTimeout(timeout);\n resolve(mdb);\n });\n });\n }\n\n return instance;\n}\n\nexport async function useReadyMongoDatabase(instanceIndex?: number) {\n const instance = await useMongoDatabase(instanceIndex);\n await instance.waitForReady();\n return instance;\n}\n\nexport async function createMongoSession(instanceIndex?: number, options?: ClientSessionOptions) {\n const instance = await useReadyMongoDatabase(instanceIndex);\n return instance.mongoose.startSession(options);\n}\n\nexport class MongoDatabase {\n readonly name: string = \"MongoDatabase\";\n readonly uuid: string = randomUUID();\n readonly index: number;\n private uri: string | undefined;\n\n mongoose: mongoose.Mongoose;\n private eventEmitter = new EventEmitter<{ ready: [] }>();\n\n private isReady = false;\n private isConnecting = false;\n\n constructor(\n public client: Vimcord,\n options?: mongoose.MongooseOptions\n ) {\n this.mongoose = new mongoose.Mongoose(options);\n this.index = instances.length - 1;\n instances.push(this);\n\n globalInstanceEmitter.emit(\"created\", this);\n }\n\n async waitForReady(): Promise<boolean> {\n if (!this.isReady && this.isConnecting) {\n return new Promise(resolve => this.eventEmitter.once(\"ready\", () => resolve(this.isReady)));\n }\n return this.isReady;\n }\n\n async connect(\n uri?: string,\n connectionOptions?: mongoose.ConnectOptions,\n options?: MongoConnectionOptions\n ): Promise<boolean> {\n if (!this.isReady && this.isConnecting) {\n return new Promise(resolve => this.eventEmitter.once(\"ready\", () => resolve(true)));\n }\n\n // If already connected, return the existing connection\n if (this.mongoose.connection?.readyState === 1) {\n return true;\n }\n\n uri ??= this.uri || this.client.config.app.devMode ? process.env.MONGO_URI_DEV : process.env.MONGO_URI;\n options = { ...options, maxRetries: options?.maxRetries ?? 3 };\n\n if (!uri) {\n throw new Error(\n `MONGO_URI Missing: ${this.client.config.app.devMode ? \"DEV MODE is enabled, but MONGO_URI_DEV is not set\" : \"MONGO_URI not set\"}`\n );\n }\n\n this.uri = uri;\n this.isReady = false;\n this.isConnecting = true;\n\n try {\n const stopLoader = this.client.logger.loader(\"Connecting to MongoDB...\");\n await retryExponentialBackoff(\n attempt => {\n return this.mongoose.connect(uri, {\n serverSelectionTimeoutMS: 30000,\n socketTimeoutMS: 45000,\n connectTimeoutMS: 30000,\n maxPoolSize: 10,\n minPoolSize: 5,\n bufferCommands: false,\n ...connectionOptions\n });\n },\n options.maxRetries,\n 1_000\n );\n\n this.isReady = true;\n this.eventEmitter.emit(\"ready\");\n globalInstanceEmitter.emit(\"connected\", this);\n stopLoader(\"Connected to MongoDB \");\n } catch (err) {\n this.client.logger.error(`Failed to connect to MongoDB after ${options.maxRetries} attempt(s)`, err as Error);\n }\n\n this.isConnecting = false;\n return true;\n }\n}\n","/* Check if Mongoose is installed */\ntry {\n import(\"mongoose\");\n} catch {\n throw new Error(\"MongoSchemaBuilder requires the mongoose package, install it with `npm install mongoose`\");\n}\n\nimport mongoose, {\n AggregateOptions,\n CreateOptions,\n HydratedDocument,\n Model,\n mongo,\n MongooseBaseQueryOptions,\n MongooseUpdateQueryOptions,\n PipelineStage,\n ProjectionType,\n QueryOptions,\n Require_id,\n RootFilterQuery,\n Schema,\n SchemaDefinition,\n UpdateQuery\n} from \"mongoose\";\nimport { type MongoDatabase, useMongoDatabase } from \"@/modules/db/mongo/mongo\";\nimport { retryExponentialBackoff } from \"@/utils/async\";\nimport { randomBytes } from \"node:crypto\";\nimport { Logger } from \"@/tools/Logger\";\nimport EventEmitter from \"node:events\";\n\nexport type ExtractReturn<T> = T extends (this: any, ...args: any) => infer R ? Awaited<R> : never;\nexport type LeanOrHydratedDocument<T, O extends QueryOptions<T>> = O[\"lean\"] extends false\n ? HydratedDocument<T>\n : Require_id<T>;\n\nexport interface MongoSchemaEvents {\n initialized: [];\n ready: [boolean];\n error: [Error];\n}\n\nexport interface MongoSchemaOptions {\n connectionIndex?: number;\n}\n\nexport function createMongoSchema<Definition extends object>(\n collection: string,\n definition: SchemaDefinition<Definition>,\n options?: MongoSchemaOptions\n): MongoSchemaBuilder<Definition> {\n return new MongoSchemaBuilder(collection, definition, options);\n}\n\nexport class MongoSchemaBuilder<Definition extends object> {\n schema!: Schema<Definition>;\n model!: Model<Definition>;\n\n database: MongoDatabase | null = null;\n connectionIndex: number = 0;\n\n isReady: boolean = false;\n isInitializing: boolean = false;\n eventEmitter = new EventEmitter<MongoSchemaEvents>();\n\n logger: Logger;\n\n constructor(collection: string, definition: SchemaDefinition<Definition>, options?: MongoSchemaOptions) {\n this.connectionIndex = options?.connectionIndex ?? this.connectionIndex;\n\n // Initialize a custom logger instance\n this.logger = new Logger({\n prefixEmoji: \"🥭\",\n prefix: `MongoSchema (c${this.connectionIndex}) [${collection}]`,\n colors: { primary: \"#F29B58\" }\n });\n\n /* Set up event handlers */\n this.eventEmitter.once(\"initialized\", () => {\n if (this.database) {\n /* Create the schema and model */\n this.schema = new Schema(definition, { versionKey: false });\n this.model = this.database.mongoose.model(collection, this.schema) as Model<Definition>;\n this.eventEmitter.emit(\"ready\", true);\n } else {\n this.eventEmitter.emit(\"error\", new Error(`MongoDatabase (c${this.connectionIndex}) not found`));\n }\n });\n\n this.eventEmitter.on(\"ready\", ready => {\n this.isReady = ready;\n\n // Verbose logging\n if (this.database?.client.config.app.verbose) {\n this.logger.debug(`Loaded! | ${this.database?.client.config.app.name}`);\n }\n });\n\n this.eventEmitter.on(\"error\", error => this.logger.error(\"Error:\", error));\n\n // Finish initialization\n this.init().catch(error => {\n this.eventEmitter.emit(\"error\", error);\n });\n }\n\n private async init() {\n if (this.isInitializing) return;\n this.isInitializing = true;\n\n try {\n const database = await useMongoDatabase(this.connectionIndex);\n if (!database) {\n throw new Error(\"Could not use MongoDatabase\");\n }\n\n // Set our database reference\n this.database = database;\n\n this.eventEmitter.emit(\"initialized\");\n } catch (err) {\n this.eventEmitter.emit(\"error\", err as Error);\n } finally {\n this.isInitializing = false;\n }\n }\n\n extend<Extra extends Record<string, (...args: any) => any>>(\n extras: Extra & ThisType<MongoSchemaBuilder<Definition>>\n ): MongoSchemaBuilder<Definition> & Extra {\n for (const [key, fn] of Object.entries(extras as any)) {\n if (typeof fn === \"function\") {\n (this as any)[key] = function (...args: any[]) {\n return fn.call(this, ...args);\n };\n }\n }\n\n return this as any as MongoSchemaBuilder<Definition> & Extra;\n }\n\n on<K extends keyof MongoSchemaEvents>(event: K, listener: (...args: MongoSchemaEvents[K]) => void) {\n this.eventEmitter.on(event, listener as any);\n return this;\n }\n\n once<K extends keyof MongoSchemaEvents>(event: K, listener: (...args: MongoSchemaEvents[K]) => void) {\n this.eventEmitter.once(event, listener as any);\n return this;\n }\n\n off<K extends keyof MongoSchemaEvents>(event: K, listener: (...args: MongoSchemaEvents[K]) => void) {\n this.eventEmitter.off(event, listener as any);\n return this;\n }\n\n /** Execute a function while ensuring the connection is ready. On error it will retry using an exponential backoff. */\n async execute<T extends (...args: any) => any>(fn: T) {\n try {\n // Check ready\n if (!this.isReady) {\n await new Promise<void>((resolve, reject) => {\n // 45 second timeout\n const timeout = setTimeout(() => reject(\"execution wait for ready timed out\"), 45_000);\n\n this.eventEmitter.once(\"ready\", () => {\n clearTimeout(timeout);\n resolve();\n });\n\n this.eventEmitter.once(\"error\", error => {\n clearTimeout(timeout);\n reject(error);\n });\n });\n }\n\n // Check our database reference\n if (!this.database) {\n throw new Error(\"MongoDB connection not found\");\n }\n\n return await retryExponentialBackoff(async () => (await fn()) as ExtractReturn<T>);\n } catch (err) {\n this.eventEmitter.emit(\"error\", err as Error);\n }\n }\n\n async createHexId(bytes: number, path: keyof Require_id<Definition>, maxRetries: number = 10) {\n return await this.execute(async () => {\n const createHex = () => Buffer.from(randomBytes(bytes)).toString(\"hex\");\n\n let id = createHex();\n let tries = 0;\n\n while (await this.model.exists({ [path]: id } as Partial<Require_id<Definition>>)) {\n if (tries >= maxRetries) throw Error(`Failed to generate a unique hex ID after ${tries} attempt(s)`);\n id = createHex();\n tries++;\n }\n\n return id;\n });\n }\n\n async count(\n filter?: RootFilterQuery<Definition>,\n options?: mongo.CountOptions & MongooseBaseQueryOptions<Definition> & mongo.Abortable\n ) {\n return await this.execute(async () => {\n return this.model.countDocuments(filter, options);\n });\n }\n\n async exists(filter: RootFilterQuery<Definition>) {\n return await this.execute(async () => {\n return (await this.model.exists(filter)) ? true : false;\n });\n }\n\n async create(query: Partial<Require_id<Definition>>[], options?: CreateOptions) {\n return (\n (await this.execute(async () => {\n return this.model.create(query, options);\n })) ?? []\n );\n }\n\n async upsert(\n filter: RootFilterQuery<Definition>,\n query: Partial<Require_id<Definition>>,\n options?: QueryOptions<Definition>\n ) {\n return await this.execute(async () => {\n return this.model.findOneAndUpdate(filter, query, { ...options, upsert: true, new: true });\n });\n }\n\n async delete(filter: RootFilterQuery<Definition>, options?: mongo.DeleteOptions & MongooseBaseQueryOptions<Definition>) {\n return await this.execute(async () => {\n return this.model.deleteOne(filter, options);\n });\n }\n\n async deleteAll(\n filter: RootFilterQuery<Definition>,\n options?: mongo.DeleteOptions & MongooseBaseQueryOptions<Definition>\n ) {\n return await this.execute(async () => {\n return this.model.deleteMany(filter, options);\n });\n }\n\n async distinct<K extends keyof Require_id<Definition> & string>(\n key: K,\n filter?: RootFilterQuery<Definition>,\n options?: QueryOptions<Definition>\n ) {\n return await this.execute(async () => {\n return this.model.distinct(key, filter, options);\n });\n }\n\n async fetch<Options extends QueryOptions<Definition>>(\n filter?: RootFilterQuery<Definition>,\n projection?: ProjectionType<Definition>,\n options?: Options\n ): Promise<LeanOrHydratedDocument<Definition, Options> | null | undefined> {\n return await this.execute(async () => {\n return this.model.findOne(filter, projection, { ...options, lean: options?.lean ?? true });\n });\n }\n\n async fetchAll<Options extends QueryOptions<Definition>>(\n filter: RootFilterQuery<Definition>,\n projection?: ProjectionType<Definition>,\n options?: Options\n ): Promise<LeanOrHydratedDocument<Definition, Options>[]> {\n return (\n (await this.execute(async () => {\n return this.model.find(filter, projection, { ...options, lean: options?.lean ?? true });\n })) || []\n );\n }\n\n async update<Options extends QueryOptions<Definition>>(\n filter: RootFilterQuery<Definition>,\n update: UpdateQuery<Definition>,\n options?: Options\n ): Promise<LeanOrHydratedDocument<Definition, Options> | null | undefined> {\n return await this.execute(async () => {\n return this.model.findOneAndUpdate(filter, update, { ...options, lean: options?.lean ?? true });\n });\n }\n\n async updateAll(\n filter: RootFilterQuery<Definition>,\n update: UpdateQuery<Definition>,\n options?: mongo.UpdateOptions & MongooseUpdateQueryOptions<Definition>\n ) {\n return await this.execute(async () => {\n return this.model.updateMany(filter, update, options);\n });\n }\n\n async aggregate<T extends any>(pipeline: PipelineStage[], options?: AggregateOptions): Promise<T[]> {\n return (await this.execute(async () => {\n const result = await this.model.aggregate(pipeline, options);\n return result?.length ? result : [];\n })) as T[];\n }\n}\n","import { globalVimcordToolsConfig, VimcordToolsConfig } from \"@/configs/tools.config\";\nimport {\n CollectedMessageInteraction,\n InteractionCollector,\n MappedInteractionTypes,\n Message,\n MessageComponentType,\n UserResolvable\n} from \"discord.js\";\n\ntype Func = (...args: any[]) => any;\ntype Listener = { fn: Func; options?: ListenerOptions };\n\nexport interface BetterCollectorOptions<T extends MessageComponentType> {\n type?: T;\n participants?: UserResolvable[];\n idle?: number;\n timeout?: number;\n /** Run listeners in sequence, awaiting each other */\n sequential?: boolean;\n /** Prevent a user from triggering another interaction until their previous one is resolved */\n userLock?: boolean;\n max?: number;\n maxComponents?: number;\n maxUsers?: number;\n onTimeout?: CollectorTimeoutType;\n config?: VimcordToolsConfig;\n}\n\nexport interface ListenerOptions<\n ComponentType extends MessageComponentType = MessageComponentType,\n InGuild extends boolean = boolean\n> {\n participants?: UserResolvable[];\n defer?: boolean | { update?: boolean; ephemeral?: boolean };\n finally?: (arg: MappedInteractionTypes<InGuild>[ComponentType]) => any;\n}\n\nexport enum CollectorTimeoutType {\n DisableComponents = 0,\n DeleteMessage = 1,\n DoNothing = 2\n}\n\nexport class BetterCollector<ComponentType extends MessageComponentType, InGuild extends boolean = boolean> {\n message?: Message;\n collector?: InteractionCollector<MappedInteractionTypes<InGuild>[ComponentType]>;\n options?: BetterCollectorOptions<ComponentType>;\n\n private activeUsers = new Set<string>();\n private participantWarningCooldowns = new Map<string, number>();\n private config: VimcordToolsConfig;\n\n private events: { collectId: Map<string, Listener[]>; collect: Listener[]; end: Listener[]; timeout: Listener[] } = {\n collectId: new Map(),\n collect: [],\n end: [],\n timeout: []\n };\n\n static create<T extends MessageComponentType>(message: Message | undefined | null, options: BetterCollectorOptions<T>) {\n return new BetterCollector<T, boolean>(message, options);\n }\n\n private async validateParticipant(interaction: CollectedMessageInteraction, participants?: UserResolvable[]) {\n const allowedParticipants = participants || this.options?.participants || [];\n if (!allowedParticipants.length) return true;\n\n const isAllowed = allowedParticipants.some(user => {\n if (typeof user === \"string\") return user === interaction.user.id;\n if (typeof user === \"object\" && \"id\" in user) return user.id === interaction.user.id;\n return false;\n });\n\n if (!isAllowed) {\n const now = Date.now();\n const lastWarned = this.participantWarningCooldowns.get(interaction.user.id) || 0;\n\n if (now - lastWarned > this.config.collector.notAParticipantWarningCooldown) {\n this.participantWarningCooldowns.set(interaction.user.id, now);\n\n if (this.config.collector.notAParticipantMessage) {\n await interaction\n .reply({\n content: this.config.collector.notAParticipantMessage,\n flags: \"Ephemeral\"\n })\n .catch(() => {});\n } else {\n await interaction.deferUpdate().catch(() => {});\n }\n } else {\n // NOTE: They are spamming, acknowledge silently\n await interaction.deferUpdate().catch(() => {});\n }\n }\n\n return isAllowed;\n }\n\n private build() {\n if (!this.message) return;\n if (this.collector) return;\n\n // Build and configure the collector\n this.collector = this.message.createMessageComponentCollector({\n idle: this.options?.idle ?? this.config.timeouts.collectorIdle,\n time: this.options?.timeout ?? this.config.timeouts.collectorTimeout,\n componentType: this.options?.type,\n max: this.options?.max,\n maxComponents: this.options?.maxComponents,\n maxUsers: this.options?.maxUsers\n });\n\n this.setupListeners();\n }\n\n private setupListeners() {\n if (!this.collector) return;\n\n this.collector.on(\"collect\", async interaction => {\n // Check if user is locked\n if (this.options?.userLock && this.activeUsers.has(interaction.user.id)) {\n return interaction\n .reply({ content: this.config.collector.userLockMessage, flags: \"Ephemeral\" })\n .catch(() => {});\n }\n\n if (this.options?.userLock) {\n this.activeUsers.add(interaction.user.id);\n }\n\n const globalListeners = this.events.collect;\n const idListeners = this.events.collectId.get(interaction.customId) || [];\n const allListeners = [...globalListeners, ...idListeners];\n\n const shouldBeDeferred = allListeners.find(l => l.options?.defer)?.options?.defer;\n\n /* Identify who is allowed to run */\n const validListeners = [];\n for (const listener of allListeners) {\n const isAllowed = await this.validateParticipant(interaction, listener.options?.participants);\n if (isAllowed) validListeners.push(listener);\n }\n\n // Nobody is allowed to run this interaction\n if (validListeners.length === 0) return;\n\n try {\n if (shouldBeDeferred) {\n if (typeof shouldBeDeferred === \"object\") {\n if (shouldBeDeferred.update) {\n await interaction.deferUpdate().catch(Boolean);\n } else {\n await interaction\n .deferReply({ flags: shouldBeDeferred.ephemeral ? \"Ephemeral\" : undefined })\n .catch(Boolean);\n }\n } else {\n await interaction.deferReply().catch(Boolean);\n }\n }\n\n // Sequential Execution\n if (this.options?.sequential) {\n for (const listener of allListeners) {\n try {\n const isAllowed = await this.validateParticipant(interaction, listener.options?.participants);\n if (!isAllowed) return;\n await listener.fn(interaction).finally(() => listener.options?.finally?.(interaction));\n } catch (err) {\n this.handleListenerError(err);\n }\n }\n }\n // Parallel Execution\n else {\n Promise.all(\n allListeners.map(l => {\n const isAllowed = this.validateParticipant(interaction, l.options?.participants);\n if (!isAllowed) return;\n return l\n .fn(interaction)\n .catch(this.handleListenerError)\n .finally(() => l.options?.finally?.(interaction));\n })\n );\n }\n } finally {\n if (this.options?.userLock) {\n this.activeUsers.delete(interaction.user.id);\n }\n }\n });\n\n this.collector.on(\"end\", async (collected, reason) => {\n // Sequential Execution\n if (this.options?.sequential) {\n for (const listener of this.events.end) {\n try {\n await listener.fn(collected, reason);\n } catch (err) {\n this.handleListenerError(err);\n }\n }\n }\n // Parallel Execution\n else {\n Promise.all(this.events.end.map(l => l.fn(collected, reason).catch(this.handleListenerError)));\n }\n\n switch (this.options?.onTimeout) {\n case CollectorTimeoutType.DisableComponents:\n if (!this.message?.editable) break;\n\n try {\n // Map through rows and components to set disabled: true\n const disabledRows = this.message.components.map(row => {\n // We use toJSON() to get a plain object we can modify\n const updatedRow = row.toJSON();\n if (\"components\" in updatedRow) {\n updatedRow.components = updatedRow.components.map(component => ({\n ...component,\n disabled: true\n })) as any;\n }\n return updatedRow;\n });\n\n await this.message.edit({ components: disabledRows });\n } catch (err) {\n // Fail silently if the message was deleted\n if (!(err instanceof Error && err.message.includes(\"Unknown Message\"))) {\n this.handleListenerError(err);\n }\n }\n break;\n\n case CollectorTimeoutType.DeleteMessage:\n if (!this.message?.deletable) break;\n await this.message.delete().catch(Boolean);\n break;\n\n case CollectorTimeoutType.DoNothing:\n default:\n break;\n }\n });\n }\n\n private handleListenerError(err: unknown) {\n console.error(\"[BetterCollector] Listener Error:\", err);\n }\n\n constructor(message: Message | undefined | null, options?: BetterCollectorOptions<ComponentType>) {\n this.config = options?.config || globalVimcordToolsConfig;\n this.message = message || undefined;\n this.options = options;\n this.build();\n }\n\n /** Triggers on any interaction */\n on(\n fn: (interaction: MappedInteractionTypes<InGuild>[ComponentType]) => any,\n options?: ListenerOptions<ComponentType, InGuild>\n ): this;\n /** Triggers when the interaction's customId matches */\n on(\n customId: string,\n fn: (interaction: MappedInteractionTypes<InGuild>[ComponentType]) => any,\n options?: ListenerOptions<ComponentType, InGuild>\n ): this;\n on(\n idOrFunc: string | Func,\n fnOrOptions?: Func | ListenerOptions<ComponentType, InGuild>,\n options?: ListenerOptions<ComponentType, InGuild>\n ): this {\n let finalFn: Func;\n let finalOptions: ListenerOptions<ComponentType, InGuild> | undefined;\n let customId: string | undefined;\n\n if (typeof idOrFunc === \"function\") {\n // Handles: on(fn, options)\n finalFn = idOrFunc;\n finalOptions = fnOrOptions as ListenerOptions;\n } else {\n // Handles: on(customId, fn, options)\n if (typeof fnOrOptions !== \"function\") {\n throw new Error(\"[BetterCollector] Second argument must be a function when a customId is provided.\");\n }\n customId = idOrFunc;\n finalFn = fnOrOptions;\n finalOptions = options;\n }\n\n if (customId) {\n const listeners = this.events.collectId.get(customId) || [];\n listeners.push({ fn: finalFn, options: finalOptions as any });\n this.events.collectId.set(customId, listeners);\n } else {\n this.events.collect.push({ fn: finalFn, options: finalOptions as any });\n }\n\n return this;\n }\n\n onEnd(\n fn: (collected: MappedInteractionTypes<InGuild>[ComponentType][], reason: string) => any,\n options?: ListenerOptions\n ) {\n this.events.end.push({ fn, options });\n return this;\n }\n\n /** Manually stop the collector and trigger cleanup */\n stop(reason: string = \"manual\") {\n this.collector?.stop(reason);\n }\n}\n","import {\n ActionRowBuilder,\n APIThumbnailComponent,\n ButtonBuilder,\n ButtonComponentData,\n ContainerBuilder,\n Message,\n MessageActionRowComponentBuilder,\n ThumbnailBuilder\n} from \"discord.js\";\nimport { globalVimcordToolsConfig, VimcordToolsConfig } from \"@/configs/tools.config\";\nimport { DynaSendOptions, dynaSend } from \"./dynaSend\";\nimport { SendHandler } from \"./types\";\n\nexport interface BetterContainerData {\n color?: string | string[] | null;\n config?: VimcordToolsConfig;\n}\n\nexport class BetterContainer {\n private container = new ContainerBuilder();\n private data: Required<Omit<BetterContainerData, \"config\">>;\n private config: VimcordToolsConfig;\n\n constructor(data: BetterContainerData = {}) {\n this.config = data.config || globalVimcordToolsConfig;\n\n this.data = {\n color:\n data.color ??\n (this.config.devMode ? (this.config.embedColorDev as string[]) : (this.config.embedColor as string[])),\n ...data\n };\n\n this.build();\n }\n\n private configure() {\n // Color\n if (this.data.color) {\n try {\n const color = Array.isArray(this.data.color)\n ? (this.data.color[Math.floor(Math.random() * this.data.color.length)] ?? null)\n : this.data.color;\n\n if (color) {\n this.container.setAccentColor(parseInt(color.replace(\"#\", \"\"), 16));\n } else {\n this.container.clearAccentColor();\n }\n } catch (error) {\n console.error(\"[BetterContainer] Invalid color:\", error);\n }\n }\n }\n\n build() {\n this.configure();\n }\n\n addSeparator(options?: { divider?: boolean; spacing?: number }): this {\n this.container.addSeparatorComponents(sb => {\n if (options?.divider !== undefined) sb.setDivider(options.divider);\n if (options?.spacing !== undefined) sb.setSpacing(options.spacing);\n return sb;\n });\n return this;\n }\n\n addText(text: string | (string | null | undefined)[]): this {\n this.container.addTextDisplayComponents(tdb =>\n tdb.setContent(Array.isArray(text) ? text.filter(t => t !== null && t !== undefined).join(\"\\n\") : text)\n );\n return this;\n }\n\n addMedia(...media: { url: string | string[]; spoiler?: boolean; description?: string }[]): this {\n this.container.addMediaGalleryComponents(mb => {\n for (const m of media) {\n const urls = Array.isArray(m.url) ? m.url : [m.url];\n for (const u of urls) {\n mb.addItems(mgb => {\n mgb.setURL(u);\n if (m.spoiler) mgb.setSpoiler(true);\n if (m.description) mgb.setDescription(m.description);\n return mgb;\n });\n }\n }\n\n return mb;\n });\n return this;\n }\n\n addSection(data: {\n text?: string | (string | null | undefined)[];\n button?: Partial<ButtonComponentData>;\n thumbnail?: Partial<APIThumbnailComponent>;\n }): this {\n this.container.addSectionComponents(sb => {\n // Text\n if (data.text) {\n sb.addTextDisplayComponents(tdb =>\n tdb.setContent(\n Array.isArray(data.text)\n ? data.text.filter(t => t !== null && t !== undefined).join(\"\\n\")\n : data.text!\n )\n );\n }\n\n // Thumbnail\n if (data.thumbnail) sb.setThumbnailAccessory(new ThumbnailBuilder(data.thumbnail));\n\n // Button\n if (data.button) sb.setButtonAccessory(new ButtonBuilder(data.button));\n\n return sb;\n });\n\n return this;\n }\n\n addActionRow(...components: ActionRowBuilder<MessageActionRowComponentBuilder>[]): this {\n this.container.addActionRowComponents(...components);\n return this;\n }\n\n toJSON() {\n return this.container.toJSON();\n }\n\n async send(handler: SendHandler, options: DynaSendOptions = {}): Promise<Message | null> {\n this.build();\n\n return await dynaSend(handler, {\n ...options,\n withResponse: true,\n components: [this.container],\n flags: Array.isArray(options.flags)\n ? [...options.flags, \"IsComponentsV2\"]\n : options.flags\n ? [options.flags, \"IsComponentsV2\"]\n : \"IsComponentsV2\"\n });\n }\n}\n","import {\n APIChannelSelectComponent,\n APIFileUploadComponent,\n APIMentionableSelectComponent,\n APIModalInteractionResponseCallbackData,\n APIRoleSelectComponent,\n APIStringSelectComponent,\n APITextInputComponent,\n APIUserSelectComponent,\n AwaitModalSubmitOptions,\n ChannelSelectMenuBuilder,\n FileUploadBuilder,\n Interaction,\n LabelBuilder,\n MentionableSelectMenuBuilder,\n ModalBuilder,\n ModalSubmitInteraction,\n RoleSelectMenuBuilder,\n StringSelectMenuBuilder,\n TextInputBuilder,\n TextInputStyle,\n UserSelectMenuBuilder\n} from \"discord.js\";\nimport { globalVimcordToolsConfig, VimcordToolsConfig } from \"@/configs/tools.config\";\n\ntype _TextInputComponentData = Partial<APITextInputComponent> & _LabelComponentData;\ntype _StringSelectComponentData = Partial<APIStringSelectComponent> & _LabelComponentData;\ntype _ChannelSelectComponentData = Partial<APIChannelSelectComponent> & _LabelComponentData;\ntype _UserSelectComponentData = Partial<APIUserSelectComponent> & _LabelComponentData;\ntype _RoleSelectComponentData = Partial<APIRoleSelectComponent> & _LabelComponentData;\ntype _MentionableSelectComponentData = Partial<APIMentionableSelectComponent> & _LabelComponentData;\ntype _FileUploadComponentData = Partial<APIFileUploadComponent> & _LabelComponentData;\n\nexport type BetterTextInputComponent = { textInput: _TextInputComponentData };\nexport type BetterStringSelectComponent = { stringSelect: _StringSelectComponentData };\nexport type BetterChannelSelectComponent = { channelSelect: _ChannelSelectComponentData };\nexport type BetterUserSelectComponent = { userSelect: _UserSelectComponentData };\nexport type BetterRoleSelectComponent = { roleSelect: _RoleSelectComponentData };\nexport type BetterMentionableSelectComponent = { mentionableSelect: _MentionableSelectComponentData };\nexport type BetterFileUploadSelectComponent = { fileUpload: _FileUploadComponentData };\n\nexport type BetterModalComponent =\n | BetterTextInputComponent\n | BetterStringSelectComponent\n | BetterChannelSelectComponent\n | BetterUserSelectComponent\n | BetterRoleSelectComponent\n | BetterMentionableSelectComponent\n | BetterFileUploadSelectComponent;\n\ninterface _LabelComponentData {\n label: string;\n description?: string;\n}\n\nexport interface BetterModalOptions {\n /** The ID of the modal, if not provided will generate a time-based ID */\n id?: string;\n /** The title of the modal */\n title?: string;\n /** Max 5 components */\n components?: BetterModalComponent[];\n config?: VimcordToolsConfig;\n}\n\nexport interface ModalSubmitResult<T extends Record<string, any> = Record<string, any>> {\n /** Modal fields by custom_id */\n fields: T;\n /** Modal fields in the order components were added */\n values: any[];\n /** The modal submit interaction for replying */\n interaction: ModalSubmitInteraction;\n}\n\nfunction randomCharString(length: number) {\n const chars = \"ABCDEFGHJKLMOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n return Array.from({ length }, () => chars.charAt(Math.floor(Math.random() * chars.length))).join(\"\");\n}\n\nexport class BetterModal {\n id: string;\n options: BetterModalOptions;\n private modal: ModalBuilder;\n private components = new Map<string, LabelBuilder>();\n private config: VimcordToolsConfig;\n\n constructor(options: BetterModalOptions = {}) {\n this.id = options.id || this.createModalId();\n this.options = options;\n this.modal = new ModalBuilder().setCustomId(this.id);\n this.config = options.config || globalVimcordToolsConfig;\n\n if (options.title) {\n this.setTitle(options.title);\n }\n\n if (options.components?.length) {\n this.addComponents(...options.components);\n }\n }\n\n private createModalId() {\n return `modal:${randomCharString(10)}-${Date.now()}`;\n }\n\n private createComponentId() {\n return `modal-component:${randomCharString(4)}-${Date.now().toString().slice(-4)}`;\n }\n\n private validateComponentLength() {\n if (this.components.size >= 5) throw new Error(\"Modal can only have 5 components\");\n }\n\n toJSON(): APIModalInteractionResponseCallbackData {\n return this.modal.toJSON();\n }\n\n build(): ModalBuilder {\n this.modal.setLabelComponents(Array.from(this.components.values()));\n return this.modal;\n }\n\n setTitle(title: string): this {\n this.modal.setTitle(title);\n return this;\n }\n\n addComponents(...components: BetterModalComponent[]): this {\n for (const component of components) {\n if (\"textInput\" in component) {\n this.addTextInput(component.textInput);\n } else if (\"stringSelect\" in component) {\n this.addStringSelect(component.stringSelect);\n } else if (\"channelSelect\" in component) {\n this.addChannelSelect(component.channelSelect);\n } else if (\"userSelect\" in component) {\n this.addUserSelect(component.userSelect);\n } else if (\"roleSelect\" in component) {\n this.addRoleSelect(component.roleSelect);\n } else if (\"mentionableSelect\" in component) {\n this.addMentionableSelect(component.mentionableSelect);\n } else if (\"fileUpload\" in component) {\n this.addFileUpload(component.fileUpload);\n }\n }\n return this;\n }\n\n setComponents(...components: BetterModalComponent[]): this {\n this.modal.spliceLabelComponents(0, this.modal.components.length);\n this.addComponents(...components);\n return this;\n }\n\n addTextInput(data: _TextInputComponentData): this {\n this.validateComponentLength();\n let { label, description, custom_id, ...rest } = data;\n custom_id ||= this.createComponentId();\n const textInputComponent = new TextInputBuilder(rest).setCustomId(custom_id);\n if (!rest.style) textInputComponent.setStyle(TextInputStyle.Short);\n const labelComponent = new LabelBuilder().setLabel(label).setTextInputComponent(textInputComponent);\n if (description) labelComponent.setDescription(description);\n this.components.set(custom_id, labelComponent);\n return this;\n }\n\n addStringSelect(data: _StringSelectComponentData): this {\n this.validateComponentLength();\n let { label, description, custom_id, ...rest } = data;\n custom_id ||= this.createComponentId();\n const stringSelectComponent = new StringSelectMenuBuilder(rest).setCustomId(custom_id);\n const labelComponent = new LabelBuilder().setLabel(label).setStringSelectMenuComponent(stringSelectComponent);\n if (description) labelComponent.setDescription(description);\n this.components.set(custom_id, labelComponent);\n return this;\n }\n\n addChannelSelect(data: _ChannelSelectComponentData): this {\n this.validateComponentLength();\n let { label, description, custom_id, ...rest } = data;\n custom_id ||= this.createComponentId();\n const channelSelectComponent = new ChannelSelectMenuBuilder(rest).setCustomId(custom_id);\n const labelComponent = new LabelBuilder().setLabel(label).setChannelSelectMenuComponent(channelSelectComponent);\n if (description) labelComponent.setDescription(description);\n this.components.set(custom_id, labelComponent);\n return this;\n }\n\n addUserSelect(data: _UserSelectComponentData): this {\n this.validateComponentLength();\n let { label, description, custom_id, ...rest } = data;\n custom_id ||= this.createComponentId();\n const userSelectComponent = new UserSelectMenuBuilder(rest).setCustomId(custom_id);\n const labelComponent = new LabelBuilder().setLabel(label).setUserSelectMenuComponent(userSelectComponent);\n if (description) labelComponent.setDescription(description);\n this.components.set(custom_id, labelComponent);\n return this;\n }\n\n addRoleSelect(data: _RoleSelectComponentData): this {\n this.validateComponentLength();\n let { label, description, custom_id, ...rest } = data;\n custom_id ||= this.createComponentId();\n const roleSelectComponent = new RoleSelectMenuBuilder(rest).setCustomId(custom_id);\n const labelComponent = new LabelBuilder().setLabel(label).setRoleSelectMenuComponent(roleSelectComponent);\n if (description) labelComponent.setDescription(description);\n this.components.set(custom_id, labelComponent);\n return this;\n }\n\n addMentionableSelect(data: _MentionableSelectComponentData): this {\n this.validateComponentLength();\n let { label, description, custom_id, ...rest } = data;\n custom_id ||= this.createComponentId();\n const mentionableSelectComponent = new MentionableSelectMenuBuilder(rest).setCustomId(custom_id);\n const labelComponent = new LabelBuilder()\n .setLabel(label)\n .setMentionableSelectMenuComponent(mentionableSelectComponent);\n if (description) labelComponent.setDescription(description);\n this.components.set(custom_id, labelComponent);\n return this;\n }\n\n addFileUpload(data: _FileUploadComponentData): this {\n this.validateComponentLength();\n let { label, description, custom_id, ...rest } = data;\n custom_id ||= this.createComponentId();\n const fileUploadComponent = new FileUploadBuilder(rest).setCustomId(custom_id);\n const labelComponent = new LabelBuilder().setLabel(label).setFileUploadComponent(fileUploadComponent);\n if (description) labelComponent.setDescription(description);\n this.components.set(custom_id, labelComponent);\n return this;\n }\n\n /** Show the modal via interaction */\n async show(interaction: Interaction): Promise<void> {\n if (!(\"showModal\" in interaction)) throw new Error(\"Interaction does not support showing modals\");\n if (!this.modal.data.title) throw new Error(\"Modal must have a title\");\n this.build();\n await interaction.showModal(this.modal).catch(err => {\n console.error(\"Modal failed to send\", err);\n });\n }\n\n /** Waits for the modal to be submitted and returns the component data\n * @param interaction The interaction used to show the modal\n * @param options Options */\n async awaitSubmit<T extends Record<string, any> = Record<string, string>>(\n interaction: Interaction,\n options?: Omit<AwaitModalSubmitOptions<ModalSubmitInteraction>, \"filter\">\n ): Promise<ModalSubmitResult<T> | null> {\n if (!(\"showModal\" in interaction)) throw new Error(\"Interaction does not support showing modals\");\n try {\n const modalSubmit = await interaction.awaitModalSubmit({\n time: this.config.timeouts.modalSubmit,\n ...options,\n filter: i => i.customId === this.id\n });\n\n const fields: Record<string, any> = {};\n const values: any[] = [];\n\n // Iterate in order\n for (const [customId] of this.components) {\n let value: any = null;\n\n try {\n // Try text input\n value = modalSubmit.fields.getTextInputValue(customId);\n } catch {\n try {\n // Try to get field from fields map\n const field = modalSubmit.fields.fields.get(customId);\n if (field && \"values\" in field) {\n value = field.values;\n }\n } catch {}\n }\n\n fields[customId] = value;\n values.push(value);\n }\n\n return { fields: fields as T, values, interaction: modalSubmit };\n } catch (error) {\n return null;\n }\n }\n\n async showAndAwait<T extends Record<string, any> = Record<string, string>>(\n interaction: Interaction,\n options?: Omit<AwaitModalSubmitOptions<ModalSubmitInteraction>, \"filter\">\n ): Promise<ModalSubmitResult<T> | null> {\n if (!(\"showModal\" in interaction)) throw new Error(\"Interaction does not support showing modals\");\n await this.show(interaction);\n return this.awaitSubmit<T>(interaction, options);\n }\n}\n","import { globalVimcordToolsConfig, VimcordToolsConfig } from \"@/configs/tools.config\";\nimport {\n ActionRowBuilder,\n AttachmentBuilder,\n ButtonBuilder,\n ButtonInteraction,\n ButtonStyle,\n ComponentType,\n ContainerBuilder,\n EmbedBuilder,\n InteractionCollector,\n Message,\n MessageReaction,\n ReactionCollector,\n SelectMenuComponentOptionData,\n StringSelectMenuBuilder,\n StringSelectMenuInteraction,\n StringSelectMenuOptionBuilder,\n User,\n UserResolvable\n} from \"discord.js\";\nimport EventEmitter from \"node:events\";\nimport { BetterContainer } from \"./BetterContainer\";\nimport { BetterEmbed } from \"./BetterEmbed\";\nimport { dynaSend, DynaSendOptions, RequiredDynaSendOptions } from \"./dynaSend\";\nimport { EmbedResolvable, SendHandler, SendMethod } from \"./types\";\n\n/* NOTE: SinglePageResolvable now supports AttachmentBuilder for image-only pages */\nexport type SinglePageResolvable = string | EmbedResolvable | ContainerBuilder | BetterContainer | AttachmentBuilder;\n/* NOTE: A PageResolvable can now be a single item OR an array of embeds (which counts as 1 page) */\nexport type PageResolvable = SinglePageResolvable | EmbedResolvable[];\nexport type Chapter = PageResolvable[];\n\nexport interface PageIndex {\n chapter: number;\n nested: number;\n}\n\nexport interface ChapterData extends Omit<SelectMenuComponentOptionData, \"value\"> {\n value?: string;\n /** Optional attachments mapped to each nested page index */\n files?: (AttachmentBuilder | undefined)[];\n}\n\nexport interface PaginationEvent {\n beforeChapterChange: [chapterIndex: number];\n chapterChange: [option: StringSelectMenuOptionBuilder, page: PageResolvable, index: PageIndex];\n beforePageChange: [nestedIndex: number];\n pageChange: [page: PageResolvable, index: PageIndex];\n first: [page: PageResolvable, index: PageIndex];\n back: [page: PageResolvable, index: PageIndex];\n jump: [page: PageResolvable, index: PageIndex];\n next: [page: PageResolvable, index: PageIndex];\n last: [page: PageResolvable, index: PageIndex];\n collect: [interaction: StringSelectMenuInteraction | ButtonInteraction, page: PageResolvable, index: PageIndex];\n react: [reaction: MessageReaction, user: User, page: PageResolvable, index: PageIndex];\n preTimeout: [message: Message];\n postTimeout: [message: Message];\n}\n\nexport interface PaginatorOptions {\n /** @default {@link PaginationType.Short} */\n type?: PaginationType;\n participants?: UserResolvable[];\n /** Shorthand to create the Paginator with only 1 chapter */\n pages?: PageResolvable[];\n /** @default false */\n useReactions?: boolean;\n /** @default false */\n dynamic?: boolean;\n timeout?: number;\n onTimeout?: PaginationTimeoutType;\n config?: VimcordToolsConfig;\n}\n\nexport interface PaginatorData {\n message: Message | null;\n messageActionRows: ActionRowBuilder<StringSelectMenuBuilder | ButtonBuilder>[];\n messageSendOptions: DynaSendOptions | undefined;\n extraButtons: { index: number; component: ButtonBuilder }[];\n\n page: {\n current: PageResolvable | null;\n index: PageIndex;\n };\n\n navigation: {\n reactions: { name: string; id: string }[];\n isRequired: boolean;\n isLong: boolean;\n canJump: boolean;\n };\n\n collectors: {\n component: InteractionCollector<StringSelectMenuInteraction | ButtonInteraction> | null;\n reaction: ReactionCollector | null;\n };\n\n components: {\n chapterSelect: StringSelectMenuBuilder;\n navigation: Record<keyof VimcordToolsConfig[\"paginator\"][\"buttons\"], ButtonBuilder>;\n\n actionRows: {\n chapterSelect: ActionRowBuilder<StringSelectMenuBuilder>;\n navigation: ActionRowBuilder<ButtonBuilder>;\n };\n };\n}\n\nexport enum PaginationType {\n Short = 0,\n ShortJump = 1,\n Long = 2,\n LongJump = 3\n}\n\nexport enum PaginationTimeoutType {\n DisableComponents = 0,\n ClearComponents = 1,\n DeleteMessage = 2,\n DoNothing = 3\n}\n\nfunction wrapPositive(num: number, max: number) {\n return ((num % (max + 1)) + (max + 1)) % (max + 1);\n}\n\nfunction createNavButton(id: keyof VimcordToolsConfig[\"paginator\"][\"buttons\"], config: VimcordToolsConfig): ButtonBuilder {\n const data = config.paginator.buttons[id];\n const btn = new ButtonBuilder({ customId: `btn_${id}`, style: ButtonStyle.Secondary });\n\n if (data.label) {\n btn.setLabel(data.label);\n } else {\n btn.setEmoji(data.emoji.name);\n }\n\n return btn;\n}\n\nfunction isEmbed(item: any): item is EmbedResolvable {\n return item instanceof EmbedBuilder || item instanceof BetterEmbed;\n}\n\n// Helper to normalize pages input\n// [Embed1, Embed2] -> treated as 2 pages\n// [[Embed1, Embed2]] -> treated as 1 page (group)\nfunction resolvePages(pages: PageResolvable | PageResolvable[]): PageResolvable[] {\n if (Array.isArray(pages)) {\n if (pages.length === 0) return [];\n // If the first item is an Array, it is a list of Groups [[E1, E2], [E3]]\n if (Array.isArray(pages[0])) return pages as PageResolvable[];\n // If the first item is an Embed/String, it is a list of Single Pages [E1, E2]\n // This means we treat top-level arrays of embeds as MULTIPLE pages\n return pages as PageResolvable[];\n }\n // Single item passed (String, Embed, or Group if manually typed but unlikely here)\n return [pages];\n}\n\nexport class Paginator {\n chapters: { id: string; pages: Chapter; files?: (AttachmentBuilder | undefined)[] }[] = [];\n\n private options: Required<Omit<PaginatorOptions, \"config\">>;\n private config: VimcordToolsConfig;\n private data: PaginatorData;\n private events: Record<keyof PaginationEvent, { listener: (...args: any[]) => any; once: boolean }[]>;\n\n eventEmitter = new EventEmitter<PaginationEvent>();\n\n constructor(options: PaginatorOptions = {}) {\n this.config = options.config || globalVimcordToolsConfig;\n\n this.options = {\n type: options.type ?? PaginationType.Short,\n participants: options.participants ?? [],\n pages: options.pages ?? [],\n useReactions: options.useReactions ?? false,\n dynamic: options.dynamic ?? false,\n timeout: options.timeout ?? this.config.timeouts.pagination,\n onTimeout: options.onTimeout ?? PaginationTimeoutType.ClearComponents\n };\n\n this.data = {\n message: null,\n messageActionRows: [],\n messageSendOptions: undefined,\n extraButtons: [],\n\n page: { current: null, index: { chapter: 0, nested: 0 } },\n\n navigation: { reactions: [], isRequired: false, isLong: false, canJump: false },\n collectors: { component: null, reaction: null },\n\n components: {\n chapterSelect: new StringSelectMenuBuilder({ customId: \"ssm_chapterSelect\" }),\n navigation: {\n first: createNavButton(\"first\", this.config),\n back: createNavButton(\"back\", this.config),\n jump: createNavButton(\"jump\", this.config),\n next: createNavButton(\"next\", this.config),\n last: createNavButton(\"last\", this.config)\n },\n\n actionRows: {\n chapterSelect: new ActionRowBuilder<StringSelectMenuBuilder>(),\n navigation: new ActionRowBuilder<ButtonBuilder>()\n }\n }\n };\n\n this.data.components.actionRows.chapterSelect.setComponents(this.data.components.chapterSelect);\n\n this.events = {\n beforeChapterChange: [],\n chapterChange: [],\n beforePageChange: [],\n pageChange: [],\n first: [],\n back: [],\n jump: [],\n next: [],\n last: [],\n collect: [],\n react: [],\n preTimeout: [],\n postTimeout: []\n };\n\n if (this.options.pages.length) {\n this.addChapter(this.options.pages, { label: \"Default\" });\n }\n\n /* Error Checking */\n for (const [key, val] of Object.entries(this.config.paginator.buttons)) {\n if (!val.emoji.id) throw new Error(`[Paginator] Button '${key}.id' is not defined`);\n if (!val.emoji.name) throw new Error(`[Paginator] Button '${key}.name' is not defined`);\n }\n }\n\n private async build(): Promise<void> {\n await this.setPage();\n\n this.data.components.actionRows.navigation.setComponents([]);\n this.data.navigation.reactions = [];\n this.data.messageActionRows = [];\n\n if (this.data.navigation.isRequired) {\n let navTypes: (keyof VimcordToolsConfig[\"paginator\"][\"buttons\"])[] = [];\n\n if (this.options.dynamic) {\n const isLong = this.data.navigation.isLong;\n const isJump =\n this.options.type === PaginationType.ShortJump || this.options.type === PaginationType.LongJump;\n\n if (isLong) {\n this.options.type = isJump ? PaginationType.LongJump : PaginationType.Long;\n } else {\n this.options.type = isJump ? PaginationType.ShortJump : PaginationType.Short;\n }\n }\n\n switch (this.options.type) {\n case PaginationType.Short:\n navTypes = [\"back\", \"next\"];\n break;\n case PaginationType.ShortJump:\n navTypes = [\"back\", \"jump\", \"next\"];\n break;\n case PaginationType.Long:\n navTypes = [\"first\", \"back\", \"next\", \"last\"];\n break;\n case PaginationType.LongJump:\n navTypes = [\"first\", \"back\", \"jump\", \"next\", \"last\"];\n break;\n }\n\n if (this.options.useReactions) {\n this.data.navigation.reactions = navTypes.map(type => {\n const data = this.config.paginator.buttons[type]!;\n return { name: data.emoji.name, id: data.emoji.id };\n });\n } else {\n this.data.components.actionRows.navigation.setComponents(\n navTypes.map(type => this.data.components.navigation[type])\n );\n }\n }\n\n if (this.chapters.length > 1) {\n this.data.messageActionRows.push(this.data.components.actionRows.chapterSelect);\n }\n\n if ((this.data.navigation.isRequired && !this.options.useReactions) || this.data.extraButtons.length) {\n for (const btn of this.data.extraButtons) {\n this.data.components.actionRows.navigation.components.splice(btn.index, 0, btn.component);\n }\n this.data.messageActionRows.push(this.data.components.actionRows.navigation);\n }\n }\n\n private buildSendOptions(options: DynaSendOptions = {}): RequiredDynaSendOptions {\n const sendOptions: RequiredDynaSendOptions = {\n content: \"\",\n embeds: [],\n components: [],\n flags: [],\n files: [], // Explicitly empty to clear previous files on page switch\n ...options,\n withResponse: true\n };\n\n const page = this.data.page.current;\n\n /* Logic for AttachmentBuilder augmentation via ChapterData */\n const currentChapter = this.chapters[this.data.page.index.chapter];\n const chapterFile = currentChapter?.files?.[this.data.page.index.nested];\n if (chapterFile) sendOptions.files!.push(chapterFile);\n\n if (Array.isArray(page)) {\n // Handle array of embeds (Group of Embeds per page)\n sendOptions.embeds!.push(...page);\n } else if (typeof page === \"string\") {\n sendOptions.content = page;\n } else if (isEmbed(page)) {\n sendOptions.embeds!.push(page);\n } else if (page instanceof AttachmentBuilder) {\n /* Logic for Image-only pages */\n sendOptions.files!.push(page);\n } else if (page instanceof ContainerBuilder || page instanceof BetterContainer) {\n sendOptions.components!.push(page);\n\n if (!(sendOptions.flags as string[]).includes(\"IsComponentsV2\")) {\n (sendOptions.flags as string[]).push(\"IsComponentsV2\");\n }\n }\n\n sendOptions.components!.push(...this.data.messageActionRows);\n return sendOptions;\n }\n\n private async handlePostTimeout(): Promise<void> {\n if (!this.data.message) return;\n\n this.callEventStack(\"preTimeout\", this.data.message);\n\n // Stop component and reaction collectors\n this.data.collectors.component?.stop();\n this.data.collectors.reaction?.stop();\n\n // Handle the configured timeout action\n switch (this.options.onTimeout) {\n case PaginationTimeoutType.DisableComponents:\n if (!this.data.message.editable) break;\n\n const disabledNavComponents = this.data.components.actionRows.navigation.components.map(component => {\n if (\"setDisabled\" in component) {\n return component.setDisabled(true);\n }\n return component;\n });\n\n const disabledNavRow = ActionRowBuilder.from(this.data.components.actionRows.navigation).setComponents(\n disabledNavComponents\n );\n\n const newComponents: ActionRowBuilder<any>[] = [];\n\n const currentPage = this.data.page.current;\n if (currentPage instanceof ContainerBuilder || currentPage instanceof BetterContainer) {\n // To maintain the message appearance, add the container back at the end\n // Note: The components *inside* this container are NOT being disabled,\n // as that was the source of the type error.\n newComponents.push(currentPage as unknown as ActionRowBuilder<any>);\n }\n\n if (this.chapters.length > 1) {\n // Ensure the chapter select is also disabled if required\n const disabledSelect = StringSelectMenuBuilder.from(this.data.components.chapterSelect).setDisabled(\n true\n );\n newComponents.push(\n ActionRowBuilder.from(this.data.components.actionRows.chapterSelect).setComponents(disabledSelect)\n );\n }\n\n if (disabledNavRow.components.length > 0) {\n newComponents.push(disabledNavRow);\n }\n\n await this.data.message.edit({ components: newComponents }).catch(Boolean);\n\n // If using reactions, remove them\n if (this.options.useReactions) {\n await this.nav_removeFromMessage();\n }\n break;\n\n case PaginationTimeoutType.ClearComponents:\n if (this.data.message.editable) {\n // nav_removeFromMessage handles removing both components and reactions\n await this.nav_removeFromMessage();\n }\n break;\n\n case PaginationTimeoutType.DeleteMessage:\n await this.data.message.delete().catch(Boolean);\n break;\n\n case PaginationTimeoutType.DoNothing:\n break;\n }\n\n this.callEventStack(\"postTimeout\", this.data.message);\n }\n\n private async nav_removeFromMessage(): Promise<void> {\n if (!this.data.message?.editable) return;\n\n if (this.options.useReactions) {\n await this.data.message.reactions.removeAll().catch(Boolean);\n } else {\n const newComponents = this.data.message.components.filter(c => c.type !== ComponentType.Container);\n await this.data.message.edit({ components: newComponents }).catch(Boolean);\n }\n }\n\n private async nav_addReactions(): Promise<void> {\n if (!this.data.message || !this.options.useReactions || !this.data.navigation.reactions.length) return;\n for (const r of this.data.navigation.reactions) {\n await this.data.message.react(r.id).catch(Boolean);\n }\n }\n\n private async collect_components(): Promise<void> {\n if (!this.data.message || !this.data.messageActionRows.length) return;\n if (this.data.collectors.component) {\n this.data.collectors.component.resetTimer();\n return;\n }\n\n const participantIds = this.options.participants.map(p => (typeof p === \"string\" ? p : p.id));\n\n const collector = this.data.message.createMessageComponentCollector({\n filter: async i => {\n if (!participantIds.length) return true;\n\n if (participantIds.includes(i.user.id)) {\n return true;\n } else {\n await i.reply({ content: this.config.paginator.notAParticipantMessage, flags: \"Ephemeral\" });\n return false;\n }\n },\n ...(this.options.timeout ? { idle: this.options.timeout } : {})\n }) as InteractionCollector<StringSelectMenuInteraction | ButtonInteraction>;\n\n this.data.collectors.component = collector;\n\n collector.on(\"collect\", async i => {\n if (!i.isStringSelectMenu() && !i.isButton()) return;\n collector.resetTimer();\n\n this.callEventStack(\"collect\", i, this.data.page.current!, this.data.page.index);\n\n try {\n if (i.customId === \"btn_jump\") {\n this.callEventStack(\"jump\", this.data.page.current!, this.data.page.index);\n await i.reply({ content: \"Jump not implemented yet.\", flags: \"Ephemeral\" });\n return;\n }\n\n switch (i.customId) {\n case \"ssm_chapterSelect\":\n await i.deferUpdate().catch(Boolean);\n const chapterIndex = this.chapters.findIndex(\n c => c.id === (i as StringSelectMenuInteraction).values[0]\n );\n await this.setPage(chapterIndex, 0);\n await this.refresh();\n break;\n\n case \"btn_first\":\n await i.deferUpdate().catch(Boolean);\n this.callEventStack(\"first\", this.data.page.current!, this.data.page.index);\n await this.setPage(this.data.page.index.chapter, 0);\n await this.refresh();\n break;\n\n case \"btn_back\":\n await i.deferUpdate().catch(Boolean);\n this.callEventStack(\"back\", this.data.page.current!, this.data.page.index);\n await this.setPage(this.data.page.index.chapter, this.data.page.index.nested - 1);\n await this.refresh();\n break;\n\n case \"btn_next\":\n await i.deferUpdate().catch(Boolean);\n this.callEventStack(\"next\", this.data.page.current!, this.data.page.index);\n await this.setPage(this.data.page.index.chapter, this.data.page.index.nested + 1);\n await this.refresh();\n break;\n\n case \"btn_last\":\n await i.deferUpdate().catch(Boolean);\n this.callEventStack(\"last\", this.data.page.current!, this.data.page.index);\n await this.setPage(\n this.data.page.index.chapter,\n this.chapters[this.data.page.index.chapter]!.pages.length - 1\n );\n await this.refresh();\n break;\n }\n } catch (err) {\n console.error(\"[Paginator] Component navigation error\", err);\n }\n });\n\n collector.on(\"end\", async () => {\n this.data.collectors.component = null;\n this.handlePostTimeout();\n });\n }\n\n private async callEventStack<T extends keyof PaginationEvent>(event: T, ...args: PaginationEvent[T]): Promise<void> {\n if (!this.events[event].length) return;\n const listeners = [...this.events[event]];\n for (const _event of listeners) {\n await _event.listener(...args);\n if (_event.once) {\n const originalIndex = this.events[event].indexOf(_event);\n if (originalIndex > -1) this.events[event].splice(originalIndex, 1);\n }\n }\n }\n\n on<T extends keyof PaginationEvent>(event: T, listener: (...args: PaginationEvent[T]) => void, once = false): this {\n this.events[event].push({ listener, once });\n return this;\n }\n\n /** Adds a chapter to the paginator.\n * @param pages The pages for this chapter.\n * Note: `[Embed1, Embed2]` = 2 Pages. `[[Embed1, Embed2]]` = 1 Page (Group of 2).\n * @param data Metadata for the chapter select menu. */\n addChapter(pages: PageResolvable | PageResolvable[], data: ChapterData): this {\n if (data.default === undefined && !this.chapters.length) {\n data.default = true;\n }\n\n if (data.default) {\n this.data.components.chapterSelect.options.forEach(opt => opt.setDefault(false));\n }\n\n if (!data.value) {\n data.value = `ssm_c:${this.chapters.length}`;\n }\n\n // Normalize pages to standard array\n const normalizedPages = resolvePages(pages);\n\n this.chapters.push({ id: data.value, pages: normalizedPages, files: data.files });\n this.data.components.chapterSelect.addOptions(data as SelectMenuComponentOptionData);\n return this;\n }\n\n spliceChapters(index: number, deleteCount: number): this {\n this.chapters.splice(index, deleteCount);\n this.data.components.chapterSelect.spliceOptions(index, deleteCount);\n return this;\n }\n\n hydrateChapter(index: number, pages: PageResolvable | PageResolvable[], set?: boolean): this {\n if (!this.chapters[index]) {\n throw new Error(`[Paginator] Could not find chapter at index ${index}`);\n }\n\n const normalizedPages = resolvePages(pages);\n\n if (set) {\n this.chapters[index].pages = normalizedPages;\n } else {\n this.chapters[index].pages.push(...normalizedPages);\n }\n\n return this;\n }\n\n setPaginationType(type: PaginationType): this {\n this.options.type = type;\n return this;\n }\n\n insertButtonAt(index: number, component: ButtonBuilder): this {\n if (this.data.components.actionRows.navigation.components.length >= 5) {\n throw new Error(\"[Paginator] You cannot have more than 5 components in 1 action row. Use a separate ActionRow\");\n }\n this.data.extraButtons.push({ index, component });\n return this;\n }\n\n removeButtonAt(...index: number[]): this {\n index.forEach(i => this.data.extraButtons.splice(i, 1));\n return this;\n }\n\n async setPage(\n chapterIndex: number = this.data.page.index.chapter,\n nestedIndex: number = this.data.page.index.nested\n ): Promise<void> {\n const _oldChapterIndex = this.data.page.index.chapter;\n this.data.page.index.chapter = wrapPositive(chapterIndex, this.chapters.length - 1);\n\n const currentChapter = this.chapters[this.data.page.index.chapter];\n if (!currentChapter) {\n throw new Error(`[Paginator] Could not find chapter at index ${this.data.page.index.chapter}`);\n }\n\n await this.callEventStack(\"beforeChapterChange\", this.data.page.index.chapter);\n await this.callEventStack(\"beforePageChange\", nestedIndex);\n\n const _oldNestedIndex = this.data.page.index.nested;\n this.data.page.index.nested =\n this.data.page.index.chapter !== _oldChapterIndex\n ? 0\n : wrapPositive(nestedIndex, currentChapter.pages.length - 1);\n\n const currentPage = currentChapter.pages[this.data.page.index.nested];\n if (!currentPage) {\n throw new Error(`[Paginator] Could not find page at index ${this.data.page.index.nested}`);\n }\n\n this.data.page.current = currentPage;\n\n this.data.components.chapterSelect.options.forEach(opt => opt.setDefault(false));\n this.data.components.chapterSelect.options.at(this.data.page.index.chapter)?.setDefault(true);\n\n const { jumpableThreshold, longThreshold } = this.config.paginator;\n this.data.navigation.isRequired = currentChapter.pages.length >= 2;\n this.data.navigation.canJump = currentChapter.pages.length >= jumpableThreshold;\n this.data.navigation.isLong = currentChapter.pages.length >= longThreshold;\n\n if (this.data.page.index.chapter !== _oldChapterIndex) {\n this.callEventStack(\n \"chapterChange\",\n this.data.components.chapterSelect.options.at(this.data.page.index.chapter)!,\n this.data.page.current,\n this.data.page.index\n );\n this.callEventStack(\"pageChange\", this.data.page.current, this.data.page.index);\n } else if (this.data.page.index.nested !== _oldNestedIndex) {\n this.callEventStack(\"pageChange\", this.data.page.current, this.data.page.index);\n }\n }\n\n async refresh(): Promise<Message | null> {\n if (!this.data.message) {\n throw new Error(\"[Paginator] Cannot refresh, message not sent\");\n }\n\n if (!this.data.message.editable) {\n throw new Error(\"[Paginator] Cannot refresh, message is not editable\");\n }\n\n await this.build();\n\n this.data.message = await dynaSend(this.data.message, {\n sendMethod: SendMethod.MessageEdit,\n ...this.buildSendOptions(this.data.messageSendOptions)\n });\n\n return this.data.message;\n }\n\n async send(handler: SendHandler, options?: DynaSendOptions): Promise<Message | null> {\n this.data.messageSendOptions = options;\n await this.build();\n\n this.data.message = await dynaSend(handler, this.buildSendOptions(options));\n if (!this.data.message) return null;\n\n this.collect_components();\n return this.data.message;\n }\n}\n","import {\n ActionRowBuilder,\n APIButtonComponent,\n ButtonBuilder,\n ButtonStyle,\n ComponentType,\n ContainerBuilder,\n Message,\n UserResolvable,\n ButtonInteraction\n} from \"discord.js\";\nimport { globalVimcordToolsConfig, VimcordToolsConfig } from \"@/configs/tools.config\";\nimport { dynaSend, DynaSendOptions, RequiredDynaSendOptions } from \"./dynaSend\";\nimport { EmbedResolvable, SendHandler } from \"./types\";\nimport { BetterContainer } from \"./BetterContainer\";\nimport { BetterEmbed } from \"./BetterEmbed\";\n\nexport enum PromptResolveType {\n DisableComponents = 0,\n ClearComponents = 1,\n DeleteOnConfirm = 3,\n DeleteOnReject = 4\n}\n\nexport type ButtonHandler = (interaction: ButtonInteraction) => void | Promise<void>;\n\nexport interface CustomButton {\n builder: ButtonBuilder | ((builder: ButtonBuilder) => ButtonBuilder) | Partial<APIButtonComponent>;\n handler?: ButtonHandler;\n /** Position index: 0 = before confirm, 1 = between confirm/reject, 2+ = after reject\n * @default 2 */\n index?: number;\n}\n\nexport interface PromptOptions {\n participants?: UserResolvable[];\n content?: string;\n embed?: EmbedResolvable;\n container?: ContainerBuilder | BetterContainer;\n textOnly?: boolean;\n buttons?: {\n confirm?: ButtonBuilder | ((builder: ButtonBuilder) => ButtonBuilder) | Partial<APIButtonComponent>;\n reject?: ButtonBuilder | ((builder: ButtonBuilder) => ButtonBuilder) | Partial<APIButtonComponent>;\n };\n customButtons?: Record<string, CustomButton>;\n /** @default [PromptResolveType.DeleteOnConfirm, PromptResolveType.DeleteOnReject] */\n onResolve?: PromptResolveType[];\n timeout?: number;\n config?: VimcordToolsConfig;\n}\n\nexport interface PromptResult {\n message: Message | null;\n confirmed: boolean | null;\n customId: string | null;\n timedOut: boolean;\n}\n\nexport class Prompt {\n readonly participants: UserResolvable[];\n readonly content?: string;\n readonly embed: EmbedResolvable;\n readonly container?: ContainerBuilder | BetterContainer;\n readonly textOnly?: boolean;\n readonly buttons: { confirm: ButtonBuilder; reject: ButtonBuilder };\n readonly customButtons: Map<string, { button: ButtonBuilder; handler?: ButtonHandler; index: number }>;\n readonly onResolve: PromptResolveType[];\n readonly timeout: number;\n readonly config: VimcordToolsConfig;\n\n private message: Message | null = null;\n\n constructor(options: PromptOptions = {}) {\n this.config = options.config ?? globalVimcordToolsConfig;\n this.participants = options.participants ?? [];\n this.timeout = options.timeout ?? this.config.timeouts.prompt;\n this.content = options.content;\n this.embed = options.embed ?? this.createDefaultForm();\n this.container = options?.container;\n this.textOnly = options.textOnly;\n this.buttons = this.createButtons(options.buttons);\n this.customButtons = this.createCustomButtons(options.customButtons);\n this.onResolve = options.onResolve ?? [PromptResolveType.DeleteOnConfirm, PromptResolveType.DeleteOnReject];\n }\n\n private createDefaultForm(): BetterEmbed {\n return new BetterEmbed({\n title: this.config.prompt.defaultTitle,\n description: this.config.prompt.defaultDescription\n });\n }\n\n private createButtons(buttonOptions?: PromptOptions[\"buttons\"]): {\n confirm: ButtonBuilder;\n reject: ButtonBuilder;\n } {\n const confirm = this.buildButton(\n buttonOptions?.confirm,\n \"btn_confirm\",\n this.config.prompt.confirmLabel,\n ButtonStyle.Success\n );\n\n const reject = this.buildButton(\n buttonOptions?.reject,\n \"btn_reject\",\n this.config.prompt.rejectLabel,\n ButtonStyle.Danger\n );\n\n return { confirm, reject };\n }\n\n private createCustomButtons(\n customOptions?: Record<string, CustomButton>\n ): Map<string, { button: ButtonBuilder; handler?: ButtonHandler; index: number }> {\n const map = new Map<string, { button: ButtonBuilder; handler?: ButtonHandler; index: number }>();\n\n if (!customOptions) return map;\n\n for (const [customId, { builder, handler, index = 2 }] of Object.entries(customOptions)) {\n const button = this.buildButton(builder, customId, customId, ButtonStyle.Primary);\n map.set(customId, { button, handler, index });\n }\n\n return map;\n }\n\n private buildButton(\n option: ButtonBuilder | ((builder: ButtonBuilder) => ButtonBuilder) | Partial<APIButtonComponent> | undefined,\n customId: string,\n defaultLabel: string,\n defaultStyle: ButtonStyle\n ): ButtonBuilder {\n if (typeof option === \"function\") {\n return option(new ButtonBuilder());\n }\n\n if (option instanceof ButtonBuilder) {\n return option;\n }\n\n return new ButtonBuilder({\n customId,\n label: defaultLabel,\n style: defaultStyle,\n ...option\n });\n }\n\n private buildActionRow(disable: Record<string, boolean> = {}): ActionRowBuilder<ButtonBuilder> {\n const confirmBtn = disable.confirm\n ? new ButtonBuilder(this.buttons.confirm.data).setDisabled(true)\n : this.buttons.confirm;\n\n const rejectBtn = disable.reject\n ? new ButtonBuilder(this.buttons.reject.data).setDisabled(true)\n : this.buttons.reject;\n\n const buttons: ButtonBuilder[] = [];\n\n // Collect custom buttons with their indices\n const customButtonsArray = Array.from(this.customButtons.entries()).map(([customId, data]) => ({\n customId,\n button: disable[customId] ? new ButtonBuilder(data.button.data).setDisabled(true) : data.button,\n index: data.index\n }));\n\n // Sort by index\n customButtonsArray.sort((a, b) => a.index - b.index);\n\n // Build button array in order\n for (const custom of customButtonsArray) {\n if (custom.index === 0) {\n buttons.push(custom.button);\n }\n }\n\n buttons.push(confirmBtn);\n\n for (const custom of customButtonsArray) {\n if (custom.index === 1) {\n buttons.push(custom.button);\n }\n }\n\n buttons.push(rejectBtn);\n\n for (const custom of customButtonsArray) {\n if (custom.index >= 2) {\n buttons.push(custom.button);\n }\n }\n\n return new ActionRowBuilder<ButtonBuilder>({ components: buttons });\n }\n\n private buildSendOptions(options?: DynaSendOptions): RequiredDynaSendOptions {\n const sendData: DynaSendOptions = { ...options };\n\n if (!this.textOnly && this.container) {\n sendData.components = Array.isArray(sendData.components)\n ? [...sendData.components, this.container]\n : [this.container];\n\n const existingFlags = sendData.flags ? (Array.isArray(sendData.flags) ? sendData.flags : [sendData.flags]) : [];\n\n if (!existingFlags.includes(\"IsComponentsV2\")) {\n sendData.flags = [...existingFlags, \"IsComponentsV2\"];\n } else {\n sendData.flags = existingFlags;\n }\n } else {\n if (!this.textOnly) {\n sendData.embeds = Array.isArray(sendData.embeds) ? [this.embed, ...sendData.embeds] : [this.embed];\n }\n }\n\n if (this.content) {\n sendData.content = this.content;\n }\n\n sendData.components = Array.isArray(sendData.components)\n ? [...sendData.components, this.buildActionRow()]\n : [this.buildActionRow()];\n\n return sendData as RequiredDynaSendOptions;\n }\n\n private isParticipant(userId: string): boolean {\n if (this.participants.length === 0) return true;\n return this.participants.some(p => {\n if (typeof p === \"string\") return p === userId;\n if (typeof p === \"object\" && \"id\" in p) return p.id === userId;\n return false;\n });\n }\n\n private async handleResolve(confirmed: boolean | null): Promise<void> {\n if (!this.message) return;\n\n const shouldDelete =\n (confirmed === true && this.onResolve.includes(PromptResolveType.DeleteOnConfirm)) ||\n (confirmed === false && this.onResolve.includes(PromptResolveType.DeleteOnReject));\n\n if (shouldDelete) {\n await this.message.delete().catch(Boolean);\n return;\n }\n\n if (this.onResolve.includes(PromptResolveType.ClearComponents)) {\n await this.message.edit({ components: [] }).catch(Boolean);\n } else if (this.onResolve.includes(PromptResolveType.DisableComponents)) {\n const disableAll: Record<string, boolean> = { confirm: true, reject: true };\n for (const customId of this.customButtons.keys()) {\n disableAll[customId] = true;\n }\n await this.message.edit({ components: [this.buildActionRow(disableAll)] }).catch(Boolean);\n }\n }\n\n async send(handler: SendHandler, options?: DynaSendOptions): Promise<Message | null> {\n const sendData = this.buildSendOptions(options);\n this.message = await dynaSend(handler, sendData);\n return this.message;\n }\n\n async awaitResponse(): Promise<PromptResult> {\n if (!this.message) {\n throw new Error(\"Prompt must be sent before awaiting response\");\n }\n\n const validCustomIds = new Set([\"btn_confirm\", \"btn_reject\", ...this.customButtons.keys()]);\n\n try {\n const interaction = await this.message.awaitMessageComponent({\n componentType: ComponentType.Button,\n filter: i => validCustomIds.has(i.customId) && this.isParticipant(i.user.id),\n time: this.timeout\n });\n\n await interaction.deferUpdate().catch(Boolean);\n\n let confirmed: boolean | null = null;\n if (interaction.customId === \"btn_confirm\") {\n confirmed = true;\n } else if (interaction.customId === \"btn_reject\") {\n confirmed = false;\n }\n\n const customButton = this.customButtons.get(interaction.customId);\n if (customButton?.handler) {\n await customButton.handler(interaction);\n }\n\n await this.handleResolve(confirmed);\n\n return {\n message: this.message,\n confirmed,\n customId: interaction.customId,\n timedOut: false\n };\n } catch (error) {\n await this.handleResolve(false);\n\n return {\n message: this.message,\n confirmed: null,\n customId: null,\n timedOut: true\n };\n }\n }\n}\n\n/** Create and send a prompt, awaiting its response\n * @param handler - The send handler\n * @param options - Prompt options\n * @param sendOptions - Additional send options */\nexport async function prompt(\n handler: SendHandler,\n options?: PromptOptions,\n sendOptions?: DynaSendOptions\n): Promise<PromptResult> {\n const p = new Prompt(options);\n await p.send(handler, sendOptions);\n return await p.awaitResponse();\n}\n","import { clientInstances } from \"@/client\";\nimport { Logger } from \"@/tools/Logger\";\nimport { createInterface, Interface } from \"node:readline\";\nimport { $ } from \"qznt\";\n\nexport interface VimcordCLIOptions {\n prefix: string;\n}\n\nexport class VimcordCLI {\n rl: Interface;\n options: VimcordCLIOptions;\n\n commands = new Map<string, { description: string; fn: (args: string[], content: string) => void }>();\n logger = new Logger({ prefixEmoji: \"🚀\", prefix: \"CLI\", showTimestamp: false });\n\n constructor(options: VimcordCLIOptions) {\n this.options = options;\n\n this.rl = createInterface({\n input: process.stdin as any as NodeJS.ReadableStream,\n output: process.stdout as any as NodeJS.WritableStream,\n terminal: false\n });\n\n this.rl.on(\"line\", line => {\n const { isCommand, commandName, content, args } = this.parseLine(line);\n if (!isCommand) return;\n const command = this.commands.get(commandName!);\n if (!command) {\n const nearestMatches = Array.from(this.commands.keys()).filter(cmd =>\n cmd.toLowerCase().includes(commandName!.toLowerCase())\n );\n return this.logger.error(\n `Unknown command '${commandName}'${nearestMatches.length ? `. Did you mean ${nearestMatches.length > 1 ? `[${nearestMatches.map(m => `'${this.options.prefix}${m}'`).join(\", \")}]` : `'${this.options.prefix}${nearestMatches[0]}'`}?` : \"\"}`\n );\n }\n command.fn(args!, content!);\n });\n }\n\n private parseLine(line: string) {\n if (line.startsWith(this.options.prefix)) {\n // Remove the prefix\n line = line.slice(this.options.prefix.length);\n } else {\n return { isCommand: false };\n }\n\n const args = line.split(\" \").map(s => s.trim());\n const commandName = args.shift();\n\n return { isCommand: true, commandName, content: args.join(\" \"), args };\n }\n\n getClientInstance(line: string) {\n const clientIndex = $.str.getFlag(line, \"--client\", 1) || $.str.getFlag(line, \"-c\", 1);\n\n if (clientIndex) {\n const idx = Number(clientIndex);\n if (isNaN(idx)) {\n CLI.logger.error(`'${clientIndex}' is not a valid number`);\n return undefined;\n }\n const client = clientInstances[idx];\n if (!client) {\n CLI.logger.error(\"Client instance not found\");\n return undefined;\n }\n return client;\n } else {\n // Fallback to the first client\n const client = clientInstances[0];\n if (!client) {\n CLI.logger.error(\"Client instance not found\");\n return undefined;\n }\n return client;\n }\n }\n\n addCommand(commandName: string, description: string, fn: (args: string[], content: string) => void) {\n this.commands.set(commandName, { description, fn });\n }\n\n removeCommand(commandName: string) {\n if (!this.commands.has(commandName)) return false;\n this.commands.delete(commandName);\n return true;\n }\n}\n\n/* Create and export a singleton instance */\nlet initCalled = false;\nexport const CLI = new VimcordCLI({ prefix: \"/\" });\n\n// TODO: Add /events ~ List loaded events\nCLI.addCommand(\"help\", \"View information about a command, or the available CLI options\", args => {\n const prefix = CLI.options.prefix;\n const helpList: Record<string, string> = {};\n\n for (const cmd of CLI.commands.entries()) {\n const commandName = cmd[0];\n const commandDescription = cmd[1].description;\n helpList[`${prefix}${commandName}`] = `~ ${commandDescription}`;\n }\n\n CLI.logger.table(\"(help)\", helpList);\n});\n\nCLI.addCommand(\"register\", \"Register app commands (slash & context) globally, or per guild\", async (args, content) => {\n const client = CLI.getClientInstance(content);\n if (!client) return;\n\n const mode = args[0]?.toLowerCase() || \"\";\n if (![\"guild\", \"global\"].includes(mode)) {\n return CLI.logger.error(`'${mode}' is not a valid option. Your options are [guild|global]`);\n }\n\n // Parse guild flags\n let guildIds = ($.str.getFlag(content, \"--guilds\", 1) || $.str.getFlag(content, \"-g\", 1) || \"\")\n .replaceAll(/[\"']/g, \"\")\n .split(\" \")\n .filter(Boolean)\n .map(s => s.replaceAll(\",\", \"\").trim());\n\n if (!guildIds.length) guildIds = client.guilds.cache.map(g => g.id);\n\n switch (mode) {\n case \"guild\":\n CLI.logger.info(\"Registering guild commands...\");\n await client.commands.slash.registerGuild({ guilds: guildIds });\n await client.commands.context.registerGuild({ guilds: guildIds });\n break;\n\n case \"global\":\n CLI.logger.info(\"Registering global commands...\");\n await client.commands.slash.registerGlobal();\n await client.commands.context.registerGlobal();\n break;\n }\n});\n\nCLI.addCommand(\"unregister\", \"Unregister app commands globally, or per guild\", async (args, content) => {\n const client = CLI.getClientInstance(content);\n if (!client) return;\n\n const mode = args[0]?.toLowerCase() || \"\";\n if (![\"guild\", \"global\"].includes(mode)) {\n return CLI.logger.error(`'${mode}' is not a valid option. Your options are [guild|global]`);\n }\n\n let guildIds = ($.str.getFlag(content, \"--guilds\", 1) || $.str.getFlag(content, \"-g\", 1) || \"\")\n .replaceAll(/[\"']/g, \"\")\n .split(\" \")\n .filter(Boolean)\n .map(s => s.replaceAll(\",\", \"\").trim());\n\n if (!guildIds.length) guildIds = client.guilds.cache.map(g => g.id);\n\n switch (mode) {\n case \"guild\":\n CLI.logger.info(\"Unregistering guild commands...\");\n await client.commands.slash.unregisterGuild({ guilds: guildIds });\n await client.commands.context.unregisterGuild({ guilds: guildIds });\n break;\n\n case \"global\":\n CLI.logger.info(\"Unregistering global commands...\");\n // We'll use the managers' unregisterGlobal if you added it,\n // otherwise these call the REST routes for global deletion.\n await client.commands.slash.unregisterGlobal();\n await client.commands.context.unregisterGlobal();\n break;\n }\n});\n\nCLI.addCommand(\"stats\", \"View statistics about a client instance\", (args, content) => {\n const client = CLI.getClientInstance(content);\n if (!client) return;\n\n CLI.logger.table(`(stats) ~ ${client.config.app.name}`, {\n \"Guilds:\": $.format.number(client.guilds.cache.size),\n \"Ping:\": `${client.ws.ping || 0}ms`,\n \"Uptime:\": `${$.math.secs(client.uptime || 0)}s`,\n \"Process Uptime:\": `${Math.floor(process.uptime())}s`,\n \"Memory Usage:\": `${(process.memoryUsage().rss / 1024 / 1024).toFixed(2)} MB`\n });\n});\n\nCLI.addCommand(\"cmds\", \"List the loaded commands\", async (args, content) => {\n const client = CLI.getClientInstance(content);\n if (!client) return;\n\n // Default to slash if no mode is provided\n const mode = (args[0] || \"slash\").toLowerCase();\n\n switch (mode) {\n case \"slash\": {\n const commands = Array.from(client.commands.slash.commands.values());\n // Sort by builder name\n commands.sort((a, b) => a.builder.name.localeCompare(b.builder.name));\n\n const tableData: Record<string, string> = {};\n for (const cmd of commands) {\n tableData[`/${cmd.builder.name}`] = `~ ${cmd.builder.description || \"No description\"}`;\n }\n\n return CLI.logger.table(`(cmds) ~ slash (${$.format.number(commands.length)})`, tableData);\n }\n\n case \"prefix\": {\n const commands = Array.from(client.commands.prefix.commands.values());\n commands.sort((a, b) => {\n const nameA = a.toConfig().name;\n const nameB = b.toConfig().name;\n return nameA.localeCompare(nameB);\n });\n\n const tableData: Record<string, string> = {};\n const defaultPrefix = client.config.prefixCommands.defaultPrefix;\n\n for (const cmd of commands) {\n const config = cmd.toConfig();\n const aliasIndicator = config.aliases?.length ? ` [${config.aliases.join(\", \")}]` : \"\";\n\n tableData[`${defaultPrefix}${config.name}${aliasIndicator}`] = `~ ${config.description || \"No description\"}`;\n }\n\n return CLI.logger.table(`(cmds) ~ prefix (${$.format.number(commands.length)})`, tableData);\n }\n\n case \"ctx\": {\n const commands = Array.from(client.commands.context.commands.values());\n commands.sort((a, b) => a.builder.name.localeCompare(b.builder.name));\n\n const tableData: Record<string, string> = {};\n for (const cmd of commands) {\n // Context menus don't have descriptions, but they do have types (User/Message)\n const type = cmd.builder.type === 2 ? \"User\" : \"Msg\";\n tableData[`[${type}] ${cmd.builder.name}`] = \"\";\n }\n\n return CLI.logger.table(`(cmds) ~ ctx (${$.format.number(commands.length)})`, tableData);\n }\n\n default:\n return CLI.logger.error(`'${mode}' is not a valid option. Valid options: [slash|prefix|ctx]`);\n }\n});\n\n/** One-time function to be called during client creation */\nexport function initCLI() {\n if (initCalled) return;\n CLI.logger.log(`~ Type ${CLI.options.prefix}help to view available commands`);\n initCalled = true;\n}\n","import { clientInstances, Vimcord, VimcordConfig, VimcordFeatures } from \"@/client\";\nimport { ClientOptions } from \"discord.js\";\nimport { PartialDeep } from \"type-fest\";\nimport * as VimcordCLI from \"./VimcordCLI\";\n\nexport type VimcordConfigOptions = PartialDeep<VimcordConfig>;\n\nexport function useClient(index: number = 0) {\n return clientInstances.at(index);\n}\n\nexport async function useReadyClient(index: number = 0) {\n return useClient(index)?.whenReady();\n}\n\n/** Automatically bundles **🚀 {@link VimcordCLI}** with client creation */\nexport function createClient(options: ClientOptions, features: VimcordFeatures = {}, config: VimcordConfigOptions = {}) {\n const client = new Vimcord(options, features, config);\n VimcordCLI.initCLI();\n return client;\n}\n\nexport function getClientInstances() {\n return clientInstances;\n}\n","export function pickRandom<T extends any[]>(\n arr: T,\n options?: { notEqualTo?: any; maxRerollAttempts?: number; clone?: boolean }\n): T[number] {\n const _rnd = () => {\n return arr[Math.floor(Math.random() * arr.length)] as T[number];\n };\n\n let att = 0;\n let candidate = _rnd();\n\n if (options?.notEqualTo !== undefined && arr.length > 1) {\n while (candidate === options.notEqualTo) {\n if (att < (options?.maxRerollAttempts ?? 100)) {\n throw new Error(`pickRandom reached max reroll attempts (${options?.maxRerollAttempts ?? 100})`);\n }\n candidate = _rnd();\n att++;\n }\n }\n\n return options?.clone ? structuredClone(candidate) : candidate;\n}\n"],"mappings":"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","names":["CommandType","MissingPermissionReason","RateLimitScope","_","randomUUID","_","_","Client","_","_","_","defaultConfig","_","defaultConfig","_","defaultConfig","_","defaultConfig","LogLevel","userMention","_","StatusType","$","dir","ActionRowBuilder","Message","GuildMember","User","BaseInteraction","GuildMember","User","SendMethod","BaseInteraction","GuildMember","User","GuildMember","User","str","ActionRowBuilder","Message","randomUUID","chalk","Client","randomUUID","randomUUID","EventEmitter","EventEmitter","path","CollectorTimeoutType","ButtonBuilder","ContainerBuilder","ContainerBuilder","ButtonBuilder","ActionRowBuilder","AttachmentBuilder","ButtonBuilder","ButtonStyle","ComponentType","ContainerBuilder","EmbedBuilder","StringSelectMenuBuilder","EventEmitter","PaginationType","PaginationTimeoutType","ButtonBuilder","ButtonStyle","EmbedBuilder","EventEmitter","StringSelectMenuBuilder","ActionRowBuilder","AttachmentBuilder","ContainerBuilder","ComponentType","ActionRowBuilder","ButtonBuilder","ButtonStyle","ComponentType","PromptResolveType","ButtonStyle","ButtonBuilder","ActionRowBuilder","ComponentType","$"]}