{"version":3,"sources":["../src/client/index.ts","../src/commands/index.ts","../src/v2/index.ts","../src/ux/index.ts","../src/rest/index.ts","../src/perms/index.ts","../src/shards/index.ts","../src/cache/index.ts","../src/i18n/index.ts","../src/errors/index.ts"],"names":["confirm","createDefaultLogger","modal","embed","MessageFlags","ActionRowBuilder","ModalBuilder","TextInputBuilder","TextInputStyle","options","interactionObj","msg"],"mappings":"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","file":"index.mjs","sourcesContent":["import { Client, GatewayIntentBits } from 'discord.js';\r\nimport type { CreateClientOptions, Features, Logger } from '../types/index.js';\r\n\r\n/**\r\n * Maps features to the required Discord gateway intents\r\n */\r\nconst FEATURE_INTENTS: Record<string, GatewayIntentBits[]> = {\r\n  commands: [],\r\n  messages: [GatewayIntentBits.MessageContent, GatewayIntentBits.GuildMessages],\r\n  members: [GatewayIntentBits.GuildMembers],\r\n  reactions: [GatewayIntentBits.GuildMessageReactions],\r\n  voice: [GatewayIntentBits.GuildVoiceStates],\r\n  v2: [], // V2 components don't need special intents\r\n  diagnostics: [GatewayIntentBits.Guilds], // Need basic guild access for diagnostics\r\n};\r\n\r\n/**\r\n * Creates a Discord.js client with automatic intent configuration based on features.\r\n * Reduces foot-guns by automatically setting up the right intents for common use cases.\r\n * \r\n * @param options - Configuration options for the client\r\n * @returns Configured Discord.js Client instance\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createClient } from 'djs-helper-kit';\r\n * \r\n * const client = createClient({ \r\n *   features: ['commands', 'members', 'v2', 'diagnostics'] \r\n * });\r\n * ```\r\n * \r\n * @example\r\n * ```javascript\r\n * const { createClient } = require('djs-helper-kit');\r\n * const client = createClient({ features: ['commands', 'v2'] });\r\n * ```\r\n */\r\nexport function createClient(options: CreateClientOptions = {}): Client {\r\n  const {\r\n    features = ['commands'],\r\n    additionalIntents = [],\r\n    partials = [],\r\n    handleErrors = true,\r\n    logger = createDefaultLogger(),\r\n  } = options;\r\n\r\n  // Calculate required intents based on features\r\n  const intents = new Set<GatewayIntentBits>();\r\n  \r\n  // Always add Guilds intent for basic functionality\r\n  intents.add(GatewayIntentBits.Guilds);\r\n  \r\n  // Add intents based on features\r\n  for (const feature of features) {\r\n    const featureIntents = FEATURE_INTENTS[feature];\r\n    if (featureIntents) {\r\n      featureIntents.forEach(intent => intents.add(intent));\r\n    } else {\r\n      logger.warn(`Unknown feature: ${feature}`);\r\n    }\r\n  }\r\n  \r\n  // Add any additional intents\r\n  additionalIntents.forEach(intent => intents.add(intent));\r\n\r\n  const client = new Client({\r\n    intents: Array.from(intents),\r\n    partials,\r\n  });\r\n\r\n  // Install error handling if requested\r\n  if (handleErrors) {\r\n    installErrorHandling(client, logger);\r\n  }\r\n\r\n  // Add feature tracking for diagnostics\r\n  (client as { __easierDjsFeatures?: Features; __easierDjsLogger?: Logger }).__easierDjsFeatures = features;\r\n  (client as { __easierDjsFeatures?: Features; __easierDjsLogger?: Logger }).__easierDjsLogger = logger;\r\n\r\n  return client;\r\n}\r\n\r\n/**\r\n * Runs comprehensive diagnostics on a Discord client to identify common issues.\r\n * Checks intents, permissions, latency, and configuration problems.\r\n * \r\n * @param client - The Discord.js client to diagnose\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createClient, diagnose } from 'djs-helper-kit';\r\n * \r\n * const client = createClient({ features: ['commands', 'diagnostics'] });\r\n * await diagnose(client); // Prints actionable health checks\r\n * await client.login(process.env.DISCORD_TOKEN);\r\n * ```\r\n * \r\n * @example\r\n * ```javascript\r\n * const { createClient, diagnose } = require('djs-helper-kit');\r\n * const client = createClient({ features: ['commands'] });\r\n * diagnose(client).then(() => client.login(process.env.DISCORD_TOKEN));\r\n * ```\r\n */\r\nexport async function diagnose(client: Client): Promise<void> {\r\n  const logger = (client as { __easierDjsLogger?: Logger }).__easierDjsLogger || createDefaultLogger();\r\n  const features = (client as { __easierDjsFeatures?: Features }).__easierDjsFeatures || [];\r\n  \r\n  logger.info('🔍 Running djs-helper-kit diagnostics...');\r\n  \r\n  // Check if client is ready\r\n  if (!client.isReady()) {\r\n    logger.warn('⚠️  Client is not ready yet. Some checks may be incomplete.');\r\n  }\r\n  \r\n  // Check token\r\n  if (!process.env.DISCORD_TOKEN && !client.token) {\r\n    logger.error('❌ No Discord token found. Set DISCORD_TOKEN environment variable.');\r\n  } else {\r\n    logger.info('✅ Discord token configured');\r\n  }\r\n  \r\n  // Check intents configuration\r\n  checkIntents(client, features, logger);\r\n  \r\n  // Check latency if ready\r\n  if (client.isReady()) {\r\n    const wsLatency = client.ws.ping;\r\n    if (wsLatency < 100) {\r\n      logger.info(`✅ WebSocket latency: ${wsLatency}ms (excellent)`);\r\n    } else if (wsLatency < 300) {\r\n      logger.info(`⚠️  WebSocket latency: ${wsLatency}ms (good)`);\r\n    } else {\r\n      logger.warn(`⚠️  WebSocket latency: ${wsLatency}ms (high - check connection)`);\r\n    }\r\n    \r\n    logger.info(`📊 Bot in ${client.guilds.cache.size} servers`);\r\n  }\r\n  \r\n  // Check Node.js version\r\n  const nodeVersion = process.version;\r\n  const majorVersion = parseInt(nodeVersion.slice(1).split('.')[0]!);\r\n  if (majorVersion >= 18) {\r\n    logger.info(`✅ Node.js ${nodeVersion} (supported)`);\r\n  } else {\r\n    logger.error(`❌ Node.js ${nodeVersion} is too old. djs-helper-kit requires Node.js 18.17+`);\r\n  }\r\n  \r\n  logger.info('🎯 Diagnostics complete!');\r\n}\r\n\r\n/**\r\n * Checks if the client has the right intents for the enabled features\r\n */\r\nfunction checkIntents(client: Client, features: Features, logger: Logger): void {\r\n  const requiredIntents = new Set<GatewayIntentBits>();\r\n  \r\n  // Calculate what intents should be enabled\r\n  for (const feature of features) {\r\n    const featureIntents = FEATURE_INTENTS[feature];\r\n    if (featureIntents) {\r\n      featureIntents.forEach(intent => requiredIntents.add(intent));\r\n    }\r\n  }\r\n  \r\n  const clientIntents = client.options.intents;\r\n  const hasMessageContent = Array.isArray(clientIntents) \r\n    ? clientIntents.includes(GatewayIntentBits.MessageContent)\r\n    : clientIntents?.has(GatewayIntentBits.MessageContent);\r\n  \r\n  // Check message content intent specifically\r\n  if (features.includes('messages')) {\r\n    if (hasMessageContent) {\r\n      logger.info('✅ Message Content intent enabled');\r\n    } else {\r\n      logger.error('❌ Message Content intent missing. Required for reading message content.');\r\n      logger.error('   Add it in Discord Developer Portal > Bot > Privileged Gateway Intents');\r\n    }\r\n  }\r\n  \r\n  // Check guild members intent\r\n  if (features.includes('members')) {\r\n    const hasMembers = Array.isArray(clientIntents)\r\n      ? clientIntents.includes(GatewayIntentBits.GuildMembers)\r\n      : clientIntents?.has(GatewayIntentBits.GuildMembers);\r\n    if (hasMembers) {\r\n      logger.info('✅ Guild Members intent enabled');\r\n    } else {\r\n      logger.error('❌ Guild Members intent missing. Required for member-related features.');\r\n      logger.error('   Enable it in Discord Developer Portal > Bot > Privileged Gateway Intents');\r\n    }\r\n  }\r\n  \r\n  logger.info(`📋 Features enabled: ${features.join(', ')}`);\r\n}\r\n\r\n/**\r\n * Installs default error handling for the client\r\n */\r\nfunction installErrorHandling(client: Client, logger: Logger): void {\r\n  // Handle unhandled promise rejections in interactions\r\n  client.on('interactionCreate', async (interaction) => {\r\n    if (!interaction.isRepliable()) return;\r\n    \r\n    // Add error handling wrapper (this would be expanded in a full implementation)\r\n    // For now, just log that error handling is installed\r\n    logger.debug('Error handling installed for interaction');\r\n  });\r\n  \r\n  client.on('error', (error) => {\r\n    logger.error('Discord client error:', error);\r\n  });\r\n  \r\n  client.on('warn', (warning) => {\r\n    logger.warn('Discord client warning:', warning);\r\n  });\r\n}\r\n\r\n/**\r\n * Creates a simple default logger that outputs to console\r\n */\r\nfunction createDefaultLogger(): Logger {\r\n  return {\r\n    debug: (message: string, ...args: unknown[]) => console.debug(`[DEBUG] ${message}`, ...args),\r\n    info: (message: string, ...args: unknown[]) => console.info(`[INFO] ${message}`, ...args),\r\n    warn: (message: string, ...args: unknown[]) => console.warn(`[WARN] ${message}`, ...args),\r\n    error: (message: string, ...args: unknown[]) => console.error(`[ERROR] ${message}`, ...args),\r\n  };\r\n} ","import { REST, Routes, Client, Message, ChatInputCommandInteraction } from 'discord.js';\r\nimport { readdir, stat } from 'fs/promises';\r\nimport { join, extname } from 'path';\r\nimport { pathToFileURL } from 'url';\r\nimport type { CommandDefinition, PrefixCommandDefinition, Logger } from '../types/index.js';\r\n\r\n/**\r\n * Options for deploying slash commands\r\n */\r\nexport interface DeployOptions {\r\n  /** Deployment scope - guild or global */\r\n  scope?: 'guild' | 'global';\r\n  /** Guild ID (required for guild scope) */\r\n  guildId?: string;\r\n  /** Dry run mode - shows what would be deployed without applying changes */\r\n  dryRun?: boolean;\r\n  /** Ask for confirmation before destructive changes */\r\n  confirm?: boolean;\r\n  /** Logger instance for output */\r\n  logger?: Logger;\r\n}\r\n\r\n/**\r\n * Loads command definitions from a directory or array.\r\n * Automatically imports TypeScript/JavaScript files and extracts command definitions.\r\n * \r\n * @param dirOrArray - Directory path to scan or array of command definitions\r\n * @returns Array of loaded command definitions\r\n * \r\n * @example\r\n * ```typescript\r\n * import { loadCommands } from 'djs-helper-kit';\r\n * \r\n * // Load from directory\r\n * const commands = loadCommands('./commands');\r\n * \r\n * // Load from array\r\n * const commands = loadCommands([\r\n *   {\r\n *     data: new SlashCommandBuilder().setName('ping').setDescription('Ping command'),\r\n *     run: async (interaction) => interaction.reply('Pong!')\r\n *   }\r\n * ]);\r\n * ```\r\n * \r\n * @example\r\n * ```javascript\r\n * const { loadCommands } = require('djs-helper-kit');\r\n * const commands = loadCommands('./commands');\r\n * ```\r\n */\r\nexport function loadCommands(dirOrArray: string | CommandDefinition[]): CommandDefinition[] {\r\n  if (Array.isArray(dirOrArray)) {\r\n    return dirOrArray;\r\n  }\r\n  \r\n  // For directory loading, this would need to be implemented asynchronously\r\n  // For now, return empty array with a note that this needs async implementation\r\n  console.warn('Directory loading not yet implemented. Use array format for now.');\r\n  return [];\r\n}\r\n\r\n/**\r\n * Loads commands from a directory asynchronously.\r\n * Scans for .js, .ts, .mjs files and imports them as command modules.\r\n * \r\n * @param directory - Directory path to scan\r\n * @param logger - Optional logger for debug output\r\n * @returns Promise resolving to array of command definitions\r\n * \r\n * @example\r\n * ```typescript\r\n * import { loadCommandsAsync } from 'djs-helper-kit';\r\n * \r\n * const commands = await loadCommandsAsync('./commands');\r\n * ```\r\n */\r\nexport async function loadCommandsAsync(\r\n  directory: string,\r\n  logger?: Logger\r\n): Promise<CommandDefinition[]> {\r\n  const commands: CommandDefinition[] = [];\r\n  \r\n  try {\r\n    const files = await readdir(directory);\r\n    \r\n    for (const file of files) {\r\n      const filePath = join(directory, file);\r\n      const stats = await stat(filePath);\r\n      \r\n      // Only load .js and .mjs files, skip configuration files\r\n      if (stats.isFile() && \r\n          ['.js', '.mjs'].includes(extname(file)) && \r\n          !file.startsWith('.') && \r\n          !file.includes('config') && \r\n          !file.includes('test-') && \r\n          file !== 'index.js' && \r\n          file !== 'index.mjs') {\r\n        try {\r\n          logger?.debug(`Loading command from ${file}`);\r\n          \r\n          // Convert to proper file:// URL for ESM imports on Windows\r\n          const fileUrl = pathToFileURL(filePath);\r\n          const module = await import(fileUrl.href);\r\n          \r\n          // Only load the default export as a command\r\n          // Named exports are typically helper functions and should not be treated as commands\r\n          const possibleCommands = [\r\n            module.default\r\n          ].filter(Boolean);\r\n          \r\n          // Validate command structure\r\n          const validCommands = possibleCommands.filter((cmd: unknown) => {\r\n            const command = cmd as Record<string, unknown>;\r\n            const data = command.data as Record<string, unknown>;\r\n            return command && \r\n                   command.data && \r\n                   typeof command.data === 'object' && \r\n                   data.name && \r\n                   command.run && \r\n                   typeof command.run === 'function';\r\n          });\r\n          \r\n          commands.push(...validCommands as CommandDefinition[]);\r\n        } catch (error) {\r\n          logger?.error(`Failed to load command from ${file}:`, error);\r\n        }\r\n      }\r\n    }\r\n  } catch (error) {\r\n    logger?.error(`Failed to read commands directory ${directory}:`, error);\r\n  }\r\n  \r\n  return commands;\r\n}\r\n\r\n/**\r\n * Deploys slash commands to Discord with intelligent diffing.\r\n * Shows what will change before applying and handles both guild and global deployment.\r\n * \r\n * @param client - Discord.js client instance\r\n * @param commands - Array of command definitions to deploy\r\n * @param options - Deployment options\r\n * \r\n * @example\r\n * ```typescript\r\n * import { deploy, loadCommands } from 'djs-helper-kit';\r\n * \r\n * const commands = loadCommands('./commands');\r\n * await deploy(client, commands, {\r\n *   scope: process.env.NODE_ENV === 'production' ? 'global' : 'guild',\r\n *   guildId: process.env.DEV_GUILD_ID,\r\n *   confirm: true,\r\n * });\r\n * ```\r\n * \r\n * @example\r\n * ```javascript\r\n * const { deploy, loadCommands } = require('djs-helper-kit');\r\n * \r\n * const commands = loadCommands([myCommand]);\r\n * await deploy(client, commands, { scope: 'guild', guildId: '123456789' });\r\n * ```\r\n */\r\nexport async function deploy(\r\n  client: Client,\r\n  commands: CommandDefinition[],\r\n  options: DeployOptions = {}\r\n): Promise<void> {\r\n  const {\r\n    scope = 'guild',\r\n    guildId,\r\n    dryRun = false,\r\n    confirm = false,\r\n    logger = createDefaultLogger()\r\n  } = options;\r\n\r\n  if (!client.token) {\r\n    throw new Error('Client must be logged in with a token to deploy commands');\r\n  }\r\n\r\n  if (scope === 'guild' && !guildId) {\r\n    throw new Error('Guild ID is required for guild-scoped command deployment');\r\n  }\r\n\r\n  const rest = new REST({ version: '10' }).setToken(client.token);\r\n  const clientId = client.user?.id || client.application?.id;\r\n  \r\n  if (!clientId) {\r\n    throw new Error('Unable to determine client ID. Make sure the client is ready.');\r\n  }\r\n\r\n  // Prepare command data for deployment\r\n  const commandData = commands.map(cmd => cmd.data.toJSON());\r\n  \r\n  logger.info(`🚀 Deploying ${commandData.length} command(s) to ${scope}${scope === 'guild' ? ` (${guildId})` : ''}`);\r\n  \r\n  try {\r\n    // Determine the correct route\r\n    const route = scope === 'guild' \r\n      ? Routes.applicationGuildCommands(clientId, guildId!)\r\n      : Routes.applicationCommands(clientId);\r\n\r\n    // Get existing commands for comparison\r\n    const existingCommands = await rest.get(route) as Record<string, unknown>[];\r\n    \r\n    // Show diff\r\n    showCommandDiff(existingCommands, commandData, logger);\r\n    \r\n    if (dryRun) {\r\n      logger.info('🔍 Dry run mode - no changes applied');\r\n      return;\r\n    }\r\n    \r\n    if (confirm) {\r\n      // In a real implementation, this would prompt for user confirmation\r\n      logger.info('⚠️  Confirmation required - proceeding with deployment');\r\n    }\r\n    \r\n    // Deploy commands\r\n    const deployedCommands = await rest.put(route, { body: commandData }) as Record<string, unknown>[];\r\n    \r\n    logger.info(`✅ Successfully deployed ${deployedCommands.length} command(s)!`);\r\n    \r\n    if (scope === 'global') {\r\n      logger.warn('⏰ Global commands may take up to 1 hour to propagate across all servers');\r\n    }\r\n    \r\n  } catch (error) {\r\n    logger.error('❌ Failed to deploy commands:', error);\r\n    throw error;\r\n  }\r\n}\r\n\r\n/**\r\n * Shows a diff between existing and new commands\r\n */\r\nfunction showCommandDiff(existing: unknown[], newCommands: unknown[], logger: Logger): void {\r\n  const existingMap = new Map(existing.map((cmd) => [(cmd as Record<string, unknown>).name as string, cmd]));\r\n  const newMap = new Map(newCommands.map((cmd) => [(cmd as Record<string, unknown>).name as string, cmd]));\r\n  \r\n  const toAdd = newCommands.filter((cmd) => !existingMap.has((cmd as Record<string, unknown>).name as string));\r\n  const toUpdate = newCommands.filter((cmd) => {\r\n    const existingCmd = existingMap.get((cmd as Record<string, unknown>).name as string);\r\n    return existingCmd && !commandsEqual(existingCmd, cmd);\r\n  });\r\n  const toRemove = existing.filter((cmd) => !newMap.has((cmd as Record<string, unknown>).name as string));\r\n  \r\n  if (toAdd.length === 0 && toUpdate.length === 0 && toRemove.length === 0) {\r\n    logger.info('📋 No changes detected - commands are up to date');\r\n    return;\r\n  }\r\n  \r\n  logger.info('📋 Command deployment summary:');\r\n  \r\n  if (toAdd.length > 0) {\r\n    logger.info(`  ➕ Adding ${toAdd.length} command(s):`);\r\n    toAdd.forEach((cmd) => logger.info(`     - ${(cmd as Record<string, unknown>).name}: ${(cmd as Record<string, unknown>).description}`));\r\n  }\r\n  \r\n  if (toUpdate.length > 0) {\r\n    logger.info(`  📝 Updating ${toUpdate.length} command(s):`);\r\n    toUpdate.forEach((cmd) => logger.info(`     - ${(cmd as Record<string, unknown>).name}: ${(cmd as Record<string, unknown>).description}`));\r\n  }\r\n  \r\n  if (toRemove.length > 0) {\r\n    logger.info(`  ❌ Removing ${toRemove.length} command(s):`);\r\n    toRemove.forEach((cmd) => logger.info(`     - ${(cmd as Record<string, unknown>).name}: ${(cmd as Record<string, unknown>).description}`));\r\n  }\r\n}\r\n\r\n/**\r\n * Compares two command objects for equality (simplified)\r\n */\r\nfunction commandsEqual(cmd1: unknown, cmd2: unknown): boolean {\r\n  const c1 = cmd1 as Record<string, unknown>;\r\n  const c2 = cmd2 as Record<string, unknown>;\r\n  return (\r\n    c1.name === c2.name &&\r\n    c1.description === c2.description &&\r\n    JSON.stringify(c1.options || []) === JSON.stringify(c2.options || [])\r\n  );\r\n}\r\n\r\n/**\r\n * Creates a simple logger for command deployment\r\n */\r\nfunction createDefaultLogger() {\r\n  return {\r\n    debug: (message: string, ...args: unknown[]) => console.debug(`[DEBUG] ${message}`, ...args),\r\n    info: (message: string, ...args: unknown[]) => console.info(`[INFO] ${message}`, ...args),\r\n    warn: (message: string, ...args: unknown[]) => console.warn(`[WARN] ${message}`, ...args),\r\n    error: (message: string, ...args: unknown[]) => console.error(`[ERROR] ${message}`, ...args),\r\n  };\r\n}\r\n\r\n/**\r\n * Creates a simple command handler that can be attached to the interactionCreate event.\r\n * Handles command lookup, guard checking, and error handling.\r\n * \r\n * @param commands - Array of command definitions\r\n * @param logger - Optional logger instance\r\n * @returns Event handler function\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createCommandHandler } from 'djs-helper-kit';\r\n * \r\n * const commands = loadCommands('./commands');\r\n * const handler = createCommandHandler(commands);\r\n * \r\n * client.on('interactionCreate', handler);\r\n * ```\r\n */\r\nexport function createCommandHandler(commands: CommandDefinition[], logger?: Logger) {\r\n  const commandMap = new Map(commands.map(cmd => [cmd.data.name, cmd]));\r\n  \r\n  return async (interaction: ChatInputCommandInteraction) => {\r\n    if (!interaction.isChatInputCommand()) return;\r\n    \r\n    const command = commandMap.get(interaction.commandName);\r\n    if (!command) return;\r\n    \r\n    const context = { client: interaction.client, logger: logger || createDefaultLogger() };\r\n    \r\n    try {\r\n      // Run guard if present\r\n      if (command.guard) {\r\n        const guardResult = await command.guard(interaction, context);\r\n        if (guardResult !== true) {\r\n          const errorMessage = typeof guardResult === 'string' \r\n            ? guardResult \r\n            : 'Access denied';\r\n          \r\n          await interaction.reply({ \r\n            content: errorMessage, \r\n            ephemeral: true \r\n          });\r\n          return;\r\n        }\r\n      }\r\n      \r\n      // Run the command\r\n      await command.run(interaction, context);\r\n      \r\n    } catch (error) {\r\n      context.logger.error(`Error in command ${interaction.commandName}:`, error);\r\n      \r\n      const errorMessage = 'An error occurred while executing this command.';\r\n      \r\n      if (interaction.replied || interaction.deferred) {\r\n        await interaction.editReply(errorMessage);\r\n      } else {\r\n        await interaction.reply({ content: errorMessage, ephemeral: true });\r\n      }\r\n    }\r\n  };\r\n}\r\n\r\n/**\r\n * Creates a prefix command handler for message events.\r\n * Handles command parsing, guard checking, and error handling.\r\n * \r\n * @param prefixCommands - Array of prefix command definitions\r\n * @param prefix - Command prefix (default: '!')\r\n * @param logger - Optional logger instance\r\n * @returns Event handler function\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createPrefixCommandHandler } from 'djs-helper-kit';\r\n * \r\n * const prefixCommands = [\r\n *   {\r\n *     name: 'ping',\r\n *     description: 'Ping command',\r\n *     run: async (message, args, ctx) => {\r\n *       await message.reply('Pong!');\r\n *     }\r\n *   }\r\n * ];\r\n * \r\n * const handler = createPrefixCommandHandler(prefixCommands, '!');\r\n * client.on('messageCreate', handler);\r\n * ```\r\n */\r\nexport function createPrefixCommandHandler(\r\n  prefixCommands: PrefixCommandDefinition[], \r\n  prefix: string = '!',\r\n  logger?: Logger\r\n) {\r\n  const commandMap = new Map<string, PrefixCommandDefinition>();\r\n  \r\n  // Build command map with aliases\r\n  for (const cmd of prefixCommands) {\r\n    commandMap.set(cmd.name, cmd);\r\n    if (cmd.aliases) {\r\n      for (const alias of cmd.aliases) {\r\n        commandMap.set(alias, cmd);\r\n      }\r\n    }\r\n  }\r\n  \r\n  return async (message: Message) => {\r\n    // Ignore bot messages and messages that don't start with prefix\r\n    if (message.author.bot || !message.content.startsWith(prefix)) return;\r\n    \r\n    // Parse command and arguments\r\n    const args = message.content.slice(prefix.length).trim().split(/ +/);\r\n    const commandName = args.shift()?.toLowerCase();\r\n    \r\n    if (!commandName) return;\r\n    \r\n    const command = commandMap.get(commandName);\r\n    if (!command) return;\r\n    \r\n    const context = { client: message.client, logger: logger || createDefaultLogger() };\r\n    \r\n    try {\r\n      // Run guard if present\r\n      if (command.guard) {\r\n        const guardResult = await command.guard(message, args, context);\r\n        if (guardResult !== true) {\r\n          const errorMessage = typeof guardResult === 'string' \r\n            ? guardResult \r\n            : 'Access denied';\r\n          \r\n          await message.reply(errorMessage);\r\n          return;\r\n        }\r\n      }\r\n      \r\n      // Run the command\r\n      await command.run(message, args, context);\r\n      \r\n    } catch (error) {\r\n      context.logger.error(`Error in prefix command ${commandName}:`, error);\r\n      await message.reply('An error occurred while executing this command.');\r\n    }\r\n  };\r\n} ","import { \r\n  ActionRowBuilder, \r\n  ButtonBuilder, \r\n  ButtonStyle,\r\n  MessageFlags,\r\n  APIMessageComponent,\r\n  TextInputBuilder,\r\n  TextInputStyle,\r\n  SelectMenuBuilder,\r\n  ModalBuilder,\r\n  TextDisplayBuilder,\r\n  ContainerBuilder,\r\n  ChannelSelectMenuBuilder,\r\n  RoleSelectMenuBuilder,\r\n  UserSelectMenuBuilder,\r\n  MentionableSelectMenuBuilder,\r\n  StringSelectMenuBuilder,\r\n  StringSelectMenuOptionBuilder\r\n} from 'discord.js';\r\n\r\nexport type Markdownish = string;\r\n\r\n/**\r\n * Simple message builder that mimics v1 message creation\r\n * but uses Components v2 under the hood\r\n * \r\n * @example\r\n * ```typescript\r\n * const message = msg()\r\n *   .title('Welcome!')\r\n *   .text('This is a simple message with **markdown** support.')\r\n *   .separator()\r\n *   .field('Status', 'Online', true)\r\n *   .buttons(btn.primary('action', 'Click me'))\r\n *   .build();\r\n * \r\n * await interaction.reply(message);\r\n * ```\r\n */\r\nexport interface SimpleMessage {\r\n  /**\r\n   * Add text content with markdown support\r\n   * @param content - The text content to add\r\n   * @returns The message builder for chaining\r\n   */\r\n  text(content: string): this;\r\n  \r\n  /**\r\n   * Add a title (bold text)\r\n   * @param text - The title text\r\n   * @returns The message builder for chaining\r\n   */\r\n  title(text: string): this;\r\n  \r\n  /**\r\n   * Add a subtitle (italic text)\r\n   * @param text - The subtitle text\r\n   * @returns The message builder for chaining\r\n   */\r\n  subtitle(text: string): this;\r\n  \r\n  /**\r\n   * Add a separator line\r\n   * @returns The message builder for chaining\r\n   */\r\n  separator(): this;\r\n  \r\n  /**\r\n   * Add a small separator\r\n   * @returns The message builder for chaining\r\n   */\r\n  smallSeparator(): this;\r\n  \r\n  /**\r\n   * Add an image (as text with URL)\r\n   * @param url - The image URL\r\n   * @param alt - Optional alt text for the image\r\n   * @returns The message builder for chaining\r\n   */\r\n  image(url: string, alt?: string): this;\r\n  \r\n  /**\r\n   * Add multiple images (as text with URLs)\r\n   * @param urls - Array of image URLs\r\n   * @returns The message builder for chaining\r\n   */\r\n  images(urls: string[]): this;\r\n  \r\n  /**\r\n   * Add a media gallery\r\n   * @param urls - Array of media URLs\r\n   * @returns The message builder for chaining\r\n   */\r\n  mediaGallery(urls: string[]): this;\r\n  \r\n  /**\r\n   * Add a thumbnail\r\n   * @param url - The thumbnail URL\r\n   * @param alt - Optional alt text for the thumbnail\r\n   * @returns The message builder for chaining\r\n   */\r\n  thumbnail(url: string, alt?: string): this;\r\n  \r\n  /**\r\n   * Add a field (name: value format)\r\n   * @param name - The field name\r\n   * @param value - The field value\r\n   * @param inline - Whether the field should be inline\r\n   * @returns The message builder for chaining\r\n   */\r\n  field(name: string, value: string, inline?: boolean): this;\r\n  \r\n  /**\r\n   * Set the color theme (affects visual styling)\r\n   * @param hex - The color hex value\r\n   * @returns The message builder for chaining\r\n   */\r\n  color(hex: number): this;\r\n  \r\n  /**\r\n   * Add a footer\r\n   * @param text - The footer text\r\n   * @returns The message builder for chaining\r\n   */\r\n  footer(text: string): this;\r\n  \r\n  /**\r\n   * Add buttons\r\n   * @param buttons - The buttons to add\r\n   * @returns The message builder for chaining\r\n   */\r\n  buttons(...buttons: ButtonBuilder[]): this;\r\n  \r\n  /**\r\n   * Add a select menu\r\n   * @param menu - The select menu to add\r\n   * @returns The message builder for chaining\r\n   */\r\n  select(menu: SelectMenuBuilder | StringSelectMenuBuilder | UserSelectMenuBuilder | RoleSelectMenuBuilder | ChannelSelectMenuBuilder | MentionableSelectMenuBuilder): this;\r\n  \r\n  /**\r\n   * Build the final message for Discord.js\r\n   * @returns The built message components and flags\r\n   */\r\n  build(): {\r\n    components: APIMessageComponent[];\r\n    flags: MessageFlags;\r\n  };\r\n  \r\n  /**\r\n   * Build for interaction reply\r\n   * @returns The built message components and flags\r\n   */\r\n  reply(): {\r\n    components: APIMessageComponent[];\r\n    flags: MessageFlags;\r\n  };\r\n}\r\n\r\n/**\r\n * Simple embed builder that mimics v1 embed creation\r\n * but uses Components v2 under the hood\r\n * \r\n * @example\r\n * ```typescript\r\n * const embed = embed()\r\n *   .title('Server Information')\r\n *   .description('Details about the server')\r\n *   .color(0x5865f2)\r\n *   .field('Members', '1000', true)\r\n *   .field('Channels', '50', true)\r\n *   .footer('Requested by user')\r\n *   .buttons(btn.success('join', 'Join Server'))\r\n *   .build();\r\n * \r\n * await interaction.reply(embed);\r\n * ```\r\n */\r\nexport interface SimpleEmbed {\r\n  /**\r\n   * Set the title\r\n   * @param text - The title text\r\n   * @returns The embed builder for chaining\r\n   */\r\n  title(text: string): this;\r\n  \r\n  /**\r\n   * Set the description\r\n   * @param text - The description text\r\n   * @returns The embed builder for chaining\r\n   */\r\n  description(text: string): this;\r\n  \r\n  /**\r\n   * Set the color\r\n   * @param hex - The color hex value\r\n   * @returns The embed builder for chaining\r\n   */\r\n  color(hex: number): this;\r\n  \r\n  /**\r\n   * Add a field\r\n   * @param name - The field name\r\n   * @param value - The field value\r\n   * @param inline - Whether the field should be inline\r\n   * @returns The embed builder for chaining\r\n   */\r\n  field(name: string, value: string, inline?: boolean): this;\r\n  \r\n  /**\r\n   * Set thumbnail\r\n   * @param url - The thumbnail URL\r\n   * @returns The embed builder for chaining\r\n   */\r\n  thumbnail(url: string): this;\r\n  \r\n  /**\r\n   * Set main image\r\n   * @param url - The image URL\r\n   * @returns The embed builder for chaining\r\n   */\r\n  image(url: string): this;\r\n  \r\n  /**\r\n   * Set footer\r\n   * @param text - The footer text\r\n   * @returns The embed builder for chaining\r\n   */\r\n  footer(text: string): this;\r\n  \r\n  /**\r\n   * Set timestamp\r\n   * @param date - The timestamp date (defaults to current time)\r\n   * @returns The embed builder for chaining\r\n   */\r\n  timestamp(date?: Date): this;\r\n  \r\n  /**\r\n   * Add buttons\r\n   * @param buttons - The buttons to add\r\n   * @returns The embed builder for chaining\r\n   */\r\n  buttons(...buttons: ButtonBuilder[]): this;\r\n  \r\n  /**\r\n   * Add a select menu\r\n   * @param menu - The select menu to add\r\n   * @returns The embed builder for chaining\r\n   */\r\n  select(menu: SelectMenuBuilder | StringSelectMenuBuilder | UserSelectMenuBuilder | RoleSelectMenuBuilder | ChannelSelectMenuBuilder | MentionableSelectMenuBuilder): this;\r\n  \r\n  /**\r\n   * Build the final embed for Discord.js\r\n   * @returns The built embed components and flags\r\n   */\r\n  build(): {\r\n    components: APIMessageComponent[];\r\n    flags: MessageFlags;\r\n  };\r\n}\r\n\r\n/**\r\n * Options for pagination helper\r\n */\r\nexport interface PaginationOptions {\r\n  /** Array of items to paginate */\r\n  items: unknown[];\r\n  /** Number of items per page */\r\n  itemsPerPage: number;\r\n  /** Current page number (defaults to 1) */\r\n  currentPage?: number;\r\n  /** Whether to show page information (defaults to true) */\r\n  showPageInfo?: boolean;\r\n  /** Whether to show navigation buttons (defaults to true) */\r\n  showNavigation?: boolean;\r\n}\r\n\r\n/**\r\n * Form field configuration for modals\r\n */\r\nexport interface FormField {\r\n  /** Unique identifier for the field */\r\n  id: string;\r\n  /** Display label for the field */\r\n  label: string;\r\n  /** Optional placeholder text */\r\n  placeholder?: string;\r\n  /** Whether the field is required (defaults to true) */\r\n  required?: boolean;\r\n  /** Input style (short or paragraph) */\r\n  style?: TextInputStyle;\r\n  /** Minimum length for the input */\r\n  minLength?: number;\r\n  /** Maximum length for the input */\r\n  maxLength?: number;\r\n  /** Default value for the field */\r\n  value?: string;\r\n}\r\n\r\n/**\r\n * Modal builder with enhanced features\r\n */\r\nexport interface ModalBuilderV2 {\r\n  /**\r\n   * Create a simple modal with text inputs\r\n   * @param id - Custom ID for the modal\r\n   * @param title - Modal title\r\n   * @param inputs - Array of form field configurations\r\n   * @returns ModalBuilder instance\r\n   */\r\n  create(id: string, title: string, inputs: FormField[]): ModalBuilder;\r\n  \r\n  /**\r\n   * Create a contact form modal\r\n   * @param id - Custom ID for the modal\r\n   * @returns ModalBuilder instance with contact form fields\r\n   */\r\n  contact(id: string): ModalBuilder;\r\n  \r\n  /**\r\n   * Create a feedback form modal\r\n   * @param id - Custom ID for the modal\r\n   * @returns ModalBuilder instance with feedback form fields\r\n   */\r\n  feedback(id: string): ModalBuilder;\r\n  \r\n  /**\r\n   * Create a settings form modal\r\n   * @param id - Custom ID for the modal\r\n   * @param fields - Array of field names to generate inputs for\r\n   * @returns ModalBuilder instance with settings form fields\r\n   */\r\n  settings(id: string, fields: string[]): ModalBuilder;\r\n}\r\n\r\n/**\r\n * Create a simple message builder\r\n * \r\n * @example\r\n * ```typescript\r\n * const message = msg()\r\n *   .title('Welcome!')\r\n *   .text('This is a simple message.')\r\n *   .buttons(btn.primary('click', 'Click me'))\r\n *   .build();\r\n * ```\r\n * \r\n * @returns A new SimpleMessage instance\r\n */\r\nexport function msg(): SimpleMessage {\r\n  return new SimpleMessageImpl();\r\n}\r\n\r\n/**\r\n * Create a simple embed builder\r\n * \r\n * @example\r\n * ```typescript\r\n * const embed = embed()\r\n *   .title('Server Info')\r\n *   .description('Information about the server')\r\n *   .color(0x5865f2)\r\n *   .build();\r\n * ```\r\n * \r\n * @returns A new SimpleEmbed instance\r\n */\r\nexport function embed(): SimpleEmbed {\r\n  return new SimpleEmbedImpl();\r\n}\r\n\r\n/**\r\n * Enhanced modal builder with predefined forms\r\n * \r\n * @example\r\n * ```typescript\r\n * // Contact form\r\n * const contactModal = modalV2.contact('contact_form');\r\n * await interaction.showModal(contactModal);\r\n * \r\n * // Custom form\r\n * const customModal = modalV2.create('custom', 'Form', [\r\n *   { id: 'name', label: 'Name', required: true },\r\n *   { id: 'email', label: 'Email', required: true }\r\n * ]);\r\n * ```\r\n */\r\nexport const modalV2: ModalBuilderV2 = {\r\n  create(id: string, title: string, inputs: FormField[]): ModalBuilder {\r\n    const modal = new ModalBuilder()\r\n      .setCustomId(id)\r\n      .setTitle(title);\r\n\r\n    inputs.forEach(input => {\r\n      const textInput = new TextInputBuilder()\r\n        .setCustomId(input.id)\r\n        .setLabel(input.label)\r\n        .setStyle(input.style || TextInputStyle.Short)\r\n        .setRequired(input.required !== false);\r\n\r\n      if (input.placeholder) {\r\n        textInput.setPlaceholder(input.placeholder);\r\n      }\r\n\r\n      if (input.minLength !== undefined) {\r\n        textInput.setMinLength(input.minLength);\r\n      }\r\n\r\n      if (input.maxLength !== undefined) {\r\n        textInput.setMaxLength(input.maxLength);\r\n      }\r\n\r\n      if (input.value) {\r\n        textInput.setValue(input.value);\r\n      }\r\n\r\n      const actionRow = new ActionRowBuilder<TextInputBuilder>()\r\n        .addComponents(textInput);\r\n\r\n      modal.addComponents(actionRow);\r\n    });\r\n\r\n    return modal;\r\n  },\r\n\r\n  contact(id: string): ModalBuilder {\r\n    return this.create(id, 'Contact Form', [\r\n      { id: 'name', label: 'Name', placeholder: 'Enter your name', required: true },\r\n      { id: 'email', label: 'Email', placeholder: 'Enter your email', required: true },\r\n      { id: 'subject', label: 'Subject', placeholder: 'What is this about?', required: true },\r\n      { id: 'message', label: 'Message', placeholder: 'Tell us more...', required: true, style: TextInputStyle.Paragraph }\r\n    ]);\r\n  },\r\n\r\n  feedback(id: string): ModalBuilder {\r\n    return this.create(id, 'Feedback Form', [\r\n      { id: 'rating', label: 'Rating (1-10)', placeholder: 'Rate your experience', required: true },\r\n      { id: 'feedback', label: 'Feedback', placeholder: 'Share your thoughts...', required: true, style: TextInputStyle.Paragraph },\r\n      { id: 'suggestions', label: 'Suggestions', placeholder: 'Any suggestions for improvement?', style: TextInputStyle.Paragraph }\r\n    ]);\r\n  },\r\n\r\n  settings(id: string, fields: string[]): ModalBuilder {\r\n    const inputs: FormField[] = fields.map(field => ({\r\n      id: field.toLowerCase().replace(/\\s+/g, '_'),\r\n      label: field,\r\n      placeholder: `Enter ${field.toLowerCase()}`,\r\n      required: true\r\n    }));\r\n\r\n    return this.create(id, 'Settings', inputs);\r\n  }\r\n};\r\n\r\n/**\r\n * Create a paginated message for large datasets\r\n * \r\n * @example\r\n * ```typescript\r\n * const items = Array.from({ length: 100 }, (_, i) => ({\r\n *   title: `Item ${i + 1}`,\r\n *   description: `Description for item ${i + 1}`\r\n * }));\r\n * \r\n * const pagination = createPagination({\r\n *   items,\r\n *   itemsPerPage: 5,\r\n *   currentPage: 1,\r\n *   showPageInfo: true,\r\n *   showNavigation: true\r\n * });\r\n * \r\n * await interaction.reply(pagination);\r\n * ```\r\n * \r\n * @param options - Pagination configuration options\r\n * @returns Built message with pagination components\r\n */\r\nexport function createPagination(options: PaginationOptions) {\r\n  const { items, itemsPerPage, currentPage = 1, showPageInfo = true, showNavigation = true } = options;\r\n  const totalPages = Math.ceil(items.length / itemsPerPage);\r\n  const startIndex = (currentPage - 1) * itemsPerPage;\r\n  const endIndex = startIndex + itemsPerPage;\r\n  const currentItems = items.slice(startIndex, endIndex);\r\n\r\n  const message = msg();\r\n  \r\n  // Add page info\r\n  if (showPageInfo) {\r\n    message.text(`**Page ${currentPage} of ${totalPages}**`);\r\n    message.text(`Showing ${startIndex + 1}-${Math.min(endIndex, items.length)} of ${items.length} items`);\r\n    message.separator();\r\n  }\r\n\r\n  // Add items\r\n  currentItems.forEach((item, index) => {\r\n    if (typeof item === 'string') {\r\n      message.text(item);\r\n    } else if (typeof item === 'object' && item !== null && 'title' in item && 'description' in item) {\r\n      const itemObj = item as Record<string, unknown>;\r\n      message.title(itemObj.title as string);\r\n      message.text(itemObj.description as string);\r\n    } else {\r\n      message.text(JSON.stringify(item));\r\n    }\r\n  });\r\n\r\n  // Add navigation buttons\r\n  if (showNavigation && totalPages > 1) {\r\n    const buttons: ButtonBuilder[] = [];\r\n    \r\n    if (currentPage > 1) {\r\n      buttons.push(btn.primary('page_first', '⏮️ First'));\r\n      buttons.push(btn.secondary('page_prev', '◀️ Previous'));\r\n    }\r\n    \r\n    if (currentPage < totalPages) {\r\n      buttons.push(btn.secondary('page_next', 'Next ▶️'));\r\n      buttons.push(btn.primary('page_last', 'Last ⏭️'));\r\n    }\r\n    \r\n    if (buttons.length > 0) {\r\n      message.buttons(...buttons);\r\n    }\r\n  }\r\n\r\n  return message.build();\r\n}\r\n\r\n/**\r\n * Create a custom form modal\r\n * \r\n * @example\r\n * ```typescript\r\n * const form = createForm([\r\n *   { id: 'name', label: 'Name', required: true },\r\n *   { id: 'email', label: 'Email', required: true },\r\n *   { id: 'message', label: 'Message', style: 2, required: false }\r\n * ]);\r\n * \r\n * await interaction.showModal(form);\r\n * ```\r\n * \r\n * @param fields - Array of form field configurations\r\n * @returns ModalBuilder instance with the specified fields\r\n */\r\nexport function createForm(fields: FormField[]) {\r\n  return modalV2.create('form_' + Date.now(), 'Form', fields);\r\n}\r\n\r\nclass SimpleMessageImpl implements SimpleMessage {\r\n  private textComponents: string[] = [];\r\n  private actionComponents: APIMessageComponent[] = [];\r\n  private messageColor?: number;\r\n  private hasContent = false;\r\n\r\n  text(content: string): this {\r\n    this.textComponents.push(content);\r\n    this.hasContent = true;\r\n    return this;\r\n  }\r\n\r\n  title(text: string): this {\r\n    this.textComponents.push(`**${text}**`);\r\n    this.hasContent = true;\r\n    return this;\r\n  }\r\n\r\n  subtitle(text: string): this {\r\n    this.textComponents.push(`*${text}*`);\r\n    this.hasContent = true;\r\n    return this;\r\n  }\r\n\r\n  separator(): this {\r\n    this.textComponents.push('---');\r\n    return this;\r\n  }\r\n\r\n  smallSeparator(): this {\r\n    this.textComponents.push('---');\r\n    return this;\r\n  }\r\n\r\n  image(url: string, alt?: string): this {\r\n    this.textComponents.push(`![${alt || 'Image'}](${url})`);\r\n    return this;\r\n  }\r\n\r\n  images(urls: string[]): this {\r\n    const imageText = urls.map(url => `![Image](${url})`).join('\\n');\r\n    this.textComponents.push(imageText);\r\n    return this;\r\n  }\r\n\r\n  mediaGallery(urls: string[]): this {\r\n    // For now, use text representation since MediaGalleryBuilder might not be available\r\n    const galleryText = urls.map(url => `![Gallery Image](${url})`).join('\\n');\r\n    this.textComponents.push(galleryText);\r\n    return this;\r\n  }\r\n\r\n  thumbnail(url: string, alt?: string): this {\r\n    this.textComponents.push(`![${alt || 'Thumbnail'}](${url})`);\r\n    return this;\r\n  }\r\n\r\n  field(name: string, value: string, inline = false): this {\r\n    const fieldText = inline \r\n      ? `**${name}** ${value}`\r\n      : `**${name}**\\n${value}`;\r\n    \r\n    this.textComponents.push(fieldText);\r\n    this.hasContent = true;\r\n    return this;\r\n  }\r\n\r\n  color(hex: number): this {\r\n    this.messageColor = hex;\r\n    return this;\r\n  }\r\n\r\n  footer(text: string): this {\r\n    this.textComponents.push(`*${text}*`);\r\n    this.hasContent = true;\r\n    return this;\r\n  }\r\n\r\n  buttons(...buttons: ButtonBuilder[]): this {\r\n    const row = new ActionRowBuilder<ButtonBuilder>();\r\n    buttons.forEach(button => row.addComponents(button));\r\n    this.actionComponents.push(row.toJSON());\r\n    return this;\r\n  }\r\n\r\n  select(menu: SelectMenuBuilder | StringSelectMenuBuilder | UserSelectMenuBuilder | RoleSelectMenuBuilder | ChannelSelectMenuBuilder | MentionableSelectMenuBuilder): this {\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    const row = new ActionRowBuilder<any>();\r\n    row.addComponents(menu);\r\n    this.actionComponents.push(row.toJSON());\r\n    return this;\r\n  }\r\n\r\n  build(): { components: APIMessageComponent[]; flags: MessageFlags } {\r\n    const components: APIMessageComponent[] = [];\r\n\r\n    // If no content was added, add a default text component\r\n    if (!this.hasContent) {\r\n      this.textComponents.unshift(' ');\r\n    }\r\n\r\n    // Create a container with all text content\r\n    if (this.textComponents.length > 0) {\r\n      const container = new ContainerBuilder();\r\n      this.textComponents.forEach(text => {\r\n        container.addTextDisplayComponents(\r\n          new TextDisplayBuilder().setContent(text)\r\n        );\r\n      });\r\n      components.push(container.toJSON());\r\n    }\r\n\r\n    // Add action components\r\n    components.push(...this.actionComponents);\r\n\r\n    return {\r\n      components,\r\n      flags: MessageFlags.IsComponentsV2\r\n    };\r\n  }\r\n\r\n  reply(): { components: APIMessageComponent[]; flags: MessageFlags } {\r\n    return this.build();\r\n  }\r\n}\r\n\r\nclass SimpleEmbedImpl implements SimpleEmbed {\r\n  private textComponents: string[] = [];\r\n  private actionComponents: APIMessageComponent[] = [];\r\n  private embedColor?: number;\r\n  private embedTitle?: string;\r\n  private embedDescription?: string;\r\n  private fields: Array<{ name: string; value: string; inline: boolean }> = [];\r\n  private embedThumbnail?: string;\r\n  private embedImage?: string;\r\n  private embedFooter?: string;\r\n  private embedTimestamp?: Date;\r\n\r\n  title(text: string): this {\r\n    this.embedTitle = text;\r\n    return this;\r\n  }\r\n\r\n  description(text: string): this {\r\n    this.embedDescription = text;\r\n    return this;\r\n  }\r\n\r\n  color(hex: number): this {\r\n    this.embedColor = hex;\r\n    return this;\r\n  }\r\n\r\n  field(name: string, value: string, inline = false): this {\r\n    this.fields.push({ name, value, inline });\r\n    return this;\r\n  }\r\n\r\n  thumbnail(url: string): this {\r\n    this.embedThumbnail = url;\r\n    return this;\r\n  }\r\n\r\n  image(url: string): this {\r\n    this.embedImage = url;\r\n    return this;\r\n  }\r\n\r\n  footer(text: string): this {\r\n    this.embedFooter = text;\r\n    return this;\r\n  }\r\n\r\n  timestamp(date?: Date): this {\r\n    this.embedTimestamp = date || new Date();\r\n    return this;\r\n  }\r\n\r\n  buttons(...buttons: ButtonBuilder[]): this {\r\n    const row = new ActionRowBuilder<ButtonBuilder>();\r\n    buttons.forEach(button => row.addComponents(button));\r\n    this.actionComponents.push(row.toJSON());\r\n    return this;\r\n  }\r\n\r\n  select(menu: SelectMenuBuilder | StringSelectMenuBuilder | UserSelectMenuBuilder | RoleSelectMenuBuilder | ChannelSelectMenuBuilder | MentionableSelectMenuBuilder): this {\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    const row = new ActionRowBuilder<any>();\r\n    row.addComponents(menu);\r\n    this.actionComponents.push(row.toJSON());\r\n    return this;\r\n  }\r\n\r\n  build(): { components: APIMessageComponent[]; flags: MessageFlags } {\r\n    const components: APIMessageComponent[] = [];\r\n\r\n    // Create container for embed content\r\n    const container = new ContainerBuilder();\r\n    \r\n    // Add title\r\n    if (this.embedTitle) {\r\n      container.addTextDisplayComponents(\r\n        new TextDisplayBuilder().setContent(`**${this.embedTitle}**`)\r\n      );\r\n    }\r\n\r\n    // Add description\r\n    if (this.embedDescription) {\r\n      container.addTextDisplayComponents(\r\n        new TextDisplayBuilder().setContent(this.embedDescription)\r\n      );\r\n    }\r\n\r\n    // Add fields\r\n    if (this.fields.length > 0) {\r\n      this.fields.forEach(field => {\r\n        const fieldText = field.inline \r\n          ? `**${field.name}** ${field.value}`\r\n          : `**${field.name}**\\n${field.value}`;\r\n        \r\n        container.addTextDisplayComponents(\r\n          new TextDisplayBuilder().setContent(fieldText)\r\n        );\r\n      });\r\n    }\r\n\r\n    // Add footer\r\n    if (this.embedFooter) {\r\n      container.addTextDisplayComponents(\r\n        new TextDisplayBuilder().setContent(`*${this.embedFooter}*`)\r\n      );\r\n    }\r\n\r\n    // Add timestamp\r\n    if (this.embedTimestamp) {\r\n      container.addTextDisplayComponents(\r\n        new TextDisplayBuilder().setContent(`<t:${Math.floor(this.embedTimestamp.getTime() / 1000)}:R>`)\r\n      );\r\n    }\r\n\r\n    components.push(container.toJSON());\r\n\r\n    // Add thumbnail if specified (as text since ImageDisplayBuilder isn't available)\r\n    if (this.embedThumbnail) {\r\n      const thumbContainer = new ContainerBuilder();\r\n      thumbContainer.addTextDisplayComponents(\r\n        new TextDisplayBuilder().setContent(`![Thumbnail](${this.embedThumbnail})`)\r\n      );\r\n      components.push(thumbContainer.toJSON());\r\n    }\r\n\r\n    // Add main image if specified (as text since ImageDisplayBuilder isn't available)\r\n    if (this.embedImage) {\r\n      const imageContainer = new ContainerBuilder();\r\n      imageContainer.addTextDisplayComponents(\r\n        new TextDisplayBuilder().setContent(`![Embed image](${this.embedImage})`)\r\n      );\r\n      components.push(imageContainer.toJSON());\r\n    }\r\n\r\n    // Add action components\r\n    components.push(...this.actionComponents);\r\n\r\n    return {\r\n      components,\r\n      flags: MessageFlags.IsComponentsV2\r\n    };\r\n  }\r\n}\r\n\r\n/**\r\n * Button helper namespace for creating Discord.js buttons\r\n * \r\n * @example\r\n * ```typescript\r\n * const button = btn.primary('action', 'Click me');\r\n * const dangerButton = btn.danger('delete', 'Delete');\r\n * const linkButton = btn.link('https://discord.js.org', 'Visit Discord.js');\r\n * ```\r\n */\r\nexport const btn = {\r\n  /**\r\n   * Create a primary button\r\n   * @param id - Custom ID for the button\r\n   * @param label - Button label text\r\n   * @returns ButtonBuilder configured as primary style\r\n   */\r\n  primary(id: string, label: string): ButtonBuilder {\r\n    return new ButtonBuilder()\r\n      .setCustomId(id)\r\n      .setLabel(label)\r\n      .setStyle(ButtonStyle.Primary);\r\n  },\r\n\r\n  /**\r\n   * Create a secondary button\r\n   * @param id - Custom ID for the button\r\n   * @param label - Button label text\r\n   * @returns ButtonBuilder configured as secondary style\r\n   */\r\n  secondary(id: string, label: string): ButtonBuilder {\r\n    return new ButtonBuilder()\r\n      .setCustomId(id)\r\n      .setLabel(label)\r\n      .setStyle(ButtonStyle.Secondary);\r\n  },\r\n\r\n  /**\r\n   * Create a danger button\r\n   * @param id - Custom ID for the button\r\n   * @param label - Button label text\r\n   * @returns ButtonBuilder configured as danger style\r\n   */\r\n  danger(id: string, label: string): ButtonBuilder {\r\n    return new ButtonBuilder()\r\n      .setCustomId(id)\r\n      .setLabel(label)\r\n      .setStyle(ButtonStyle.Danger);\r\n  },\r\n\r\n  /**\r\n   * Create a success button\r\n   * @param id - Custom ID for the button\r\n   * @param label - Button label text\r\n   * @returns ButtonBuilder configured as success style\r\n   */\r\n  success(id: string, label: string): ButtonBuilder {\r\n    return new ButtonBuilder()\r\n      .setCustomId(id)\r\n      .setLabel(label)\r\n      .setStyle(ButtonStyle.Success);\r\n  },\r\n\r\n  /**\r\n   * Create a link button\r\n   * @param url - URL for the button to link to\r\n   * @param label - Button label text\r\n   * @returns ButtonBuilder configured as link style\r\n   */\r\n  link(url: string, label: string): ButtonBuilder {\r\n    return new ButtonBuilder()\r\n      .setURL(url)\r\n      .setLabel(label)\r\n      .setStyle(ButtonStyle.Link);\r\n  }\r\n};\r\n\r\n/**\r\n * Select menu helper namespace for creating Discord.js select menus\r\n * \r\n * @example\r\n * ```typescript\r\n * const stringMenu = select.string('choice', 'Select an option', [\r\n *   { label: 'Option 1', value: 'opt1', description: 'First option' },\r\n *   { label: 'Option 2', value: 'opt2', description: 'Second option' }\r\n * ]);\r\n * \r\n * const userMenu = select.user('user_select', 'Select a user');\r\n * const roleMenu = select.role('role_select', 'Select a role');\r\n * ```\r\n */\r\nexport const select = {\r\n  /**\r\n   * Create a string select menu\r\n   * @param id - Custom ID for the menu\r\n   * @param placeholder - Placeholder text\r\n   * @param options - Array of options with label, value, and optional description\r\n   * @returns StringSelectMenuBuilder\r\n   */\r\n  string(id: string, placeholder: string, options: Array<{ label: string; value: string; description?: string }>): StringSelectMenuBuilder {\r\n    const menu = new StringSelectMenuBuilder()\r\n      .setCustomId(id)\r\n      .setPlaceholder(placeholder);\r\n\r\n    options.forEach(option => {\r\n      const menuOption = new StringSelectMenuOptionBuilder()\r\n        .setLabel(option.label)\r\n        .setValue(option.value);\r\n      \r\n      if (option.description) {\r\n        menuOption.setDescription(option.description);\r\n      }\r\n      \r\n      menu.addOptions(menuOption);\r\n    });\r\n\r\n    return menu;\r\n  },\r\n\r\n  /**\r\n   * Create a user select menu\r\n   * @param id - Custom ID for the menu\r\n   * @param placeholder - Placeholder text\r\n   * @returns UserSelectMenuBuilder\r\n   */\r\n  user(id: string, placeholder: string): UserSelectMenuBuilder {\r\n    return new UserSelectMenuBuilder()\r\n      .setCustomId(id)\r\n      .setPlaceholder(placeholder);\r\n  },\r\n\r\n  /**\r\n   * Create a role select menu\r\n   * @param id - Custom ID for the menu\r\n   * @param placeholder - Placeholder text\r\n   * @returns RoleSelectMenuBuilder\r\n   */\r\n  role(id: string, placeholder: string): RoleSelectMenuBuilder {\r\n    return new RoleSelectMenuBuilder()\r\n      .setCustomId(id)\r\n      .setPlaceholder(placeholder);\r\n  },\r\n\r\n  /**\r\n   * Create a channel select menu\r\n   * @param id - Custom ID for the menu\r\n   * @param placeholder - Placeholder text\r\n   * @returns ChannelSelectMenuBuilder\r\n   */\r\n  channel(id: string, placeholder: string): ChannelSelectMenuBuilder {\r\n    return new ChannelSelectMenuBuilder()\r\n      .setCustomId(id)\r\n      .setPlaceholder(placeholder);\r\n  }\r\n};\r\n\r\n/**\r\n * Migration helper to convert existing EmbedBuilder to v2 format\r\n * \r\n * @example\r\n * ```typescript\r\n * import { EmbedBuilder } from 'discord.js';\r\n * import { convertEmbed } from 'djs-helper-kit';\r\n * \r\n * const oldEmbed = new EmbedBuilder()\r\n *   .setTitle('Title')\r\n *   .setDescription('Description');\r\n * \r\n * const newEmbed = convertEmbed(oldEmbed);\r\n * await interaction.reply(newEmbed.build());\r\n * ```\r\n * \r\n * @param embed - Discord.js EmbedBuilder to convert\r\n * @returns SimpleEmbed with equivalent content\r\n */\r\nexport function convertEmbed(embed: unknown): SimpleEmbed {\r\n  const embedObj = embed as Record<string, unknown>;\r\n  const builder = (embedObj as unknown as () => SimpleEmbed)();\r\n  \r\n  // Convert embed properties to embed format\r\n  const data = embedObj.data as Record<string, unknown> | undefined;\r\n  if (data?.color) {\r\n    builder.color(data.color as number);\r\n  }\r\n  \r\n  if (data?.title) {\r\n    builder.title(data.title as string);\r\n  }\r\n  \r\n  if (data?.description) {\r\n    builder.description(data.description as string);\r\n  }\r\n  \r\n  // Convert embed fields to embed fields\r\n  if (data?.fields && Array.isArray(data.fields)) {\r\n    for (const field of data.fields as Array<Record<string, unknown>>) {\r\n      builder.field(field.name as string, field.value as string, field.inline as boolean);\r\n    }\r\n  }\r\n  \r\n  if (data?.thumbnail && typeof data.thumbnail === 'object' && data.thumbnail !== null) {\r\n    const thumbnail = data.thumbnail as Record<string, unknown>;\r\n    if (thumbnail.url) {\r\n      builder.thumbnail(thumbnail.url as string);\r\n    }\r\n  }\r\n  \r\n  if (data?.image && typeof data.image === 'object' && data.image !== null) {\r\n    const image = data.image as Record<string, unknown>;\r\n    if (image.url) {\r\n      builder.image(image.url as string);\r\n    }\r\n  }\r\n  \r\n  if (data?.footer && typeof data.footer === 'object' && data.footer !== null) {\r\n    const footer = data.footer as Record<string, unknown>;\r\n    if (footer.text) {\r\n      builder.footer(footer.text as string);\r\n    }\r\n  }\r\n  \r\n  if (data?.timestamp) {\r\n    builder.timestamp(new Date(data.timestamp as string | number));\r\n  }\r\n  \r\n  return builder;\r\n}\r\n\r\n/**\r\n * Migrate a collection of embeds to v2 format\r\n * \r\n * @example\r\n * ```typescript\r\n * const oldEmbeds = [embed1, embed2, embed3];\r\n * const newEmbeds = migrateEmbeds(oldEmbeds).map(e => e.build());\r\n * ```\r\n * \r\n * @param embeds - Array of EmbedBuilder instances\r\n * @returns Array of SimpleEmbed instances\r\n */\r\nexport function migrateEmbeds(embeds: unknown[]): SimpleEmbed[] {\r\n  return embeds.map(embed => convertEmbed(embed));\r\n}\r\n\r\n/**\r\n * Check if a message contains v1 embeds that need migration\r\n * \r\n * @example\r\n * ```typescript\r\n * if (needsMigration(message)) {\r\n *   const newEmbeds = migrateMessage(message);\r\n *   await interaction.reply(newEmbeds[0].build());\r\n * }\r\n * ```\r\n * \r\n * @param message - Discord message object\r\n * @returns True if message contains embeds that should be migrated\r\n */\r\nexport function needsMigration(message: unknown): boolean {\r\n  const messageObj = message as Record<string, unknown>;\r\n  return Array.isArray(messageObj.embeds) && messageObj.embeds.length > 0;\r\n}\r\n\r\n/**\r\n * Migrate a message with v1 embeds to v2 format\r\n * \r\n * @example\r\n * ```typescript\r\n * const newEmbeds = migrateMessage(message);\r\n * for (const embed of newEmbeds) {\r\n *   await interaction.followUp(embed.build());\r\n * }\r\n * ```\r\n * \r\n * @param message - Discord message object with embeds\r\n * @returns Array of SimpleEmbed instances\r\n */\r\nexport function migrateMessage(message: unknown): SimpleEmbed[] {\r\n  if (!needsMigration(message)) {\r\n    return [];\r\n  }\r\n  \r\n  const messageObj = message as Record<string, unknown>;\r\n  const embeds = messageObj.embeds as Array<unknown>;\r\n  return migrateEmbeds(embeds);\r\n}\r\n\r\n// Legacy exports for backward compatibility\r\n// export { card } from './legacy.js'; ","import { \r\n  ActionRowBuilder, \r\n  ButtonBuilder, \r\n  ComponentType,\r\n  MessageComponentInteraction,\r\n  Message,\r\n  MessageFlags,\r\n  ChatInputCommandInteraction,\r\n  ButtonInteraction,\r\n  ModalBuilder,\r\n  TextInputBuilder,\r\n  TextInputStyle\r\n} from 'discord.js';\r\nimport { msg, btn } from '../v2/index.js';\r\n\r\n/**\r\n * Configuration options for confirm dialogs\r\n */\r\nexport interface ConfirmOptions {\r\n  /** Custom ID for the yes button */\r\n  yesId?: string;\r\n  /** Custom ID for the no button */\r\n  noId?: string;\r\n  /** Timeout in milliseconds (default: 30000) */\r\n  timeoutMs?: number;\r\n  /** Whether the response should be ephemeral */\r\n  ephemeral?: boolean;\r\n  /** Custom UI builder function */\r\n  ui?: (_base: ReturnType<typeof msg>) => ReturnType<typeof msg>;\r\n}\r\n\r\n/**\r\n * Configuration options for pagination\r\n */\r\nexport interface PaginateOptions {\r\n  /** Items per page (default: 10) */\r\n  perPage?: number;\r\n  /** Timeout in milliseconds (default: 300000 / 5 minutes) */\r\n  timeoutMs?: number;\r\n  /** Whether the response should be ephemeral */\r\n  ephemeral?: boolean;\r\n  /** Custom render function for each page */\r\n  render?: (_items: string[], _page: number, _totalPages: number) => ReturnType<typeof msg>;\r\n}\r\n\r\n/**\r\n * Configuration options for component collectors\r\n */\r\nexport interface CollectOptions {\r\n  /** Filter function for interactions */\r\n  filter?: (_i: MessageComponentInteraction) => boolean;\r\n  /** Collection timeout in milliseconds */\r\n  time?: number;\r\n  /** Maximum interactions to collect */\r\n  max?: number;\r\n}\r\n\r\n/**\r\n * Shows a confirmation dialog with Yes/No buttons.\r\n * Handles timeout gracefully and provides clear user feedback.\r\n * \r\n * @param interaction - The interaction to respond to\r\n * @param text - The confirmation message text\r\n * @param options - Configuration options\r\n * @returns Promise resolving to true if confirmed, false if denied or timed out\r\n * \r\n * @example\r\n * ```typescript\r\n * import { confirm } from 'djs-helper-kit';\r\n * \r\n * if (await confirm(interaction, \"Delete this channel?\")) {\r\n *   // User confirmed, proceed with deletion\r\n *   await interaction.channel?.delete();\r\n * }\r\n * ```\r\n * \r\n * @example\r\n * ```javascript\r\n * const { confirm } = require('djs-helper-kit');\r\n * \r\n * const confirmed = await confirm(interaction, \"Are you sure?\", {\r\n *   ephemeral: true,\r\n *   timeoutMs: 15000\r\n * });\r\n * ```\r\n */\r\nexport async function confirm(\r\n  interaction: ChatInputCommandInteraction | ButtonInteraction,\r\n  text: string,\r\n  options: ConfirmOptions = {}\r\n): Promise<boolean> {\r\n  const {\r\n    yesId = 'confirm_yes',\r\n    noId = 'confirm_no',\r\n    timeoutMs = 30000,\r\n    ephemeral = false,\r\n    ui = (base) => base\r\n  } = options;\r\n\r\n  // Build the confirmation UI\r\n  const baseCard = msg().text(`⚠️ **Confirmation Required**\\n\\n${text}`);\r\n  const confirmCard = ui(baseCard);\r\n  \r\n  // const actionRow = new ActionRowBuilder<ButtonBuilder>().addComponents(\r\n  //   btn.danger(yesId, 'Yes'),\r\n  //   btn.secondary(noId, 'No')\r\n  // );\r\n\r\n  const response = confirmCard.buttons(btn.danger(yesId, 'Yes'), btn.secondary(noId, 'No')).build();\r\n  const flags = response.flags | (ephemeral ? MessageFlags.Ephemeral : 0);\r\n\r\n  // Send the confirmation message\r\n  let message: Message;\r\n  if (interaction.replied || interaction.deferred) {\r\n    const reply = await interaction.editReply({ components: response.components, flags });\r\n    message = reply as Message;\r\n  } else {\r\n    const reply = await interaction.reply({ components: response.components, flags, fetchReply: true });\r\n    message = reply as Message;\r\n  }\r\n\r\n  try {\r\n    // Wait for user response\r\n    const buttonInteraction = await message.awaitMessageComponent({\r\n      filter: (i: MessageComponentInteraction) => [yesId, noId].includes(i.customId) && i.user.id === interaction.user.id,\r\n      time: timeoutMs,\r\n      componentType: ComponentType.Button\r\n    });\r\n\r\n    const confirmed = buttonInteraction.customId === yesId;\r\n    \r\n    // Update the message to show the result\r\n    const resultCard = msg().text(\r\n      confirmed \r\n        ? '✅ **Confirmed**\\nAction will proceed.'\r\n        : '❌ **Cancelled**\\nNo action taken.'\r\n    );\r\n\r\n    const resultResponse = resultCard.build();\r\n    await buttonInteraction.update({ components: resultResponse.components });\r\n    \r\n    return confirmed;\r\n  } catch {\r\n    // Timeout occurred\r\n    const timeoutCard = msg().text('⏰ **Timed out**\\nNo response received.');\r\n    \r\n    try {\r\n      const timeoutResponse = timeoutCard.build();\r\n      await interaction.editReply({ components: timeoutResponse.components });\r\n    } catch {\r\n      // Ignore edit errors (interaction might be expired)\r\n    }\r\n    \r\n    return false;\r\n  }\r\n}\r\n\r\n/**\r\n * Creates a paginated interface for large lists of items.\r\n * Automatically handles navigation and provides a clean interface.\r\n * \r\n * @param interaction - The interaction to respond to\r\n * @param items - Array of items to paginate\r\n * @param options - Configuration options\r\n * \r\n * @example\r\n * ```typescript\r\n * import { paginate } from 'djs-helper-kit';\r\n * \r\n * const userList = guild.members.cache.map(m => m.user.tag);\r\n * await paginate(interaction, userList, { \r\n *   perPage: 10,\r\n *   ephemeral: true \r\n * });\r\n * ```\r\n * \r\n * @example\r\n * ```javascript\r\n * const { paginate } = require('djs-helper-kit');\r\n * \r\n * await paginate(interaction, items, {\r\n *   perPage: 5,\r\n *   render: (items, page) => card().section(`Page ${page}\\n${items.join('\\n')}`)\r\n * });\r\n * ```\r\n */\r\nexport async function paginate(\r\n  interaction: ChatInputCommandInteraction | ButtonInteraction,\r\n  items: string[],\r\n  options: PaginateOptions = {}\r\n): Promise<void> {\r\n  const {\r\n    perPage = 10,\r\n    timeoutMs = 300000, // 5 minutes\r\n    ephemeral = false,\r\n    render = defaultPaginateRender\r\n  } = options;\r\n\r\n  if (items.length === 0) {\r\n    const emptyCard = msg().text('📭 **No items to display**');\r\n    const response = emptyCard.build();\r\n    response.flags = response.flags | (ephemeral ? MessageFlags.Ephemeral : 0);\r\n    \r\n    const responseData = response;\r\n    await interaction.reply({ components: responseData.components, flags: responseData.flags as number });\r\n    return;\r\n  }\r\n\r\n  const totalPages = Math.ceil(items.length / perPage);\r\n  let currentPage = 0;\r\n\r\n  const updatePage = async (pageIndex: number, targetInteraction: { update?: Function; reply?: Function }) => {\r\n    const startIndex = pageIndex * perPage;\r\n    const endIndex = Math.min(startIndex + perPage, items.length);\r\n    const pageItems = items.slice(startIndex, endIndex);\r\n    \r\n    const pageCard = render(pageItems, pageIndex + 1, totalPages);\r\n    \r\n    const actionRow = new ActionRowBuilder<ButtonBuilder>();\r\n    \r\n    // Add navigation buttons\r\n    if (totalPages > 1) {\r\n      actionRow.addComponents(\r\n        btn.secondary('page_first', '⏮️').setDisabled(pageIndex === 0),\r\n        btn.secondary('page_prev', '⬅️').setDisabled(pageIndex === 0),\r\n        btn.secondary('page_next', '➡️').setDisabled(pageIndex === totalPages - 1),\r\n        btn.secondary('page_last', '⏭️').setDisabled(pageIndex === totalPages - 1)\r\n      );\r\n    }\r\n    \r\n    const response = pageCard.buttons(...actionRow.components).build();\r\n    response.flags = response.flags | (ephemeral ? MessageFlags.Ephemeral : 0);\r\n    \r\n    return await targetInteraction.update ? \r\n      (targetInteraction.update as Function)(response) : \r\n      (targetInteraction.reply as Function)({ ...response, fetchReply: true });\r\n  };\r\n\r\n  // Send initial page\r\n  let message: Message;\r\n  if (interaction.replied || interaction.deferred) {\r\n    message = await updatePage(currentPage, { update: interaction.editReply.bind(interaction) });\r\n  } else {\r\n    message = await updatePage(currentPage, interaction) as Message;\r\n  }\r\n\r\n  if (totalPages <= 1) return; // No pagination needed\r\n\r\n  // Handle navigation\r\n  const collector = message.createMessageComponentCollector({\r\n    filter: (i: MessageComponentInteraction) => i.user.id === interaction.user.id,\r\n    time: timeoutMs,\r\n    componentType: ComponentType.Button\r\n  });\r\n\r\n  collector.on('collect', async (buttonInteraction: MessageComponentInteraction) => {\r\n    switch (buttonInteraction.customId) {\r\n    case 'page_first':\r\n      currentPage = 0;\r\n      break;\r\n    case 'page_prev':\r\n      currentPage = Math.max(0, currentPage - 1);\r\n      break;\r\n    case 'page_next':\r\n      currentPage = Math.min(totalPages - 1, currentPage + 1);\r\n      break;\r\n    case 'page_last':\r\n      currentPage = totalPages - 1;\r\n      break;\r\n    }\r\n    \r\n    await updatePage(currentPage, buttonInteraction);\r\n  });\r\n\r\n  collector.on('end', async () => {\r\n    // Disable all buttons on timeout\r\n    try {\r\n      const timeoutCard = render(\r\n        items.slice(currentPage * perPage, Math.min((currentPage + 1) * perPage, items.length)),\r\n        currentPage + 1,\r\n        totalPages\r\n      );\r\n      \r\n      const timeoutResponse = timeoutCard.buttons().build();\r\n      await interaction.editReply({ components: timeoutResponse.components });\r\n    } catch {\r\n      // Ignore edit errors\r\n    }\r\n  });\r\n}\r\n\r\n/**\r\n * Collects button interactions from a message for a specified time.\r\n * \r\n * @param message - The message to collect interactions from\r\n * @param options - Collection options\r\n * @returns Promise resolving to array of collected interactions\r\n * \r\n * @example\r\n * ```typescript\r\n * import { collectButtons } from 'djs-helper-kit';\r\n * \r\n * const interactions = await collectButtons(message, {\r\n *   filter: (i) => i.user.id === interaction.user.id,\r\n *   time: 60000,\r\n *   max: 1\r\n * });\r\n * ```\r\n */\r\nexport async function collectButtons(\r\n  message: Message,\r\n  options: CollectOptions = {}\r\n): Promise<MessageComponentInteraction[]> {\r\n  const {\r\n    filter = () => true,\r\n    time = 30000,\r\n    max = 1\r\n  } = options;\r\n\r\n  return new Promise((resolve) => {\r\n    const collected: MessageComponentInteraction[] = [];\r\n    \r\n    const collector = message.createMessageComponentCollector({\r\n      filter,\r\n      time,\r\n      max,\r\n      componentType: ComponentType.Button\r\n    });\r\n\r\n    collector.on('collect', (interaction: MessageComponentInteraction) => {\r\n      collected.push(interaction);\r\n    });\r\n\r\n    collector.on('end', () => {\r\n      resolve(collected);\r\n    });\r\n  });\r\n}\r\n\r\n/**\r\n * Default render function for pagination\r\n */\r\nfunction defaultPaginateRender(items: string[], page: number, totalPages: number): ReturnType<typeof msg> {\r\n  const content = items.join('\\n') || 'No items on this page';\r\n  return msg()\r\n    .text(`📄 **Page ${page} of ${totalPages}**\\n\\n${content}`)\r\n    .footer(`${items.length} items on this page`);\r\n}\r\n\r\n/**\r\n * Field definition for modal forms\r\n */\r\nexport interface ModalField {\r\n  /** Unique identifier for the field */\r\n  id: string;\r\n  /** Display label for the field */\r\n  label: string;\r\n  /** Input style - short or paragraph */\r\n  style?: 'short' | 'paragraph';\r\n  /** Whether the field is required */\r\n  required?: boolean;\r\n  /** Maximum character length */\r\n  maxLength?: number;\r\n  /** Placeholder text */\r\n  placeholder?: string;\r\n  /** Default value */\r\n  value?: string;\r\n}\r\n\r\n/**\r\n * Creates a modal builder with predefined fields.\r\n * Simplifies modal creation with a schema-first approach.\r\n * \r\n * @param id - Modal custom ID\r\n * @param title - Modal title\r\n * @param fields - Array of field definitions\r\n * @returns ModalBuilder instance\r\n * \r\n * @example\r\n * ```typescript\r\n * import { modal } from 'djs-helper-kit';\r\n * \r\n * const form = modal('report', 'Report User', [\r\n *   { id: 'user', label: 'User ID', required: true },\r\n *   { id: 'reason', label: 'Reason', style: 'paragraph', maxLength: 1000 }\r\n * ]);\r\n * \r\n * await interaction.showModal(form);\r\n * ```\r\n */\r\nexport function modal(id: string, title: string, fields: ModalField[]): ModalBuilder {\r\n  const modal = new ModalBuilder()\r\n    .setCustomId(id)\r\n    .setTitle(title);\r\n\r\n  const actionRows: ActionRowBuilder<TextInputBuilder>[] = [];\r\n\r\n  for (const field of fields) {\r\n    const input = new TextInputBuilder()\r\n      .setCustomId(field.id)\r\n      .setLabel(field.label)\r\n      .setStyle(field.style === 'paragraph' ? TextInputStyle.Paragraph : TextInputStyle.Short)\r\n      .setRequired(field.required ?? false);\r\n\r\n    if (field.maxLength) {\r\n      input.setMaxLength(field.maxLength);\r\n    }\r\n\r\n    if (field.placeholder) {\r\n      input.setPlaceholder(field.placeholder);\r\n    }\r\n\r\n    if (field.value) {\r\n      input.setValue(field.value);\r\n    }\r\n\r\n    const actionRow = new ActionRowBuilder<TextInputBuilder>().addComponents(input);\r\n    actionRows.push(actionRow);\r\n  }\r\n\r\n  return modal.addComponents(actionRows);\r\n}\r\n\r\n/**\r\n * Waits for a modal submission and returns parsed data.\r\n * Handles timeout and provides type-safe field access.\r\n * \r\n * @param interaction - Command interaction to show modal on\r\n * @param modal - Modal builder to show\r\n * @param timeoutMs - Timeout in milliseconds (default: 300000 / 5 minutes)\r\n * @returns Promise resolving to parsed modal data\r\n * \r\n * @example\r\n * ```typescript\r\n * import { modal, awaitModal } from 'djs-helper-kit';\r\n * \r\n * const form = modal('report', 'Report User', [\r\n *   { id: 'user', label: 'User ID', required: true },\r\n *   { id: 'reason', label: 'Reason', style: 'paragraph' }\r\n * ]);\r\n * \r\n * const data = await awaitModal(interaction, form);\r\n * await interaction.followUp(`Reported ${data.user} for: ${data.reason}`);\r\n * ```\r\n */\r\nexport async function awaitModal(\r\n  interaction: ChatInputCommandInteraction,\r\n  modal: ModalBuilder,\r\n  timeoutMs: number = 300000\r\n): Promise<Record<string, string>> {\r\n  await interaction.showModal(modal);\r\n\r\n  try {\r\n    const modalInteraction = await interaction.awaitModalSubmit({\r\n      filter: (i) => i.customId === modal.data.custom_id && i.user.id === interaction.user.id,\r\n      time: timeoutMs\r\n    });\r\n\r\n    const data: Record<string, string> = {};\r\n    \r\n    for (const component of modalInteraction.components) {\r\n      if (component.components[0]?.type === ComponentType.TextInput) {\r\n        const input = component.components[0];\r\n        data[input.customId] = input.value;\r\n      }\r\n    }\r\n\r\n    return data;\r\n  } catch {\r\n    throw new Error('Modal submission timed out or was cancelled');\r\n  }\r\n} ","import { REST } from 'discord.js';\r\nimport type { Logger } from '../types/index.js';\r\n\r\nexport interface RestOptions {\r\n  maxRetries?: number;\r\n  baseDelayMs?: number;\r\n  logger?: Logger;\r\n}\r\n\r\n/**\r\n * Wraps a REST instance with rate limiting and retry logic.\r\n * Provides exponential backoff with jitter for failed requests.\r\n * \r\n * @param rest - Discord.js REST instance\r\n * @param options - Configuration options\r\n * @returns Enhanced REST instance with retry logic\r\n * \r\n * @example\r\n * ```typescript\r\n * import { REST } from 'discord.js';\r\n * import { wrapRest } from 'djs-helper-kit';\r\n * \r\n * const rest = new REST({ version: '10' }).setToken(process.env.DISCORD_TOKEN!);\r\n * const enhancedRest = wrapRest(rest, { maxRetries: 3, baseDelayMs: 1000 });\r\n * ```\r\n */\r\nexport function wrapRest(rest: REST, options: RestOptions = {}): REST {\r\n  const {\r\n    maxRetries = 3,\r\n    baseDelayMs = 1000,\r\n    logger = createDefaultLogger()\r\n  } = options;\r\n\r\n  // Store original methods\r\n  const originalPost = rest.post.bind(rest);\r\n  const originalPatch = rest.patch.bind(rest);\r\n  const originalDelete = rest.delete.bind(rest);\r\n\r\n  // Enhanced POST with retry logic\r\n  rest.post = async (route: unknown, options?: unknown) => {\r\n    return await retryWithBackoff(\r\n      () => originalPost(route as `/${string}`, options as Record<string, unknown>),\r\n      maxRetries,\r\n      baseDelayMs,\r\n      logger,\r\n      'POST'\r\n    );\r\n  };\r\n\r\n  // Enhanced PATCH with retry logic\r\n  rest.patch = async (route: unknown, options?: unknown) => {\r\n    return await retryWithBackoff(\r\n      () => originalPatch(route as `/${string}`, options as Record<string, unknown>),\r\n      maxRetries,\r\n      baseDelayMs,\r\n      logger,\r\n      'PATCH'\r\n    );\r\n  };\r\n\r\n  // Enhanced DELETE with retry logic\r\n  rest.delete = async (route: unknown, options?: unknown) => {\r\n    return await retryWithBackoff(\r\n      () => originalDelete(route as `/${string}`, options as Record<string, unknown>),\r\n      maxRetries,\r\n      baseDelayMs,\r\n      logger,\r\n      'DELETE'\r\n    );\r\n  };\r\n\r\n  return rest;\r\n}\r\n\r\n/**\r\n * Retry function with exponential backoff and jitter\r\n */\r\nasync function retryWithBackoff(\r\n  fn: () => Promise<unknown>,\r\n  maxRetries: number,\r\n  baseDelayMs: number,\r\n  logger: Logger,\r\n  method: string\r\n): Promise<unknown> {\r\n  let lastError: unknown;\r\n\r\n  for (let attempt = 0; attempt <= maxRetries; attempt++) {\r\n    try {\r\n      return await fn();\r\n    } catch (error: unknown) {\r\n      lastError = error;\r\n\r\n      // Don't retry on client errors (4xx) except 429\r\n      const errorObj = error as Record<string, unknown>;\r\n      if (typeof errorObj.code === 'number' && errorObj.code >= 400 && errorObj.code < 500 && errorObj.code !== 429) {\r\n        throw error;\r\n      }\r\n\r\n      // Don't retry on server errors (5xx) after max retries\r\n      if (attempt === maxRetries) {\r\n        logger.error(`Failed ${method} request after ${maxRetries} retries:`, error);\r\n        throw error;\r\n      }\r\n\r\n      // Calculate delay with exponential backoff and jitter\r\n      const delay = baseDelayMs * Math.pow(2, attempt) + Math.random() * 250;\r\n      \r\n      logger.warn(`${method} request failed (attempt ${attempt + 1}/${maxRetries + 1}), retrying in ${Math.round(delay)}ms`);\r\n      \r\n      await new Promise(resolve => setTimeout(resolve, delay));\r\n    }\r\n  }\r\n\r\n  throw lastError;\r\n}\r\n\r\n/**\r\n * Creates a simple logger for REST operations\r\n */\r\nfunction createDefaultLogger(): Logger {\r\n  return {\r\n    debug: (message: string, ...args: unknown[]) => console.debug(`[REST] ${message}`, ...args),\r\n    info: (message: string, ...args: unknown[]) => console.info(`[REST] ${message}`, ...args),\r\n    warn: (message: string, ...args: unknown[]) => console.warn(`[REST] ${message}`, ...args),\r\n    error: (message: string, ...args: unknown[]) => console.error(`[REST] ${message}`, ...args),\r\n  };\r\n} ","// Permission helpers - TODO: Implement in v0.2\r\nimport type { GuildMember, ChatInputCommandInteraction } from 'discord.js';\r\n\r\n/**\r\n * Check if a member has a specific permission.\r\n * Implementation coming in v0.2.\r\n */\r\nexport function hasPerm(_member: GuildMember, _perm: unknown): boolean {\r\n  // This is a stub implementation\r\n  return true;\r\n}\r\n\r\n/**\r\n * Require guild admin permissions.\r\n * Implementation coming in v0.2.\r\n */\r\nexport async function requireGuildAdmin(_interaction: ChatInputCommandInteraction): Promise<boolean> {\r\n  console.warn('requireGuildAdmin not yet implemented - coming in v0.2');\r\n  return false;\r\n}\r\n\r\n/**\r\n * Check if bot can send messages in a channel.\r\n * Implementation coming in v0.2.\r\n */\r\nexport async function canSend(_channel: unknown): Promise<boolean> {\r\n  // This is a stub implementation\r\n  return true;\r\n} ","import { Client, ShardingManager } from 'discord.js';\r\nimport type { AutoShardOptions, Logger } from '../types/index.js';\r\n\r\nexport interface ShardInfo {\r\n  id: number;\r\n  status: string;\r\n  guilds: number;\r\n  ping: number;\r\n  uptime: number;\r\n}\r\n\r\nexport interface ShardHealth {\r\n  total: number;\r\n  online: number;\r\n  offline: number;\r\n  shards: ShardInfo[];\r\n  averagePing: number;\r\n  totalGuilds: number;\r\n}\r\n\r\n/**\r\n * Automatically handles sharding based on guild count.\r\n * Provides auto-scaling for large bots with health monitoring.\r\n * \r\n * @param token - Discord bot token\r\n * @param options - Sharding configuration options\r\n * @returns ShardingManager instance\r\n * \r\n * @example\r\n * ```typescript\r\n * import { autoShard } from 'djs-helper-kit';\r\n * \r\n * const manager = autoShard(process.env.DISCORD_TOKEN!, {\r\n *   totalShards: 'auto',\r\n *   respawn: true\r\n * });\r\n * \r\n * manager.on('shardCreate', shard => {\r\n *   console.log(`Launched shard ${shard.id}`);\r\n * });\r\n * ```\r\n */\r\nexport function autoShard(token: string, options: AutoShardOptions = {}): ShardingManager {\r\n  const {\r\n    totalShards = 'auto',\r\n    respawn = true,\r\n    logger = createDefaultLogger()\r\n  } = options;\r\n\r\n  const manager = new ShardingManager('./dist/bot.js', {\r\n    token,\r\n    totalShards,\r\n    respawn\r\n  });\r\n\r\n  // Handle shard events\r\n  manager.on('shardCreate', (shard) => {\r\n    logger.info(`Launched shard ${shard.id}`);\r\n  });\r\n\r\n  return manager;\r\n}\r\n\r\n/**\r\n * Check health of all shards in a sharded client.\r\n * Provides comprehensive health monitoring for large bots.\r\n * \r\n * @param client - Discord.js client (can be any shard)\r\n * @returns Promise resolving to shard health information\r\n * \r\n * @example\r\n * ```typescript\r\n * import { shardHealth } from 'djs-helper-kit';\r\n * \r\n * // Check health every 5 minutes\r\n * setInterval(async () => {\r\n *   const health = await shardHealth(client);\r\n *   console.log(`Online shards: ${health.online}/${health.total}`);\r\n *   console.log(`Average ping: ${health.averagePing}ms`);\r\n * }, 300000);\r\n * ```\r\n */\r\nexport async function shardHealth(client: Client): Promise<ShardHealth> {\r\n  // For now, return basic info for single shard\r\n  // Full implementation would require complex shard communication\r\n  const shardInfo: ShardInfo = {\r\n    id: 0,\r\n    status: client.ws.status.toString(),\r\n    guilds: client.guilds.cache.size,\r\n    ping: client.ws.ping,\r\n    uptime: client.uptime || 0\r\n  };\r\n\r\n  return {\r\n    total: 1,\r\n    online: shardInfo.status === 'ready' ? 1 : 0,\r\n    offline: shardInfo.status === 'ready' ? 0 : 1,\r\n    shards: [shardInfo],\r\n    averagePing: shardInfo.ping,\r\n    totalGuilds: shardInfo.guilds\r\n  };\r\n}\r\n\r\n/**\r\n * Broadcast a message to all shards.\r\n * Useful for updating configuration or sending commands across all shards.\r\n * \r\n * @param client - Discord.js client (can be any shard)\r\n * @param message - Message to broadcast\r\n * @returns Promise resolving to responses from all shards\r\n * \r\n * @example\r\n * ```typescript\r\n * import { broadcastToShards } from 'djs-helper-kit';\r\n * \r\n * // Update configuration across all shards\r\n * await broadcastToShards(client, {\r\n *   type: 'UPDATE_CONFIG',\r\n *   data: { maintenance: true }\r\n * });\r\n * ```\r\n */\r\nexport async function broadcastToShards(client: Client, message: unknown): Promise<unknown[]> {\r\n  // For single shard, just emit the event\r\n  client.emit('broadcast', message);\r\n  return [true];\r\n}\r\n\r\n/**\r\n * Get guild count across all shards.\r\n * \r\n * @param client - Discord.js client\r\n * @returns Promise resolving to total guild count\r\n */\r\nexport async function getTotalGuildCount(client: Client): Promise<number> {\r\n  const health = await shardHealth(client);\r\n  return health.totalGuilds;\r\n}\r\n\r\n/**\r\n * Creates a default logger for sharding operations\r\n */\r\nfunction createDefaultLogger(): Logger {\r\n  return {\r\n    debug: (message: string, ...args: unknown[]) => console.debug(`[SHARD] ${message}`, ...args),\r\n    info: (message: string, ...args: unknown[]) => console.info(`[SHARD] ${message}`, ...args),\r\n    warn: (message: string, ...args: unknown[]) => console.warn(`[SHARD] ${message}`, ...args),\r\n    error: (message: string, ...args: unknown[]) => console.error(`[SHARD] ${message}`, ...args),\r\n  };\r\n} ","import type { CacheAdapter } from '../types/index.js';\r\nimport type { Client, Message, GuildMember } from 'discord.js';\r\n\r\n/**\r\n * Safely get a message without throwing on partials.\r\n * Handles cases where the message might not be cached or accessible.\r\n * \r\n * @param client - Discord.js client\r\n * @param channelId - Channel ID where the message is located\r\n * @param messageId - Message ID to fetch\r\n * @returns Promise resolving to the message or null if not found\r\n * \r\n * @example\r\n * ```typescript\r\n * import { getMessageSafe } from 'djs-helper-kit';\r\n * \r\n * const message = await getMessageSafe(client, '123456789', '987654321');\r\n * if (message) {\r\n *   console.log('Message content:', message.content);\r\n * }\r\n * ```\r\n */\r\nexport async function getMessageSafe(client: Client, channelId: string, messageId: string): Promise<Message | null> {\r\n  try {\r\n    const channel = await client.channels.fetch(channelId);\r\n    if (!channel?.isTextBased()) return null;\r\n    \r\n    const message = await channel.messages.fetch(messageId);\r\n    return message;\r\n  } catch {\r\n    // Message not found or not accessible\r\n    return null;\r\n  }\r\n}\r\n\r\n/**\r\n * Ensure a guild member is fetched and cached.\r\n * Handles cases where the member might not be cached.\r\n * \r\n * @param client - Discord.js client\r\n * @param guildId - Guild ID where the member is located\r\n * @param userId - User ID to fetch\r\n * @returns Promise resolving to the guild member or null if not found\r\n * \r\n * @example\r\n * ```typescript\r\n * import { ensureGuildMember } from 'djs-helper-kit';\r\n * \r\n * const member = await ensureGuildMember(client, '123456789', '987654321');\r\n * if (member) {\r\n *   console.log('Member nickname:', member.nickname);\r\n * }\r\n * ```\r\n */\r\nexport async function ensureGuildMember(client: Client, guildId: string, userId: string): Promise<GuildMember | null> {\r\n  try {\r\n    const guild = await client.guilds.fetch(guildId);\r\n    const member = await guild.members.fetch(userId);\r\n    return member;\r\n  } catch {\r\n    // Member not found or not accessible\r\n    return null;\r\n  }\r\n}\r\n\r\n/**\r\n * In-memory cache adapter with TTL support.\r\n * Simple cache implementation for development and small-scale usage.\r\n * \r\n * @returns CacheAdapter instance\r\n * \r\n * @example\r\n * ```typescript\r\n * import { memoryCache } from 'djs-helper-kit';\r\n * \r\n * const cache = memoryCache();\r\n * await cache.set('user:123', { name: 'John', age: 25 }, 3600); // 1 hour TTL\r\n * const user = await cache.get('user:123');\r\n * ```\r\n */\r\nexport function memoryCache(): CacheAdapter {\r\n  const store = new Map<string, { value: unknown; expires: number }>();\r\n  \r\n  // Cleanup expired entries every 5 minutes\r\n  setInterval(() => {\r\n    const now = Date.now();\r\n    for (const [key, entry] of store.entries()) {\r\n      if (entry.expires > 0 && entry.expires < now) {\r\n        store.delete(key);\r\n      }\r\n    }\r\n  }, 5 * 60 * 1000);\r\n  \r\n  return {\r\n    async get<T>(key: string): Promise<T | null> {\r\n      const entry = store.get(key);\r\n      if (!entry) return null;\r\n      \r\n      if (entry.expires > 0 && entry.expires < Date.now()) {\r\n        store.delete(key);\r\n        return null;\r\n      }\r\n      \r\n      return entry.value as T;\r\n    },\r\n    \r\n    async set<T>(key: string, value: T, ttlSeconds?: number): Promise<void> {\r\n      const expires = ttlSeconds ? Date.now() + (ttlSeconds * 1000) : 0;\r\n      store.set(key, { value, expires });\r\n    },\r\n    \r\n    async del(key: string): Promise<void> {\r\n      store.delete(key);\r\n    }\r\n  };\r\n}\r\n\r\n/**\r\n * Redis cache adapter (requires Redis connection).\r\n * For production use with Redis server.\r\n * \r\n * @param url - Redis connection URL\r\n * @returns CacheAdapter instance\r\n * \r\n * @example\r\n * ```typescript\r\n * import { redisCache } from 'djs-helper-kit';\r\n * \r\n * const cache = redisCache('redis://localhost:6379');\r\n * await cache.set('session:123', { userId: '456' }, 1800); // 30 min TTL\r\n * ```\r\n */\r\nexport function redisCache(_url: string): CacheAdapter {\r\n  // This would require a Redis client like 'redis' or 'ioredis'\r\n  // For now, we'll provide a stub implementation\r\n  console.warn('Redis cache adapter requires Redis client. Install \"redis\" or \"ioredis\" package.');\r\n  \r\n  return {\r\n    async get<T>(): Promise<T | null> {\r\n      return null;\r\n    },\r\n    \r\n    async set(): Promise<void> {\r\n      // No-op for now\r\n    },\r\n    \r\n    async del(): Promise<void> {\r\n      // No-op for now\r\n    }\r\n  };\r\n} ","import type { Dict, Logger } from '../types/index.js';\r\n\r\nexport interface I18nOptions {\r\n  defaultLocale?: string;\r\n  fallbackLocale?: string;\r\n  logger?: Logger;\r\n}\r\n\r\nexport interface I18nInstance {\r\n  t(key: string, locale?: string, params?: Record<string, unknown>): string;\r\n  locale: string;\r\n  setLocale(locale: string): void;\r\n  has(key: string, locale?: string): boolean;\r\n}\r\n\r\n/**\r\n * Create an i18n instance for locale-aware responses.\r\n * Provides simple internationalization for Discord bot responses.\r\n * \r\n * @param locales - Dictionary of locale keys to translation objects\r\n * @param options - Configuration options\r\n * @returns I18nInstance\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createI18n } from 'djs-helper-kit';\r\n * \r\n * const i18n = createI18n({\r\n *   en: {\r\n *     'welcome': 'Welcome to the server!',\r\n *     'ping': 'Pong! Latency: {latency}ms'\r\n *   },\r\n *   es: {\r\n *     'welcome': '¡Bienvenido al servidor!',\r\n *     'ping': '¡Pong! Latencia: {latency}ms'\r\n *   }\r\n * });\r\n * \r\n * await interaction.reply(i18n.t('welcome', 'en'));\r\n * ```\r\n */\r\nexport function createI18n(locales: Dict, options: I18nOptions = {}): I18nInstance {\r\n  const {\r\n    defaultLocale = 'en',\r\n    fallbackLocale = 'en',\r\n    logger = createDefaultLogger()\r\n  } = options;\r\n\r\n  let currentLocale = defaultLocale;\r\n\r\n  function interpolate(text: string, params: Record<string, unknown> = {}): string {\r\n    return text.replace(/\\{(\\w+)\\}/g, (match, key) => {\r\n      return params[key]?.toString() || match;\r\n    });\r\n  }\r\n\r\n  function getTranslation(key: string, locale: string = currentLocale): string | null {\r\n    const localeData = locales[locale];\r\n    if (!localeData) {\r\n      logger.warn(`Locale '${locale}' not found, falling back to '${fallbackLocale}'`);\r\n      return locales[fallbackLocale]?.[key] || null;\r\n    }\r\n    return localeData[key] || null;\r\n  }\r\n\r\n  return {\r\n    t(key: string, locale?: string, params?: Record<string, unknown>): string {\r\n      const translation = getTranslation(key, locale);\r\n      if (!translation) {\r\n        logger.warn(`Translation key '${key}' not found for locale '${locale || currentLocale}'`);\r\n        return key;\r\n      }\r\n      return interpolate(translation, params);\r\n    },\r\n\r\n    get locale() {\r\n      return currentLocale;\r\n    },\r\n\r\n    setLocale(locale: string): void {\r\n      if (locales[locale]) {\r\n        currentLocale = locale;\r\n        logger.info(`Locale set to '${locale}'`);\r\n      } else {\r\n        logger.warn(`Locale '${locale}' not found, keeping current locale '${currentLocale}'`);\r\n      }\r\n    },\r\n\r\n    has(key: string, locale?: string): boolean {\r\n      return getTranslation(key, locale) !== null;\r\n    }\r\n  };\r\n}\r\n\r\n/**\r\n * Get user's preferred locale from Discord.\r\n * Extracts locale from user's Discord settings.\r\n * \r\n * @param user - Discord user object\r\n * @returns User's locale or fallback\r\n * \r\n * @example\r\n * ```typescript\r\n * import { getUserLocale } from 'djs-helper-kit';\r\n * \r\n * const userLocale = getUserLocale(interaction.user);\r\n * const message = i18n.t('welcome', userLocale);\r\n * ```\r\n */\r\nexport function getUserLocale(_user: unknown): string {\r\n  // In a real implementation, this would check user preferences\r\n  return 'en';\r\n}\r\n\r\n/**\r\n * Format number according to locale.\r\n * \r\n * @param number - Number to format\r\n * @param locale - Locale for formatting\r\n * @returns Formatted number string\r\n */\r\nexport function formatNumber(number: number, locale: string = 'en'): string {\r\n  return new Intl.NumberFormat(locale).format(number);\r\n}\r\n\r\n/**\r\n * Format date according to locale.\r\n * \r\n * @param date - Date to format\r\n * @param locale - Locale for formatting\r\n * @param options - Intl.DateTimeFormatOptions\r\n * @returns Formatted date string\r\n */\r\nexport function formatDate(\r\n  date: Date, \r\n  locale: string = 'en', \r\n  options?: Intl.DateTimeFormatOptions\r\n): string {\r\n  return new Intl.DateTimeFormat(locale, options).format(date);\r\n}\r\n\r\n/**\r\n * Creates a default logger for i18n operations\r\n */\r\nfunction createDefaultLogger(): Logger {\r\n  return {\r\n    debug: (message: string, ...args: unknown[]) => console.debug(`[I18N] ${message}`, ...args),\r\n    info: (message: string, ...args: unknown[]) => console.info(`[I18N] ${message}`, ...args),\r\n    warn: (message: string, ...args: unknown[]) => console.warn(`[I18N] ${message}`, ...args),\r\n    error: (message: string, ...args: unknown[]) => console.error(`[I18N] ${message}`, ...args),\r\n  };\r\n} ","import type { Client } from 'discord.js';\r\nimport type { Logger } from '../types/index.js';\r\n\r\n/**\r\n * Base error class for djs-helper-kit errors\r\n */\r\nexport class EasierError extends Error {\r\n  public code?: string;\r\n  public cause?: unknown;\r\n  \r\n  constructor(message: string, code?: string, cause?: unknown) {\r\n    super(message);\r\n    this.name = 'EasierError';\r\n    if (code !== undefined) {\r\n      this.code = code;\r\n    }\r\n    this.cause = cause;\r\n  }\r\n}\r\n\r\n/**\r\n * Error thrown when command validation fails\r\n */\r\nexport class CommandValidationError extends EasierError {\r\n  constructor(message: string, cause?: unknown) {\r\n    super(message, 'COMMAND_VALIDATION_ERROR', cause);\r\n    this.name = 'CommandValidationError';\r\n  }\r\n}\r\n\r\n/**\r\n * Error thrown when permissions are insufficient\r\n */\r\nexport class PermissionError extends EasierError {\r\n  constructor(message: string, cause?: unknown) {\r\n    super(message, 'PERMISSION_ERROR', cause);\r\n    this.name = 'PermissionError';\r\n  }\r\n}\r\n\r\n/**\r\n * Error thrown when rate limits are exceeded\r\n */\r\nexport class RateLimitError extends EasierError {\r\n  constructor(message: string, retryAfter?: number, cause?: unknown) {\r\n    super(message, 'RATE_LIMIT_ERROR', cause);\r\n    this.name = 'RateLimitError';\r\n    if (retryAfter !== undefined) {\r\n      (this as { retryAfter?: number }).retryAfter = retryAfter;\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * Installs default error handling middleware for Discord interactions.\r\n * Catches unhandled errors and provides user-friendly error messages.\r\n * \r\n * @param client - Discord.js client to install error handling on\r\n * @param logger - Optional logger for error reporting\r\n * \r\n * @example\r\n * ```typescript\r\n * import { installInteractionErrorHandler } from 'djs-helper-kit';\r\n * \r\n * installInteractionErrorHandler(client, logger);\r\n * ```\r\n * \r\n * @example\r\n * ```javascript\r\n * const { installInteractionErrorHandler } = require('djs-helper-kit');\r\n * installInteractionErrorHandler(client);\r\n * ```\r\n */\r\nexport function installInteractionErrorHandler(client: Client, logger?: Logger): void {\r\n  const log = logger || createDefaultLogger();\r\n  \r\n  client.on('interactionCreate', async (interaction) => {\r\n    if (!interaction.isRepliable()) return;\r\n    \r\n    // Store original methods to wrap them\r\n    const originalReply = interaction.reply.bind(interaction);\r\n    const originalFollowUp = interaction.followUp.bind(interaction);\r\n    const originalEditReply = interaction.editReply.bind(interaction);\r\n    \r\n    // Wrap reply methods with error handling\r\n    interaction.reply = wrapWithErrorHandling(originalReply, interaction, log);\r\n    interaction.followUp = wrapWithErrorHandling(originalFollowUp, interaction, log);\r\n    interaction.editReply = wrapWithErrorHandling(originalEditReply, interaction, log);\r\n  });\r\n  \r\n  // Handle uncaught errors\r\n  client.on('error', (error) => {\r\n    log.error('Discord client error:', error);\r\n  });\r\n  \r\n  client.on('warn', (warning) => {\r\n    log.warn('Discord client warning:', warning);\r\n  });\r\n  \r\n  log.info('✅ Interaction error handler installed');\r\n}\r\n\r\n/**\r\n * Wraps an interaction method with error handling\r\n */\r\nfunction wrapWithErrorHandling(originalMethod: Function, interaction: unknown, logger: Logger) {\r\n  return async (...args: unknown[]) => {\r\n    try {\r\n      return await originalMethod(...args);\r\n    } catch (error) {\r\n      await handleInteractionError(error, interaction, logger);\r\n      throw error; // Re-throw for upstream handling\r\n    }\r\n  };\r\n}\r\n\r\n/**\r\n * Handles errors that occur during interaction processing\r\n */\r\nasync function handleInteractionError(error: unknown, interaction: unknown, logger: Logger): Promise<void> {\r\n  // Redact sensitive information from error logs\r\n  const redactedError = redactSensitiveInfo(error);\r\n  const interactionObj = interaction as Record<string, unknown>;\r\n  const userId = interactionObj.user && typeof interactionObj.user === 'object' && interactionObj.user !== null\r\n    ? (interactionObj.user as Record<string, unknown>).id\r\n    : 'unknown';\r\n  logger.error(`Interaction error for user ${userId}:`, redactedError);\r\n  \r\n  let userMessage = 'Something went wrong while processing your request.';\r\n  \r\n  if (error instanceof EasierError) {\r\n    switch (error.code) {\r\n    case 'PERMISSION_ERROR':\r\n      userMessage = 'You don\\'t have permission to use this command.';\r\n      break;\r\n    case 'RATE_LIMIT_ERROR':\r\n      userMessage = 'You\\'re doing that too fast. Please try again later.';\r\n      break;\r\n    case 'COMMAND_VALIDATION_ERROR':\r\n      userMessage = 'Invalid command input. Please check your parameters.';\r\n      break;\r\n    }\r\n  }\r\n  \r\n  try {\r\n    const interactionObj = interaction as Record<string, unknown>;\r\n    if (interactionObj.replied || interactionObj.deferred) {\r\n      await (interactionObj.editReply as Function)({ content: userMessage, ephemeral: true });\r\n    } else {\r\n      await (interactionObj.reply as Function)({ content: userMessage, ephemeral: true });\r\n    }\r\n  } catch (replyError) {\r\n    logger.error('Failed to send error message to user:', replyError);\r\n  }\r\n}\r\n\r\n/**\r\n * Redacts sensitive information from error objects and stack traces\r\n */\r\nfunction redactSensitiveInfo(error: unknown): unknown {\r\n  if (error instanceof Error) {\r\n    const redactedError = { ...error };\r\n    \r\n    // Redact common sensitive patterns\r\n    if (redactedError.message) {\r\n      redactedError.message = redactedError.message\r\n        .replace(/Bot\\s+[A-Za-z0-9._-]{59}/g, 'Bot [REDACTED]')\r\n        .replace(/Bearer\\s+[A-Za-z0-9._-]+/g, 'Bearer [REDACTED]')\r\n        .replace(/\\d{17,19}/g, '[SNOWFLAKE_REDACTED]'); // Discord snowflakes\r\n    }\r\n    \r\n    if (redactedError.stack) {\r\n      redactedError.stack = redactedError.stack\r\n        .replace(/Bot\\s+[A-Za-z0-9._-]{59}/g, 'Bot [REDACTED]')\r\n        .replace(/Bearer\\s+[A-Za-z0-9._-]+/g, 'Bearer [REDACTED]')\r\n        .replace(/\\d{17,19}/g, '[SNOWFLAKE_REDACTED]');\r\n    }\r\n    \r\n    return redactedError;\r\n  }\r\n  \r\n  return error;\r\n}\r\n\r\n/**\r\n * Creates a logger with redaction capabilities\r\n * \r\n * @param options - Logger configuration\r\n * @returns Logger instance with built-in redaction\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createLogger } from 'djs-helper-kit';\r\n * \r\n * const logger = createLogger({ \r\n *   level: 'info',\r\n *   redact: ['password', 'token', 'secret']\r\n * });\r\n * ```\r\n */\r\nexport function createLogger(options: {\r\n  level?: 'debug' | 'info' | 'warn' | 'error';\r\n  redact?: string[];\r\n} = {}): Logger {\r\n  const { level = 'info', redact = ['token', 'password', 'secret', 'key'] } = options;\r\n  \r\n  const levels = ['debug', 'info', 'warn', 'error'];\r\n  const currentLevelIndex = levels.indexOf(level);\r\n  \r\n  const shouldLog = (messageLevel: string) => {\r\n    return levels.indexOf(messageLevel) >= currentLevelIndex;\r\n  };\r\n  \r\n  const redactMessage = (message: string, ...args: unknown[]) => {\r\n    let redactedMessage = message;\r\n    const redactedArgs = args.map(arg => {\r\n      if (typeof arg === 'string') {\r\n        let redacted = arg;\r\n        redact.forEach(pattern => {\r\n          const regex = new RegExp(pattern, 'gi');\r\n          redacted = redacted.replace(regex, '[REDACTED]');\r\n        });\r\n        return redacted;\r\n      }\r\n      return arg;\r\n    });\r\n    \r\n    redact.forEach(pattern => {\r\n      const regex = new RegExp(pattern, 'gi');\r\n      redactedMessage = redactedMessage.replace(regex, '[REDACTED]');\r\n    });\r\n    \r\n    return { message: redactedMessage, args: redactedArgs };\r\n  };\r\n  \r\n  return {\r\n    debug: (message: string, ...args: unknown[]) => {\r\n      if (shouldLog('debug')) {\r\n        const { message: msg, args: redactedArgs } = redactMessage(message, ...args);\r\n        console.debug(`[DEBUG] ${msg}`, ...redactedArgs);\r\n      }\r\n    },\r\n    info: (message: string, ...args: unknown[]) => {\r\n      if (shouldLog('info')) {\r\n        const { message: msg, args: redactedArgs } = redactMessage(message, ...args);\r\n        console.info(`[INFO] ${msg}`, ...redactedArgs);\r\n      }\r\n    },\r\n    warn: (message: string, ...args: unknown[]) => {\r\n      if (shouldLog('warn')) {\r\n        const { message: msg, args: redactedArgs } = redactMessage(message, ...args);\r\n        console.warn(`[WARN] ${msg}`, ...redactedArgs);\r\n      }\r\n    },\r\n    error: (message: string, ...args: unknown[]) => {\r\n      if (shouldLog('error')) {\r\n        const { message: msg, args: redactedArgs } = redactMessage(message, ...args);\r\n        console.error(`[ERROR] ${msg}`, ...redactedArgs);\r\n      }\r\n    },\r\n  };\r\n}\r\n\r\n/**\r\n * Creates a simple default logger\r\n */\r\nfunction createDefaultLogger(): Logger {\r\n  return {\r\n    debug: (message: string, ...args: unknown[]) => console.debug(`[DEBUG] ${message}`, ...args),\r\n    info: (message: string, ...args: unknown[]) => console.info(`[INFO] ${message}`, ...args),\r\n    warn: (message: string, ...args: unknown[]) => console.warn(`[WARN] ${message}`, ...args),\r\n    error: (message: string, ...args: unknown[]) => console.error(`[ERROR] ${message}`, ...args),\r\n  };\r\n} "]}