{"version":3,"sources":["../src/index.ts","../src/bot/bot.ts","../src/gateway/gateway.ts","../src/utils/logger.ts","../src/gateway/shard.ts","../src/gateway/manager.ts","../src/utils/rateLimit.ts","../src/rest/client.ts","../src/oauth/browser.ts","../src/oauth/serverHelpers.ts","../src/webhooks/webhook.ts"],"sourcesContent":["// Core Bot\nexport { UniCordBot, EmbedBuilder } from './bot/bot';\nexport type {\n  BotOptions,\n  MessageContext,\n  InteractionContext,\n  ComponentContext,\n} from './bot/bot';\n\n// OAuth\nexport { OAuth2, DiscordScopes } from './oauth/browser';\nexport {\n  exchangeCodeForTokenNode,\n  getEnhancedUserData,\n  getUserAvatarURL,\n  getDefaultAvatarURL,\n  getUserDisplayName,\n  getGuildIconURL,\n  hasPermission,\n  Permissions,\n  refreshAccessToken,\n  revokeAccessToken,\n} from './oauth/serverHelpers';\nexport type { OAuthOptions, OAuthCallbackResult } from './oauth/browser';\nexport type { ExchangeOptions, EnhancedUserData } from './oauth/serverHelpers';\n\n// Gateway & Networking\nexport { Gateway } from './gateway/gateway';\nexport { ShardManager } from './gateway/manager';\nexport { RestClient } from './rest/client';\nexport { sendWebhook } from './webhooks/webhook';\n\n// Utilities\nexport { logger } from './utils/logger';\nexport { RateLimitManager } from './utils/rateLimit';\n\n// Discord API Types\nexport type {\n  DiscordUser,\n  DiscordMember,\n  DiscordChannel,\n  DiscordMessage,\n  DiscordAttachment,\n  DiscordEmbed,\n  DiscordEmbedFooter,\n  DiscordEmbedImage,\n  DiscordEmbedThumbnail,\n  DiscordEmbedVideo,\n  DiscordEmbedProvider,\n  DiscordEmbedAuthor,\n  DiscordEmbedField,\n  DiscordReaction,\n  DiscordEmoji,\n  DiscordMessageReference,\n  DiscordInteraction,\n  DiscordInteractionData,\n  DiscordInteractionDataOption,\n  DiscordActionRow,\n  DiscordComponent,\n  DiscordButton,\n  DiscordStringSelect,\n  DiscordUserSelect,\n  DiscordRoleSelect,\n  DiscordMentionableSelect,\n  DiscordChannelSelect,\n  DiscordTextInput,\n  DiscordSelectOption,\n  DiscordInteractionResponse,\n  DiscordInteractionCallbackData,\n  DiscordAllowedMentions,\n  FileData,\n  MessagePayload,\n  OAuthTokenResponse,\n  OAuthUserData,\n  OAuthGuildData,\n  OAuthConnectionData,\n  ButtonStyle,\n  TextInputStyle,\n  InteractionResponseType,\n} from './types/discord';\n","import { EventEmitter } from 'events';\nimport { Gateway } from '../gateway/gateway';\nimport { ShardManager } from '../gateway/manager';\nimport { RestClient } from '../rest/client';\nimport { logger } from '../utils/logger';\nimport {\n  DiscordMessage,\n  DiscordInteraction,\n  DiscordUser,\n  DiscordMember,\n  DiscordChannel,\n  DiscordGuild,\n  DiscordEmbed,\n  DiscordActionRow,\n  DiscordComponent,\n  DiscordButton,\n  DiscordStringSelect,\n  DiscordInteractionDataOption,\n  DiscordAttachment,\n  DiscordEmoji,\n  DiscordReaction,\n  MessagePayload,\n  FileData,\n  ButtonStyle,\n  InteractionResponseType,\n  DiscordInteractionResponse,\n  DiscordInteractionCallbackData,\n} from '../types/discord';\n\nexport interface BotOptions {\n  token: string;\n  intents: number;\n  prefix?: string;\n  shardCount?: number;\n  autoSyncCommands?: boolean;\n  mentionPrefix?: boolean;\n  handleAllMessages?: boolean;\n  applicationId?: string;\n}\n\ninterface CommandHandler {\n  (ctx: MessageContext | InteractionContext): void | Promise<void>;\n}\n\ninterface ComponentHandler {\n  (ctx: ComponentContext): void | Promise<void>;\n}\n\ninterface MentionHandler {\n  (ctx: MessageContext): void | Promise<void>;\n}\n\nexport interface MessageContext {\n  message: DiscordMessage;\n  author: DiscordUser;\n  member?: DiscordMember;\n  channel: DiscordChannel;\n  guild?: DiscordGuild;\n  content: string;\n  mentions: DiscordUser[];\n  mentionedRoles: string[];\n  attachments: DiscordAttachment[];\n  args: string[];\n  bot: UniCordBot;\n  reply: (content: string | MessagePayload) => Promise<DiscordMessage>;\n  send: (content: string | MessagePayload) => Promise<DiscordMessage>;\n  react: (emoji: string) => Promise<void>;\n  edit: (\n    messageId: string,\n    content: string | MessagePayload,\n  ) => Promise<DiscordMessage>;\n  delete: (messageId?: string) => Promise<void>;\n  createButton: (\n    label: string,\n    customId: string,\n    style?: ButtonStyle,\n  ) => DiscordButton;\n  createActionRow: (...components: DiscordComponent[]) => DiscordActionRow;\n}\n\nexport interface InteractionContext {\n  interaction: DiscordInteraction;\n  user: DiscordUser;\n  member?: DiscordMember;\n  channel: DiscordChannel;\n  guild?: DiscordGuild;\n  options: Map<string, unknown>;\n  bot: UniCordBot;\n  reply: (content: string | MessagePayload) => Promise<DiscordMessage>;\n  editReply: (content: string | MessagePayload) => Promise<DiscordMessage>;\n  deleteReply: () => Promise<void>;\n  followUp: (content: string | MessagePayload) => Promise<DiscordMessage>;\n  defer: (ephemeral?: boolean) => Promise<void>;\n  showModal: (\n    title: string,\n    customId: string,\n    components: DiscordActionRow[],\n  ) => Promise<void>;\n  createButton: (\n    label: string,\n    customId: string,\n    style?: ButtonStyle,\n  ) => DiscordButton;\n  createActionRow: (...components: DiscordComponent[]) => DiscordActionRow;\n}\n\nexport interface ComponentContext {\n  interaction: DiscordInteraction;\n  user: DiscordUser;\n  member?: DiscordMember;\n  channel: DiscordChannel;\n  guild?: DiscordGuild;\n  customId: string;\n  values?: string[];\n  bot: UniCordBot;\n  reply: (content: string | MessagePayload) => Promise<DiscordMessage>;\n  update: (content: string | MessagePayload) => Promise<void>;\n  defer: (ephemeral?: boolean) => Promise<void>;\n  followUp: (content: string | MessagePayload) => Promise<DiscordMessage>;\n  createButton: (\n    label: string,\n    customId: string,\n    style?: ButtonStyle,\n  ) => DiscordButton;\n  createActionRow: (...components: DiscordComponent[]) => DiscordActionRow;\n}\n\nexport class UniCordBot extends EventEmitter {\n  private gateway?: Gateway;\n  private rest: RestClient;\n  private commands = new Map<string, CommandHandler>();\n  private slashCommands = new Map<\n    string,\n    { options: DiscordInteractionDataOption[]; handler: CommandHandler }\n  >();\n  private components = new Map<string, ComponentHandler>();\n  private mentionHandlers: MentionHandler[] = [];\n  private messageHandlers: CommandHandler[] = [];\n  private middlewares: Array<\n    (\n      ctx: MessageContext | InteractionContext | ComponentContext,\n      next: () => Promise<void>,\n    ) => Promise<void>\n  > = [];\n  public user?: DiscordUser;\n  public applicationId?: string;\n\n  constructor(private opts: BotOptions) {\n    super();\n    this.rest = new RestClient({ token: opts.token, applicationId: opts.applicationId });\n    \n    // Set applicationId if provided in options\n    if (opts.applicationId) {\n      this.applicationId = opts.applicationId;\n    }\n  }\n\n  // Enhanced command registration with aliases and cooldowns\n  command(\n    name: string,\n    handler: CommandHandler,\n    options?: {\n      aliases?: string[];\n      cooldown?: number;\n      description?: string;\n      usage?: string;\n      category?: string;\n      permissions?: string[];\n      guildOnly?: boolean;\n      dmOnly?: boolean;\n    },\n  ) {\n    this.commands.set(name, handler);\n\n    // Register aliases\n    if (options?.aliases) {\n      for (const alias of options.aliases) {\n        this.commands.set(alias, handler);\n      }\n    }\n\n    return this;\n  }\n\n  // Enhanced slash command registration\n  slash(\n    name: string,\n    options: DiscordInteractionDataOption[],\n    handler: CommandHandler,\n    _slashOptions?: {\n      cooldown?: number;\n      category?: string;\n      permissions?: string[];\n      guildOnly?: boolean;\n      dmOnly?: boolean;\n    },\n  ) {\n    this.slashCommands.set(name, { options, handler });\n    return this;\n  }\n\n  // Component handling\n  component(customId: string, handler: ComponentHandler) {\n    this.components.set(customId, handler);\n    return this;\n  }\n\n  button(customId: string, handler: ComponentHandler) {\n    this.components.set(customId, handler);\n    return this;\n  }\n\n  selectMenu(customId: string, handler: ComponentHandler) {\n    this.components.set(customId, handler);\n    return this;\n  }\n\n  // Mention and message handling\n  onMention(handler: MentionHandler) {\n    this.mentionHandlers.push(handler);\n    return this;\n  }\n\n  onMessage(handler: CommandHandler) {\n    this.messageHandlers.push(handler);\n    return this;\n  }\n\n  middleware(\n    fn: (\n      ctx: MessageContext | InteractionContext | ComponentContext,\n      next: () => Promise<void>,\n    ) => Promise<void>,\n  ) {\n    this.middlewares.push(fn);\n    return this;\n  }\n\n  // Event handling with improved API\n  onEvent(event: string, handler: (data: unknown) => void | Promise<void>) {\n    this.on(event, handler);\n    return this;\n  }\n\n  // Guild events\n  onGuildCreate(handler: (guild: DiscordGuild) => void | Promise<void>) {\n    this.on('GUILD_CREATE', handler);\n    return this;\n  }\n\n  onGuildDelete(handler: (guild: DiscordGuild) => void | Promise<void>) {\n    this.on('GUILD_DELETE', handler);\n    return this;\n  }\n\n  onGuildUpdate(handler: (guild: DiscordGuild) => void | Promise<void>) {\n    this.on('GUILD_UPDATE', handler);\n    return this;\n  }\n\n  // Member events\n  onGuildMemberAdd(handler: (member: DiscordMember) => void | Promise<void>) {\n    this.on('GUILD_MEMBER_ADD', handler);\n    return this;\n  }\n\n  onGuildMemberRemove(\n    handler: (member: DiscordMember) => void | Promise<void>,\n  ) {\n    this.on('GUILD_MEMBER_REMOVE', handler);\n    return this;\n  }\n\n  onGuildMemberUpdate(\n    handler: (member: DiscordMember) => void | Promise<void>,\n  ) {\n    this.on('GUILD_MEMBER_UPDATE', handler);\n    return this;\n  }\n\n  // Message events\n  onMessageCreate(handler: (message: DiscordMessage) => void | Promise<void>) {\n    this.on('MESSAGE_CREATE', handler);\n    return this;\n  }\n\n  onMessageUpdate(handler: (message: DiscordMessage) => void | Promise<void>) {\n    this.on('MESSAGE_UPDATE', handler);\n    return this;\n  }\n\n  onMessageDelete(handler: (message: DiscordMessage) => void | Promise<void>) {\n    this.on('MESSAGE_DELETE', handler);\n    return this;\n  }\n\n  // Reaction events\n  onReactionAdd(handler: (reaction: DiscordReaction) => void | Promise<void>) {\n    this.on('MESSAGE_REACTION_ADD', handler);\n    return this;\n  }\n\n  onReactionRemove(\n    handler: (reaction: DiscordReaction) => void | Promise<void>,\n  ) {\n    this.on('MESSAGE_REACTION_REMOVE', handler);\n    return this;\n  }\n\n  // Voice events\n  onVoiceStateUpdate(handler: (state: unknown) => void | Promise<void>) {\n    this.on('VOICE_STATE_UPDATE', handler);\n    return this;\n  }\n\n  // File and message utilities\n  createEmbed(): EmbedBuilder {\n    return new EmbedBuilder();\n  }\n\n  createButton(\n    label: string,\n    customId: string,\n    style: ButtonStyle = ButtonStyle.Primary,\n  ): DiscordButton {\n    return {\n      type: 2,\n      style,\n      label,\n      custom_id: customId,\n    };\n  }\n\n  createLinkButton(label: string, url: string): DiscordButton {\n    return {\n      type: 2,\n      style: ButtonStyle.Link,\n      label,\n      url,\n    };\n  }\n\n  createStringSelect(\n    customId: string,\n    options: Array<{\n      label: string;\n      value: string;\n      description?: string;\n      emoji?: DiscordEmoji;\n      default?: boolean;\n    }>,\n  ): DiscordStringSelect {\n    return {\n      type: 3,\n      custom_id: customId,\n      options,\n    };\n  }\n\n  createActionRow(...components: DiscordComponent[]): DiscordActionRow {\n    return {\n      type: 1,\n      components,\n    };\n  }\n\n  // File handling\n  async uploadFile(\n    channelId: string,\n    file: FileData,\n    content?: string,\n  ): Promise<DiscordMessage> {\n    const formData = new FormData();\n    const payload: Record<string, unknown> = {};\n\n    if (content) payload.content = content;\n\n    formData.append('payload_json', JSON.stringify(payload));\n    const blob = new Blob(\n      [file.data instanceof Buffer ? file.data : new Uint8Array(file.data)],\n      {\n        type: file.contentType || 'application/octet-stream',\n      },\n    );\n    formData.append('files[0]', blob, file.name);\n\n    return this.rest.postFormData(`/channels/${channelId}/messages`, formData);\n  }\n\n  // Bot lifecycle\n  async start() {\n    if (this.opts.shardCount && this.opts.shardCount > 1) {\n      const manager = new ShardManager({\n        token: this.opts.token,\n        intents: this.opts.intents,\n      });\n      manager.spawn(this.opts.shardCount);\n      manager.shards.forEach((s) => this.bindGateway(s));\n    } else {\n      this.gateway = new Gateway({\n        token: this.opts.token,\n        intents: this.opts.intents,\n      });\n      this.bindGateway(this.gateway);\n      this.gateway.connect();\n    }\n\n    // Wait for the bot to be ready before syncing commands\n    if (this.opts.autoSyncCommands) {\n      await new Promise<void>((resolve) => {\n        this.once('ready', async () => {\n          try {\n            await this.syncCommands({ scope: 'global' });\n          } catch (error) {\n            logger.error('Failed to sync commands:', error);\n          }\n          resolve();\n        });\n      });\n    }\n  }\n\n  private bindGateway(g: Gateway) {\n    g.on('MESSAGE_CREATE', (msg) => this.handleMessage(msg));\n    g.on('INTERACTION_CREATE', (interaction) =>\n      this.handleInteraction(interaction),\n    );\n    g.on('READY', (d) => {\n      this.user = d.user;\n      this.applicationId = d.application?.id;\n      if (this.applicationId) {\n        this.rest.setApplicationId(this.applicationId);\n      }\n      this.emit('ready', d);\n    });\n    g.on('MESSAGE_UPDATE', (msg) => this.emit('messageUpdate', msg));\n    g.on('MESSAGE_DELETE', (msg) => this.emit('messageDelete', msg));\n    g.on('GUILD_MEMBER_ADD', (member) => this.emit('guildMemberAdd', member));\n    g.on('GUILD_MEMBER_REMOVE', (member) =>\n      this.emit('guildMemberRemove', member),\n    );\n  }\n\n  private async runMiddlewares(\n    ctx: MessageContext | InteractionContext | ComponentContext,\n    handler: CommandHandler | ComponentHandler,\n  ) {\n    let idx = -1;\n    const dispatch = async (i: number): Promise<void> => {\n      if (i <= idx) return;\n      idx = i;\n      const fn = this.middlewares[i];\n      if (fn) await fn(ctx, () => dispatch(i + 1));\n      else {\n        if ('customId' in ctx) {\n          // ComponentContext\n          await (handler as ComponentHandler)(ctx);\n        } else {\n          // MessageContext or InteractionContext\n          await (handler as CommandHandler)(ctx);\n        }\n      }\n    };\n    await dispatch(0);\n  }\n\n  private async handleMessage(msg: DiscordMessage) {\n    try {\n      const ctx = this.createMessageContext(msg);\n\n      // Skip messages from bots (including self)\n      if (msg.author.bot) return;\n\n      // Handle mentions\n      const botMention =\n        this.user && msg.mentions.some((u) => u.id === this.user!.id);\n      if (botMention && this.mentionHandlers.length > 0) {\n        for (const handler of this.mentionHandlers) {\n          await handler(ctx);\n        }\n      }\n\n      // Handle all messages if enabled\n      if (this.opts.handleAllMessages && this.messageHandlers.length > 0) {\n        for (const handler of this.messageHandlers) {\n          await this.runMiddlewares(ctx, handler);\n        }\n      }\n\n      // Handle prefix commands with improved parsing\n      const prefix = this.opts.prefix;\n      const mentionPrefix =\n        this.opts.mentionPrefix &&\n        this.user &&\n        msg.content.startsWith(`<@${this.user.id}>`);\n\n      if (prefix && msg.content.startsWith(prefix)) {\n        const commandContent = msg.content.slice(prefix.length).trim();\n        if (commandContent) {\n          const args = this.parseCommandArgs(commandContent);\n          const commandName = args.shift()?.toLowerCase();\n\n          if (commandName) {\n            const handler = this.commands.get(commandName);\n            if (handler) {\n              ctx.args = args;\n              await this.runMiddlewares(ctx, handler);\n            } else {\n              // Command not found - could emit event or send help\n              this.emit('commandNotFound', {\n                message: msg,\n                command: commandName,\n                args,\n              });\n            }\n          }\n        }\n      } else if (mentionPrefix) {\n        const commandContent = msg.content\n          .replace(`<@${this.user!.id}>`, '')\n          .trim();\n        if (commandContent) {\n          const args = this.parseCommandArgs(commandContent);\n          const commandName = args.shift()?.toLowerCase();\n\n          if (commandName) {\n            const handler = this.commands.get(commandName);\n            if (handler) {\n              ctx.args = args;\n              await this.runMiddlewares(ctx, handler);\n            } else {\n              this.emit('commandNotFound', {\n                message: msg,\n                command: commandName,\n                args,\n              });\n            }\n          }\n        }\n      }\n\n      // Emit message event for other handlers\n      this.emit('message', msg);\n    } catch (error) {\n      logger.error('Error handling message:', error);\n      this.emit('error', error);\n    }\n  }\n\n  // Improved command argument parsing\n  private parseCommandArgs(content: string): string[] {\n    const args: string[] = [];\n    let current = '';\n    let inQuotes = false;\n    let escapeNext = false;\n\n    for (let i = 0; i < content.length; i++) {\n      const char = content[i];\n\n      if (escapeNext) {\n        current += char;\n        escapeNext = false;\n        continue;\n      }\n\n      if (char === '\\\\') {\n        escapeNext = true;\n        continue;\n      }\n\n      if (char === '\"' && !escapeNext) {\n        inQuotes = !inQuotes;\n        continue;\n      }\n\n      if (char === ' ' && !inQuotes) {\n        if (current.trim()) {\n          args.push(current.trim());\n          current = '';\n        }\n        continue;\n      }\n\n      current += char;\n    }\n\n    if (current.trim()) {\n      args.push(current.trim());\n    }\n\n    return args;\n  }\n\n  private async handleInteraction(inter: DiscordInteraction) {\n    try {\n      if (inter.type === 2) {\n        // Application Command\n        const name = inter.data?.name;\n        if (name) {\n          const cmd = this.slashCommands.get(name);\n          if (cmd) {\n            const ctx = this.createInteractionContext(inter);\n            await this.runMiddlewares(ctx, cmd.handler);\n          }\n        }\n      } else if (inter.type === 3) {\n        // Message Component\n        const customId = inter.data?.custom_id;\n        if (customId) {\n          const handler = this.components.get(customId);\n          if (handler) {\n            const ctx = this.createComponentContext(inter);\n            await this.runMiddlewares(ctx, handler);\n          }\n        }\n      }\n    } catch (error) {\n      this.emit('error', error);\n    }\n  }\n\n  private createMessageContext(msg: DiscordMessage): MessageContext {\n    const ctx: MessageContext = {\n      message: msg,\n      author: msg.author,\n      member: msg.member,\n      channel: { id: msg.channel_id } as DiscordChannel,\n      guild: msg.guild_id\n        ? {\n            id: msg.guild_id,\n            name: '',\n            owner_id: '',\n            afk_timeout: 300,\n            verification_level: 0,\n            default_message_notifications: 0,\n            explicit_content_filter: 0,\n            roles: [],\n            emojis: [],\n            features: [],\n            mfa_level: 0,\n            system_channel_flags: 0,\n            premium_tier: 0,\n            nsfw_level: 0,\n            premium_progress_bar_enabled: false,\n            preferred_locale: 'en-US',\n          }\n        : undefined,\n      content: msg.content,\n      mentions: msg.mentions,\n      mentionedRoles: msg.mention_roles,\n      attachments: msg.attachments,\n      args: [],\n      bot: this,\n      reply: (content: string | MessagePayload) =>\n        this.sendMessage(msg.channel_id, content, msg.id),\n      send: (content: string | MessagePayload) =>\n        this.sendMessage(msg.channel_id, content),\n      react: (emoji: string) =>\n        this.rest.put(\n          `/channels/${msg.channel_id}/messages/${msg.id}/reactions/${encodeURIComponent(emoji)}/@me`,\n          {},\n        ),\n      edit: (messageId: string, content: string | MessagePayload) =>\n        this.editMessage(msg.channel_id, messageId, content),\n      delete: (messageId?: string) =>\n        this.rest.delete(\n          `/channels/${msg.channel_id}/messages/${messageId || msg.id}`,\n        ),\n      createButton: this.createButton.bind(this),\n      createActionRow: this.createActionRow.bind(this),\n    };\n    return ctx;\n  }\n\n  private createInteractionContext(\n    inter: DiscordInteraction,\n  ): InteractionContext {\n    const options = new Map();\n    if (inter.data?.options) {\n      for (const option of inter.data.options) {\n        options.set(option.name, option.value);\n      }\n    }\n\n    const ctx: InteractionContext = {\n      interaction: inter,\n      user:\n        inter.user ||\n        (inter.member?.user ?? { id: '', username: '', discriminator: '0000' }),\n      member: inter.member,\n      channel: { id: inter.channel_id ?? '' } as DiscordChannel,\n      guild: inter.guild_id\n        ? {\n            id: inter.guild_id,\n            name: '',\n            owner_id: '',\n            afk_timeout: 300,\n            verification_level: 0,\n            default_message_notifications: 0,\n            explicit_content_filter: 0,\n            roles: [],\n            emojis: [],\n            features: [],\n            mfa_level: 0,\n            system_channel_flags: 0,\n            premium_tier: 0,\n            nsfw_level: 0,\n            premium_progress_bar_enabled: false,\n            preferred_locale: 'en-US',\n          }\n        : undefined,\n      options,\n      bot: this,\n      reply: (content: string | MessagePayload) =>\n        this.replyToInteraction(inter, content),\n      editReply: (content: string | MessagePayload) =>\n        this.editInteractionResponse(inter, content),\n      deleteReply: () =>\n        this.rest.delete(\n          `/webhooks/${inter.application_id}/${inter.token}/messages/@original`,\n        ),\n      followUp: (content: string | MessagePayload) =>\n        this.followUpInteraction(inter, content),\n      defer: (ephemeral = false) => this.deferInteraction(inter, ephemeral),\n      showModal: (\n        title: string,\n        customId: string,\n        components: DiscordActionRow[],\n      ) => this.showModal(inter, title, customId, components),\n      createButton: this.createButton.bind(this),\n      createActionRow: this.createActionRow.bind(this),\n    };\n    return ctx;\n  }\n\n  private createComponentContext(inter: DiscordInteraction): ComponentContext {\n    const ctx: ComponentContext = {\n      interaction: inter,\n      user:\n        inter.user ||\n        (inter.member?.user ?? { id: '', username: '', discriminator: '0000' }),\n      member: inter.member,\n      channel: { id: inter.channel_id ?? '' } as DiscordChannel,\n      guild: inter.guild_id\n        ? {\n            id: inter.guild_id,\n            name: '',\n            owner_id: '',\n            afk_timeout: 300,\n            verification_level: 0,\n            default_message_notifications: 0,\n            explicit_content_filter: 0,\n            roles: [],\n            emojis: [],\n            features: [],\n            mfa_level: 0,\n            system_channel_flags: 0,\n            premium_tier: 0,\n            nsfw_level: 0,\n            premium_progress_bar_enabled: false,\n            preferred_locale: 'en-US',\n          }\n        : undefined,\n      customId: inter.data?.custom_id ?? '',\n      values: inter.data?.values,\n      bot: this,\n      reply: (content: string | MessagePayload) =>\n        this.replyToInteraction(inter, content),\n      update: (content: string | MessagePayload) =>\n        this.updateInteraction(inter, content),\n      defer: (ephemeral = false) => this.deferInteraction(inter, ephemeral),\n      followUp: (content: string | MessagePayload) =>\n        this.followUpInteraction(inter, content),\n      createButton: this.createButton.bind(this),\n      createActionRow: this.createActionRow.bind(this),\n    };\n    return ctx;\n  }\n\n  // Utility methods\n  private async sendMessage(\n    channelId: string,\n    content: string | MessagePayload,\n    replyToId?: string,\n  ) {\n    const payload = typeof content === 'string' ? { content } : content;\n    if (replyToId) {\n      payload.message_reference = { message_id: replyToId };\n    }\n    return this.rest.post(`/channels/${channelId}/messages`, payload);\n  }\n\n  private async editMessage(\n    channelId: string,\n    messageId: string,\n    content: string | MessagePayload,\n  ) {\n    const payload = typeof content === 'string' ? { content } : content;\n    return this.rest.patch(\n      `/channels/${channelId}/messages/${messageId}`,\n      payload,\n    );\n  }\n\n  private async replyToInteraction(\n    inter: DiscordInteraction,\n    content: string | MessagePayload,\n  ) {\n    const data = typeof content === 'string' ? { content } : content;\n    const response: DiscordInteractionResponse = {\n      type: InteractionResponseType.ChannelMessageWithSource,\n      data,\n    };\n    return this.rest.post(\n      `/interactions/${inter.id}/${inter.token}/callback`,\n      response,\n    );\n  }\n\n  private async updateInteraction(\n    inter: DiscordInteraction,\n    content: string | MessagePayload,\n  ) {\n    const data = typeof content === 'string' ? { content } : content;\n    const response: DiscordInteractionResponse = {\n      type: InteractionResponseType.UpdateMessage,\n      data,\n    };\n    return this.rest.post(\n      `/interactions/${inter.id}/${inter.token}/callback`,\n      response,\n    );\n  }\n\n  private async deferInteraction(inter: DiscordInteraction, ephemeral = false) {\n    const response: DiscordInteractionResponse = {\n      type: InteractionResponseType.DeferredChannelMessageWithSource,\n      data: ephemeral ? { flags: 64 } : undefined,\n    };\n    return this.rest.post(\n      `/interactions/${inter.id}/${inter.token}/callback`,\n      response,\n    );\n  }\n\n  private async editInteractionResponse(\n    inter: DiscordInteraction,\n    content: string | MessagePayload,\n  ) {\n    const data = typeof content === 'string' ? { content } : content;\n    return this.rest.patch(\n      `/webhooks/${inter.application_id}/${inter.token}/messages/@original`,\n      data,\n    );\n  }\n\n  private async followUpInteraction(\n    inter: DiscordInteraction,\n    content: string | MessagePayload,\n  ) {\n    const data = typeof content === 'string' ? { content } : content;\n    return this.rest.post(\n      `/webhooks/${inter.application_id}/${inter.token}`,\n      data,\n    );\n  }\n\n  private async showModal(\n    inter: DiscordInteraction,\n    title: string,\n    customId: string,\n    components: DiscordActionRow[],\n  ) {\n    const response: DiscordInteractionResponse = {\n      type: InteractionResponseType.Modal,\n      data: {\n        title,\n        custom_id: customId,\n        components,\n      } as DiscordInteractionCallbackData,\n    };\n    return this.rest.post(\n      `/interactions/${inter.id}/${inter.token}/callback`,\n      response,\n    );\n  }\n\n  async syncCommands(opts: { scope: 'global' | 'guild'; guildId?: string }) {\n    const commands = Array.from(this.slashCommands.entries()).map(\n      ([name, { options }]) => ({\n        name,\n        ...options,\n      }),\n    );\n    if (opts.scope === 'global') {\n      await this.rest.bulkOverwriteCommands('global', commands);\n    } else {\n      if (opts.guildId) {\n        await this.rest.bulkOverwriteCommands(opts.guildId, commands);\n      }\n    }\n    logger.info('Commands synced');\n  }\n\n  // Utility methods for bot management\n  async getGuild(guildId: string) {\n    return this.rest.get(`/guilds/${guildId}`);\n  }\n\n  async getGuildChannels(guildId: string) {\n    return this.rest.get(`/guilds/${guildId}/channels`);\n  }\n\n  async getGuildMembers(guildId: string, limit = 1000) {\n    return this.rest.get(`/guilds/${guildId}/members?limit=${limit}`);\n  }\n\n  async getGuildRoles(guildId: string) {\n    return this.rest.get(`/guilds/${guildId}/roles`);\n  }\n\n  async createGuildRole(guildId: string, roleData: Record<string, unknown>) {\n    return this.rest.post(`/guilds/${guildId}/roles`, roleData);\n  }\n\n  async updateGuildRole(\n    guildId: string,\n    roleId: string,\n    roleData: Record<string, unknown>,\n  ) {\n    return this.rest.patch(`/guilds/${guildId}/roles/${roleId}`, roleData);\n  }\n\n  async deleteGuildRole(guildId: string, roleId: string) {\n    return this.rest.delete(`/guilds/${guildId}/roles/${roleId}`);\n  }\n\n  // Channel management\n  async createChannel(guildId: string, channelData: Record<string, unknown>) {\n    return this.rest.post(`/guilds/${guildId}/channels`, channelData);\n  }\n\n  async updateChannel(channelId: string, channelData: Record<string, unknown>) {\n    return this.rest.patch(`/channels/${channelId}`, channelData);\n  }\n\n  async deleteChannel(channelId: string) {\n    return this.rest.delete(`/channels/${channelId}`);\n  }\n\n  // Message management\n  async getMessage(channelId: string, messageId: string) {\n    return this.rest.get(`/channels/${channelId}/messages/${messageId}`);\n  }\n\n  async getChannelMessages(\n    channelId: string,\n    limit = 50,\n    before?: string,\n    after?: string,\n    around?: string,\n  ) {\n    let url = `/channels/${channelId}/messages?limit=${limit}`;\n    if (before) url += `&before=${before}`;\n    if (after) url += `&after=${after}`;\n    if (around) url += `&around=${around}`;\n    return this.rest.get(url);\n  }\n\n  async deleteMessage(channelId: string, messageId: string) {\n    return this.rest.delete(`/channels/${channelId}/messages/${messageId}`);\n  }\n\n  async bulkDeleteMessages(channelId: string, messageIds: string[]) {\n    return this.rest.post(`/channels/${channelId}/messages/bulk-delete`, {\n      messages: messageIds,\n    });\n  }\n\n  // User management\n  async getUser(userId: string) {\n    return this.rest.get(`/users/${userId}`);\n  }\n\n  async getCurrentUser() {\n    return this.rest.get('/users/@me');\n  }\n\n  async updateCurrentUser(userData: Record<string, unknown>) {\n    return this.rest.patch('/users/@me', userData);\n  }\n\n  // Webhook management\n  async createWebhook(channelId: string, webhookData: Record<string, unknown>) {\n    return this.rest.post(`/channels/${channelId}/webhooks`, webhookData);\n  }\n\n  async getChannelWebhooks(channelId: string) {\n    return this.rest.get(`/channels/${channelId}/webhooks`);\n  }\n\n  async getGuildWebhooks(guildId: string) {\n    return this.rest.get(`/guilds/${guildId}/webhooks`);\n  }\n\n  // Invite management\n  async createInvite(channelId: string, inviteData: Record<string, unknown>) {\n    return this.rest.post(`/channels/${channelId}/invites`, inviteData);\n  }\n\n  async getChannelInvites(channelId: string) {\n    return this.rest.get(`/channels/${channelId}/invites`);\n  }\n\n  async getGuildInvites(guildId: string) {\n    return this.rest.get(`/guilds/${guildId}/invites`);\n  }\n\n  // Emoji management\n  async getGuildEmojis(guildId: string) {\n    return this.rest.get(`/guilds/${guildId}/emojis`);\n  }\n\n  async createGuildEmoji(guildId: string, emojiData: Record<string, unknown>) {\n    return this.rest.post(`/guilds/${guildId}/emojis`, emojiData);\n  }\n\n  async updateGuildEmoji(\n    guildId: string,\n    emojiId: string,\n    emojiData: Record<string, unknown>,\n  ) {\n    return this.rest.patch(`/guilds/${guildId}/emojis/${emojiId}`, emojiData);\n  }\n\n  async deleteGuildEmoji(guildId: string, emojiId: string) {\n    return this.rest.delete(`/guilds/${guildId}/emojis/${emojiId}`);\n  }\n}\n\n// Embed Builder Helper Class\nexport class EmbedBuilder {\n  private embed: DiscordEmbed = {};\n\n  setTitle(title: string) {\n    this.embed.title = title;\n    return this;\n  }\n\n  setDescription(description: string) {\n    this.embed.description = description;\n    return this;\n  }\n\n  setColor(color: number) {\n    this.embed.color = color;\n    return this;\n  }\n\n  setAuthor(name: string, iconUrl?: string, url?: string) {\n    this.embed.author = { name, icon_url: iconUrl, url };\n    return this;\n  }\n\n  setFooter(text: string, iconUrl?: string) {\n    this.embed.footer = { text, icon_url: iconUrl };\n    return this;\n  }\n\n  setImage(url: string) {\n    this.embed.image = { url };\n    return this;\n  }\n\n  setThumbnail(url: string) {\n    this.embed.thumbnail = { url };\n    return this;\n  }\n\n  addField(name: string, value: string, inline = false) {\n    if (!this.embed.fields) this.embed.fields = [];\n    this.embed.fields.push({ name, value, inline });\n    return this;\n  }\n\n  setTimestamp(date?: Date) {\n    this.embed.timestamp = (date || new Date()).toISOString();\n    return this;\n  }\n\n  setUrl(url: string) {\n    this.embed.url = url;\n    return this;\n  }\n\n  toJSON(): DiscordEmbed {\n    return this.embed;\n  }\n}\n","import { EventEmitter } from 'events';\nimport WebSocket from 'ws';\nimport { logger } from '../utils/logger';\n\nexport interface GatewayOptions {\n  token: string;\n  intents: number;\n  shardId?: number;\n  shardCount?: number;\n  url?: string;\n  applicationId?: string;\n}\n\ninterface Payload {\n  op: number;\n  d?: unknown;\n  s?: number;\n  t?: string;\n}\n\nexport class Gateway extends EventEmitter {\n  private ws?: WebSocket;\n  private seq: number | null = null;\n  private sessionId: string | null = null;\n  private heartbeatInterval = 0;\n  private heartbeatTimer?: NodeJS.Timeout;\n  private resumeUrl?: string;\n  private reconnectAttempts = 0;\n\n  constructor(private options: GatewayOptions) {\n    super();\n  }\n\n  connect() {\n    const url =\n      this.options.url || 'wss://gateway.discord.gg/?v=10&encoding=json';\n    this.ws = new WebSocket(url);\n\n    this.ws.on('open', () => {\n      logger.info('Gateway connected');\n    });\n\n    this.ws.on('message', (data: WebSocket.RawData) =>\n      this.handleMessage(data.toString()),\n    );\n    this.ws.on('close', () => this.reconnect());\n    this.ws.on('error', () => this.reconnect());\n  }\n\n  private send(payload: Payload) {\n    this.ws?.send(JSON.stringify(payload));\n  }\n\n  private identify() {\n    this.send({\n      op: 2,\n      d: {\n        token: this.options.token,\n        intents: this.options.intents,\n        properties: { os: 'linux', browser: 'unicord', device: 'unicord' },\n        shard: [this.options.shardId || 0, this.options.shardCount || 1],\n      },\n    });\n  }\n\n  private resume() {\n    if (!this.sessionId) return this.identify();\n    this.send({\n      op: 6,\n      d: {\n        token: this.options.token,\n        session_id: this.sessionId,\n        seq: this.seq,\n      },\n    });\n  }\n\n  private heartbeat() {\n    this.send({ op: 1, d: this.seq });\n  }\n\n  private startHeartbeat(interval: number) {\n    clearInterval(this.heartbeatTimer);\n    this.heartbeatInterval = interval;\n    this.heartbeatTimer = setInterval(() => this.heartbeat(), interval);\n  }\n\n  private handleMessage(str: string) {\n    const packet: Payload = JSON.parse(str);\n    if (packet.s !== undefined) this.seq = packet.s;\n\n    switch (packet.op) {\n      case 0: {\n        if (packet.t === 'READY') {\n          const data = packet.d as { session_id: string; resume_gateway_url: string };\n          this.sessionId = data.session_id;\n          this.resumeUrl = data.resume_gateway_url;\n          this.reconnectAttempts = 0;\n        }\n        if (packet.t) {\n          this.emit(packet.t, packet.d);\n        }\n        break;\n      }\n      case 1:\n        this.heartbeat();\n        break;\n      case 7:\n        this.reconnect();\n        break;\n      case 9:\n        setTimeout(() => this.identify(), 5000);\n        break;\n      case 10: {\n        const heartbeatData = packet.d as { heartbeat_interval: number };\n        this.startHeartbeat(heartbeatData.heartbeat_interval);\n        if (this.sessionId) this.resume();\n        else this.identify();\n        break;\n      }\n      case 11:\n        // heartbeat ACK\n        break;\n      default:\n        logger.debug('Unknown opcode', packet);\n    }\n  }\n\n  private reconnect() {\n    clearInterval(this.heartbeatTimer);\n    const wait = Math.min(1000 * 2 ** this.reconnectAttempts, 60000);\n    logger.info(`Gateway reconnect in ${wait}ms`);\n    setTimeout(() => {\n      this.reconnectAttempts++;\n      this.connect();\n      if (this.resumeUrl) {\n        this.options.url = `${this.resumeUrl}?v=10&encoding=json`;\n      }\n    }, wait);\n  }\n}\n","export const logger = {\n  info: (...args: any[]) => console.log('[INFO]', ...args),\n  warn: (...args: any[]) => console.warn('[WARN]', ...args),\n  error: (...args: any[]) => console.error('[ERROR]', ...args),\n  debug: (...args: any[]) => {\n    if (process.env.DEBUG) console.debug('[DEBUG]', ...args);\n  },\n};\n\nexport type Logger = typeof logger;\n","import { Gateway, GatewayOptions } from './gateway';\n\nexport class Shard extends Gateway {\n  constructor(id: number, count: number, opts: GatewayOptions) {\n    super({ ...opts, shardId: id, shardCount: count });\n  }\n}\n","import { Shard } from './shard';\nimport { GatewayOptions } from './gateway';\n\n// TODO: advanced sharding across processes and persistent resume storage\nexport class ShardManager {\n  shards: Shard[] = [];\n  constructor(private opts: GatewayOptions) {}\n\n  spawn(count: number) {\n    for (let i = 0; i < count; i++) {\n      const shard = new Shard(i, count, this.opts);\n      shard.connect();\n      this.shards.push(shard);\n    }\n  }\n}\n","export type Route = string;\n\ntype QueueFn<T> = () => Promise<T>;\n\ninterface Bucket {\n  running: boolean;\n  queue: Array<() => Promise<void>>;\n}\n\nexport class RateLimitManager {\n  private buckets = new Map<Route, Bucket>();\n\n  private getBucket(route: Route): Bucket {\n    let bucket = this.buckets.get(route);\n    if (!bucket) {\n      bucket = { running: false, queue: [] };\n      this.buckets.set(route, bucket);\n    }\n    return bucket;\n  }\n\n  queue<T>(route: Route, fn: QueueFn<T>): Promise<T> {\n    const bucket = this.getBucket(route);\n    return new Promise((resolve, reject) => {\n      bucket.queue.push(async () => {\n        try {\n          const res = await fn();\n          resolve(res);\n        } catch (e) {\n          reject(e);\n        }\n      });\n      this.run(bucket);\n    });\n  }\n\n  private async run(bucket: Bucket) {\n    if (bucket.running) return;\n    bucket.running = true;\n    while (bucket.queue.length) {\n      const task = bucket.queue.shift();\n      if (task) {\n        await task();\n      }\n    }\n    bucket.running = false;\n  }\n}\n","import { RateLimitManager } from '../utils/rateLimit';\n\nexport interface RestClientOptions {\n  token?: string;\n  baseUrl?: string;\n  applicationId?: string;\n}\n\nexport class RestClient {\n  private token?: string;\n  private baseUrl: string;\n  private rate = new RateLimitManager();\n  private applicationId?: string;\n\n  constructor(opts: RestClientOptions = {}) {\n    this.token = opts.token;\n    this.baseUrl = opts.baseUrl || 'https://discord.com/api/v10';\n    \n    if (opts.applicationId) {\n      this.applicationId = opts.applicationId;\n    }\n  }\n\n  setToken(token: string) {\n    this.token = token;\n  }\n\n  setApplicationId(applicationId: string) {\n    this.applicationId = applicationId;\n  }\n\n  private async request(\n    method: string,\n    path: string,\n    body?: any,\n    tries = 0,\n    isFormData = false,\n  ): Promise<any> {\n    const route = `${method}:${path}`;\n    return this.rate.queue(route, async () => {\n      const headers: Record<string, string> = {};\n      if (!isFormData) {\n        headers['Content-Type'] = 'application/json';\n      }\n      if (this.token) headers.Authorization = `Bot ${this.token}`;\n\n      const res = await fetch(`${this.baseUrl}${path}`, {\n        method,\n        headers,\n        body: isFormData ? body : body ? JSON.stringify(body) : undefined,\n      });\n\n      if (res.status === 429 || res.status >= 500) {\n        if (tries < 3) {\n          const retry =\n            Number(res.headers.get('retry-after')) * 1000 || 2 ** tries * 1000;\n          await new Promise((r) => setTimeout(r, retry));\n          return this.request(method, path, body, tries + 1, isFormData);\n        }\n      }\n      if (!res.ok) {\n        throw new Error(`Request failed: ${res.status}`);\n      }\n      if (res.status === 204) return null;\n      return res.json();\n    });\n  }\n\n  private async requestFormData(\n    method: string,\n    path: string,\n    formData: FormData,\n    tries = 0,\n  ): Promise<any> {\n    return this.request(method, path, formData, tries, true);\n  }\n\n  get(path: string) {\n    return this.request('GET', path);\n  }\n\n  post(path: string, body: any) {\n    return this.request('POST', path, body);\n  }\n\n  postFormData(path: string, formData: FormData) {\n    return this.requestFormData('POST', path, formData);\n  }\n\n  put(path: string, body: any) {\n    return this.request('PUT', path, body);\n  }\n\n  patch(path: string, body: any) {\n    return this.request('PATCH', path, body);\n  }\n\n  delete(path: string, body?: any) {\n    return this.request('DELETE', path, body);\n  }\n\n  getMe() {\n    return this.get('/users/@me');\n  }\n\n  getGuilds() {\n    return this.get('/users/@me/guilds');\n  }\n\n  createApplicationCommand(scope: 'global' | string, payload: any) {\n    if (!this.applicationId) {\n      throw new Error(\n        'Application ID not set. Wait for the bot to be ready before creating commands.',\n      );\n    }\n    if (scope === 'global')\n      return this.post(`/applications/${this.applicationId}/commands`, payload);\n    return this.post(\n      `/applications/${this.applicationId}/guilds/${scope}/commands`,\n      payload,\n    );\n  }\n\n  bulkOverwriteCommands(scope: 'global' | string, payload: any[]) {\n    if (!this.applicationId) {\n      throw new Error(\n        'Application ID not set. Wait for the bot to be ready before syncing commands.',\n      );\n    }\n    if (scope === 'global')\n      return this.put(`/applications/${this.applicationId}/commands`, payload);\n    return this.put(\n      `/applications/${this.applicationId}/guilds/${scope}/commands`,\n      payload,\n    );\n  }\n}\n","import {\n  OAuthUserData,\n  OAuthGuildData,\n  OAuthConnectionData,\n  OAuthTokenResponse,\n} from '../types/discord';\n\nexport interface OAuthOptions {\n  clientId: string;\n  redirectUri: string;\n  backendTokenURL: string;\n  defaultScopes?: string[];\n}\n\nexport interface OAuthCallbackResult {\n  user: OAuthUserData;\n  tokens: OAuthTokenResponse;\n  guilds?: OAuthGuildData[];\n  connections?: OAuthConnectionData[];\n}\n\n// Available Discord OAuth2 scopes\nexport const DiscordScopes = {\n  IDENTIFY: 'identify',\n  EMAIL: 'email',\n  CONNECTIONS: 'connections',\n  GUILDS: 'guilds',\n  GUILDS_JOIN: 'guilds.join',\n  GUILDS_MEMBERS_READ: 'guilds.members.read',\n  GDM_JOIN: 'gdm.join',\n  RPC: 'rpc',\n  RPC_NOTIFICATIONS_READ: 'rpc.notifications.read',\n  RPC_VOICE_READ: 'rpc.voice.read',\n  RPC_VOICE_WRITE: 'rpc.voice.write',\n  RPC_ACTIVITIES_WRITE: 'rpc.activities.write',\n  BOT: 'bot',\n  WEBHOOK_INCOMING: 'webhook.incoming',\n  MESSAGES_READ: 'messages.read',\n  APPLICATIONS_BUILDS_UPLOAD: 'applications.builds.upload',\n  APPLICATIONS_BUILDS_READ: 'applications.builds.read',\n  APPLICATIONS_COMMANDS: 'applications.commands',\n  APPLICATIONS_COMMANDS_UPDATE: 'applications.commands.update',\n  APPLICATIONS_COMMANDS_PERMISSIONS_UPDATE:\n    'applications.commands.permissions.update',\n  APPLICATIONS_STORE_UPDATE: 'applications.store.update',\n  APPLICATIONS_ENTITLEMENTS: 'applications.entitlements',\n  ACTIVITIES_READ: 'activities.read',\n  ACTIVITIES_WRITE: 'activities.write',\n  RELATIONSHIPS_READ: 'relationships.read',\n  VOICE: 'voice',\n  DM_CHANNELS_READ: 'dm_channels.read',\n  ROLE_CONNECTIONS_WRITE: 'role_connections.write',\n} as const;\n\nfunction base64url(input: ArrayBuffer | Uint8Array): string {\n  // Encode array buffer or Uint8Array to base64url\n  const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n  let str = '';\n  for (let i = 0; i < bytes.byteLength; i++) {\n    str += String.fromCharCode(bytes[i]);\n  }\n  return btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\nasync function sha256(verifier: string): Promise<ArrayBuffer> {\n  const data = new TextEncoder().encode(verifier);\n  return crypto.subtle.digest('SHA-256', data);\n}\n\nexport class OAuth2 {\n  private opts: OAuthOptions;\n\n  constructor(opts: OAuthOptions) {\n    this.opts = opts;\n  }\n\n  async login(\n    scopes?: string[] | string,\n    options?: { prompt?: 'consent' | 'none'; permissions?: string },\n  ): Promise<void> {\n    const scopeArray = Array.isArray(scopes)\n      ? scopes\n      : typeof scopes === 'string'\n        ? scopes.split(' ')\n        : this.opts.defaultScopes || [DiscordScopes.IDENTIFY];\n\n    const state = crypto.randomUUID();\n    const codeVerifier = base64url(crypto.getRandomValues(new Uint8Array(32)));\n    const codeChallenge = base64url(await sha256(codeVerifier));\n\n    sessionStorage.setItem('unicord_state', state);\n    sessionStorage.setItem('unicord_verifier', codeVerifier);\n    sessionStorage.setItem('unicord_scopes', JSON.stringify(scopeArray));\n\n    const params = new URLSearchParams({\n      client_id: this.opts.clientId,\n      redirect_uri: this.opts.redirectUri,\n      response_type: 'code',\n      scope: scopeArray.join(' '),\n      state,\n      code_challenge: codeChallenge,\n      code_challenge_method: 'S256',\n    });\n\n    if (options?.prompt) {\n      params.append('prompt', options.prompt);\n    }\n\n    if (options?.permissions) {\n      params.append('permissions', options.permissions);\n    }\n\n    location.href = `https://discord.com/oauth2/authorize?${params.toString()}`;\n  }\n\n  // Login with basic user info (identify scope)\n  async loginBasic(): Promise<void> {\n    return this.login([DiscordScopes.IDENTIFY]);\n  }\n\n  // Login with user info and email\n  async loginWithEmail(): Promise<void> {\n    return this.login([DiscordScopes.IDENTIFY, DiscordScopes.EMAIL]);\n  }\n\n  // Login with full profile access (user, email, guilds, connections)\n  async loginFullProfile(): Promise<void> {\n    return this.login([\n      DiscordScopes.IDENTIFY,\n      DiscordScopes.EMAIL,\n      DiscordScopes.GUILDS,\n      DiscordScopes.CONNECTIONS,\n    ]);\n  }\n\n  // Login for bot management\n  async loginForBotManagement(permissions?: string): Promise<void> {\n    return this.login(\n      [DiscordScopes.BOT, DiscordScopes.APPLICATIONS_COMMANDS],\n      {\n        permissions,\n      },\n    );\n  }\n\n  async handleCallback(): Promise<OAuthCallbackResult> {\n    const params = new URLSearchParams(location.search);\n    const code = params.get('code');\n    const state = params.get('state');\n    if (!code || !state) {\n      throw new Error('Missing code or state');\n    }\n\n    const savedState = sessionStorage.getItem('unicord_state');\n    const verifier = sessionStorage.getItem('unicord_verifier');\n    const scopesStr = sessionStorage.getItem('unicord_scopes');\n\n    if (state !== savedState) {\n      throw new Error('State mismatch');\n    }\n\n    try {\n      const requestBody: Record<string, unknown> = {\n        code,\n        code_verifier: verifier,\n        redirect_uri: this.opts.redirectUri,\n      };\n\n      if (scopesStr) {\n        requestBody.scopes = JSON.parse(scopesStr);\n      }\n\n      const res = await fetch(this.opts.backendTokenURL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        credentials: 'include',\n        body: JSON.stringify(requestBody),\n      });\n\n      if (!res.ok) {\n        throw new Error(`Token exchange failed: ${res.status}`);\n      }\n\n      const data = await res.json();\n      return data as OAuthCallbackResult;\n    } finally {\n      sessionStorage.removeItem('unicord_state');\n      sessionStorage.removeItem('unicord_verifier');\n      sessionStorage.removeItem('unicord_scopes');\n    }\n  }\n\n  // Get current user info if already authenticated\n  async getCurrentUser(): Promise<OAuthUserData | null> {\n    try {\n      const res = await fetch('/api/user', {\n        credentials: 'include',\n      });\n\n      if (res.ok) {\n        return res.json();\n      }\n\n      return null;\n    } catch {\n      return null;\n    }\n  }\n\n  // Logout user\n  async logout(): Promise<void> {\n    try {\n      await fetch('/api/logout', {\n        method: 'POST',\n        credentials: 'include',\n      });\n    } catch (error) {\n      console.warn('Logout failed:', error);\n    }\n\n    // Clear any stored auth data\n    sessionStorage.removeItem('unicord_state');\n    sessionStorage.removeItem('unicord_verifier');\n    sessionStorage.removeItem('unicord_scopes');\n  }\n}\n","import {\n  OAuthTokenResponse,\n  OAuthUserData,\n  OAuthGuildData,\n  OAuthConnectionData,\n} from '../types/discord';\n\nexport interface ExchangeOptions {\n  clientId: string;\n  clientSecret?: string;\n  code: string;\n  codeVerifier?: string;\n  redirectUri: string;\n}\n\nexport interface EnhancedUserData {\n  tokens: OAuthTokenResponse;\n  user: OAuthUserData;\n  guilds?: OAuthGuildData[];\n  connections?: OAuthConnectionData[];\n}\n\nexport async function exchangeCodeForTokenNode(opts: ExchangeOptions): Promise<{\n  tokens: OAuthTokenResponse;\n  user: OAuthUserData;\n}> {\n  const body = new URLSearchParams({\n    client_id: opts.clientId,\n    grant_type: 'authorization_code',\n    code: opts.code,\n    redirect_uri: opts.redirectUri,\n  });\n  if (opts.clientSecret) body.append('client_secret', opts.clientSecret);\n  if (opts.codeVerifier) body.append('code_verifier', opts.codeVerifier);\n\n  const tokenRes = await fetch('https://discord.com/api/oauth2/token', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n    body,\n  });\n  if (!tokenRes.ok) {\n    throw new Error(await tokenRes.text());\n  }\n  const tokens = await tokenRes.json();\n\n  const userRes = await fetch('https://discord.com/api/users/@me', {\n    headers: { Authorization: `Bearer ${tokens.access_token}` },\n  });\n  if (!userRes.ok) {\n    throw new Error(await userRes.text());\n  }\n  const user = await userRes.json();\n  return { tokens, user };\n}\n\n// Enhanced function to get all available user data\nexport async function getEnhancedUserData(\n  accessToken: string,\n  scopes?: string[],\n): Promise<EnhancedUserData> {\n  const headers = { Authorization: `Bearer ${accessToken}` };\n\n  // Get basic user info\n  const userRes = await fetch('https://discord.com/api/users/@me', { headers });\n  if (!userRes.ok) {\n    throw new Error(`Failed to fetch user: ${userRes.statusText}`);\n  }\n  const user = await userRes.json();\n\n  const result: EnhancedUserData = {\n    tokens: { access_token: accessToken } as OAuthTokenResponse,\n    user,\n  };\n\n  // Get user guilds if guilds scope is available\n  if (scopes?.includes('guilds')) {\n    try {\n      const guildsRes = await fetch(\n        'https://discord.com/api/users/@me/guilds',\n        { headers },\n      );\n      if (guildsRes.ok) {\n        result.guilds = await guildsRes.json();\n      }\n    } catch (error) {\n      console.warn('Failed to fetch guilds:', error);\n    }\n  }\n\n  // Get user connections if connections scope is available\n  if (scopes?.includes('connections')) {\n    try {\n      const connectionsRes = await fetch(\n        'https://discord.com/api/users/@me/connections',\n        { headers },\n      );\n      if (connectionsRes.ok) {\n        result.connections = await connectionsRes.json();\n      }\n    } catch (error) {\n      console.warn('Failed to fetch connections:', error);\n    }\n  }\n\n  return result;\n}\n\n// Get user avatar URL\nexport function getUserAvatarURL(\n  user: OAuthUserData,\n  size = 256,\n): string | null {\n  if (!user.avatar) return null;\n  const extension = user.avatar.startsWith('a_') ? 'gif' : 'png';\n  return `https://cdn.discordapp.com/avatars/${user.id}/${user.avatar}.${extension}?size=${size}`;\n}\n\n// Get default avatar URL\nexport function getDefaultAvatarURL(user: OAuthUserData): string {\n  const discriminator = parseInt(user.discriminator) || 0;\n  const index = discriminator % 5;\n  return `https://cdn.discordapp.com/embed/avatars/${index}.png`;\n}\n\n// Get user display name (global_name or username)\nexport function getUserDisplayName(user: OAuthUserData): string {\n  return user.global_name || user.username;\n}\n\n// Get guild icon URL\nexport function getGuildIconURL(\n  guild: OAuthGuildData,\n  size = 256,\n): string | null {\n  if (!guild.icon) return null;\n  const extension = guild.icon.startsWith('a_') ? 'gif' : 'png';\n  return `https://cdn.discordapp.com/icons/${guild.id}/${guild.icon}.${extension}?size=${size}`;\n}\n\n// Check if user has specific permissions in a guild\nexport function hasPermission(\n  guild: OAuthGuildData,\n  permission: bigint,\n): boolean {\n  const permissions = BigInt(guild.permissions);\n  // Administrator permission (8) grants all permissions\n  if ((permissions & Permissions.ADMINISTRATOR) === Permissions.ADMINISTRATOR) {\n    return true;\n  }\n  return (permissions & permission) === permission;\n}\n\n// Common Discord permissions as constants\nexport const Permissions = {\n  ADMINISTRATOR: 1n << 3n,\n  MANAGE_GUILD: 1n << 5n,\n  MANAGE_ROLES: 1n << 28n,\n  MANAGE_CHANNELS: 1n << 4n,\n  KICK_MEMBERS: 1n << 1n,\n  BAN_MEMBERS: 1n << 2n,\n  MANAGE_MESSAGES: 1n << 13n,\n  SEND_MESSAGES: 1n << 11n,\n  READ_MESSAGE_HISTORY: 1n << 16n,\n  USE_SLASH_COMMANDS: 1n << 31n,\n} as const;\n\n// Refresh an access token using a refresh token\nexport async function refreshAccessToken(\n  clientId: string,\n  clientSecret: string,\n  refreshToken: string,\n): Promise<OAuthTokenResponse> {\n  const body = new URLSearchParams({\n    client_id: clientId,\n    client_secret: clientSecret,\n    grant_type: 'refresh_token',\n    refresh_token: refreshToken,\n  });\n\n  const response = await fetch('https://discord.com/api/oauth2/token', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n    body,\n  });\n\n  if (!response.ok) {\n    throw new Error(`Failed to refresh token: ${response.statusText}`);\n  }\n\n  return response.json();\n}\n\n// Revoke an access token\nexport async function revokeAccessToken(\n  clientId: string,\n  clientSecret: string,\n  accessToken: string,\n): Promise<void> {\n  const body = new URLSearchParams({\n    client_id: clientId,\n    client_secret: clientSecret,\n    token: accessToken,\n  });\n\n  const response = await fetch('https://discord.com/api/oauth2/token/revoke', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n    body,\n  });\n\n  if (!response.ok) {\n    throw new Error(`Failed to revoke token: ${response.statusText}`);\n  }\n}\n","export async function sendWebhook(url: string, payload: any): Promise<any> {\n  const res = await fetch(url, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify(payload),\n  });\n  if (!res.ok) {\n    throw new Error(`Webhook failed: ${res.status}`);\n  }\n  return res.json();\n}\n"],"mappings":"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","names":["import_events","WebSocket"]}