lunibee 0.1.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +2 -0
  2. package/dist/builders/components.d.ts +5 -0
  3. package/dist/builders/index.js +72 -12
  4. package/dist/builders/index.js.map +5 -5
  5. package/dist/collection/index.d.ts +68 -1
  6. package/dist/collection/index.js +334 -1
  7. package/dist/collection/index.js.map +3 -3
  8. package/dist/core/collector.d.ts +13 -0
  9. package/dist/core/events.d.ts +29 -3
  10. package/dist/core/index.d.ts +22 -8
  11. package/dist/core/index.js +1526 -124
  12. package/dist/core/index.js.map +26 -22
  13. package/dist/core/permissions.d.ts +48 -0
  14. package/dist/index.js +1578 -268
  15. package/dist/index.js.map +30 -29
  16. package/dist/managers/advanced.d.ts +116 -0
  17. package/dist/managers/base.d.ts +13 -2
  18. package/dist/managers/emoji.d.ts +1 -1
  19. package/dist/managers/guild.d.ts +28 -2
  20. package/dist/managers/index.d.ts +37 -5
  21. package/dist/managers/index.js +870 -152
  22. package/dist/managers/index.js.map +18 -16
  23. package/dist/managers/message.d.ts +10 -1
  24. package/dist/rest/errors.d.ts +33 -0
  25. package/dist/rest/index.d.ts +1 -1
  26. package/dist/rest/index.js +52 -6
  27. package/dist/rest/index.js.map +5 -5
  28. package/dist/rest/routes.d.ts +20 -0
  29. package/dist/sharding/index.d.ts +29 -0
  30. package/dist/sharding/index.js +99 -15
  31. package/dist/sharding/index.js.map +8 -8
  32. package/dist/structures/base.d.ts +2 -0
  33. package/dist/structures/index.js +96 -42
  34. package/dist/structures/index.js.map +10 -9
  35. package/dist/structures/interactions.d.ts +26 -0
  36. package/dist/types/gateway.d.ts +16 -0
  37. package/dist/types/index.d.ts +55 -1
  38. package/dist/types/index.js.map +2 -2
  39. package/dist/voice/index.d.ts +3 -0
  40. package/dist/voice/index.js +15 -1
  41. package/dist/voice/index.js.map +3 -3
  42. package/dist/ws/index.js +13 -5
  43. package/dist/ws/index.js.map +6 -6
  44. package/package.json +14 -14
@@ -1,23 +1,24 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../packages/structures/src/base.ts", "../../packages/core/src/permissions.ts", "../../packages/types/src/gateway.ts", "../../packages/types/src/index.ts", "../../packages/rest/src/index.ts", "../../packages/ws/src/close-codes.ts", "../../packages/ws/src/reconnect.ts", "../../packages/structures/src/resources.ts", "../../packages/structures/src/channels.ts", "../../packages/structures/src/options.ts", "../../packages/structures/src/interactions.ts", "../../packages/structures/src/embed.ts", "../../packages/structures/src/audit-log.ts", "../../packages/structures/src/index.ts"],
3
+ "sources": ["../../packages/structures/src/base.ts", "../../packages/core/src/permissions.ts", "../../packages/types/src/gateway.ts", "../../packages/types/src/index.ts", "../../packages/rest/src/index.ts", "../../packages/managers/src/index.ts", "../../packages/ws/src/close-codes.ts", "../../packages/ws/src/reconnect.ts", "../../packages/structures/src/resources.ts", "../../packages/structures/src/channels.ts", "../../packages/structures/src/options.ts", "../../packages/structures/src/interactions.ts", "../../packages/structures/src/embed.ts", "../../packages/structures/src/audit-log.ts", "../../packages/structures/src/index.ts"],
4
4
  "sourcesContent": [
5
- "/** Common Discord snowflake-backed structure. */\nexport class BaseStructure {\n public readonly id: string;\n public constructor(id: string) {\n if (!/^\\d{1,20}$/.test(id))\n throw new TypeError(\n \"A Discord structure requires a valid snowflake ID.\",\n );\n this.id = id;\n }\n /** Returns the snowflake ID as a string. */\n public toString(): string {\n return this.id;\n }\n /** Returns the timestamp this snowflake was created at. */\n public get createdAt(): Date {\n return new Date(Number((BigInt(this.id) >> 22n) + 1420070400000n));\n }\n}\n\nexport interface ResourceContext {\n sendMessage(\n channelId: string,\n options: Record<string, unknown> & { content?: string },\n ): Promise<import(\"./index.js\").Message>;\n editMessage(\n channelId: string,\n messageId: string,\n options: Record<string, unknown> & { content?: string },\n ): Promise<import(\"./index.js\").Message>;\n deleteMessage(channelId: string, messageId: string): Promise<void>;\n crosspostMessage(\n channelId: string,\n messageId: string,\n ): Promise<import(\"./index.js\").Message>;\n editChannel?(\n channelId: string,\n options: Record<string, unknown>,\n ): Promise<import(\"./base.js\").Channel>;\n deleteChannel?(channelId: string): Promise<void>;\n addReaction?(\n channelId: string,\n messageId: string,\n emoji: string,\n ): Promise<void>;\n removeOwnReaction?(\n channelId: string,\n messageId: string,\n emoji: string,\n ): Promise<void>;\n removeReaction?(\n channelId: string,\n messageId: string,\n emoji: string,\n userId: string,\n ): Promise<void>;\n removeAllReactions?(channelId: string, messageId: string): Promise<void>;\n pinMessage?(channelId: string, messageId: string): Promise<void>;\n unpinMessage?(channelId: string, messageId: string): Promise<void>;\n}\n\n// ─── CDN helpers ──────────────────────────────────────────────────────────────\n\nexport const CDN_BASE = \"https://cdn.discordapp.com\";\n\n/** Options for CDN image URLs. */\nexport interface ImageURLOptions {\n extension?: \"png\" | \"jpg\" | \"webp\" | \"gif\" | \"jpeg\";\n size?: 16 | 32 | 64 | 128 | 256 | 512 | 1024 | 2048 | 4096;\n forceStatic?: boolean;\n}\n\n/** Builds a Discord CDN asset URL from a directory path and asset hash, applying\n * animated-hash (`a_`) gif detection, extension and size options. Shared by all\n * hash-backed asset accessors (user/member/role/webhook) to avoid duplicating the logic.\n * @param path CDN directory path, e.g. `/role-icons/{id}`. @param hash Asset hash. @param options Image URL options. */\nexport function cdnURL(\n path: string,\n hash: string,\n options: ImageURLOptions = {},\n): string {\n const isAnimated = hash.startsWith(\"a_\") && !options.forceStatic;\n const ext = options.extension ?? (isAnimated ? \"gif\" : \"png\");\n const size = options.size ? `?size=${options.size}` : \"\";\n return `${CDN_BASE}${path}/${hash}.${ext}${size}`;\n}\n\n// ─── User ─────────────────────────────────────────────────────────────────────\n\nexport class User extends BaseStructure {\n public username: string;\n public globalName: string | null;\n public avatar: string | null;\n public bot: boolean;\n public system: boolean;\n public flags: number;\n public discriminator: string | null;\n public constructor(data: import(\"@lunibee/types\").UserData) {\n super(data.id);\n if (!data.username)\n throw new TypeError(\"A Discord user requires a username.\");\n this.username = data.username;\n this.globalName = data.global_name ?? null;\n this.avatar = data.avatar ?? null;\n this.bot = data.bot ?? false;\n this.system = data.system ?? false;\n this.flags = data.public_flags ?? 0;\n this.discriminator =\n data.discriminator && data.discriminator !== \"0\"\n ? data.discriminator\n : null;\n }\n /** Effective display name — global name, falling back to username. */\n public get displayName(): string {\n return this.globalName ?? this.username;\n }\n /** Returns the user's avatar URL, or null if they have no avatar. */\n public avatarURL(options: ImageURLOptions = {}): string | null {\n if (!this.avatar) return null;\n return cdnURL(`/avatars/${this.id}`, this.avatar, options);\n }\n /** Returns the default avatar URL based on the user's discriminator/snowflake. */\n public defaultAvatarURL(): string {\n const index = this.discriminator\n ? Number(this.discriminator) % 5\n : Number((BigInt(this.id) >> 22n) % 6n);\n return `${CDN_BASE}/embed/avatars/${index}.png`;\n }\n /** Returns the avatar URL if available, falling back to the default avatar URL. */\n public displayAvatarURL(options: ImageURLOptions = {}): string {\n return this.avatarURL(options) ?? this.defaultAvatarURL();\n }\n /** Returns the Discord mention string. Used automatically in template literals. */\n public override toString(): string {\n return `<@${this.id}>`;\n }\n}\n\n// ─── Channel ──────────────────────────────────────────────────────────────────\n\nexport class Channel extends BaseStructure {\n public type: number;\n public name?: string | null;\n public guildId?: string;\n public topic?: string | null;\n public parentId?: string | null;\n public nsfw?: boolean;\n public rateLimitPerUser?: number;\n public position?: number;\n readonly #context?: ResourceContext;\n\n /** Creates a channel structure from Discord channel data. */\n public constructor(\n data: import(\"@lunibee/types\").APIChannel,\n context?: ResourceContext,\n ) {\n super(data.id);\n if (!Number.isInteger(data.type) || data.type < 0)\n throw new RangeError(\n \"A Discord channel requires a valid channel type.\",\n );\n this.type = data.type;\n this.name = data.name;\n this.guildId = data.guild_id;\n this.topic = data.topic;\n this.parentId = data.parent_id;\n this.nsfw = data.nsfw;\n this.rateLimitPerUser = data.rate_limit_per_user;\n this.position = data.position;\n this.#context = context;\n }\n\n /** Sends a message to this channel. @param options Message payload. @returns The created message. @throws {Error} If the channel is not attached to a client. */\n public sendMessage(\n options: Record<string, unknown> & { content?: string },\n ): Promise<import(\"./index.js\").Message> {\n if (!this.#context)\n throw new Error(\"This channel is not attached to a client.\");\n return this.#context.sendMessage(this.id, options);\n }\n\n /** Sends a message using Lunibee's concise channel API. @param options Message payload. @returns The created message. @throws {Error} If the channel is not attached to a client. */\n public send(\n options: Record<string, unknown> & { content?: string },\n ): Promise<import(\"./index.js\").Message> {\n return this.sendMessage(options);\n }\n\n /** Edits this channel. @param options Channel fields to change. @returns The updated channel. @throws {Error} If the channel is not attached to a client. */\n public edit(options: Record<string, unknown>): Promise<Channel> {\n if (!this.#context?.editChannel)\n throw new Error(\"This channel is not attached to a client.\");\n return this.#context.editChannel(this.id, options);\n }\n\n /** Changes only this channel's name. @param name New channel name. @returns The updated channel. @throws {TypeError} If the name is empty. @throws {Error} If the channel is not attached to a client. */\n public editName(name: string): Promise<Channel> {\n if (!name.trim()) throw new TypeError(\"Channel name cannot be empty.\");\n return this.edit({ name });\n }\n\n /** Changes only this channel's topic. @param topic New topic, or null to clear it. @returns The updated channel. @throws {Error} If the channel is not attached to a client. */\n public editTopic(topic: string | null): Promise<Channel> {\n return this.edit({ topic });\n }\n\n /** Moves this channel to another parent category. @param parentId Parent category ID, or null to remove the parent. @returns The updated channel. @throws {Error} If the channel is not attached to a client. */\n public editParent(parentId: string | null): Promise<Channel> {\n return this.edit({ parent_id: parentId });\n }\n\n /** Deletes this channel. @returns A promise fulfilled when Discord confirms deletion. @throws {Error} If the channel is not attached to a client. */\n public delete(): Promise<void> {\n if (!this.#context?.deleteChannel)\n throw new Error(\"This channel is not attached to a client.\");\n return this.#context.deleteChannel(this.id);\n }\n\n /** Updates this channel using the same resource operation as edit. @param options Channel fields to change. @returns The updated channel. @throws {Error} If the channel is not attached to a client. */\n public update(options: Record<string, unknown>): Promise<Channel> {\n return this.edit(options);\n }\n\n /** Whether this is a thread (announcement, public or private). */\n public isThread(): boolean {\n return this.type === 10 || this.type === 11 || this.type === 12;\n }\n\n /** Whether messages can be sent in this channel (text, DM, announcement, voice, stage, threads). */\n public isTextBased(): boolean {\n return [0, 1, 2, 3, 5, 10, 11, 12, 13].includes(this.type);\n }\n\n /** Whether this is a voice or stage channel. */\n public isVoiceBased(): boolean {\n return this.type === 2 || this.type === 13;\n }\n\n /** Whether this is a direct-message channel (DM or group DM). */\n public isDMBased(): boolean {\n return this.type === 1 || this.type === 3;\n }\n\n /** Returns the Discord channel mention string. Used automatically in template literals. */\n public override toString(): string {\n return `<#${this.id}>`;\n }\n}\n\n// ─── Guild ────────────────────────────────────────────────────────────────────\n\nexport class Guild extends BaseStructure {\n public name: string;\n public icon: string | null;\n public splash: string | null;\n public banner: string | null;\n public description: string | null;\n public preferredLocale: string;\n public ownerId?: string;\n public features: string[];\n public verificationLevel: number;\n public premiumTier: number;\n public premiumSubscriptionCount: number;\n public memberCount?: number;\n public approximateMemberCount?: number;\n public approximatePresenceCount?: number;\n public vanityUrlCode: string | null;\n public nsfwLevel: number;\n public discoverySplash: string | null;\n /** ID of the rules channel for Community guilds. */\n public rulesChannelId: string | null;\n /** ID of the system messages channel. */\n public systemChannelId: string | null;\n /** Bitfield of system channel flags. */\n public systemChannelFlags: number;\n /** Maximum number of members the guild can have. */\n public maxMembers: number;\n /** Required MFA level for administrators. */\n public mfaLevel: number;\n /** Explicit content filter level. */\n public explicitContentFilter: number;\n /** Default notification level for new members. */\n public defaultMessageNotifications: number;\n\n public constructor(data: import(\"@lunibee/types\").APIGuild) {\n super(data.id);\n if (!data.name) throw new TypeError(\"A Discord guild requires a name.\");\n this.name = data.name;\n this.icon = data.icon ?? null;\n this.splash = data.splash ?? null;\n this.banner = data.banner ?? null;\n this.description = data.description ?? null;\n this.preferredLocale = data.preferred_locale ?? \"en-US\";\n this.ownerId = data.owner_id;\n this.features = data.features ?? [];\n this.verificationLevel = data.verification_level ?? 0;\n this.premiumTier = data.premium_tier ?? 0;\n this.premiumSubscriptionCount = data.premium_subscription_count ?? 0;\n this.memberCount = data.member_count ?? data.approximate_member_count;\n this.approximateMemberCount = data.approximate_member_count;\n this.approximatePresenceCount = data.approximate_presence_count;\n this.vanityUrlCode = data.vanity_url_code ?? null;\n this.nsfwLevel = data.nsfw_level ?? 0;\n this.discoverySplash = data.discovery_splash ?? null;\n // NOTE (flagged to Arjun): these fields are read via a Record cast because\n // APIGuild in @lunibee/types does not yet declare rules_channel_id,\n // system_channel_id/flags, max_members, mfa_level, explicit_content_filter or\n // default_message_notifications. Runtime `??` fallbacks guard missing values.\n // Once APIGuild gains these fields (types-owner change), drop the cast.\n const d = data as unknown as Record<string, unknown>;\n this.rulesChannelId = (d.rules_channel_id as string | null) ?? null;\n this.systemChannelId = (d.system_channel_id as string | null) ?? null;\n this.systemChannelFlags =\n (d.system_channel_flags as number | undefined) ?? 0;\n this.maxMembers = (d.max_members as number | undefined) ?? 0;\n this.mfaLevel = (d.mfa_level as number | undefined) ?? 0;\n this.explicitContentFilter =\n (d.explicit_content_filter as number | undefined) ?? 0;\n this.defaultMessageNotifications =\n (d.default_message_notifications as number | undefined) ?? 0;\n }\n\n /** Returns the guild icon URL, or null if no icon is set. */\n public iconURL(options: ImageURLOptions = {}): string | null {\n if (!this.icon) return null;\n return cdnURL(`/icons/${this.id}`, this.icon, options);\n }\n\n /** Returns the guild splash URL, or null if none. */\n public splashURL(options: ImageURLOptions = {}): string | null {\n if (!this.splash) return null;\n return cdnURL(`/splashes/${this.id}`, this.splash, options);\n }\n\n /** Returns the guild banner URL, or null if none. */\n public bannerURL(options: ImageURLOptions = {}): string | null {\n if (!this.banner) return null;\n return cdnURL(`/banners/${this.id}`, this.banner, options);\n }\n\n /** Returns the guild discovery splash URL, or null if none. */\n public discoverySplashURL(options: ImageURLOptions = {}): string | null {\n if (!this.discoverySplash) return null;\n return cdnURL(\n `/discovery-splashes/${this.id}`,\n this.discoverySplash,\n options,\n );\n }\n\n /** Returns a widget image URL for the guild.\n * @param style Widget style: shield (default), banner1, banner2, banner3, banner4.\n */\n public widgetImageURL(\n style:\n \"shield\" | \"banner1\" | \"banner2\" | \"banner3\" | \"banner4\" = \"shield\",\n ): string {\n return `https://discord.com/api/guilds/${this.id}/widget.png?style=${style}`;\n }\n\n /** Whether the guild has a given feature flag. @param feature Feature string, e.g. \"COMMUNITY\". */\n public hasFeature(feature: string): boolean {\n return this.features.includes(feature);\n }\n\n /** Whether the guild is a Community server. */\n public get isCommunity(): boolean {\n return this.hasFeature(\"COMMUNITY\");\n }\n\n /** Whether the guild is an official Discord Partner. */\n public get isPartnered(): boolean {\n return this.hasFeature(\"PARTNERED\");\n }\n\n /** Whether the guild is verified by Discord. */\n public get isVerified(): boolean {\n return this.hasFeature(\"VERIFIED\");\n }\n\n /** Whether the guild has any active boost subscriptions. */\n public get isBoosted(): boolean {\n return this.premiumSubscriptionCount > 0;\n }\n\n /** Alias for premiumTier — the guild's current Nitro boost level (0–3). */\n public get boostLevel(): number {\n return this.premiumTier;\n }\n\n /** Whether the guild has a vanity URL. */\n public get hasVanityUrl(): boolean {\n return this.vanityUrlCode !== null;\n }\n\n /** Returns the guild's vanity invite URL, or null if none. */\n public get vanityURL(): string | null {\n return this.vanityUrlCode\n ? `https://discord.gg/${this.vanityUrlCode}`\n : null;\n }\n\n /** Returns a human-readable string representation. */\n public override toString(): string {\n return this.name;\n }\n}\n",
6
- "/** Permission overwrite target types. */\nexport enum PermissionOverwriteType {\n Role = 0,\n Member = 1,\n}\n\n/** Lunibee idiomatic camelCase permission bitflags. */\nexport const Permission = {\n createInstantInvite: 1n << 0n,\n kickMembers: 1n << 1n,\n banMembers: 1n << 2n,\n administrator: 1n << 3n,\n manageChannels: 1n << 4n,\n manageGuild: 1n << 5n,\n addReactions: 1n << 6n,\n viewAuditLog: 1n << 7n,\n prioritySpeaker: 1n << 8n,\n stream: 1n << 9n,\n viewChannel: 1n << 10n,\n sendMessages: 1n << 11n,\n sendTTSMessages: 1n << 12n,\n manageMessages: 1n << 13n,\n embedLinks: 1n << 14n,\n attachFiles: 1n << 15n,\n readMessageHistory: 1n << 16n,\n mentionEveryone: 1n << 17n,\n useExternalEmojis: 1n << 18n,\n viewGuildInsights: 1n << 19n,\n connect: 1n << 20n,\n speak: 1n << 21n,\n muteMembers: 1n << 22n,\n deafenMembers: 1n << 23n,\n moveMembers: 1n << 24n,\n useVAD: 1n << 25n,\n changeNickname: 1n << 26n,\n manageNicknames: 1n << 27n,\n manageRoles: 1n << 28n,\n manageWebhooks: 1n << 29n,\n manageGuildExpressions: 1n << 30n,\n useApplicationCommands: 1n << 31n,\n requestToSpeak: 1n << 32n,\n manageEvents: 1n << 33n,\n manageThreads: 1n << 34n,\n createPublicThreads: 1n << 35n,\n createPrivateThreads: 1n << 36n,\n useExternalStickers: 1n << 37n,\n sendMessagesInThreads: 1n << 38n,\n useEmbeddedActivities: 1n << 39n,\n moderateMembers: 1n << 40n,\n viewCreatorMonetizationAnalytics: 1n << 41n,\n useSoundboard: 1n << 42n,\n createGuildExpressions: 1n << 43n,\n createEvents: 1n << 44n,\n useExternalSounds: 1n << 45n,\n sendVoiceMessages: 1n << 46n,\n sendPolls: 1n << 49n,\n useExternalApps: 1n << 50n,\n} as const;\n\n/** Canonical PascalCase permission constants. */\nexport const Permissions = {\n CreateInstantInvite: 1n << 0n,\n KickMembers: 1n << 1n,\n BanMembers: 1n << 2n,\n Administrator: 1n << 3n,\n ManageChannels: 1n << 4n,\n ManageGuild: 1n << 5n,\n AddReactions: 1n << 6n,\n ViewAuditLog: 1n << 7n,\n PrioritySpeaker: 1n << 8n,\n Stream: 1n << 9n,\n ViewChannel: 1n << 10n,\n SendMessages: 1n << 11n,\n SendTTSMessages: 1n << 12n,\n ManageMessages: 1n << 13n,\n EmbedLinks: 1n << 14n,\n AttachFiles: 1n << 15n,\n ReadMessageHistory: 1n << 16n,\n MentionEveryone: 1n << 17n,\n UseExternalEmojis: 1n << 18n,\n ViewGuildInsights: 1n << 19n,\n Connect: 1n << 20n,\n Speak: 1n << 21n,\n MuteMembers: 1n << 22n,\n DeafenMembers: 1n << 23n,\n MoveMembers: 1n << 24n,\n UseVAD: 1n << 25n,\n ChangeNickname: 1n << 26n,\n ManageNicknames: 1n << 27n,\n ManageRoles: 1n << 28n,\n ManageWebhooks: 1n << 29n,\n ManageGuildExpressions: 1n << 30n,\n UseApplicationCommands: 1n << 31n,\n RequestToSpeak: 1n << 32n,\n ManageEvents: 1n << 33n,\n ManageThreads: 1n << 34n,\n CreatePublicThreads: 1n << 35n,\n CreatePrivateThreads: 1n << 36n,\n UseExternalStickers: 1n << 37n,\n SendMessagesInThreads: 1n << 38n,\n UseEmbeddedActivities: 1n << 39n,\n ModerateMembers: 1n << 40n,\n ViewCreatorMonetizationAnalytics: 1n << 41n,\n UseSoundboard: 1n << 42n,\n CreateGuildExpressions: 1n << 43n,\n CreateEvents: 1n << 44n,\n UseExternalSounds: 1n << 45n,\n SendVoiceMessages: 1n << 46n,\n SendPolls: 1n << 49n,\n UseExternalApps: 1n << 50n,\n} as const;\n\n/**\n * Permission flag bits with **bigint** values matching Discord's permission bit\n * positions. Mirrors discord.js's `PermissionFlagsBits`, so bitwise composition\n * (`Flags.A | Flags.B`) OR-s the bits instead of concatenating strings.\n *\n * Implemented as a `const` object rather than a TS `enum` because enums cannot\n * hold bigint members; the same-named union type below preserves usage as a type.\n */\nexport const PermissionFlagsBits = {\n CreateInstantInvite: 1n << 0n,\n KickMembers: 1n << 1n,\n BanMembers: 1n << 2n,\n Administrator: 1n << 3n,\n ManageChannels: 1n << 4n,\n ManageGuild: 1n << 5n,\n AddReactions: 1n << 6n,\n ViewAuditLog: 1n << 7n,\n PrioritySpeaker: 1n << 8n,\n Stream: 1n << 9n,\n ViewChannel: 1n << 10n,\n SendMessages: 1n << 11n,\n SendTTSMessages: 1n << 12n,\n ManageMessages: 1n << 13n,\n EmbedLinks: 1n << 14n,\n AttachFiles: 1n << 15n,\n ReadMessageHistory: 1n << 16n,\n MentionEveryone: 1n << 17n,\n UseExternalEmojis: 1n << 18n,\n ViewGuildInsights: 1n << 19n,\n Connect: 1n << 20n,\n Speak: 1n << 21n,\n MuteMembers: 1n << 22n,\n DeafenMembers: 1n << 23n,\n MoveMembers: 1n << 24n,\n UseVAD: 1n << 25n,\n ChangeNickname: 1n << 26n,\n ManageNicknames: 1n << 27n,\n ManageRoles: 1n << 28n,\n ManageWebhooks: 1n << 29n,\n ManageGuildExpressions: 1n << 30n,\n UseApplicationCommands: 1n << 31n,\n RequestToSpeak: 1n << 32n,\n ManageEvents: 1n << 33n,\n ManageThreads: 1n << 34n,\n CreatePublicThreads: 1n << 35n,\n CreatePrivateThreads: 1n << 36n,\n UseExternalStickers: 1n << 37n,\n SendMessagesInThreads: 1n << 38n,\n UseEmbeddedActivities: 1n << 39n,\n ModerateMembers: 1n << 40n,\n ViewCreatorMonetizationAnalytics: 1n << 41n,\n UseSoundboard: 1n << 42n,\n CreateGuildExpressions: 1n << 43n,\n CreateEvents: 1n << 44n,\n UseExternalSounds: 1n << 45n,\n SendVoiceMessages: 1n << 46n,\n SendPolls: 1n << 49n,\n UseExternalApps: 1n << 50n,\n} as const;\n\n/** Union of {@link PermissionFlagsBits} values (all bigint). */\nexport type PermissionFlagsBits =\n (typeof PermissionFlagsBits)[keyof typeof PermissionFlagsBits];\n\nexport type PermissionName =\n | keyof typeof Permission\n | keyof typeof Permissions\n | keyof typeof PermissionFlagsBits;\n\nexport type PermissionResolvable =\n | bigint\n | number\n | string\n | PermissionName\n | PermissionFlagsBits\n | PermissionSet\n | PermissionResolvable[];\n\n/** Immutable permission bitfield with direct boolean getters. */\nexport class PermissionSet {\n /** Permission bitfield. */\n public readonly bitfield: bigint;\n\n /** Creates a permission set. @param value Initial permission bitfield or array of permissions. @throws {RangeError} If the value is negative. @throws {TypeError} If the value is not a valid integer. */\n public constructor(value: PermissionResolvable = 0n) {\n try {\n if (Array.isArray(value)) {\n let bit = 0n;\n for (const item of value) {\n bit |= this.#resolve(item);\n }\n this.bitfield = bit;\n } else if (value instanceof PermissionSet) {\n this.bitfield = value.bitfield;\n } else {\n const bitfield = this.#resolve(value);\n if (bitfield < 0n)\n throw new RangeError(\n \"Permission bitfield cannot be negative.\",\n );\n this.bitfield = bitfield;\n }\n } catch (error) {\n if (error instanceof RangeError) throw error;\n throw new TypeError(\n \"Permission bitfield must be a valid non-negative integer.\",\n { cause: error },\n );\n }\n }\n\n // Direct camelCase boolean getters for instant checks (e.g. member.permissions.kickMembers)\n public get createInstantInvite(): boolean {\n return (\n (this.bitfield & Permission.createInstantInvite) ===\n Permission.createInstantInvite\n );\n }\n public get kickMembers(): boolean {\n return (\n (this.bitfield & Permission.kickMembers) === Permission.kickMembers\n );\n }\n public get banMembers(): boolean {\n return (\n (this.bitfield & Permission.banMembers) === Permission.banMembers\n );\n }\n public get administrator(): boolean {\n return (\n (this.bitfield & Permission.administrator) ===\n Permission.administrator\n );\n }\n public get manageChannels(): boolean {\n return (\n (this.bitfield & Permission.manageChannels) ===\n Permission.manageChannels\n );\n }\n public get manageGuild(): boolean {\n return (\n (this.bitfield & Permission.manageGuild) === Permission.manageGuild\n );\n }\n public get addReactions(): boolean {\n return (\n (this.bitfield & Permission.addReactions) ===\n Permission.addReactions\n );\n }\n public get viewAuditLog(): boolean {\n return (\n (this.bitfield & Permission.viewAuditLog) ===\n Permission.viewAuditLog\n );\n }\n public get prioritySpeaker(): boolean {\n return (\n (this.bitfield & Permission.prioritySpeaker) ===\n Permission.prioritySpeaker\n );\n }\n public get stream(): boolean {\n return (this.bitfield & Permission.stream) === Permission.stream;\n }\n public get viewChannel(): boolean {\n return (\n (this.bitfield & Permission.viewChannel) === Permission.viewChannel\n );\n }\n public get sendMessages(): boolean {\n return (\n (this.bitfield & Permission.sendMessages) ===\n Permission.sendMessages\n );\n }\n public get sendTTSMessages(): boolean {\n return (\n (this.bitfield & Permission.sendTTSMessages) ===\n Permission.sendTTSMessages\n );\n }\n public get manageMessages(): boolean {\n return (\n (this.bitfield & Permission.manageMessages) ===\n Permission.manageMessages\n );\n }\n public get embedLinks(): boolean {\n return (\n (this.bitfield & Permission.embedLinks) === Permission.embedLinks\n );\n }\n public get attachFiles(): boolean {\n return (\n (this.bitfield & Permission.attachFiles) === Permission.attachFiles\n );\n }\n public get readMessageHistory(): boolean {\n return (\n (this.bitfield & Permission.readMessageHistory) ===\n Permission.readMessageHistory\n );\n }\n public get mentionEveryone(): boolean {\n return (\n (this.bitfield & Permission.mentionEveryone) ===\n Permission.mentionEveryone\n );\n }\n public get useExternalEmojis(): boolean {\n return (\n (this.bitfield & Permission.useExternalEmojis) ===\n Permission.useExternalEmojis\n );\n }\n public get viewGuildInsights(): boolean {\n return (\n (this.bitfield & Permission.viewGuildInsights) ===\n Permission.viewGuildInsights\n );\n }\n public get connect(): boolean {\n return (this.bitfield & Permission.connect) === Permission.connect;\n }\n public get speak(): boolean {\n return (this.bitfield & Permission.speak) === Permission.speak;\n }\n public get muteMembers(): boolean {\n return (\n (this.bitfield & Permission.muteMembers) === Permission.muteMembers\n );\n }\n public get deafenMembers(): boolean {\n return (\n (this.bitfield & Permission.deafenMembers) ===\n Permission.deafenMembers\n );\n }\n public get moveMembers(): boolean {\n return (\n (this.bitfield & Permission.moveMembers) === Permission.moveMembers\n );\n }\n public get useVAD(): boolean {\n return (this.bitfield & Permission.useVAD) === Permission.useVAD;\n }\n public get changeNickname(): boolean {\n return (\n (this.bitfield & Permission.changeNickname) ===\n Permission.changeNickname\n );\n }\n public get manageNicknames(): boolean {\n return (\n (this.bitfield & Permission.manageNicknames) ===\n Permission.manageNicknames\n );\n }\n public get manageRoles(): boolean {\n return (\n (this.bitfield & Permission.manageRoles) === Permission.manageRoles\n );\n }\n public get manageWebhooks(): boolean {\n return (\n (this.bitfield & Permission.manageWebhooks) ===\n Permission.manageWebhooks\n );\n }\n public get manageGuildExpressions(): boolean {\n return (\n (this.bitfield & Permission.manageGuildExpressions) ===\n Permission.manageGuildExpressions\n );\n }\n public get useApplicationCommands(): boolean {\n return (\n (this.bitfield & Permission.useApplicationCommands) ===\n Permission.useApplicationCommands\n );\n }\n public get requestToSpeak(): boolean {\n return (\n (this.bitfield & Permission.requestToSpeak) ===\n Permission.requestToSpeak\n );\n }\n public get manageEvents(): boolean {\n return (\n (this.bitfield & Permission.manageEvents) ===\n Permission.manageEvents\n );\n }\n public get manageThreads(): boolean {\n return (\n (this.bitfield & Permission.manageThreads) ===\n Permission.manageThreads\n );\n }\n public get createPublicThreads(): boolean {\n return (\n (this.bitfield & Permission.createPublicThreads) ===\n Permission.createPublicThreads\n );\n }\n public get createPrivateThreads(): boolean {\n return (\n (this.bitfield & Permission.createPrivateThreads) ===\n Permission.createPrivateThreads\n );\n }\n public get useExternalStickers(): boolean {\n return (\n (this.bitfield & Permission.useExternalStickers) ===\n Permission.useExternalStickers\n );\n }\n public get sendMessagesInThreads(): boolean {\n return (\n (this.bitfield & Permission.sendMessagesInThreads) ===\n Permission.sendMessagesInThreads\n );\n }\n public get useEmbeddedActivities(): boolean {\n return (\n (this.bitfield & Permission.useEmbeddedActivities) ===\n Permission.useEmbeddedActivities\n );\n }\n public get moderateMembers(): boolean {\n return (\n (this.bitfield & Permission.moderateMembers) ===\n Permission.moderateMembers\n );\n }\n public get viewCreatorMonetizationAnalytics(): boolean {\n return (\n (this.bitfield & Permission.viewCreatorMonetizationAnalytics) ===\n Permission.viewCreatorMonetizationAnalytics\n );\n }\n public get useSoundboard(): boolean {\n return (\n (this.bitfield & Permission.useSoundboard) ===\n Permission.useSoundboard\n );\n }\n public get createGuildExpressions(): boolean {\n return (\n (this.bitfield & Permission.createGuildExpressions) ===\n Permission.createGuildExpressions\n );\n }\n public get createEvents(): boolean {\n return (\n (this.bitfield & Permission.createEvents) ===\n Permission.createEvents\n );\n }\n public get useExternalSounds(): boolean {\n return (\n (this.bitfield & Permission.useExternalSounds) ===\n Permission.useExternalSounds\n );\n }\n public get sendVoiceMessages(): boolean {\n return (\n (this.bitfield & Permission.sendVoiceMessages) ===\n Permission.sendVoiceMessages\n );\n }\n public get sendPolls(): boolean {\n return (this.bitfield & Permission.sendPolls) === Permission.sendPolls;\n }\n public get useExternalApps(): boolean {\n return (\n (this.bitfield & Permission.useExternalApps) ===\n Permission.useExternalApps\n );\n }\n\n /** Checks whether all supplied permissions are present (AND). @param permissions Permission names or raw bits. @returns True when every requested permission is present. */\n public has(...permissions: PermissionResolvable[]): boolean {\n if (permissions.length === 1) {\n const p = permissions[0]!;\n const bit = typeof p === \"bigint\" ? p : this.#resolve(p);\n return (this.bitfield & bit) === bit;\n }\n for (let i = 0; i < permissions.length; i++) {\n const p = permissions[i]!;\n const bit = typeof p === \"bigint\" ? p : this.#resolve(p);\n if ((this.bitfield & bit) !== bit) return false;\n }\n return true;\n }\n\n /** Checks whether any supplied permission is present (OR). @param permissions Permission names or raw bits. @returns True when at least one requested permission is present. */\n public any(...permissions: PermissionResolvable[]): boolean {\n if (permissions.length === 1) {\n const p = permissions[0]!;\n const bit = typeof p === \"bigint\" ? p : this.#resolve(p);\n return (this.bitfield & bit) !== 0n;\n }\n for (let i = 0; i < permissions.length; i++) {\n const p = permissions[i]!;\n const bit = typeof p === \"bigint\" ? p : this.#resolve(p);\n if ((this.bitfield & bit) !== 0n) return true;\n }\n return false;\n }\n\n /** Returns a new set with permissions added. @param permissions Permission names or raw bits. @returns A new permission set. */\n public add(...permissions: PermissionResolvable[]): PermissionSet {\n let bitfield = this.bitfield;\n for (let i = 0; i < permissions.length; i++) {\n const p = permissions[i]!;\n bitfield |= typeof p === \"bigint\" ? p : this.#resolve(p);\n }\n return new PermissionSet(bitfield);\n }\n\n /** Returns a new set with permissions removed. @param permissions Permission names or raw bits. @returns A new permission set. */\n public remove(...permissions: PermissionResolvable[]): PermissionSet {\n let bitfield = this.bitfield;\n for (let i = 0; i < permissions.length; i++) {\n const p = permissions[i]!;\n bitfield &= ~(typeof p === \"bigint\" ? p : this.#resolve(p));\n }\n return new PermissionSet(bitfield);\n }\n\n /** Checks equality with another permission set or raw bitfield. @param other Permission set or raw bitfield. @returns True when both values are equal. */\n public equals(other: PermissionSet | bigint | number | string): boolean {\n return (\n this.bitfield ===\n (other instanceof PermissionSet\n ? other.bitfield\n : new PermissionSet(other).bitfield)\n );\n }\n\n /** Returns the decimal permission representation. @returns Decimal permission bitfield. */\n public toString(): string {\n return this.bitfield.toString();\n }\n\n /** Returns known permission names contained in this set. @returns Names of all enabled known permissions. */\n public toArray(): PermissionName[] {\n return (Object.keys(Permission) as PermissionName[]).filter(\n (permission) => this.has(permission),\n );\n }\n\n /** Resolves a named permission, enum value, or raw bit. @param permission Permission name, enum value, or raw bit. @returns Numeric permission bit. */\n #resolve(permission: PermissionResolvable): bigint {\n if (typeof permission === \"bigint\") return permission;\n if (typeof permission === \"number\") return BigInt(permission);\n if (permission instanceof PermissionSet) return permission.bitfield;\n if (Array.isArray(permission)) {\n let bit = 0n;\n for (let i = 0; i < permission.length; i++)\n bit |= this.#resolve(permission[i]!);\n return bit;\n }\n if (typeof permission === \"string\") {\n if (permission in Permission)\n return (Permission as Record<string, bigint>)[permission]!;\n if (permission in Permissions)\n return (Permissions as Record<string, bigint>)[permission]!;\n if (permission in PermissionFlagsBits)\n return (PermissionFlagsBits as Record<string, bigint>)[\n permission\n ]!;\n const lower =\n permission.charAt(0).toLowerCase() + permission.slice(1);\n if (lower in Permission)\n return (Permission as Record<string, bigint>)[lower]!;\n return BigInt(permission);\n }\n return 0n;\n }\n}\n\n/** Permissions bitfield alias. */\nexport class PermissionsBitField extends PermissionSet {\n /** Permission flags bits enum. */\n public static readonly Flags = PermissionFlagsBits;\n /** Permission flags constants. */\n public static readonly All = Permission;\n\n /** Creates a permissions bitfield. @param value Initial permission bitfield or array of permissions. */\n public constructor(value: PermissionResolvable = 0n) {\n super(value);\n }\n}\n",
7
- "// ─── Gateway Intents ─────────────────────────────────────────────────────────\n\n/** Gateway intent bit flags supported by Discord (PascalCase). */\nexport const GatewayIntentBits = {\n Guilds: 1 << 0,\n GuildMembers: 1 << 1,\n GuildModeration: 1 << 2,\n GuildExpressions: 1 << 3,\n GuildIntegrations: 1 << 4,\n GuildWebhooks: 1 << 5,\n GuildInvites: 1 << 6,\n GuildVoiceStates: 1 << 7,\n GuildPresences: 1 << 8,\n GuildMessages: 1 << 9,\n GuildMessageReactions: 1 << 10,\n GuildMessageTyping: 1 << 11,\n DirectMessages: 1 << 12,\n DirectMessageReactions: 1 << 13,\n DirectMessageTyping: 1 << 14,\n MessageContent: 1 << 15,\n GuildScheduledEvents: 1 << 16,\n AutoModerationConfiguration: 1 << 20,\n AutoModerationExecution: 1 << 21,\n GuildMessagePolls: 1 << 24,\n DirectMessagePolls: 1 << 25,\n} as const;\n\n/** Idiomatic camelCase Gateway intent bit flags supported by Discord. */\nexport const IntentBits = {\n guild: 1 << 0,\n guilds: 1 << 0,\n guildMembers: 1 << 1,\n guildModeration: 1 << 2,\n guildBans: 1 << 2,\n guildExpressions: 1 << 3,\n guildEmojis: 1 << 3,\n guildEmojisAndStickers: 1 << 3,\n guildIntegrations: 1 << 4,\n guildWebhooks: 1 << 5,\n guildInvites: 1 << 6,\n guildVoiceStates: 1 << 7,\n guildPresences: 1 << 8,\n guildMessages: 1 << 9,\n guildMessage: 1 << 9,\n guildMessageReactions: 1 << 10,\n guildMessageTyping: 1 << 11,\n directMessages: 1 << 12,\n directMessageReactions: 1 << 13,\n directMessageTyping: 1 << 14,\n messageContent: 1 << 15,\n guildScheduledEvents: 1 << 16,\n autoModerationConfiguration: 1 << 20,\n autoModerationExecution: 1 << 21,\n guildMessagePolls: 1 << 24,\n directMessagePolls: 1 << 25,\n} as const;\n\n/** Alias for IntentBits. */\nexport const Intents = IntentBits;\n\n/** Gateway intent resolvable value (single bitfield, enum key, or array of bitfields/strings). */\nexport type GatewayIntentResolvable =\n | number\n | keyof typeof GatewayIntentBits\n | keyof typeof IntentBits\n | (\n | number\n | keyof typeof GatewayIntentBits\n | keyof typeof IntentBits\n | string\n )[]\n | { readonly bitfield: number };\n\n/** Resolves any GatewayIntentResolvable into a raw bitfield integer. */\nexport function resolveGatewayIntents(\n intents: GatewayIntentResolvable,\n): number {\n if (typeof intents === \"number\") return intents;\n if (intents && typeof intents === \"object\" && !Array.isArray(intents))\n return intents.bitfield;\n if (Array.isArray(intents)) {\n return intents.reduce<number>((acc, intent) => {\n return acc | resolveGatewayIntents(intent as any);\n }, 0);\n }\n if (typeof intents === \"string\") {\n if (intents in GatewayIntentBits)\n return (GatewayIntentBits as Record<string, number>)[intents]!;\n if (intents in IntentBits)\n return (IntentBits as Record<string, number>)[intents]!;\n const lower = intents.charAt(0).toLowerCase() + intents.slice(1);\n if (lower in IntentBits)\n return (IntentBits as Record<string, number>)[lower]!;\n const num = Number(intents);\n if (!Number.isNaN(num)) return num;\n }\n return 0;\n}\n\n/**\n * Discord.js-familiar intent bitfield.\n * @example new IntentsBitField([IntentsBitField.Flags.Guilds, \"GuildMessages\"])\n */\nexport class IntentsBitField {\n /** Intent flag values by name. */\n public static readonly Flags = GatewayIntentBits;\n /** Raw intent bitfield. */\n public bitfield: number;\n\n public constructor(bits: GatewayIntentResolvable = 0) {\n this.bitfield = resolveGatewayIntents(bits);\n }\n\n /** Whether every given intent is set. */\n public has(bits: GatewayIntentResolvable): boolean {\n const resolved = resolveGatewayIntents(bits);\n return (this.bitfield & resolved) === resolved;\n }\n\n /** Whether any given intent is set. */\n public any(bits: GatewayIntentResolvable): boolean {\n return (this.bitfield & resolveGatewayIntents(bits)) !== 0;\n }\n\n /** Adds intents in place. @returns This bitfield. */\n public add(...bits: GatewayIntentResolvable[]): this {\n for (const bit of bits) this.bitfield |= resolveGatewayIntents(bit);\n return this;\n }\n\n /** Removes intents in place. @returns This bitfield. */\n public remove(...bits: GatewayIntentResolvable[]): this {\n for (const bit of bits) this.bitfield &= ~resolveGatewayIntents(bit);\n return this;\n }\n\n /** Names of the set intents. */\n public toArray(): (keyof typeof GatewayIntentBits)[] {\n return (\n Object.keys(GatewayIntentBits) as (keyof typeof GatewayIntentBits)[]\n ).filter((name) => this.has(GatewayIntentBits[name]));\n }\n\n /** Whether this equals another bitfield. */\n public equals(bits: GatewayIntentResolvable): boolean {\n return this.bitfield === resolveGatewayIntents(bits);\n }\n\n public valueOf(): number {\n return this.bitfield;\n }\n\n public toJSON(): number {\n return this.bitfield;\n }\n}\n\n// ─── Gateway Config ───────────────────────────────────────────────────────────\n\n/** Gateway connection properties (OS, browser, device). */\nexport interface GatewayProperties {\n os?: string;\n browser?: string;\n device?: string;\n [key: string]: unknown;\n}\n/** Gateway presence activity. */\nexport interface GatewayPresenceActivity {\n name: string;\n type?: number;\n url?: string;\n state?: string;\n}\n/** Gateway presence data. */\nexport interface GatewayPresence {\n status?: \"online\" | \"dnd\" | \"idle\" | \"invisible\" | \"offline\";\n activities?: GatewayPresenceActivity[];\n afk?: boolean;\n since?: number | null;\n}\n/** Client configuration. */\nexport interface ClientOptions {\n token: string;\n intents: GatewayIntentResolvable;\n gateway?: GatewayOptions;\n rest?: RESTOptions;\n}\n/** Gateway connection configuration. */\nexport interface GatewayOptions {\n intents?: GatewayIntentResolvable;\n reconnect?: boolean;\n maxReconnectAttempts?: number;\n reconnectBaseDelay?: number;\n reconnectMaxDelay?: number;\n shardId?: number;\n shardCount?: number;\n properties?: GatewayProperties;\n presence?: GatewayPresence;\n}\n\n/** REST request configuration. */\nexport interface RESTOptions {\n timeout?: number;\n retries?: number;\n baseURL?: string;\n}\n",
8
- "/** Discord API snowflake identifier. */\nexport type Snowflake = string;\n\nexport * from \"./gateway.js\";\nexport * from \"./gateway-events.js\";\n\n// ─── Core Discord Objects ─────────────────────────────────────────────────────\n\n/** Discord user object. */\nexport interface UserData {\n id: Snowflake;\n username: string;\n discriminator?: string;\n global_name?: string | null;\n avatar?: string | null;\n bot?: boolean;\n system?: boolean;\n public_flags?: number;\n}\n/** Current authenticated bot user. */\nexport type ClientUser = UserData;\n/** Discord Gateway payload envelope. */\nexport interface GatewayPayload<T = unknown> {\n op: number;\n d: T | null;\n s: number | null;\n t: string | null;\n}\n/** Generic Discord API error payload. */\nexport interface APIError {\n code?: number;\n message?: string;\n errors?: Record<string, unknown>;\n}\n\n// ─── Discord Flags & Enums ────────────────────────────────────────────────────\n\n/** Discord message flags. */\nexport const MessageFlags = {\n Crossposted: 1,\n IsCrosspost: 2,\n SuppressEmbeds: 4,\n SourceMessageDeleted: 8,\n Urgent: 16,\n HasThread: 32,\n Ephemeral: 64,\n Loading: 128,\n IsComponentsV2: 32768,\n} as const;\n\n/** Discord channel types. */\nexport const ChannelType = {\n GuildText: 0,\n DM: 1,\n GuildVoice: 2,\n GroupDM: 3,\n GuildCategory: 4,\n GuildAnnouncement: 5,\n AnnouncementThread: 10,\n PublicThread: 11,\n PrivateThread: 12,\n GuildStageVoice: 13,\n GuildDirectory: 14,\n GuildForum: 15,\n GuildMedia: 16,\n} as const;\n\n/** Discord component types. */\nexport const ComponentType = {\n ActionRow: 1,\n Button: 2,\n StringSelect: 3,\n TextInput: 4,\n UserSelect: 5,\n RoleSelect: 6,\n MentionableSelect: 7,\n ChannelSelect: 8,\n Section: 9,\n TextDisplay: 10,\n Thumbnail: 11,\n MediaGallery: 12,\n File: 13,\n Separator: 14,\n ContentInventoryEntry: 16,\n Container: 17,\n} as const;\n\n/** Discord button style types. */\nexport const ButtonStyle = {\n Primary: 1,\n Secondary: 2,\n Success: 3,\n Danger: 4,\n Link: 5,\n Premium: 6,\n} as const;\n\n/** Discord text input style types. */\nexport const TextInputStyle = {\n Short: 1,\n Paragraph: 2,\n} as const;\n\n/** Discord interaction response types. */\nexport const InteractionResponseType = {\n Pong: 1,\n ChannelMessage: 4,\n DeferredChannelMessage: 5,\n DeferredMessageUpdate: 6,\n MessageUpdate: 7,\n Autocomplete: 8,\n Modal: 9,\n} as const;\n\n/** Discord sticker format types. */\nexport const StickerFormatType = {\n PNG: 1,\n APNG: 2,\n Lottie: 3,\n GIF: 4,\n} as const;\n\n/** Discord sticker types. */\nexport const StickerType = {\n Standard: 1,\n Guild: 2,\n} as const;\n\n/** Discord verification levels. */\nexport const VerificationLevel = {\n None: 0,\n Low: 1,\n Medium: 2,\n High: 3,\n VeryHigh: 4,\n} as const;\n\n/** Discord premium tiers. */\nexport const PremiumTier = {\n None: 0,\n Tier1: 1,\n Tier2: 2,\n Tier3: 3,\n} as const;\n\n// ─── Embeds ───────────────────────────────────────────────────────────────────\n\n/** Raw Discord embed footer object. */\nexport interface APIEmbedFooter {\n text: string;\n icon_url?: string;\n proxy_icon_url?: string;\n}\n/** Raw Discord embed image/thumbnail/video object. */\nexport interface APIEmbedMedia {\n url: string;\n proxy_url?: string;\n height?: number;\n width?: number;\n}\n/** Raw Discord embed provider object. */\nexport interface APIEmbedProvider {\n name?: string;\n url?: string;\n}\n/** Raw Discord embed author object. */\nexport interface APIEmbedAuthor {\n name: string;\n url?: string;\n icon_url?: string;\n proxy_icon_url?: string;\n}\n/** Raw Discord embed field object. */\nexport interface APIEmbedField {\n name: string;\n value: string;\n inline?: boolean;\n}\n/** Raw Discord embed object. */\nexport interface APIEmbed {\n title?: string;\n type?: string;\n description?: string;\n url?: string;\n timestamp?: string;\n color?: number;\n footer?: APIEmbedFooter;\n image?: APIEmbedMedia;\n thumbnail?: APIEmbedMedia;\n video?: APIEmbedMedia;\n provider?: APIEmbedProvider;\n author?: APIEmbedAuthor;\n fields?: APIEmbedField[];\n}\n\n// ─── Message Components ───────────────────────────────────────────────────────\n\n/** Raw Discord select menu option. */\nexport interface APISelectMenuOption {\n label: string;\n value: string;\n description?: string;\n emoji?: APIPartialEmoji;\n default?: boolean;\n}\n/** Raw Discord emoji (partial, as used in components). */\nexport interface APIPartialEmoji {\n id?: Snowflake | null;\n name?: string | null;\n animated?: boolean;\n}\n/** Raw Discord button component. */\nexport interface APIButtonComponent {\n type: 2;\n style: number;\n label?: string;\n emoji?: APIPartialEmoji;\n custom_id?: string;\n url?: string;\n sku_id?: string;\n disabled?: boolean;\n}\n/** Raw Discord select menu component. */\nexport interface APISelectMenuComponent {\n type: 3 | 5 | 6 | 7 | 8;\n custom_id: string;\n options?: APISelectMenuOption[];\n channel_types?: number[];\n placeholder?: string;\n min_values?: number;\n max_values?: number;\n disabled?: boolean;\n}\n/** Raw Discord text input component. */\nexport interface APITextInputComponent {\n type: 4;\n custom_id: string;\n style: number;\n label: string;\n min_length?: number;\n max_length?: number;\n required?: boolean;\n value?: string;\n placeholder?: string;\n}\n/** Union of all raw message component types. */\nexport type APIMessageActionRowComponent =\n APIButtonComponent | APISelectMenuComponent | APITextInputComponent;\n/** Raw Discord action row component. */\nexport interface APIActionRowComponent {\n type: 1;\n id?: number;\n components: APIMessageActionRowComponent[];\n}\n/** Union including action rows and V2 components. */\nexport type APIMessageComponent =\n APIActionRowComponent | { type: Exclude<number, 1>; [key: string]: any };\n\n// ─── Attachments ─────────────────────────────────────────────────────────────\n\n/** Raw Discord attachment object. */\nexport interface APIAttachment {\n id: Snowflake;\n filename: string;\n description?: string | null;\n content_type?: string;\n size: number;\n url: string;\n proxy_url: string;\n height?: number | null;\n width?: number | null;\n ephemeral?: boolean;\n duration_secs?: number;\n waveform?: string;\n flags?: number;\n}\n\n// ─── Stickers ────────────────────────────────────────────────────────────────\n\n/** Compact sticker item as included in messages. */\nexport interface APIStickerItem {\n id: Snowflake;\n name: string;\n format_type: number;\n}\n/** Full Discord sticker object. */\nexport interface APISticker {\n id: Snowflake;\n pack_id?: Snowflake;\n name: string;\n description?: string | null;\n tags?: string;\n type: number;\n format_type: number;\n available?: boolean;\n guild_id?: Snowflake;\n user?: UserData;\n sort_value?: number;\n}\n\n// ─── Messages ────────────────────────────────────────────────────────────────\n\n/** Raw Discord message reference. */\nexport interface APIMessageReference {\n type?: number;\n message_id?: Snowflake;\n channel_id?: Snowflake;\n guild_id?: Snowflake;\n fail_if_not_exists?: boolean;\n}\n/** Raw Discord message reaction. */\nexport interface APIMessageReaction {\n count: number;\n count_details?: Record<string, number>;\n me?: boolean;\n me_burst?: boolean;\n emoji: APIPartialEmoji;\n burst_colors?: string[];\n}\n/** Raw Discord message object. */\nexport interface APIMessage {\n id: Snowflake;\n channel_id: Snowflake;\n author: UserData;\n content: string;\n timestamp?: string;\n edited_timestamp?: string | null;\n tts?: boolean;\n mention_everyone?: boolean;\n mentions?: UserData[];\n mention_roles?: Snowflake[];\n mention_channels?: Array<Record<string, unknown>>;\n attachments?: APIAttachment[];\n embeds?: APIEmbed[];\n reactions?: APIMessageReaction[];\n nonce?: string | number | null;\n pinned?: boolean;\n webhook_id?: Snowflake;\n type?: number;\n activity?: Record<string, unknown>;\n application?: Record<string, unknown>;\n application_id?: Snowflake;\n message_reference?: APIMessageReference;\n flags?: number;\n referenced_message?: APIMessage | null;\n interaction_metadata?: Record<string, unknown>;\n thread?: Record<string, unknown>;\n components?: APIMessageComponent[];\n sticker_items?: APIStickerItem[];\n stickers?: APISticker[];\n position?: number;\n role_subscription_data?: Record<string, unknown>;\n purchase_notification?: Record<string, unknown>;\n poll?: Record<string, unknown>;\n guild_id?: Snowflake;\n}\n\n// ─── Channels ────────────────────────────────────────────────────────────────\n\n/** Raw Discord channel object. */\nexport interface APIChannel {\n id: Snowflake;\n type: number;\n guild_id?: Snowflake;\n position?: number;\n permission_overwrites?: Array<Record<string, unknown>>;\n name?: string | null;\n topic?: string | null;\n nsfw?: boolean;\n last_message_id?: Snowflake | null;\n bitrate?: number;\n user_limit?: number;\n rate_limit_per_user?: number;\n recipients?: UserData[];\n icon?: string | null;\n owner_id?: Snowflake;\n application_id?: Snowflake;\n parent_id?: Snowflake | null;\n last_pin_timestamp?: string | null;\n rtc_region?: string | null;\n video_quality_mode?: number;\n message_count?: number;\n member_count?: number;\n thread_metadata?: APIThreadMetadata;\n default_auto_archive_duration?: number;\n flags?: number;\n total_message_sent?: number;\n available_tags?: APIForumTag[];\n default_reaction_emoji?: APIPartialEmoji | null;\n default_thread_rate_limit_per_user?: number;\n default_sort_order?: number | null;\n default_forum_layout?: number;\n}\n\n/** Raw Discord thread metadata. */\nexport interface APIThreadMetadata {\n archived: boolean;\n auto_archive_duration: number;\n archive_timestamp: string;\n locked: boolean;\n invitable?: boolean;\n create_timestamp?: string | null;\n}\n\n/** Raw Discord forum tag. */\nexport interface APIForumTag {\n id: Snowflake;\n name: string;\n moderated: boolean;\n emoji_id?: Snowflake | null;\n emoji_name?: string | null;\n}\n\n/** Raw Discord thread member. */\nexport interface APIThreadMember {\n id?: Snowflake;\n user_id?: Snowflake;\n join_timestamp: string;\n flags: number;\n member?: APIGuildMember;\n}\n\n// ─── Roles ────────────────────────────────────────────────────────────────────\n\n/** Raw Discord role object. */\nexport interface APIRole {\n id: Snowflake;\n name: string;\n color: number;\n hoist: boolean;\n icon?: string | null;\n unicode_emoji?: string | null;\n position: number;\n permissions: string;\n managed: boolean;\n mentionable: boolean;\n tags?: Record<string, unknown>;\n flags?: number;\n}\n\n// ─── Emoji ────────────────────────────────────────────────────────────────────\n\n/** Raw Discord emoji object. */\nexport interface APIEmoji {\n id: Snowflake | null;\n name: string | null;\n roles?: Snowflake[];\n user?: UserData;\n require_colons?: boolean;\n managed?: boolean;\n animated?: boolean;\n available?: boolean;\n}\n\n// ─── Guilds ───────────────────────────────────────────────────────────────────\n\n/** Raw Discord guild object. */\nexport interface APIGuild {\n id: Snowflake;\n name: string;\n icon?: string | null;\n icon_hash?: string | null;\n splash?: string | null;\n discovery_splash?: string | null;\n owner?: boolean;\n owner_id?: Snowflake;\n permissions?: string;\n afk_channel_id?: Snowflake | null;\n afk_timeout?: number;\n widget_enabled?: boolean;\n widget_channel_id?: Snowflake | null;\n verification_level?: number;\n default_message_notifications?: number;\n explicit_content_filter?: number;\n roles?: APIRole[];\n emojis?: APIEmoji[];\n stickers?: APISticker[];\n features?: string[];\n mfa_level?: number;\n application_id?: Snowflake | null;\n system_channel_id?: Snowflake | null;\n system_channel_flags?: number;\n rules_channel_id?: Snowflake | null;\n max_presences?: number | null;\n max_members?: number;\n vanity_url_code?: string | null;\n description?: string | null;\n banner?: string | null;\n premium_tier?: number;\n premium_subscription_count?: number;\n preferred_locale?: string;\n public_updates_channel_id?: Snowflake | null;\n max_video_channel_users?: number;\n approximate_member_count?: number;\n approximate_presence_count?: number;\n nsfw_level?: number;\n safety_alerts_channel_id?: Snowflake | null;\n member_count?: number;\n}\n\n// ─── Welcome Screen ───────────────────────────────────────────────────────────\n\nexport interface APIWelcomeScreenChannel {\n channel_id: Snowflake;\n description: string;\n emoji_id: Snowflake | null;\n emoji_name: string | null;\n}\n\nexport interface APIGuildWelcomeScreen {\n description: string | null;\n welcome_channels: APIWelcomeScreenChannel[];\n}\n\n// ─── Guild Onboarding ─────────────────────────────────────────────────────────\n\nexport interface APIOnboardingPromptOption {\n id: Snowflake;\n channel_ids: Snowflake[];\n role_ids: Snowflake[];\n emoji?: APIPartialEmoji;\n title: string;\n description: string | null;\n}\n\nexport interface APIOnboardingPrompt {\n id: Snowflake;\n type: number;\n options: APIOnboardingPromptOption[];\n title: string;\n single_select: boolean;\n required: boolean;\n in_onboarding: boolean;\n}\n\nexport interface APIGuildOnboarding {\n guild_id: Snowflake;\n prompts: APIOnboardingPrompt[];\n default_channel_ids: Snowflake[];\n enabled: boolean;\n mode: number;\n}\n\n/** Raw Discord guild member object. */\nexport interface APIGuildMember {\n user: UserData;\n nick?: string | null;\n avatar?: string | null;\n roles: Snowflake[];\n joined_at: string;\n premium_since?: string | null;\n deaf?: boolean;\n mute?: boolean;\n flags?: number;\n pending?: boolean;\n permissions?: string;\n communication_disabled_until?: string | null;\n guild_id?: Snowflake;\n}\n\n// ─── Voice ────────────────────────────────────────────────────────────────────\n\n/** Raw Discord voice state object. */\nexport interface APIVoiceState {\n guild_id?: Snowflake;\n channel_id?: Snowflake | null;\n user_id: Snowflake;\n member?: APIGuildMember;\n session_id: string;\n deaf: boolean;\n mute: boolean;\n self_deaf: boolean;\n self_mute: boolean;\n self_stream?: boolean;\n self_video: boolean;\n suppress: boolean;\n request_to_speak_timestamp?: string | null;\n}\n\n/** Raw Discord voice server update event. */\nexport interface APIVoiceServerUpdate {\n token: string;\n guild_id: Snowflake;\n endpoint?: string | null;\n}\n\n// ─── Presence ────────────────────────────────────────────────────────────────\n\n/** Raw Discord activity object. */\nexport interface APIActivity {\n name: string;\n type: number;\n url?: string | null;\n created_at: number;\n state?: string | null;\n details?: string | null;\n emoji?: APIPartialEmoji | null;\n}\n\n/** Raw Discord presence update event. */\nexport interface APIPresenceUpdate {\n user: { id: Snowflake } & Partial<UserData>;\n guild_id: Snowflake;\n status: string;\n activities: APIActivity[];\n client_status: { desktop?: string; mobile?: string; web?: string };\n}\n\n// ─── Typing ───────────────────────────────────────────────────────────────────\n\n/** Raw Discord typing start event. */\nexport interface APITypingStart {\n channel_id: Snowflake;\n guild_id?: Snowflake;\n user_id: Snowflake;\n timestamp: number;\n member?: APIGuildMember;\n}\n\n// ─── Guilds ──────────────────────────────────────────────────────────────────\n\n/** Raw Discord guild preview. */\nexport interface APIGuildPreview {\n id: Snowflake;\n name: string;\n icon: string | null;\n splash: string | null;\n discovery_splash: string | null;\n emojis: unknown[];\n features: string[];\n approximate_member_count: number;\n approximate_presence_count: number;\n description: string | null;\n stickers: unknown[];\n}\n\n// ─── Invites ─────────────────────────────────────────────────────────────────\n\n/** Raw Discord invite. */\nexport interface APIInvite {\n code: string;\n guild?: Partial<APIGuild>;\n channel: Partial<APIChannel>;\n inviter?: UserData;\n target_type?: number;\n target_user?: UserData;\n approximate_presence_count?: number;\n approximate_member_count?: number;\n}\n\n/** Raw Discord invite create event. */\nexport interface APIInviteCreate {\n channel_id: Snowflake;\n code: string;\n created_at: string;\n guild_id?: Snowflake;\n inviter?: UserData;\n max_age: number;\n max_uses: number;\n target_type?: number;\n target_user?: UserData;\n temporary: boolean;\n uses: number;\n}\n\n/** Raw Discord invite delete event. */\nexport interface APIInviteDelete {\n channel_id: Snowflake;\n guild_id?: Snowflake;\n code: string;\n}\n\n// ─── Webhooks ────────────────────────────────────────────────────────────────\n\n/** Raw Discord webhooks update event. */\nexport interface APIWebhooksUpdate {\n guild_id: Snowflake;\n channel_id: Snowflake;\n}\n\n/** Raw Discord webhook object. */\nexport interface APIWebhook {\n id: Snowflake;\n type: number;\n guild_id?: Snowflake | null;\n channel_id?: Snowflake | null;\n user?: UserData;\n name?: string | null;\n avatar?: string | null;\n token?: string;\n application_id?: Snowflake | null;\n url?: string;\n}\n\n// ─── AutoMod ─────────────────────────────────────────────────────────────────\n\n/** Raw Discord AutoMod action. */\nexport interface APIAutoModerationAction {\n type: number;\n metadata?: {\n channel_id?: Snowflake;\n duration_seconds?: number;\n custom_message?: string;\n };\n}\n\n// ─── Audit Logs ──────────────────────────────────────────────────────────────\n\n/** Raw Discord audit log change object. */\nexport interface APIAuditLogChange {\n new_value?: unknown;\n old_value?: unknown;\n key: string;\n}\n\n/** Raw Discord audit log entry options object. */\nexport interface APIAuditLogOptions {\n app_id?: Snowflake;\n auto_moderation_rule_name?: string;\n auto_moderation_rule_trigger_type?: string;\n channel_id?: Snowflake;\n count?: string;\n delete_member_days?: string;\n id?: Snowflake;\n members_removed?: string;\n message_id?: Snowflake;\n role_name?: string;\n type?: string;\n integration_type?: string;\n}\n\n/** Raw Discord audit log entry object. */\nexport interface APIAuditLogEntry {\n target_id: string | null;\n changes?: APIAuditLogChange[];\n user_id: Snowflake | null;\n id: Snowflake;\n action_type: number;\n options?: APIAuditLogOptions;\n reason?: string;\n}\n\n/** Raw Discord audit log object. */\nexport interface APIAuditLog {\n audit_log_entries: APIAuditLogEntry[];\n guild_scheduled_events: APIGuildScheduledEvent[];\n integrations: Array<Record<string, unknown>>;\n threads: APIChannel[];\n users: UserData[];\n webhooks: APIWebhook[];\n application_commands: APIApplicationCommand[];\n auto_moderation_rules: APIAutoModerationRule[];\n}\n\n/** Raw Discord AutoMod rule object. */\nexport interface APIAutoModerationRule {\n id: Snowflake;\n guild_id: Snowflake;\n name: string;\n creator_id: Snowflake;\n event_type: number;\n trigger_type: number;\n trigger_metadata: Record<string, unknown>;\n actions: APIAutoModerationAction[];\n enabled: boolean;\n exempt_roles: Snowflake[];\n exempt_channels: Snowflake[];\n}\n\n/** Raw Discord AutoMod action execution event. */\nexport interface APIAutoModerationActionExecution {\n guild_id: Snowflake;\n action: APIAutoModerationAction;\n rule_id: Snowflake;\n rule_trigger_type: number;\n user_id: Snowflake;\n channel_id?: Snowflake;\n message_id?: Snowflake;\n alert_system_message_id?: Snowflake;\n content: string;\n matched_keyword?: string | null;\n matched_content?: string | null;\n}\n\n// ─── Scheduled Events ─────────────────────────────────────────────────────────\n\n/** Raw Discord guild scheduled event entity metadata. */\nexport interface APIGuildScheduledEventEntityMetadata {\n location?: string;\n}\n\n/** Raw Discord guild scheduled event object. */\nexport interface APIGuildScheduledEvent {\n id: Snowflake;\n guild_id: Snowflake;\n channel_id?: Snowflake | null;\n creator_id?: Snowflake | null;\n name: string;\n description?: string | null;\n scheduled_start_time: string;\n scheduled_end_time?: string | null;\n privacy_level: number;\n status: number;\n entity_type: number;\n entity_id?: Snowflake | null;\n entity_metadata?: APIGuildScheduledEventEntityMetadata | null;\n creator?: UserData;\n user_count?: number;\n image?: string | null;\n}\n\n// ─── Stage Instances ─────────────────────────────────────────────────────────\n\n/** Raw Discord stage instance object. */\nexport interface APIStageInstance {\n id: Snowflake;\n guild_id: Snowflake;\n channel_id: Snowflake;\n topic: string;\n privacy_level: number;\n discoverable_disabled?: boolean;\n guild_scheduled_event_id?: Snowflake | null;\n}\n\n// ─── Application Commands ─────────────────────────────────────────────────────\n\n/** Discord application command option types. */\nexport const ApplicationCommandOptionType = {\n SubCommand: 1,\n SubCommandGroup: 2,\n String: 3,\n Integer: 4,\n Boolean: 5,\n User: 6,\n Channel: 7,\n Role: 8,\n Mentionable: 9,\n Number: 10,\n Attachment: 11,\n} as const;\n\n/** Discord application command types. */\nexport const ApplicationCommandType = {\n ChatInput: 1,\n User: 2,\n Message: 3,\n} as const;\n\n/** Raw Discord application command option. */\nexport interface APIApplicationCommandOption {\n type: number;\n name: string;\n description: string;\n required?: boolean;\n choices?: Array<{ name: string; value: string | number }>;\n options?: APIApplicationCommandOption[];\n min_value?: number;\n max_value?: number;\n min_length?: number;\n max_length?: number;\n autocomplete?: boolean;\n channel_types?: number[];\n}\n\n/** Raw Discord application command object (from API). */\nexport interface APIApplicationCommand {\n id: Snowflake;\n type?: number;\n application_id: Snowflake;\n guild_id?: Snowflake;\n name: string;\n description: string;\n options?: APIApplicationCommandOption[];\n default_member_permissions?: string | null;\n dm_permission?: boolean;\n nsfw?: boolean;\n version: Snowflake;\n}\n\n/** Data for creating/overwriting an application command. */\nexport interface ApplicationCommandData {\n name: string;\n description: string;\n type?: number;\n options?: APIApplicationCommandOption[];\n default_member_permissions?: string | null;\n dm_permission?: boolean;\n nsfw?: boolean;\n}\n",
9
- "/** Library version and source URL used for the Discord-compliant User-Agent. */\nimport packageJson from \"../package.json\" with { type: \"json\" };\nconst LIBRARY_VERSION = packageJson.version;\nconst LIBRARY_URL = \"https://github.com/Ekretos/lunibee\";\nconst USER_AGENT = `DiscordBot (${LIBRARY_URL}, ${packageJson.version})`;\n\nimport {\n MemoryRateLimitStore,\n type RateLimitStore,\n type BucketState,\n} from \"./store.js\";\nimport { RESTError, abortError, sleep } from \"./errors.js\";\nimport {\n createRouteKey,\n serializeQuery,\n type RESTQuery,\n type RouteKey,\n} from \"./route.js\";\nimport { RequestScheduler } from \"./scheduler.js\";\nimport { RateLimiter } from \"./limiter.js\";\nimport { HttpTransport, TransportError } from \"./transport.js\";\nimport { ResponseDecoder } from \"./decoder.js\";\n\n/** Internal state shared by requests mapped to one Discord rate-limit bucket. */\ntype Bucket = { remaining: number; resetAt: number };\n/** A file attachment sent as part of a multipart REST request. */\nexport interface RESTFileAttachment {\n name: string;\n data: Blob | Uint8Array | ArrayBuffer;\n contentType?: string;\n}\n\n/**\n * Options controlling an individual REST request.\n *\n * Lunibee's canonical call shape is positional (`post(path, body)`); these options\n * add the Discord.js-`@discordjs/rest`-familiar per-request knobs (`query`, `headers`,\n * `reason`, `auth`) additively without changing that positional default.\n */\nexport interface RESTRequestOptions {\n /** Abort signal used to cancel the request and any queued wait. */ signal?: AbortSignal;\n /** Query-string appended to the path (`URLSearchParams`, a record, or a raw string). */ query?: RESTQuery;\n /** Extra request headers merged in (library headers such as `Authorization` win). */ headers?: Record<\n string,\n string\n >;\n /** Audit-log reason, sent as the `X-Audit-Log-Reason` header. */ reason?: string;\n /** Set `false` to omit the `Authorization` header for this request. Defaults to `true`. */ auth?: boolean;\n}\n\n/**\n * Discord.js-familiar request payload. Superset of {@link RESTRequestOptions} that also\n * carries the `body` and `files`, matching `@discordjs/rest`'s `RequestData`. It powers the\n * additive `method(path, { body })` overloads without breaking the positional signature.\n */\nexport interface RequestData extends RESTRequestOptions {\n /** Request body. Encoded as JSON unless `files` are present (then multipart). */ body?: unknown;\n /** File attachments; presence upgrades the request to `multipart/form-data`. */ files?: RESTFileAttachment[];\n}\n\n/** Keys recognised on a {@link RequestData} wrapper, used to disambiguate it from a raw body. */\nconst REQUEST_DATA_KEYS = new Set([\n \"body\",\n \"files\",\n \"query\",\n \"headers\",\n \"reason\",\n \"auth\",\n \"signal\",\n]);\n\n/**\n * Detects a Discord.js-style `RequestData` wrapper so verb helpers can accept both\n * `post(path, rawBody)` (Lunibee-canonical) and `post(path, { body })` (Discord.js-familiar).\n * Conservative by design: only a plain object whose every own key is a known `RequestData`\n * key counts — a raw Discord payload (which always carries entity keys like `content`/`name`)\n * never matches, so existing positional callers are unaffected.\n */\nfunction isRequestData(value: unknown): value is RequestData {\n if (value === null || typeof value !== \"object\") return false;\n if (Array.isArray(value)) return false;\n if (typeof FormData !== \"undefined\" && value instanceof FormData)\n return false;\n if (\n value instanceof Blob ||\n value instanceof Uint8Array ||\n value instanceof ArrayBuffer\n )\n return false;\n const keys = Object.keys(value);\n if (keys.length === 0) return false;\n return keys.every((key) => REQUEST_DATA_KEYS.has(key));\n}\n\n// ─── REST Hooks ───────────────────────────────────────────────────────────────\n\n/** Context passed to `RESTHooks.onRequest`. */\nexport interface RESTRequestContext {\n method: string;\n path: string;\n attempt: number;\n}\n/** Context passed to `RESTHooks.onResponse`. */\nexport interface RESTResponseContext {\n method: string;\n path: string;\n status: number;\n durationMs: number;\n}\n/** Context passed to `RESTHooks.onRateLimit`. */\nexport interface RESTRateLimitContext {\n method: string;\n path: string;\n retryAfterMs: number;\n global: boolean;\n bucket?: string;\n}\n/** Context passed to `RESTHooks.onRetry`. */\nexport interface RESTRetryContext {\n method: string;\n path: string;\n attempt: number;\n status: number;\n delayMs: number;\n}\n\n/**\n * Lightweight callback hooks for REST request lifecycle events.\n *\n * All callbacks are optional. They are dispatched in isolation from the request\n * path (deferred to a microtask, and any thrown error is swallowed), so a hook\n * cannot break or reject a request. Even so, hooks **must** be fast and\n * non-blocking: heavy synchronous work in a hook still steals event-loop time\n * from in-flight requests. Offload anything expensive to your own queue.\n */\nexport interface RESTHooks {\n /** Called just before every HTTP attempt. */\n onRequest?(ctx: RESTRequestContext): void;\n /** Called after a successful or failed response is received. */\n onResponse?(ctx: RESTResponseContext): void;\n /** Called when a rate limit is encountered and the client is about to wait. */\n onRateLimit?(ctx: RESTRateLimitContext): void;\n /** Called when a failed request is about to be retried. */\n onRetry?(ctx: RESTRetryContext): void;\n}\n\n/** Configures which REST failures may be retried. */\nexport interface RetryPolicy {\n /** Maximum retry attempts. */ maxRetries: number;\n /** Determines whether a request may be retried. @param method HTTP method. @param status HTTP status, or zero for transport errors. @returns True when retrying is safe under the policy. */ shouldRetry(\n method: string,\n status: number,\n ): boolean;\n /** Calculates delay before the next attempt. @param attempt Zero-based retry number. @param retryAfter Server-provided delay, when available. @returns Delay in milliseconds. */ getDelay(\n attempt: number,\n retryAfter?: number,\n ): number;\n}\n/** Creates the default conservative REST retry policy. @param maxRetries Maximum retries. @returns Retry policy that retries rate limits and idempotent transient failures. @throws {TypeError} If maxRetries is negative or not finite. */\nexport function createRetryPolicy(maxRetries = 2): RetryPolicy {\n if (!Number.isFinite(maxRetries) || maxRetries < 0)\n throw new TypeError(\"maxRetries must be a non-negative finite number.\");\n return {\n maxRetries: Math.floor(maxRetries),\n shouldRetry(method, status) {\n const normalized = method.toUpperCase();\n const idempotent = [\"GET\", \"HEAD\", \"PUT\", \"DELETE\"].includes(\n normalized,\n );\n // Status 0 is a transport failure (DNS, reset connection, TLS):\n // no response reached Discord's handlers, so replaying an\n // idempotent request is as safe as replaying it after a 5xx.\n if (status === 0) return idempotent;\n return (\n status === 429 || (status >= 500 && status <= 599 && idempotent)\n );\n },\n getDelay(attempt, retryAfter) {\n if (retryAfter !== undefined) return Math.max(0, retryAfter * 1000);\n return Math.min(10_000, 500 * 2 ** attempt) + Math.random() * 250;\n },\n };\n}\n\n/** Bun-native REST transport with Discord bucket-aware rate limiting, retries, and cancellation. */\nexport class REST {\n readonly #retryPolicy: RetryPolicy;\n #token?: string;\n /** Rate-limit state: when a request may go out, what a response says. */\n readonly #limiter: RateLimiter;\n /** Per-bucket ordering. */\n readonly #scheduler = new RequestScheduler();\n /** One HTTP attempt, with timeout and cancellation. */\n readonly #transport: HttpTransport;\n /** Response payload and error metadata. */\n readonly #decoder = new ResponseDecoder();\n #hooks: RESTHooks = {};\n /** Whether requests on a known bucket may run concurrently. */\n readonly #concurrentBuckets: boolean;\n /** Creates a REST transport. @param options Transport configuration. @throws {TypeError} If retry configuration is invalid. */\n public constructor(\n options: {\n token?: string;\n timeout?: number;\n retries?: number;\n retryPolicy?: RetryPolicy;\n baseURL?: string;\n hooks?: RESTHooks;\n store?: RateLimitStore;\n /** Replaces the HTTP stage, e.g. with a recording transport in tests. */\n transport?: HttpTransport;\n /**\n * Lets requests on a bucket whose limit is known run concurrently, up\n * to its `remaining` allowance, instead of one at a time. Requires a\n * store with `reserve`. Requests on one bucket may then complete out\n * of order (e.g. messages to one channel). Defaults to `false`.\n */\n concurrentBuckets?: boolean;\n } = {},\n ) {\n this.#token = options.token;\n this.#retryPolicy =\n options.retryPolicy ?? createRetryPolicy(options.retries ?? 2);\n this.#transport =\n options.transport ??\n new HttpTransport({\n baseURL: options.baseURL,\n timeout: options.timeout,\n });\n const store = options.store ?? new MemoryRateLimitStore();\n this.#concurrentBuckets =\n (options.concurrentBuckets ?? false) &&\n typeof store.reserve === \"function\";\n this.#limiter = new RateLimiter(store, {\n concurrent: this.#concurrentBuckets,\n });\n if (options.hooks) this.#hooks = options.hooks;\n }\n /** The rate-limit store backing this transport. */\n public get store(): RateLimitStore {\n return this.#limiter.store;\n }\n /** Replaces the current hook set. Pass an empty object to clear all hooks. */\n public setHooks(hooks: RESTHooks): this {\n this.#hooks = hooks;\n return this;\n }\n /** Sets the authentication token. @param token Discord bot token. @returns Nothing. @throws {TypeError} If token is empty. */\n public setToken(token: string): void {\n if (!token.trim())\n throw new TypeError(\"A Discord bot token is required.\");\n this.#token = token;\n }\n /** Executes an HTTP request with Discord bucket/global rate limits, retry handling, and AbortSignal support.\n * Accepts a JSON body, a FormData body (for file uploads), or undefined.\n * @param method HTTP method.\n * @param path API path.\n * @param body Optional JSON body, FormData for file uploads, or undefined.\n * @param options Request options: cancellation `signal` plus the Discord.js-familiar\n * `query`, `headers`, `reason`, `auth`, and `files` (which upgrade to multipart).\n * @returns Decoded response body.\n * @throws {RESTError} If Discord or transport rejects the request.\n */\n public async request<T>(\n method: string,\n path: string,\n body?: unknown,\n options: RequestData = {},\n ): Promise<T> {\n if (!method.toUpperCase())\n throw new TypeError(\"REST method is required.\");\n if (!path.startsWith(\"/\"))\n throw new TypeError(\"REST paths must start with '/'.\");\n const route = createRouteKey(method, path);\n // Upgrade to multipart when file attachments are supplied via options.\n const files = options.files;\n if (files && files.length > 0 && !(body instanceof FormData))\n body = this.#fileForm(body, files);\n const query = serializeQuery(options.query);\n const requestPath = query ? `${path}${query}` : path;\n\n // Discord scopes a rate limit by (bucket hash, major parameter): two\n // channels sharing an endpoint have independent limits, while two\n // different routes can share one hash. The key is therefore resolved\n // again once the slot is acquired, so a request that queued under its\n // route-derived key joins the shared bucket's queue if one was\n // discovered while it waited.\n return this.#scheduler.runResolved(\n () => this.#limiter.resolveBucketKey(route.route, route.major),\n options.signal,\n path,\n (bucketKey, release) =>\n this.#attempts<T>(\n route,\n requestPath,\n body,\n options,\n bucketKey,\n release,\n ),\n );\n }\n /**\n * Runs the retry loop for one scheduled request: acquire limits, send,\n * record what the response says, decode, and decide whether to try again.\n */\n async #attempts<T>(\n route: RouteKey,\n requestPath: string,\n body: unknown,\n options: RequestData,\n initialBucketKey: string,\n release: () => void,\n ): Promise<T> {\n const { method, path } = route;\n let bucketKey = initialBucketKey;\n for (\n let attempt = 0;\n attempt <= this.#retryPolicy.maxRetries;\n attempt++\n ) {\n await this.#limiter.acquire(bucketKey, options.signal, path);\n // The reservation already claimed this request's unit, so once the\n // bucket's window is known the next request need not wait for our\n // response. An unknown bucket stays serial until a response\n // reveals its limit.\n if (this.#concurrentBuckets) {\n const bucket = await this.#limiter.store.getBucket(bucketKey);\n if (bucket && bucket.resetAt > Date.now()) release();\n }\n this.#emit(this.#hooks.onRequest, { method, path, attempt });\n const requestStart = Date.now();\n let response: Response;\n try {\n response = await this.#transport.send({\n method,\n path: requestPath,\n headers: this.#headers(body, options),\n body: this.#encodeBody(body),\n signal: options.signal,\n });\n } catch (error) {\n if (error instanceof RESTError) throw error;\n if (options.signal?.aborted)\n throw abortError(path, options.signal.reason);\n const failure =\n error instanceof TransportError\n ? error\n : new TransportError(\n \"Discord REST request failed\",\n false,\n error,\n );\n if (\n !failure.timedOut &&\n attempt < this.#retryPolicy.maxRetries &&\n this.#retryPolicy.shouldRetry(method, 0)\n ) {\n await sleep(\n this.#retryPolicy.getDelay(attempt),\n options.signal,\n path,\n );\n continue;\n }\n throw new RESTError(failure.message, 0, undefined, undefined, {\n method,\n path,\n cause: failure.cause ?? failure,\n });\n }\n this.#emit(this.#hooks.onResponse, {\n method,\n path,\n status: response.status,\n durationMs: Date.now() - requestStart,\n });\n bucketKey = await this.#limiter.applyResponse(\n response,\n bucketKey,\n route.route,\n route.major,\n );\n const payload = await this.#decoder.read(response);\n if (response.ok)\n return (response.status === 204 ? undefined : payload) as T;\n\n const data = this.#decoder.errorData(payload);\n const retryAfter =\n response.status === 429\n ? this.#decoder.retryAfter(response, data)\n : undefined;\n if (data.global && retryAfter !== undefined)\n await this.#limiter.noteGlobalReset(\n Date.now() + retryAfter * 1000,\n );\n // Fire for ANY 429, including a global limit that arrives without a\n // Retry-After header; fall back to 1s in that case.\n if (response.status === 429)\n this.#emit(this.#hooks.onRateLimit, {\n method,\n path,\n retryAfterMs: (retryAfter ?? 1) * 1000,\n global: data.global ?? false,\n bucket: await this.#limiter.store.getBucketHash(\n route.route,\n ),\n });\n if (\n attempt < this.#retryPolicy.maxRetries &&\n this.#retryPolicy.shouldRetry(method, response.status)\n ) {\n const delay = this.#retryPolicy.getDelay(attempt, retryAfter);\n this.#emit(this.#hooks.onRetry, {\n method,\n path,\n attempt,\n status: response.status,\n delayMs: delay,\n });\n await sleep(delay, options.signal, path);\n continue;\n }\n throw new RESTError(\n data.message ??\n response.statusText ??\n `Discord REST request failed with status ${response.status}`,\n response.status,\n data.code,\n payload,\n { method, path },\n );\n }\n throw new RESTError(\n \"Discord REST request exhausted its retry attempts\",\n 0,\n undefined,\n undefined,\n { method, path },\n );\n }\n /** Builds the header set for one attempt; library headers win over caller headers. */\n #headers(body: unknown, options: RequestData): Record<string, string> {\n const isFormData =\n typeof FormData !== \"undefined\" && body instanceof FormData;\n const headers: Record<string, string> = { ...options.headers };\n if (options.auth !== false && this.#token)\n headers[\"Authorization\"] = `Bot ${this.#token}`;\n headers[\"User-Agent\"] = USER_AGENT;\n if (options.reason !== undefined)\n headers[\"X-Audit-Log-Reason\"] = encodeURIComponent(options.reason);\n if (!isFormData) headers[\"Content-Type\"] = \"application/json\";\n return headers;\n }\n /** Encodes a body as multipart (passed through) or JSON. */\n #encodeBody(body: unknown): BodyInit | undefined {\n if (typeof FormData !== \"undefined\" && body instanceof FormData)\n return body;\n return body === undefined ? undefined : JSON.stringify(body);\n }\n /**\n * Normalizes a verb helper's second argument into `(body, options)`.\n * Supports both `verb(path, rawBody, options?)` (Lunibee-canonical positional) and the\n * Discord.js-familiar `verb(path, { body, query, headers, reason, files })` wrapper.\n */\n #dispatch<T>(\n method: string,\n path: string,\n bodyOrOptions?: unknown,\n options?: RequestData,\n ): Promise<T> {\n if (options === undefined && isRequestData(bodyOrOptions))\n return this.request<T>(\n method,\n path,\n bodyOrOptions.body,\n bodyOrOptions,\n );\n return this.request<T>(method, path, bodyOrOptions, options);\n }\n /** Sends a GET request. @param path API path. @param options Request options (`query`, `headers`, `signal`, …). @returns Decoded response. @throws {RESTError} When the request fails. */ public get<\n T,\n >(path: string, options?: RequestData): Promise<T> {\n return this.request<T>(\"GET\", path, options?.body, options);\n }\n /** Sends a POST request. Accepts a raw body (`post(path, body)`) or a Discord.js-familiar `post(path, { body })`. @param path API path. @param body Optional JSON body, or a `RequestData` wrapper. @param options Request options. @returns Decoded response. @throws {RESTError} When the request fails. */\n public post<T>(path: string, options: RequestData): Promise<T>;\n public post<T>(\n path: string,\n body?: unknown,\n options?: RequestData,\n ): Promise<T>;\n public post<T>(\n path: string,\n body?: unknown,\n options?: RequestData,\n ): Promise<T> {\n return this.#dispatch<T>(\"POST\", path, body, options);\n }\n /** Sends a PATCH request. Accepts a raw body (`patch(path, body)`) or a Discord.js-familiar `patch(path, { body })`. @param path API path. @param body Optional JSON body, or a `RequestData` wrapper. @param options Request options. @returns Decoded response. @throws {RESTError} When the request fails. */\n public patch<T>(path: string, options: RequestData): Promise<T>;\n public patch<T>(\n path: string,\n body?: unknown,\n options?: RequestData,\n ): Promise<T>;\n public patch<T>(\n path: string,\n body?: unknown,\n options?: RequestData,\n ): Promise<T> {\n return this.#dispatch<T>(\"PATCH\", path, body, options);\n }\n /** Sends a PUT request. Accepts a raw body (`put(path, body)`) or a Discord.js-familiar `put(path, { body })`. @param path API path. @param body Optional JSON body, or a `RequestData` wrapper. @param options Request options. @returns Decoded response. @throws {RESTError} When the request fails. */\n public put<T>(path: string, options: RequestData): Promise<T>;\n public put<T>(\n path: string,\n body?: unknown,\n options?: RequestData,\n ): Promise<T>;\n public put<T>(\n path: string,\n body?: unknown,\n options?: RequestData,\n ): Promise<T> {\n return this.#dispatch<T>(\"PUT\", path, body, options);\n }\n /** Sends a DELETE request. @param path API path. @param options Request options (`reason`, `headers`, `signal`, …). @returns Decoded response. @throws {RESTError} When the request fails. */ public delete<\n T,\n >(path: string, options?: RequestData): Promise<T> {\n return this.request<T>(\"DELETE\", path, options?.body, options);\n }\n /**\n * Builds a multipart form with a JSON payload and file attachments.\n */\n #fileForm(payload: unknown, files: RESTFileAttachment[]): FormData {\n const form = new FormData();\n form.append(\"payload_json\", JSON.stringify(payload));\n for (let i = 0; i < files.length; i++) {\n const file = files[i]!;\n const blob =\n file.data instanceof Blob\n ? file.data\n : new Blob([file.data as ArrayBuffer], {\n type: file.contentType ?? \"application/octet-stream\",\n });\n form.append(`files[${i}]`, blob, file.name);\n }\n return form;\n }\n\n /**\n * Sends a multipart/form-data POST request for file uploads.\n * Attaches a JSON payload as `payload_json` and files as additional fields.\n * @param path API path.\n * @param payload JSON payload (e.g. message content, embeds).\n * @param files Array of file attachments.\n * @param options Cancellation options.\n * @returns Decoded response.\n * @throws {RESTError} When the request fails.\n */\n public postWithFiles<T>(\n path: string,\n payload: unknown,\n files: RESTFileAttachment[],\n options?: RESTRequestOptions,\n ): Promise<T> {\n return this.request<T>(\n \"POST\",\n path,\n this.#fileForm(payload, files),\n options,\n );\n }\n\n /**\n * Sends a multipart/form-data PATCH request for editing messages with files.\n * @param path API path.\n * @param payload JSON payload.\n * @param files Array of file attachments.\n * @param options Cancellation options.\n * @returns Decoded response.\n * @throws {RESTError} When the request fails.\n */\n public patchWithFiles<T>(\n path: string,\n payload: unknown,\n files: RESTFileAttachment[],\n options?: RESTRequestOptions,\n ): Promise<T> {\n return this.request<T>(\n \"PATCH\",\n path,\n this.#fileForm(payload, files),\n options,\n );\n }\n /** Dispatches a lifecycle hook in isolation: deferred to a microtask so it\n * cannot block the request path, with any thrown error swallowed so a faulty\n * hook cannot reject the request. @param hook Optional callback. @param ctx Event context. */\n #emit<C>(hook: ((ctx: C) => void) | undefined, ctx: C): void {\n if (!hook) return;\n Promise.resolve()\n .then(() => hook(ctx))\n .catch(() => {});\n }\n}\n\nexport { Routes } from \"./routes.js\";\nexport { RESTError, abortError } from \"./errors.js\";\nexport {\n createRouteKey,\n normalizeRoutePath,\n majorParameter,\n scopeBucket,\n serializeQuery,\n type RouteKey,\n type RESTQuery,\n} from \"./route.js\";\nexport { RequestScheduler } from \"./scheduler.js\";\nexport { RateLimiter } from \"./limiter.js\";\nexport {\n HttpTransport,\n TransportError,\n type TransportRequest,\n type FetchLike,\n} from \"./transport.js\";\nexport { ResponseDecoder, type DecodedError } from \"./decoder.js\";\nexport {\n type RateLimitStore,\n type BucketState,\n type Reservation,\n MemoryRateLimitStore,\n} from \"./store.js\";\nexport {\n RedisRateLimitStore,\n type RedisRateLimitStoreOptions,\n type MinimalRedisClient,\n} from \"./redis.js\";\n\nexport {\n WebhookClient,\n type WebhookClientOptions,\n type WebhookMessageOptions,\n} from \"./webhook.js\";\n\n/**\n * Discord.js-familiar alias for {@link RESTError}. `@discordjs/rest` throws `DiscordAPIError`\n * on a Discord-rejected request; Lunibee keeps `RESTError` as the canonical class and exports\n * this alias so Discord.js-shaped `catch (err) { if (err instanceof DiscordAPIError) … }` works.\n */\nexport { RESTError as DiscordAPIError };\n",
5
+ "/** Common Discord snowflake-backed structure. */\nexport class BaseStructure {\n public readonly id: string;\n public constructor(id: string) {\n if (!/^\\d{1,20}$/.test(id))\n throw new TypeError(\n \"A Discord structure requires a valid snowflake ID.\",\n );\n this.id = id;\n }\n /** Returns the snowflake ID as a string. */\n public toString(): string {\n return this.id;\n }\n /** Returns the timestamp this snowflake was created at. */\n public get createdAt(): Date {\n return new Date(Number((BigInt(this.id) >> 22n) + 1420070400000n));\n }\n}\n\nexport interface ResourceContext {\n sendMessage(\n channelId: string,\n options: Record<string, unknown> & { content?: string },\n ): Promise<import(\"./index.js\").Message>;\n editMessage(\n channelId: string,\n messageId: string,\n options: Record<string, unknown> & { content?: string },\n ): Promise<import(\"./index.js\").Message>;\n deleteMessage(channelId: string, messageId: string): Promise<void>;\n crosspostMessage(\n channelId: string,\n messageId: string,\n ): Promise<import(\"./index.js\").Message>;\n editChannel?(\n channelId: string,\n options: Record<string, unknown>,\n ): Promise<import(\"./base.js\").Channel>;\n deleteChannel?(channelId: string): Promise<void>;\n addReaction?(\n channelId: string,\n messageId: string,\n emoji: string,\n ): Promise<void>;\n removeOwnReaction?(\n channelId: string,\n messageId: string,\n emoji: string,\n ): Promise<void>;\n removeReaction?(\n channelId: string,\n messageId: string,\n emoji: string,\n userId: string,\n ): Promise<void>;\n removeAllReactions?(channelId: string, messageId: string): Promise<void>;\n pinMessage?(channelId: string, messageId: string): Promise<void>;\n unpinMessage?(channelId: string, messageId: string): Promise<void>;\n}\n\n// ─── CDN helpers ──────────────────────────────────────────────────────────────\n\nexport const CDN_BASE = \"https://cdn.discordapp.com\";\n\n/** Options for CDN image URLs. */\nexport interface ImageURLOptions {\n extension?: \"png\" | \"jpg\" | \"webp\" | \"gif\" | \"jpeg\";\n size?: 16 | 32 | 64 | 128 | 256 | 512 | 1024 | 2048 | 4096;\n forceStatic?: boolean;\n}\n\n/** Builds a Discord CDN asset URL from a directory path and asset hash, applying\n * animated-hash (`a_`) gif detection, extension and size options. Shared by all\n * hash-backed asset accessors (user/member/role/webhook) to avoid duplicating the logic.\n * @param path CDN directory path, e.g. `/role-icons/{id}`. @param hash Asset hash. @param options Image URL options. */\nexport function cdnURL(\n path: string,\n hash: string,\n options: ImageURLOptions = {},\n): string {\n const isAnimated = hash.startsWith(\"a_\") && !options.forceStatic;\n const ext = options.extension ?? (isAnimated ? \"gif\" : \"png\");\n const size = options.size ? `?size=${options.size}` : \"\";\n return `${CDN_BASE}${path}/${hash}.${ext}${size}`;\n}\n\n// ─── User ─────────────────────────────────────────────────────────────────────\n\nexport class User extends BaseStructure {\n public username: string;\n public globalName: string | null;\n public avatar: string | null;\n public bot: boolean;\n public system: boolean;\n public flags: number;\n public discriminator: string | null;\n public constructor(data: import(\"@lunibee/types\").UserData) {\n super(data.id);\n if (!data.username)\n throw new TypeError(\"A Discord user requires a username.\");\n this.username = data.username;\n this.globalName = data.global_name ?? null;\n this.avatar = data.avatar ?? null;\n this.bot = data.bot ?? false;\n this.system = data.system ?? false;\n this.flags = data.public_flags ?? 0;\n this.discriminator =\n data.discriminator && data.discriminator !== \"0\"\n ? data.discriminator\n : null;\n }\n /** Effective display name — global name, falling back to username. */\n public get displayName(): string {\n return this.globalName ?? this.username;\n }\n /** Returns the user's avatar URL, or null if they have no avatar. */\n public avatarURL(options: ImageURLOptions = {}): string | null {\n if (!this.avatar) return null;\n return cdnURL(`/avatars/${this.id}`, this.avatar, options);\n }\n /** Returns the default avatar URL based on the user's discriminator/snowflake. */\n public defaultAvatarURL(): string {\n const index = this.discriminator\n ? Number(this.discriminator) % 5\n : Number((BigInt(this.id) >> 22n) % 6n);\n return `${CDN_BASE}/embed/avatars/${index}.png`;\n }\n /** Returns the avatar URL if available, falling back to the default avatar URL. */\n public displayAvatarURL(options: ImageURLOptions = {}): string {\n return this.avatarURL(options) ?? this.defaultAvatarURL();\n }\n /** Returns the Discord mention string. Used automatically in template literals. */\n public override toString(): string {\n return `<@${this.id}>`;\n }\n}\n\n// ─── Channel ──────────────────────────────────────────────────────────────────\n\nexport class Channel extends BaseStructure {\n public type: number;\n public name?: string | null;\n public guildId?: string;\n public topic?: string | null;\n public parentId?: string | null;\n public nsfw?: boolean;\n public rateLimitPerUser?: number;\n public position?: number;\n /** Role and member permission overwrites (empty for DMs and when not provided). */\n public permissionOverwrites: import(\"@lunibee/types\").APIOverwrite[];\n readonly #context?: ResourceContext;\n\n /** Creates a channel structure from Discord channel data. */\n public constructor(\n data: import(\"@lunibee/types\").APIChannel,\n context?: ResourceContext,\n ) {\n super(data.id);\n if (!Number.isInteger(data.type) || data.type < 0)\n throw new RangeError(\n \"A Discord channel requires a valid channel type.\",\n );\n this.type = data.type;\n this.name = data.name;\n this.guildId = data.guild_id;\n this.topic = data.topic;\n this.parentId = data.parent_id;\n this.nsfw = data.nsfw;\n this.rateLimitPerUser = data.rate_limit_per_user;\n this.position = data.position;\n this.permissionOverwrites = (data.permission_overwrites ?? []).map(\n (overwrite) => ({ ...overwrite }),\n );\n this.#context = context;\n }\n\n /** Sends a message to this channel. @param options Message payload. @returns The created message. @throws {Error} If the channel is not attached to a client. */\n public sendMessage(\n options: Record<string, unknown> & { content?: string },\n ): Promise<import(\"./index.js\").Message> {\n if (!this.#context)\n throw new Error(\"This channel is not attached to a client.\");\n return this.#context.sendMessage(this.id, options);\n }\n\n /** Sends a message using Lunibee's concise channel API. @param options Message payload. @returns The created message. @throws {Error} If the channel is not attached to a client. */\n public send(\n options: Record<string, unknown> & { content?: string },\n ): Promise<import(\"./index.js\").Message> {\n return this.sendMessage(options);\n }\n\n /** Edits this channel. @param options Channel fields to change. @returns The updated channel. @throws {Error} If the channel is not attached to a client. */\n public edit(options: Record<string, unknown>): Promise<Channel> {\n if (!this.#context?.editChannel)\n throw new Error(\"This channel is not attached to a client.\");\n return this.#context.editChannel(this.id, options);\n }\n\n /** Changes only this channel's name. @param name New channel name. @returns The updated channel. @throws {TypeError} If the name is empty. @throws {Error} If the channel is not attached to a client. */\n public editName(name: string): Promise<Channel> {\n if (!name.trim()) throw new TypeError(\"Channel name cannot be empty.\");\n return this.edit({ name });\n }\n\n /** Changes only this channel's topic. @param topic New topic, or null to clear it. @returns The updated channel. @throws {Error} If the channel is not attached to a client. */\n public editTopic(topic: string | null): Promise<Channel> {\n return this.edit({ topic });\n }\n\n /** Moves this channel to another parent category. @param parentId Parent category ID, or null to remove the parent. @returns The updated channel. @throws {Error} If the channel is not attached to a client. */\n public editParent(parentId: string | null): Promise<Channel> {\n return this.edit({ parent_id: parentId });\n }\n\n /** Deletes this channel. @returns A promise fulfilled when Discord confirms deletion. @throws {Error} If the channel is not attached to a client. */\n public delete(): Promise<void> {\n if (!this.#context?.deleteChannel)\n throw new Error(\"This channel is not attached to a client.\");\n return this.#context.deleteChannel(this.id);\n }\n\n /** Updates this channel using the same resource operation as edit. @param options Channel fields to change. @returns The updated channel. @throws {Error} If the channel is not attached to a client. */\n public update(options: Record<string, unknown>): Promise<Channel> {\n return this.edit(options);\n }\n\n /** Whether this is a thread (announcement, public or private). */\n public isThread(): boolean {\n return this.type === 10 || this.type === 11 || this.type === 12;\n }\n\n /** Whether messages can be sent in this channel (text, DM, announcement, voice, stage, threads). */\n public isTextBased(): boolean {\n return [0, 1, 2, 3, 5, 10, 11, 12, 13].includes(this.type);\n }\n\n /** Whether this is a voice or stage channel. */\n public isVoiceBased(): boolean {\n return this.type === 2 || this.type === 13;\n }\n\n /** Whether this is a direct-message channel (DM or group DM). */\n public isDMBased(): boolean {\n return this.type === 1 || this.type === 3;\n }\n\n /** Returns the Discord channel mention string. Used automatically in template literals. */\n public override toString(): string {\n return `<#${this.id}>`;\n }\n}\n\n// ─── Guild ────────────────────────────────────────────────────────────────────\n\nexport class Guild extends BaseStructure {\n public name: string;\n public icon: string | null;\n public splash: string | null;\n public banner: string | null;\n public description: string | null;\n public preferredLocale: string;\n public ownerId?: string;\n public features: string[];\n public verificationLevel: number;\n public premiumTier: number;\n public premiumSubscriptionCount: number;\n public memberCount?: number;\n public approximateMemberCount?: number;\n public approximatePresenceCount?: number;\n public vanityUrlCode: string | null;\n public nsfwLevel: number;\n public discoverySplash: string | null;\n /** ID of the rules channel for Community guilds. */\n public rulesChannelId: string | null;\n /** ID of the system messages channel. */\n public systemChannelId: string | null;\n /** Bitfield of system channel flags. */\n public systemChannelFlags: number;\n /** Maximum number of members the guild can have. */\n public maxMembers: number;\n /** Required MFA level for administrators. */\n public mfaLevel: number;\n /** Explicit content filter level. */\n public explicitContentFilter: number;\n /** Default notification level for new members. */\n public defaultMessageNotifications: number;\n\n public constructor(data: import(\"@lunibee/types\").APIGuild) {\n super(data.id);\n if (!data.name) throw new TypeError(\"A Discord guild requires a name.\");\n this.name = data.name;\n this.icon = data.icon ?? null;\n this.splash = data.splash ?? null;\n this.banner = data.banner ?? null;\n this.description = data.description ?? null;\n this.preferredLocale = data.preferred_locale ?? \"en-US\";\n this.ownerId = data.owner_id;\n this.features = data.features ?? [];\n this.verificationLevel = data.verification_level ?? 0;\n this.premiumTier = data.premium_tier ?? 0;\n this.premiumSubscriptionCount = data.premium_subscription_count ?? 0;\n this.memberCount = data.member_count ?? data.approximate_member_count;\n this.approximateMemberCount = data.approximate_member_count;\n this.approximatePresenceCount = data.approximate_presence_count;\n this.vanityUrlCode = data.vanity_url_code ?? null;\n this.nsfwLevel = data.nsfw_level ?? 0;\n this.discoverySplash = data.discovery_splash ?? null;\n // NOTE (flagged to Arjun): these fields are read via a Record cast because\n // APIGuild in @lunibee/types does not yet declare rules_channel_id,\n // system_channel_id/flags, max_members, mfa_level, explicit_content_filter or\n // default_message_notifications. Runtime `??` fallbacks guard missing values.\n // Once APIGuild gains these fields (types-owner change), drop the cast.\n const d = data as unknown as Record<string, unknown>;\n this.rulesChannelId = (d.rules_channel_id as string | null) ?? null;\n this.systemChannelId = (d.system_channel_id as string | null) ?? null;\n this.systemChannelFlags =\n (d.system_channel_flags as number | undefined) ?? 0;\n this.maxMembers = (d.max_members as number | undefined) ?? 0;\n this.mfaLevel = (d.mfa_level as number | undefined) ?? 0;\n this.explicitContentFilter =\n (d.explicit_content_filter as number | undefined) ?? 0;\n this.defaultMessageNotifications =\n (d.default_message_notifications as number | undefined) ?? 0;\n }\n\n /** Returns the guild icon URL, or null if no icon is set. */\n public iconURL(options: ImageURLOptions = {}): string | null {\n if (!this.icon) return null;\n return cdnURL(`/icons/${this.id}`, this.icon, options);\n }\n\n /** Returns the guild splash URL, or null if none. */\n public splashURL(options: ImageURLOptions = {}): string | null {\n if (!this.splash) return null;\n return cdnURL(`/splashes/${this.id}`, this.splash, options);\n }\n\n /** Returns the guild banner URL, or null if none. */\n public bannerURL(options: ImageURLOptions = {}): string | null {\n if (!this.banner) return null;\n return cdnURL(`/banners/${this.id}`, this.banner, options);\n }\n\n /** Returns the guild discovery splash URL, or null if none. */\n public discoverySplashURL(options: ImageURLOptions = {}): string | null {\n if (!this.discoverySplash) return null;\n return cdnURL(\n `/discovery-splashes/${this.id}`,\n this.discoverySplash,\n options,\n );\n }\n\n /** Returns a widget image URL for the guild.\n * @param style Widget style: shield (default), banner1, banner2, banner3, banner4.\n */\n public widgetImageURL(\n style:\n \"shield\" | \"banner1\" | \"banner2\" | \"banner3\" | \"banner4\" = \"shield\",\n ): string {\n return `https://discord.com/api/guilds/${this.id}/widget.png?style=${style}`;\n }\n\n /** Whether the guild has a given feature flag. @param feature Feature string, e.g. \"COMMUNITY\". */\n public hasFeature(feature: string): boolean {\n return this.features.includes(feature);\n }\n\n /** Whether the guild is a Community server. */\n public get isCommunity(): boolean {\n return this.hasFeature(\"COMMUNITY\");\n }\n\n /** Whether the guild is an official Discord Partner. */\n public get isPartnered(): boolean {\n return this.hasFeature(\"PARTNERED\");\n }\n\n /** Whether the guild is verified by Discord. */\n public get isVerified(): boolean {\n return this.hasFeature(\"VERIFIED\");\n }\n\n /** Whether the guild has any active boost subscriptions. */\n public get isBoosted(): boolean {\n return this.premiumSubscriptionCount > 0;\n }\n\n /** Alias for premiumTier — the guild's current Nitro boost level (0–3). */\n public get boostLevel(): number {\n return this.premiumTier;\n }\n\n /** Whether the guild has a vanity URL. */\n public get hasVanityUrl(): boolean {\n return this.vanityUrlCode !== null;\n }\n\n /** Returns the guild's vanity invite URL, or null if none. */\n public get vanityURL(): string | null {\n return this.vanityUrlCode\n ? `https://discord.gg/${this.vanityUrlCode}`\n : null;\n }\n\n /** Returns a human-readable string representation. */\n public override toString(): string {\n return this.name;\n }\n}\n",
6
+ "/** Permission overwrite target types. */\nexport enum PermissionOverwriteType {\n Role = 0,\n Member = 1,\n}\n\n/** Lunibee idiomatic camelCase permission bitflags. */\nexport const Permission = {\n createInstantInvite: 1n << 0n,\n kickMembers: 1n << 1n,\n banMembers: 1n << 2n,\n administrator: 1n << 3n,\n manageChannels: 1n << 4n,\n manageGuild: 1n << 5n,\n addReactions: 1n << 6n,\n viewAuditLog: 1n << 7n,\n prioritySpeaker: 1n << 8n,\n stream: 1n << 9n,\n viewChannel: 1n << 10n,\n sendMessages: 1n << 11n,\n sendTTSMessages: 1n << 12n,\n manageMessages: 1n << 13n,\n embedLinks: 1n << 14n,\n attachFiles: 1n << 15n,\n readMessageHistory: 1n << 16n,\n mentionEveryone: 1n << 17n,\n useExternalEmojis: 1n << 18n,\n viewGuildInsights: 1n << 19n,\n connect: 1n << 20n,\n speak: 1n << 21n,\n muteMembers: 1n << 22n,\n deafenMembers: 1n << 23n,\n moveMembers: 1n << 24n,\n useVAD: 1n << 25n,\n changeNickname: 1n << 26n,\n manageNicknames: 1n << 27n,\n manageRoles: 1n << 28n,\n manageWebhooks: 1n << 29n,\n manageGuildExpressions: 1n << 30n,\n useApplicationCommands: 1n << 31n,\n requestToSpeak: 1n << 32n,\n manageEvents: 1n << 33n,\n manageThreads: 1n << 34n,\n createPublicThreads: 1n << 35n,\n createPrivateThreads: 1n << 36n,\n useExternalStickers: 1n << 37n,\n sendMessagesInThreads: 1n << 38n,\n useEmbeddedActivities: 1n << 39n,\n moderateMembers: 1n << 40n,\n viewCreatorMonetizationAnalytics: 1n << 41n,\n useSoundboard: 1n << 42n,\n createGuildExpressions: 1n << 43n,\n createEvents: 1n << 44n,\n useExternalSounds: 1n << 45n,\n sendVoiceMessages: 1n << 46n,\n setVoiceChannelStatus: 1n << 48n,\n sendPolls: 1n << 49n,\n useExternalApps: 1n << 50n,\n pinMessages: 1n << 51n,\n bypassSlowmode: 1n << 52n,\n} as const;\n\n/** Canonical PascalCase permission constants. */\nexport const Permissions = {\n CreateInstantInvite: 1n << 0n,\n KickMembers: 1n << 1n,\n BanMembers: 1n << 2n,\n Administrator: 1n << 3n,\n ManageChannels: 1n << 4n,\n ManageGuild: 1n << 5n,\n AddReactions: 1n << 6n,\n ViewAuditLog: 1n << 7n,\n PrioritySpeaker: 1n << 8n,\n Stream: 1n << 9n,\n ViewChannel: 1n << 10n,\n SendMessages: 1n << 11n,\n SendTTSMessages: 1n << 12n,\n ManageMessages: 1n << 13n,\n EmbedLinks: 1n << 14n,\n AttachFiles: 1n << 15n,\n ReadMessageHistory: 1n << 16n,\n MentionEveryone: 1n << 17n,\n UseExternalEmojis: 1n << 18n,\n ViewGuildInsights: 1n << 19n,\n Connect: 1n << 20n,\n Speak: 1n << 21n,\n MuteMembers: 1n << 22n,\n DeafenMembers: 1n << 23n,\n MoveMembers: 1n << 24n,\n UseVAD: 1n << 25n,\n ChangeNickname: 1n << 26n,\n ManageNicknames: 1n << 27n,\n ManageRoles: 1n << 28n,\n ManageWebhooks: 1n << 29n,\n ManageGuildExpressions: 1n << 30n,\n UseApplicationCommands: 1n << 31n,\n RequestToSpeak: 1n << 32n,\n ManageEvents: 1n << 33n,\n ManageThreads: 1n << 34n,\n CreatePublicThreads: 1n << 35n,\n CreatePrivateThreads: 1n << 36n,\n UseExternalStickers: 1n << 37n,\n SendMessagesInThreads: 1n << 38n,\n UseEmbeddedActivities: 1n << 39n,\n ModerateMembers: 1n << 40n,\n ViewCreatorMonetizationAnalytics: 1n << 41n,\n UseSoundboard: 1n << 42n,\n CreateGuildExpressions: 1n << 43n,\n CreateEvents: 1n << 44n,\n UseExternalSounds: 1n << 45n,\n SendVoiceMessages: 1n << 46n,\n SetVoiceChannelStatus: 1n << 48n,\n SendPolls: 1n << 49n,\n UseExternalApps: 1n << 50n,\n PinMessages: 1n << 51n,\n BypassSlowmode: 1n << 52n,\n} as const;\n\n/**\n * Permission flag bits with **bigint** values matching Discord's permission bit\n * positions. Mirrors discord.js's `PermissionFlagsBits`, so bitwise composition\n * (`Flags.A | Flags.B`) OR-s the bits instead of concatenating strings.\n *\n * Implemented as a `const` object rather than a TS `enum` because enums cannot\n * hold bigint members; the same-named union type below preserves usage as a type.\n */\nexport const PermissionFlagsBits = {\n CreateInstantInvite: 1n << 0n,\n KickMembers: 1n << 1n,\n BanMembers: 1n << 2n,\n Administrator: 1n << 3n,\n ManageChannels: 1n << 4n,\n ManageGuild: 1n << 5n,\n AddReactions: 1n << 6n,\n ViewAuditLog: 1n << 7n,\n PrioritySpeaker: 1n << 8n,\n Stream: 1n << 9n,\n ViewChannel: 1n << 10n,\n SendMessages: 1n << 11n,\n SendTTSMessages: 1n << 12n,\n ManageMessages: 1n << 13n,\n EmbedLinks: 1n << 14n,\n AttachFiles: 1n << 15n,\n ReadMessageHistory: 1n << 16n,\n MentionEveryone: 1n << 17n,\n UseExternalEmojis: 1n << 18n,\n ViewGuildInsights: 1n << 19n,\n Connect: 1n << 20n,\n Speak: 1n << 21n,\n MuteMembers: 1n << 22n,\n DeafenMembers: 1n << 23n,\n MoveMembers: 1n << 24n,\n UseVAD: 1n << 25n,\n ChangeNickname: 1n << 26n,\n ManageNicknames: 1n << 27n,\n ManageRoles: 1n << 28n,\n ManageWebhooks: 1n << 29n,\n ManageGuildExpressions: 1n << 30n,\n UseApplicationCommands: 1n << 31n,\n RequestToSpeak: 1n << 32n,\n ManageEvents: 1n << 33n,\n ManageThreads: 1n << 34n,\n CreatePublicThreads: 1n << 35n,\n CreatePrivateThreads: 1n << 36n,\n UseExternalStickers: 1n << 37n,\n SendMessagesInThreads: 1n << 38n,\n UseEmbeddedActivities: 1n << 39n,\n ModerateMembers: 1n << 40n,\n ViewCreatorMonetizationAnalytics: 1n << 41n,\n UseSoundboard: 1n << 42n,\n CreateGuildExpressions: 1n << 43n,\n CreateEvents: 1n << 44n,\n UseExternalSounds: 1n << 45n,\n SendVoiceMessages: 1n << 46n,\n SetVoiceChannelStatus: 1n << 48n,\n SendPolls: 1n << 49n,\n UseExternalApps: 1n << 50n,\n PinMessages: 1n << 51n,\n BypassSlowmode: 1n << 52n,\n} as const;\n\n/** Union of {@link PermissionFlagsBits} values (all bigint). */\nexport type PermissionFlagsBits =\n (typeof PermissionFlagsBits)[keyof typeof PermissionFlagsBits];\n\nexport type PermissionName =\n | keyof typeof Permission\n | keyof typeof Permissions\n | keyof typeof PermissionFlagsBits;\n\nexport type PermissionResolvable =\n | bigint\n | number\n | string\n | PermissionName\n | PermissionFlagsBits\n | PermissionSet\n | PermissionResolvable[];\n\n/** Immutable permission bitfield with direct boolean getters. */\nexport class PermissionSet {\n /** Permission bitfield. */\n public readonly bitfield: bigint;\n\n /** Creates a permission set. @param value Initial permission bitfield or array of permissions. @throws {RangeError} If the value is negative. @throws {TypeError} If the value is not a valid integer. */\n public constructor(value: PermissionResolvable = 0n) {\n try {\n if (Array.isArray(value)) {\n let bit = 0n;\n for (const item of value) {\n bit |= this.#resolve(item);\n }\n this.bitfield = bit;\n } else if (value instanceof PermissionSet) {\n this.bitfield = value.bitfield;\n } else {\n const bitfield = this.#resolve(value);\n if (bitfield < 0n)\n throw new RangeError(\n \"Permission bitfield cannot be negative.\",\n );\n this.bitfield = bitfield;\n }\n } catch (error) {\n if (error instanceof RangeError) throw error;\n throw new TypeError(\n \"Permission bitfield must be a valid non-negative integer.\",\n { cause: error },\n );\n }\n }\n\n // Direct camelCase boolean getters for instant checks (e.g. member.permissions.kickMembers)\n public get createInstantInvite(): boolean {\n return (\n (this.bitfield & Permission.createInstantInvite) ===\n Permission.createInstantInvite\n );\n }\n public get kickMembers(): boolean {\n return (\n (this.bitfield & Permission.kickMembers) === Permission.kickMembers\n );\n }\n public get banMembers(): boolean {\n return (\n (this.bitfield & Permission.banMembers) === Permission.banMembers\n );\n }\n public get administrator(): boolean {\n return (\n (this.bitfield & Permission.administrator) ===\n Permission.administrator\n );\n }\n public get manageChannels(): boolean {\n return (\n (this.bitfield & Permission.manageChannels) ===\n Permission.manageChannels\n );\n }\n public get manageGuild(): boolean {\n return (\n (this.bitfield & Permission.manageGuild) === Permission.manageGuild\n );\n }\n public get addReactions(): boolean {\n return (\n (this.bitfield & Permission.addReactions) ===\n Permission.addReactions\n );\n }\n public get viewAuditLog(): boolean {\n return (\n (this.bitfield & Permission.viewAuditLog) ===\n Permission.viewAuditLog\n );\n }\n public get prioritySpeaker(): boolean {\n return (\n (this.bitfield & Permission.prioritySpeaker) ===\n Permission.prioritySpeaker\n );\n }\n public get stream(): boolean {\n return (this.bitfield & Permission.stream) === Permission.stream;\n }\n public get viewChannel(): boolean {\n return (\n (this.bitfield & Permission.viewChannel) === Permission.viewChannel\n );\n }\n public get sendMessages(): boolean {\n return (\n (this.bitfield & Permission.sendMessages) ===\n Permission.sendMessages\n );\n }\n public get sendTTSMessages(): boolean {\n return (\n (this.bitfield & Permission.sendTTSMessages) ===\n Permission.sendTTSMessages\n );\n }\n public get manageMessages(): boolean {\n return (\n (this.bitfield & Permission.manageMessages) ===\n Permission.manageMessages\n );\n }\n public get embedLinks(): boolean {\n return (\n (this.bitfield & Permission.embedLinks) === Permission.embedLinks\n );\n }\n public get attachFiles(): boolean {\n return (\n (this.bitfield & Permission.attachFiles) === Permission.attachFiles\n );\n }\n public get readMessageHistory(): boolean {\n return (\n (this.bitfield & Permission.readMessageHistory) ===\n Permission.readMessageHistory\n );\n }\n public get mentionEveryone(): boolean {\n return (\n (this.bitfield & Permission.mentionEveryone) ===\n Permission.mentionEveryone\n );\n }\n public get useExternalEmojis(): boolean {\n return (\n (this.bitfield & Permission.useExternalEmojis) ===\n Permission.useExternalEmojis\n );\n }\n public get viewGuildInsights(): boolean {\n return (\n (this.bitfield & Permission.viewGuildInsights) ===\n Permission.viewGuildInsights\n );\n }\n public get connect(): boolean {\n return (this.bitfield & Permission.connect) === Permission.connect;\n }\n public get speak(): boolean {\n return (this.bitfield & Permission.speak) === Permission.speak;\n }\n public get muteMembers(): boolean {\n return (\n (this.bitfield & Permission.muteMembers) === Permission.muteMembers\n );\n }\n public get deafenMembers(): boolean {\n return (\n (this.bitfield & Permission.deafenMembers) ===\n Permission.deafenMembers\n );\n }\n public get moveMembers(): boolean {\n return (\n (this.bitfield & Permission.moveMembers) === Permission.moveMembers\n );\n }\n public get useVAD(): boolean {\n return (this.bitfield & Permission.useVAD) === Permission.useVAD;\n }\n public get changeNickname(): boolean {\n return (\n (this.bitfield & Permission.changeNickname) ===\n Permission.changeNickname\n );\n }\n public get manageNicknames(): boolean {\n return (\n (this.bitfield & Permission.manageNicknames) ===\n Permission.manageNicknames\n );\n }\n public get manageRoles(): boolean {\n return (\n (this.bitfield & Permission.manageRoles) === Permission.manageRoles\n );\n }\n public get manageWebhooks(): boolean {\n return (\n (this.bitfield & Permission.manageWebhooks) ===\n Permission.manageWebhooks\n );\n }\n public get manageGuildExpressions(): boolean {\n return (\n (this.bitfield & Permission.manageGuildExpressions) ===\n Permission.manageGuildExpressions\n );\n }\n public get useApplicationCommands(): boolean {\n return (\n (this.bitfield & Permission.useApplicationCommands) ===\n Permission.useApplicationCommands\n );\n }\n public get requestToSpeak(): boolean {\n return (\n (this.bitfield & Permission.requestToSpeak) ===\n Permission.requestToSpeak\n );\n }\n public get manageEvents(): boolean {\n return (\n (this.bitfield & Permission.manageEvents) ===\n Permission.manageEvents\n );\n }\n public get manageThreads(): boolean {\n return (\n (this.bitfield & Permission.manageThreads) ===\n Permission.manageThreads\n );\n }\n public get createPublicThreads(): boolean {\n return (\n (this.bitfield & Permission.createPublicThreads) ===\n Permission.createPublicThreads\n );\n }\n public get createPrivateThreads(): boolean {\n return (\n (this.bitfield & Permission.createPrivateThreads) ===\n Permission.createPrivateThreads\n );\n }\n public get useExternalStickers(): boolean {\n return (\n (this.bitfield & Permission.useExternalStickers) ===\n Permission.useExternalStickers\n );\n }\n public get sendMessagesInThreads(): boolean {\n return (\n (this.bitfield & Permission.sendMessagesInThreads) ===\n Permission.sendMessagesInThreads\n );\n }\n public get useEmbeddedActivities(): boolean {\n return (\n (this.bitfield & Permission.useEmbeddedActivities) ===\n Permission.useEmbeddedActivities\n );\n }\n public get moderateMembers(): boolean {\n return (\n (this.bitfield & Permission.moderateMembers) ===\n Permission.moderateMembers\n );\n }\n public get viewCreatorMonetizationAnalytics(): boolean {\n return (\n (this.bitfield & Permission.viewCreatorMonetizationAnalytics) ===\n Permission.viewCreatorMonetizationAnalytics\n );\n }\n public get useSoundboard(): boolean {\n return (\n (this.bitfield & Permission.useSoundboard) ===\n Permission.useSoundboard\n );\n }\n public get createGuildExpressions(): boolean {\n return (\n (this.bitfield & Permission.createGuildExpressions) ===\n Permission.createGuildExpressions\n );\n }\n public get createEvents(): boolean {\n return (\n (this.bitfield & Permission.createEvents) ===\n Permission.createEvents\n );\n }\n public get useExternalSounds(): boolean {\n return (\n (this.bitfield & Permission.useExternalSounds) ===\n Permission.useExternalSounds\n );\n }\n public get sendVoiceMessages(): boolean {\n return (\n (this.bitfield & Permission.sendVoiceMessages) ===\n Permission.sendVoiceMessages\n );\n }\n public get sendPolls(): boolean {\n return (this.bitfield & Permission.sendPolls) === Permission.sendPolls;\n }\n public get useExternalApps(): boolean {\n return (\n (this.bitfield & Permission.useExternalApps) ===\n Permission.useExternalApps\n );\n }\n\n /** Checks whether all supplied permissions are present (AND). @param permissions Permission names or raw bits. @returns True when every requested permission is present. */\n public has(...permissions: PermissionResolvable[]): boolean {\n if (permissions.length === 1) {\n const p = permissions[0]!;\n const bit = typeof p === \"bigint\" ? p : this.#resolve(p);\n return (this.bitfield & bit) === bit;\n }\n for (let i = 0; i < permissions.length; i++) {\n const p = permissions[i]!;\n const bit = typeof p === \"bigint\" ? p : this.#resolve(p);\n if ((this.bitfield & bit) !== bit) return false;\n }\n return true;\n }\n\n /** Checks whether any supplied permission is present (OR). @param permissions Permission names or raw bits. @returns True when at least one requested permission is present. */\n public any(...permissions: PermissionResolvable[]): boolean {\n if (permissions.length === 1) {\n const p = permissions[0]!;\n const bit = typeof p === \"bigint\" ? p : this.#resolve(p);\n return (this.bitfield & bit) !== 0n;\n }\n for (let i = 0; i < permissions.length; i++) {\n const p = permissions[i]!;\n const bit = typeof p === \"bigint\" ? p : this.#resolve(p);\n if ((this.bitfield & bit) !== 0n) return true;\n }\n return false;\n }\n\n /** Returns the known permission names from `permissions` that this set lacks. @param permissions Permission names or raw bits. */\n public missing(...permissions: PermissionResolvable[]): PermissionName[] {\n const wanted = new PermissionSet(permissions);\n return wanted.toArray().filter((name) => !this.has(name));\n }\n\n /** Returns a new set with permissions added. @param permissions Permission names or raw bits. @returns A new permission set. */\n public add(...permissions: PermissionResolvable[]): PermissionSet {\n let bitfield = this.bitfield;\n for (let i = 0; i < permissions.length; i++) {\n const p = permissions[i]!;\n bitfield |= typeof p === \"bigint\" ? p : this.#resolve(p);\n }\n return new PermissionSet(bitfield);\n }\n\n /** Returns a new set with permissions removed. @param permissions Permission names or raw bits. @returns A new permission set. */\n public remove(...permissions: PermissionResolvable[]): PermissionSet {\n let bitfield = this.bitfield;\n for (let i = 0; i < permissions.length; i++) {\n const p = permissions[i]!;\n bitfield &= ~(typeof p === \"bigint\" ? p : this.#resolve(p));\n }\n return new PermissionSet(bitfield);\n }\n\n /** Checks equality with another permission set or raw bitfield. @param other Permission set or raw bitfield. @returns True when both values are equal. */\n public equals(other: PermissionSet | bigint | number | string): boolean {\n return (\n this.bitfield ===\n (other instanceof PermissionSet\n ? other.bitfield\n : new PermissionSet(other).bitfield)\n );\n }\n\n /** Returns the decimal permission representation. @returns Decimal permission bitfield. */\n public toString(): string {\n return this.bitfield.toString();\n }\n\n /** Returns known permission names contained in this set. @returns Names of all enabled known permissions. */\n public toArray(): PermissionName[] {\n return (Object.keys(Permission) as PermissionName[]).filter(\n (permission) => this.has(permission),\n );\n }\n\n /** Resolves a named permission, enum value, or raw bit. @param permission Permission name, enum value, or raw bit. @returns Numeric permission bit. */\n #resolve(permission: PermissionResolvable): bigint {\n if (typeof permission === \"bigint\") return permission;\n if (typeof permission === \"number\") return BigInt(permission);\n if (permission instanceof PermissionSet) return permission.bitfield;\n if (Array.isArray(permission)) {\n let bit = 0n;\n for (let i = 0; i < permission.length; i++)\n bit |= this.#resolve(permission[i]!);\n return bit;\n }\n if (typeof permission === \"string\") {\n if (permission in Permission)\n return (Permission as Record<string, bigint>)[permission]!;\n if (permission in Permissions)\n return (Permissions as Record<string, bigint>)[permission]!;\n if (permission in PermissionFlagsBits)\n return (PermissionFlagsBits as Record<string, bigint>)[\n permission\n ]!;\n const lower =\n permission.charAt(0).toLowerCase() + permission.slice(1);\n if (lower in Permission)\n return (Permission as Record<string, bigint>)[lower]!;\n return BigInt(permission);\n }\n return 0n;\n }\n}\n\n/** Permissions bitfield alias. */\nexport class PermissionsBitField extends PermissionSet {\n /** Permission flags bits enum. */\n public static readonly Flags = PermissionFlagsBits;\n /** Permission flags constants. */\n public static readonly All = Permission;\n\n /** Creates a permissions bitfield. @param value Initial permission bitfield or array of permissions. */\n public constructor(value: PermissionResolvable = 0n) {\n super(value);\n }\n}\n\n/** Every known permission bit. */\nconst ALL_PERMISSIONS = Object.values(Permission).reduce(\n (bits, bit) => bits | bit,\n 0n,\n);\n\n/** A role as needed for permission resolution. */\nexport interface PermissionRole {\n id: string;\n permissions: PermissionResolvable;\n}\n\n/** A channel permission overwrite (Discord's `permission_overwrites` entry). */\nexport interface PermissionOverwrite {\n id: string;\n type: PermissionOverwriteType | number;\n allow: PermissionResolvable;\n deny: PermissionResolvable;\n}\n\n/** Everything needed to resolve a member's permissions. */\nexport interface PermissionContext {\n guildId: string;\n /** Guild owner ID; the owner has every permission. */\n ownerId?: string;\n memberId: string;\n memberRoleIds: readonly string[];\n /** Guild roles, including `@everyone` (whose ID is the guild ID). */\n roles: readonly PermissionRole[];\n /** Channel overwrites; omit for guild-level permissions. */\n overwrites?: readonly PermissionOverwrite[];\n}\n\nconst bits = (value: PermissionResolvable): bigint =>\n new PermissionSet(value).bitfield;\n\n/**\n * Resolves a member's effective permissions the way Discord does: base\n * permissions from `@everyone` and the member's roles (owner and\n * administrator get everything), then the channel's `@everyone` overwrite,\n * the combined role overwrites, and finally the member overwrite.\n */\nexport function computePermissions(context: PermissionContext): PermissionSet {\n if (context.ownerId !== undefined && context.ownerId === context.memberId)\n return new PermissionSet(ALL_PERMISSIONS);\n const roles = new Map(context.roles.map((role) => [role.id, role]));\n let base = bits(roles.get(context.guildId)?.permissions ?? 0n);\n for (const id of context.memberRoleIds)\n base |= bits(roles.get(id)?.permissions ?? 0n);\n if (base & Permission.administrator)\n return new PermissionSet(ALL_PERMISSIONS);\n const overwrites = context.overwrites ?? [];\n const everyone = overwrites.find((o) => o.id === context.guildId);\n if (everyone) base = (base & ~bits(everyone.deny)) | bits(everyone.allow);\n const memberRoles = new Set(context.memberRoleIds);\n let allow = 0n;\n let deny = 0n;\n for (const overwrite of overwrites)\n if (\n overwrite.type === PermissionOverwriteType.Role &&\n overwrite.id !== context.guildId &&\n memberRoles.has(overwrite.id)\n ) {\n allow |= bits(overwrite.allow);\n deny |= bits(overwrite.deny);\n }\n base = (base & ~deny) | allow;\n const member = overwrites.find(\n (o) =>\n o.type === PermissionOverwriteType.Member &&\n o.id === context.memberId,\n );\n if (member) base = (base & ~bits(member.deny)) | bits(member.allow);\n return new PermissionSet(base);\n}\n",
7
+ "// ─── Gateway Intents ─────────────────────────────────────────────────────────\n\n/** Gateway intent bit flags supported by Discord (PascalCase). */\nexport const GatewayIntentBits = {\n Guilds: 1 << 0,\n GuildMembers: 1 << 1,\n GuildModeration: 1 << 2,\n GuildExpressions: 1 << 3,\n GuildIntegrations: 1 << 4,\n GuildWebhooks: 1 << 5,\n GuildInvites: 1 << 6,\n GuildVoiceStates: 1 << 7,\n GuildPresences: 1 << 8,\n GuildMessages: 1 << 9,\n GuildMessageReactions: 1 << 10,\n GuildMessageTyping: 1 << 11,\n DirectMessages: 1 << 12,\n DirectMessageReactions: 1 << 13,\n DirectMessageTyping: 1 << 14,\n MessageContent: 1 << 15,\n GuildScheduledEvents: 1 << 16,\n AutoModerationConfiguration: 1 << 20,\n AutoModerationExecution: 1 << 21,\n GuildMessagePolls: 1 << 24,\n DirectMessagePolls: 1 << 25,\n} as const;\n\n/** Idiomatic camelCase Gateway intent bit flags supported by Discord. */\nexport const IntentBits = {\n guild: 1 << 0,\n guilds: 1 << 0,\n guildMembers: 1 << 1,\n guildModeration: 1 << 2,\n guildBans: 1 << 2,\n guildExpressions: 1 << 3,\n guildEmojis: 1 << 3,\n guildEmojisAndStickers: 1 << 3,\n guildIntegrations: 1 << 4,\n guildWebhooks: 1 << 5,\n guildInvites: 1 << 6,\n guildVoiceStates: 1 << 7,\n guildPresences: 1 << 8,\n guildMessages: 1 << 9,\n guildMessage: 1 << 9,\n guildMessageReactions: 1 << 10,\n guildMessageTyping: 1 << 11,\n directMessages: 1 << 12,\n directMessageReactions: 1 << 13,\n directMessageTyping: 1 << 14,\n messageContent: 1 << 15,\n guildScheduledEvents: 1 << 16,\n autoModerationConfiguration: 1 << 20,\n autoModerationExecution: 1 << 21,\n guildMessagePolls: 1 << 24,\n directMessagePolls: 1 << 25,\n} as const;\n\n/** Alias for IntentBits. */\nexport const Intents = IntentBits;\n\n/** Gateway intent resolvable value (single bitfield, enum key, or array of bitfields/strings). */\nexport type GatewayIntentResolvable =\n | number\n | keyof typeof GatewayIntentBits\n | keyof typeof IntentBits\n | (\n | number\n | keyof typeof GatewayIntentBits\n | keyof typeof IntentBits\n | string\n )[]\n | { readonly bitfield: number };\n\n/** Resolves any GatewayIntentResolvable into a raw bitfield integer. */\nexport function resolveGatewayIntents(\n intents: GatewayIntentResolvable,\n): number {\n if (typeof intents === \"number\") return intents;\n if (intents && typeof intents === \"object\" && !Array.isArray(intents))\n return intents.bitfield;\n if (Array.isArray(intents)) {\n return intents.reduce<number>((acc, intent) => {\n return acc | resolveGatewayIntents(intent as any);\n }, 0);\n }\n if (typeof intents === \"string\") {\n if (intents in GatewayIntentBits)\n return (GatewayIntentBits as Record<string, number>)[intents]!;\n if (intents in IntentBits)\n return (IntentBits as Record<string, number>)[intents]!;\n const lower = intents.charAt(0).toLowerCase() + intents.slice(1);\n if (lower in IntentBits)\n return (IntentBits as Record<string, number>)[lower]!;\n const num = Number(intents);\n if (!Number.isNaN(num)) return num;\n }\n return 0;\n}\n\n/**\n * Discord.js-familiar intent bitfield.\n * @example new IntentsBitField([IntentsBitField.Flags.Guilds, \"GuildMessages\"])\n */\nexport class IntentsBitField {\n /** Intent flag values by name. */\n public static readonly Flags = GatewayIntentBits;\n /** Raw intent bitfield. */\n public bitfield: number;\n\n public constructor(bits: GatewayIntentResolvable = 0) {\n this.bitfield = resolveGatewayIntents(bits);\n }\n\n /** Whether every given intent is set. */\n public has(bits: GatewayIntentResolvable): boolean {\n const resolved = resolveGatewayIntents(bits);\n return (this.bitfield & resolved) === resolved;\n }\n\n /** Whether any given intent is set. */\n public any(bits: GatewayIntentResolvable): boolean {\n return (this.bitfield & resolveGatewayIntents(bits)) !== 0;\n }\n\n /** Adds intents in place. @returns This bitfield. */\n public add(...bits: GatewayIntentResolvable[]): this {\n for (const bit of bits) this.bitfield |= resolveGatewayIntents(bit);\n return this;\n }\n\n /** Removes intents in place. @returns This bitfield. */\n public remove(...bits: GatewayIntentResolvable[]): this {\n for (const bit of bits) this.bitfield &= ~resolveGatewayIntents(bit);\n return this;\n }\n\n /** Names of the set intents. */\n public toArray(): (keyof typeof GatewayIntentBits)[] {\n return (\n Object.keys(GatewayIntentBits) as (keyof typeof GatewayIntentBits)[]\n ).filter((name) => this.has(GatewayIntentBits[name]));\n }\n\n /** Whether this equals another bitfield. */\n public equals(bits: GatewayIntentResolvable): boolean {\n return this.bitfield === resolveGatewayIntents(bits);\n }\n\n public valueOf(): number {\n return this.bitfield;\n }\n\n public toJSON(): number {\n return this.bitfield;\n }\n}\n\n// ─── Gateway Config ───────────────────────────────────────────────────────────\n\n/** Gateway connection properties (OS, browser, device). */\nexport interface GatewayProperties {\n os?: string;\n browser?: string;\n device?: string;\n [key: string]: unknown;\n}\n/** Gateway presence activity. */\nexport interface GatewayPresenceActivity {\n name: string;\n type?: number;\n url?: string;\n state?: string;\n}\n/** Gateway presence data. */\nexport interface GatewayPresence {\n status?: \"online\" | \"dnd\" | \"idle\" | \"invisible\" | \"offline\";\n activities?: GatewayPresenceActivity[];\n afk?: boolean;\n since?: number | null;\n}\n/** Client configuration. */\nexport interface ClientOptions {\n token: string;\n intents: GatewayIntentResolvable;\n gateway?: GatewayOptions;\n rest?: RESTOptions;\n /** Opt-in bounded per-channel message cache. Messages are not cached by default. */\n messageCache?: { maxSize?: number; ttl?: number };\n /**\n * Which resources the client keeps from Gateway events. Everything is\n * cached by default; large bots can turn off what they do not read.\n * Events are still emitted either way.\n */\n cache?: {\n users?: boolean;\n members?: boolean;\n roles?: boolean;\n emojis?: boolean;\n };\n}\n/** Gateway connection configuration. */\nexport interface GatewayOptions {\n intents?: GatewayIntentResolvable;\n reconnect?: boolean;\n maxReconnectAttempts?: number;\n reconnectBaseDelay?: number;\n reconnectMaxDelay?: number;\n shardId?: number;\n shardCount?: number;\n properties?: GatewayProperties;\n presence?: GatewayPresence;\n}\n\n/** REST request configuration. */\nexport interface RESTOptions {\n timeout?: number;\n retries?: number;\n baseURL?: string;\n}\n",
8
+ "/** Discord API snowflake identifier. */\nexport type Snowflake = string;\n\nexport * from \"./gateway.js\";\nexport * from \"./gateway-events.js\";\n\n// ─── Core Discord Objects ─────────────────────────────────────────────────────\n\n/** Discord user object. */\nexport interface UserData {\n id: Snowflake;\n username: string;\n discriminator?: string;\n global_name?: string | null;\n avatar?: string | null;\n bot?: boolean;\n system?: boolean;\n public_flags?: number;\n}\n/** Current authenticated bot user. */\nexport type ClientUser = UserData;\n/** Discord Gateway payload envelope. */\nexport interface GatewayPayload<T = unknown> {\n op: number;\n d: T | null;\n s: number | null;\n t: string | null;\n}\n/** Generic Discord API error payload. */\nexport interface APIError {\n code?: number;\n message?: string;\n errors?: Record<string, unknown>;\n}\n\n// ─── Discord Flags & Enums ────────────────────────────────────────────────────\n\n/** Discord message flags. */\nexport const MessageFlags = {\n Crossposted: 1,\n IsCrosspost: 2,\n SuppressEmbeds: 4,\n SourceMessageDeleted: 8,\n Urgent: 16,\n HasThread: 32,\n Ephemeral: 64,\n Loading: 128,\n IsComponentsV2: 32768,\n} as const;\n\n/** Discord channel types. */\nexport const ChannelType = {\n GuildText: 0,\n DM: 1,\n GuildVoice: 2,\n GroupDM: 3,\n GuildCategory: 4,\n GuildAnnouncement: 5,\n AnnouncementThread: 10,\n PublicThread: 11,\n PrivateThread: 12,\n GuildStageVoice: 13,\n GuildDirectory: 14,\n GuildForum: 15,\n GuildMedia: 16,\n} as const;\n\n/** Discord component types. */\nexport const ComponentType = {\n ActionRow: 1,\n Button: 2,\n StringSelect: 3,\n TextInput: 4,\n UserSelect: 5,\n RoleSelect: 6,\n MentionableSelect: 7,\n ChannelSelect: 8,\n Section: 9,\n TextDisplay: 10,\n Thumbnail: 11,\n MediaGallery: 12,\n File: 13,\n Separator: 14,\n ContentInventoryEntry: 16,\n Container: 17,\n} as const;\n\n/** Discord button style types. */\nexport const ButtonStyle = {\n Primary: 1,\n Secondary: 2,\n Success: 3,\n Danger: 4,\n Link: 5,\n Premium: 6,\n} as const;\n\n/** Discord text input style types. */\nexport const TextInputStyle = {\n Short: 1,\n Paragraph: 2,\n} as const;\n\n/** Discord interaction response types. */\nexport const InteractionResponseType = {\n Pong: 1,\n ChannelMessage: 4,\n DeferredChannelMessage: 5,\n DeferredMessageUpdate: 6,\n MessageUpdate: 7,\n Autocomplete: 8,\n Modal: 9,\n} as const;\n\n/** Discord sticker format types. */\nexport const StickerFormatType = {\n PNG: 1,\n APNG: 2,\n Lottie: 3,\n GIF: 4,\n} as const;\n\n/** Discord sticker types. */\nexport const StickerType = {\n Standard: 1,\n Guild: 2,\n} as const;\n\n/** Discord verification levels. */\nexport const VerificationLevel = {\n None: 0,\n Low: 1,\n Medium: 2,\n High: 3,\n VeryHigh: 4,\n} as const;\n\n/** Discord premium tiers. */\nexport const PremiumTier = {\n None: 0,\n Tier1: 1,\n Tier2: 2,\n Tier3: 3,\n} as const;\n\n// ─── Embeds ───────────────────────────────────────────────────────────────────\n\n/** Raw Discord embed footer object. */\nexport interface APIEmbedFooter {\n text: string;\n icon_url?: string;\n proxy_icon_url?: string;\n}\n/** Raw Discord embed image/thumbnail/video object. */\nexport interface APIEmbedMedia {\n url: string;\n proxy_url?: string;\n height?: number;\n width?: number;\n}\n/** Raw Discord embed provider object. */\nexport interface APIEmbedProvider {\n name?: string;\n url?: string;\n}\n/** Raw Discord embed author object. */\nexport interface APIEmbedAuthor {\n name: string;\n url?: string;\n icon_url?: string;\n proxy_icon_url?: string;\n}\n/** Raw Discord embed field object. */\nexport interface APIEmbedField {\n name: string;\n value: string;\n inline?: boolean;\n}\n/** Raw Discord embed object. */\nexport interface APIEmbed {\n title?: string;\n type?: string;\n description?: string;\n url?: string;\n timestamp?: string;\n color?: number;\n footer?: APIEmbedFooter;\n image?: APIEmbedMedia;\n thumbnail?: APIEmbedMedia;\n video?: APIEmbedMedia;\n provider?: APIEmbedProvider;\n author?: APIEmbedAuthor;\n fields?: APIEmbedField[];\n}\n\n// ─── Message Components ───────────────────────────────────────────────────────\n\n/** Raw Discord select menu option. */\nexport interface APISelectMenuOption {\n label: string;\n value: string;\n description?: string;\n emoji?: APIPartialEmoji;\n default?: boolean;\n}\n/** Raw Discord emoji (partial, as used in components). */\nexport interface APIPartialEmoji {\n id?: Snowflake | null;\n name?: string | null;\n animated?: boolean;\n}\n/** Raw Discord button component. */\nexport interface APIButtonComponent {\n type: 2;\n style: number;\n label?: string;\n emoji?: APIPartialEmoji;\n custom_id?: string;\n url?: string;\n sku_id?: string;\n disabled?: boolean;\n}\n/** Raw Discord select menu component. */\nexport interface APISelectMenuComponent {\n type: 3 | 5 | 6 | 7 | 8;\n custom_id: string;\n options?: APISelectMenuOption[];\n channel_types?: number[];\n placeholder?: string;\n min_values?: number;\n max_values?: number;\n disabled?: boolean;\n}\n/** Raw Discord text input component. */\nexport interface APITextInputComponent {\n type: 4;\n custom_id: string;\n style: number;\n label: string;\n min_length?: number;\n max_length?: number;\n required?: boolean;\n value?: string;\n placeholder?: string;\n}\n/** Union of all raw message component types. */\nexport type APIMessageActionRowComponent =\n APIButtonComponent | APISelectMenuComponent | APITextInputComponent;\n/** Raw Discord action row component. */\nexport interface APIActionRowComponent {\n type: 1;\n id?: number;\n components: APIMessageActionRowComponent[];\n}\n/** Union including action rows and V2 components. */\nexport type APIMessageComponent =\n APIActionRowComponent | { type: Exclude<number, 1>; [key: string]: any };\n\n// ─── Attachments ─────────────────────────────────────────────────────────────\n\n/** Raw Discord attachment object. */\nexport interface APIAttachment {\n id: Snowflake;\n filename: string;\n description?: string | null;\n content_type?: string;\n size: number;\n url: string;\n proxy_url: string;\n height?: number | null;\n width?: number | null;\n ephemeral?: boolean;\n duration_secs?: number;\n waveform?: string;\n flags?: number;\n}\n\n// ─── Stickers ────────────────────────────────────────────────────────────────\n\n/** Compact sticker item as included in messages. */\nexport interface APIStickerItem {\n id: Snowflake;\n name: string;\n format_type: number;\n}\n/** Full Discord sticker object. */\nexport interface APISticker {\n id: Snowflake;\n pack_id?: Snowflake;\n name: string;\n description?: string | null;\n tags?: string;\n type: number;\n format_type: number;\n available?: boolean;\n guild_id?: Snowflake;\n user?: UserData;\n sort_value?: number;\n}\n\n// ─── Messages ────────────────────────────────────────────────────────────────\n\n/** Raw Discord message reference. */\nexport interface APIMessageReference {\n type?: number;\n message_id?: Snowflake;\n channel_id?: Snowflake;\n guild_id?: Snowflake;\n fail_if_not_exists?: boolean;\n}\n/** Raw Discord message reaction. */\nexport interface APIMessageReaction {\n count: number;\n count_details?: Record<string, number>;\n me?: boolean;\n me_burst?: boolean;\n emoji: APIPartialEmoji;\n burst_colors?: string[];\n}\n/** Raw Discord message object. */\nexport interface APIMessage {\n id: Snowflake;\n channel_id: Snowflake;\n author: UserData;\n content: string;\n timestamp?: string;\n edited_timestamp?: string | null;\n tts?: boolean;\n mention_everyone?: boolean;\n mentions?: UserData[];\n mention_roles?: Snowflake[];\n mention_channels?: Array<Record<string, unknown>>;\n attachments?: APIAttachment[];\n embeds?: APIEmbed[];\n reactions?: APIMessageReaction[];\n nonce?: string | number | null;\n pinned?: boolean;\n webhook_id?: Snowflake;\n type?: number;\n activity?: Record<string, unknown>;\n application?: Record<string, unknown>;\n application_id?: Snowflake;\n message_reference?: APIMessageReference;\n flags?: number;\n referenced_message?: APIMessage | null;\n interaction_metadata?: Record<string, unknown>;\n thread?: Record<string, unknown>;\n components?: APIMessageComponent[];\n sticker_items?: APIStickerItem[];\n stickers?: APISticker[];\n position?: number;\n role_subscription_data?: Record<string, unknown>;\n purchase_notification?: Record<string, unknown>;\n poll?: Record<string, unknown>;\n guild_id?: Snowflake;\n}\n\n// ─── Channels ────────────────────────────────────────────────────────────────\n\n/** Raw Discord channel object. */\nexport interface APIChannel {\n id: Snowflake;\n type: number;\n guild_id?: Snowflake;\n position?: number;\n permission_overwrites?: APIOverwrite[];\n name?: string | null;\n topic?: string | null;\n nsfw?: boolean;\n last_message_id?: Snowflake | null;\n bitrate?: number;\n user_limit?: number;\n rate_limit_per_user?: number;\n recipients?: UserData[];\n icon?: string | null;\n owner_id?: Snowflake;\n application_id?: Snowflake;\n parent_id?: Snowflake | null;\n last_pin_timestamp?: string | null;\n rtc_region?: string | null;\n video_quality_mode?: number;\n message_count?: number;\n member_count?: number;\n thread_metadata?: APIThreadMetadata;\n default_auto_archive_duration?: number;\n flags?: number;\n total_message_sent?: number;\n available_tags?: APIForumTag[];\n default_reaction_emoji?: APIPartialEmoji | null;\n default_thread_rate_limit_per_user?: number;\n default_sort_order?: number | null;\n default_forum_layout?: number;\n}\n\n/** Raw Discord thread metadata. */\nexport interface APIThreadMetadata {\n archived: boolean;\n auto_archive_duration: number;\n archive_timestamp: string;\n locked: boolean;\n invitable?: boolean;\n create_timestamp?: string | null;\n}\n\n/** Raw Discord forum tag. */\nexport interface APIForumTag {\n id: Snowflake;\n name: string;\n moderated: boolean;\n emoji_id?: Snowflake | null;\n emoji_name?: string | null;\n}\n\n/** Raw Discord thread member. */\nexport interface APIThreadMember {\n id?: Snowflake;\n user_id?: Snowflake;\n join_timestamp: string;\n flags: number;\n member?: APIGuildMember;\n}\n\n// ─── Roles ────────────────────────────────────────────────────────────────────\n\n/** Raw Discord role object. */\nexport interface APIRole {\n id: Snowflake;\n name: string;\n color: number;\n hoist: boolean;\n icon?: string | null;\n unicode_emoji?: string | null;\n position: number;\n permissions: string;\n managed: boolean;\n mentionable: boolean;\n tags?: Record<string, unknown>;\n flags?: number;\n}\n\n// ─── Emoji ────────────────────────────────────────────────────────────────────\n\n/** Raw Discord emoji object. */\nexport interface APIEmoji {\n id: Snowflake | null;\n name: string | null;\n roles?: Snowflake[];\n user?: UserData;\n require_colons?: boolean;\n managed?: boolean;\n animated?: boolean;\n available?: boolean;\n}\n\n// ─── Guilds ───────────────────────────────────────────────────────────────────\n\n/** Raw Discord guild object. */\nexport interface APIGuild {\n id: Snowflake;\n name: string;\n icon?: string | null;\n icon_hash?: string | null;\n splash?: string | null;\n discovery_splash?: string | null;\n owner?: boolean;\n owner_id?: Snowflake;\n permissions?: string;\n afk_channel_id?: Snowflake | null;\n afk_timeout?: number;\n widget_enabled?: boolean;\n widget_channel_id?: Snowflake | null;\n verification_level?: number;\n default_message_notifications?: number;\n explicit_content_filter?: number;\n roles?: APIRole[];\n emojis?: APIEmoji[];\n stickers?: APISticker[];\n features?: string[];\n mfa_level?: number;\n application_id?: Snowflake | null;\n system_channel_id?: Snowflake | null;\n system_channel_flags?: number;\n rules_channel_id?: Snowflake | null;\n max_presences?: number | null;\n max_members?: number;\n vanity_url_code?: string | null;\n description?: string | null;\n banner?: string | null;\n premium_tier?: number;\n premium_subscription_count?: number;\n preferred_locale?: string;\n public_updates_channel_id?: Snowflake | null;\n max_video_channel_users?: number;\n approximate_member_count?: number;\n approximate_presence_count?: number;\n nsfw_level?: number;\n safety_alerts_channel_id?: Snowflake | null;\n member_count?: number;\n}\n\n// ─── Welcome Screen ───────────────────────────────────────────────────────────\n\nexport interface APIWelcomeScreenChannel {\n channel_id: Snowflake;\n description: string;\n emoji_id: Snowflake | null;\n emoji_name: string | null;\n}\n\nexport interface APIGuildWelcomeScreen {\n description: string | null;\n welcome_channels: APIWelcomeScreenChannel[];\n}\n\n// ─── Guild Onboarding ─────────────────────────────────────────────────────────\n\nexport interface APIOnboardingPromptOption {\n id: Snowflake;\n channel_ids: Snowflake[];\n role_ids: Snowflake[];\n emoji?: APIPartialEmoji;\n title: string;\n description: string | null;\n}\n\nexport interface APIOnboardingPrompt {\n id: Snowflake;\n type: number;\n options: APIOnboardingPromptOption[];\n title: string;\n single_select: boolean;\n required: boolean;\n in_onboarding: boolean;\n}\n\nexport interface APIGuildOnboarding {\n guild_id: Snowflake;\n prompts: APIOnboardingPrompt[];\n default_channel_ids: Snowflake[];\n enabled: boolean;\n mode: number;\n}\n\n/** Raw Discord guild member object. */\nexport interface APIGuildMember {\n user: UserData;\n nick?: string | null;\n avatar?: string | null;\n roles: Snowflake[];\n joined_at: string;\n premium_since?: string | null;\n deaf?: boolean;\n mute?: boolean;\n flags?: number;\n pending?: boolean;\n permissions?: string;\n communication_disabled_until?: string | null;\n guild_id?: Snowflake;\n}\n\n// ─── Voice ────────────────────────────────────────────────────────────────────\n\n/** Raw Discord voice state object. */\nexport interface APIVoiceState {\n guild_id?: Snowflake;\n channel_id?: Snowflake | null;\n user_id: Snowflake;\n member?: APIGuildMember;\n session_id: string;\n deaf: boolean;\n mute: boolean;\n self_deaf: boolean;\n self_mute: boolean;\n self_stream?: boolean;\n self_video: boolean;\n suppress: boolean;\n request_to_speak_timestamp?: string | null;\n}\n\n/** Raw Discord voice server update event. */\nexport interface APIVoiceServerUpdate {\n token: string;\n guild_id: Snowflake;\n endpoint?: string | null;\n}\n\n// ─── Presence ────────────────────────────────────────────────────────────────\n\n/** Raw Discord activity object. */\nexport interface APIActivity {\n name: string;\n type: number;\n url?: string | null;\n created_at: number;\n state?: string | null;\n details?: string | null;\n emoji?: APIPartialEmoji | null;\n}\n\n/** Raw Discord presence update event. */\nexport interface APIPresenceUpdate {\n user: { id: Snowflake } & Partial<UserData>;\n guild_id: Snowflake;\n status: string;\n activities: APIActivity[];\n client_status: { desktop?: string; mobile?: string; web?: string };\n}\n\n// ─── Typing ───────────────────────────────────────────────────────────────────\n\n/** Raw Discord typing start event. */\nexport interface APITypingStart {\n channel_id: Snowflake;\n guild_id?: Snowflake;\n user_id: Snowflake;\n timestamp: number;\n member?: APIGuildMember;\n}\n\n// ─── Guilds ──────────────────────────────────────────────────────────────────\n\n/** Raw Discord guild preview. */\nexport interface APIGuildPreview {\n id: Snowflake;\n name: string;\n icon: string | null;\n splash: string | null;\n discovery_splash: string | null;\n emojis: unknown[];\n features: string[];\n approximate_member_count: number;\n approximate_presence_count: number;\n description: string | null;\n stickers: unknown[];\n}\n\n// ─── Invites ─────────────────────────────────────────────────────────────────\n\n/** Raw Discord invite. */\nexport interface APIInvite {\n code: string;\n guild?: Partial<APIGuild>;\n channel: Partial<APIChannel>;\n inviter?: UserData;\n target_type?: number;\n target_user?: UserData;\n approximate_presence_count?: number;\n approximate_member_count?: number;\n}\n\n/** Raw Discord invite create event. */\nexport interface APIInviteCreate {\n channel_id: Snowflake;\n code: string;\n created_at: string;\n guild_id?: Snowflake;\n inviter?: UserData;\n max_age: number;\n max_uses: number;\n target_type?: number;\n target_user?: UserData;\n temporary: boolean;\n uses: number;\n}\n\n/** Raw Discord invite delete event. */\nexport interface APIInviteDelete {\n channel_id: Snowflake;\n guild_id?: Snowflake;\n code: string;\n}\n\n// ─── Webhooks ────────────────────────────────────────────────────────────────\n\n/** Raw Discord webhooks update event. */\nexport interface APIWebhooksUpdate {\n guild_id: Snowflake;\n channel_id: Snowflake;\n}\n\n/** Raw Discord webhook object. */\nexport interface APIWebhook {\n id: Snowflake;\n type: number;\n guild_id?: Snowflake | null;\n channel_id?: Snowflake | null;\n user?: UserData;\n name?: string | null;\n avatar?: string | null;\n token?: string;\n application_id?: Snowflake | null;\n url?: string;\n}\n\n// ─── AutoMod ─────────────────────────────────────────────────────────────────\n\n/** Raw Discord AutoMod action. */\nexport interface APIAutoModerationAction {\n type: number;\n metadata?: {\n channel_id?: Snowflake;\n duration_seconds?: number;\n custom_message?: string;\n };\n}\n\n// ─── Audit Logs ──────────────────────────────────────────────────────────────\n\n/** Raw Discord audit log change object. */\nexport interface APIAuditLogChange {\n new_value?: unknown;\n old_value?: unknown;\n key: string;\n}\n\n/** Raw Discord audit log entry options object. */\nexport interface APIAuditLogOptions {\n app_id?: Snowflake;\n auto_moderation_rule_name?: string;\n auto_moderation_rule_trigger_type?: string;\n channel_id?: Snowflake;\n count?: string;\n delete_member_days?: string;\n id?: Snowflake;\n members_removed?: string;\n message_id?: Snowflake;\n role_name?: string;\n type?: string;\n integration_type?: string;\n}\n\n/** Raw Discord audit log entry object. */\nexport interface APIAuditLogEntry {\n target_id: string | null;\n changes?: APIAuditLogChange[];\n user_id: Snowflake | null;\n id: Snowflake;\n action_type: number;\n options?: APIAuditLogOptions;\n reason?: string;\n}\n\n/** Raw Discord audit log object. */\nexport interface APIAuditLog {\n audit_log_entries: APIAuditLogEntry[];\n guild_scheduled_events: APIGuildScheduledEvent[];\n integrations: Array<Record<string, unknown>>;\n threads: APIChannel[];\n users: UserData[];\n webhooks: APIWebhook[];\n application_commands: APIApplicationCommand[];\n auto_moderation_rules: APIAutoModerationRule[];\n}\n\n/** Raw Discord AutoMod rule object. */\nexport interface APIAutoModerationRule {\n id: Snowflake;\n guild_id: Snowflake;\n name: string;\n creator_id: Snowflake;\n event_type: number;\n trigger_type: number;\n trigger_metadata: Record<string, unknown>;\n actions: APIAutoModerationAction[];\n enabled: boolean;\n exempt_roles: Snowflake[];\n exempt_channels: Snowflake[];\n}\n\n/** Raw Discord AutoMod action execution event. */\nexport interface APIAutoModerationActionExecution {\n guild_id: Snowflake;\n action: APIAutoModerationAction;\n rule_id: Snowflake;\n rule_trigger_type: number;\n user_id: Snowflake;\n channel_id?: Snowflake;\n message_id?: Snowflake;\n alert_system_message_id?: Snowflake;\n content: string;\n matched_keyword?: string | null;\n matched_content?: string | null;\n}\n\n// ─── Scheduled Events ─────────────────────────────────────────────────────────\n\n/** Raw Discord guild scheduled event entity metadata. */\nexport interface APIGuildScheduledEventEntityMetadata {\n location?: string;\n}\n\n/** Raw Discord guild scheduled event object. */\nexport interface APIGuildScheduledEvent {\n id: Snowflake;\n guild_id: Snowflake;\n channel_id?: Snowflake | null;\n creator_id?: Snowflake | null;\n name: string;\n description?: string | null;\n scheduled_start_time: string;\n scheduled_end_time?: string | null;\n privacy_level: number;\n status: number;\n entity_type: number;\n entity_id?: Snowflake | null;\n entity_metadata?: APIGuildScheduledEventEntityMetadata | null;\n creator?: UserData;\n user_count?: number;\n image?: string | null;\n}\n\n// ─── Stage Instances ─────────────────────────────────────────────────────────\n\n/** Raw Discord stage instance object. */\nexport interface APIStageInstance {\n id: Snowflake;\n guild_id: Snowflake;\n channel_id: Snowflake;\n topic: string;\n privacy_level: number;\n discoverable_disabled?: boolean;\n guild_scheduled_event_id?: Snowflake | null;\n}\n\n// ─── Application Commands ─────────────────────────────────────────────────────\n\n/** Discord application command option types. */\nexport const ApplicationCommandOptionType = {\n SubCommand: 1,\n SubCommandGroup: 2,\n String: 3,\n Integer: 4,\n Boolean: 5,\n User: 6,\n Channel: 7,\n Role: 8,\n Mentionable: 9,\n Number: 10,\n Attachment: 11,\n} as const;\n\n/** Discord application command types. */\nexport const ApplicationCommandType = {\n ChatInput: 1,\n User: 2,\n Message: 3,\n} as const;\n\n/** Raw Discord application command option. */\nexport interface APIApplicationCommandOption {\n type: number;\n name: string;\n description: string;\n required?: boolean;\n choices?: Array<{ name: string; value: string | number }>;\n options?: APIApplicationCommandOption[];\n min_value?: number;\n max_value?: number;\n min_length?: number;\n max_length?: number;\n autocomplete?: boolean;\n channel_types?: number[];\n}\n\n/** Raw Discord application command object (from API). */\nexport interface APIApplicationCommand {\n id: Snowflake;\n type?: number;\n application_id: Snowflake;\n guild_id?: Snowflake;\n name: string;\n description: string;\n options?: APIApplicationCommandOption[];\n default_member_permissions?: string | null;\n dm_permission?: boolean;\n nsfw?: boolean;\n version: Snowflake;\n}\n\n/** Data for creating/overwriting an application command. */\nexport interface ApplicationCommandData {\n name: string;\n description: string;\n type?: number;\n options?: APIApplicationCommandOption[];\n default_member_permissions?: string | null;\n dm_permission?: boolean;\n nsfw?: boolean;\n}\n\n/** A channel permission overwrite for a role (type 0) or member (type 1). */\nexport interface APIOverwrite {\n id: Snowflake;\n type: 0 | 1;\n /** Allowed permission bits as a decimal string. */\n allow: string;\n /** Denied permission bits as a decimal string. */\n deny: string;\n}\n\n// ─── Soundboard & Monetization ───────────────────────────────────────────────\n/** Raw Discord soundboard sound. */\nexport interface APISoundboardSound {\n sound_id: string;\n name: string;\n volume: number;\n emoji_id: string | null;\n emoji_name: string | null;\n guild_id?: string;\n available: boolean;\n user?: UserData;\n}\n\n/** Raw Discord SKU. */\nexport interface APISKU {\n id: string;\n type: number;\n application_id: string;\n name: string;\n slug: string;\n flags: number;\n}\n\n/** Raw Discord entitlement. */\nexport interface APIEntitlement {\n id: string;\n sku_id: string;\n application_id: string;\n user_id?: string;\n guild_id?: string;\n type: number;\n deleted: boolean;\n starts_at?: string | null;\n ends_at?: string | null;\n consumed?: boolean;\n}\n\n/** Raw Discord subscription. */\nexport interface APISubscription {\n id: string;\n user_id: string;\n sku_ids: string[];\n entitlement_ids: string[];\n current_period_start: string;\n current_period_end: string;\n status: number;\n canceled_at: string | null;\n country?: string;\n}\n",
9
+ "/** Library version and source URL used for the Discord-compliant User-Agent. */\nimport packageJson from \"../package.json\" with { type: \"json\" };\nconst LIBRARY_VERSION = packageJson.version;\nconst LIBRARY_URL = \"https://github.com/Ekretos/lunibee\";\nconst USER_AGENT = `DiscordBot (${LIBRARY_URL}, ${packageJson.version})`;\n\nimport {\n MemoryRateLimitStore,\n type RateLimitStore,\n type BucketState,\n} from \"./store.js\";\nimport { RESTError, abortError, redactPath, sleep } from \"./errors.js\";\nimport {\n createRouteKey,\n serializeQuery,\n type RESTQuery,\n type RouteKey,\n} from \"./route.js\";\nimport { RequestScheduler } from \"./scheduler.js\";\nimport { RateLimiter } from \"./limiter.js\";\nimport { HttpTransport, TransportError } from \"./transport.js\";\nimport { ResponseDecoder } from \"./decoder.js\";\n\n/** Internal state shared by requests mapped to one Discord rate-limit bucket. */\ntype Bucket = { remaining: number; resetAt: number };\n/** A file attachment sent as part of a multipart REST request. */\nexport interface RESTFileAttachment {\n name: string;\n data: Blob | Uint8Array | ArrayBuffer;\n contentType?: string;\n}\n\n/**\n * Options controlling an individual REST request.\n *\n * Lunibee's canonical call shape is positional (`post(path, body)`); these options\n * add the Discord.js-`@discordjs/rest`-familiar per-request knobs (`query`, `headers`,\n * `reason`, `auth`) additively without changing that positional default.\n */\nexport interface RESTRequestOptions {\n /** Abort signal used to cancel the request and any queued wait. */ signal?: AbortSignal;\n /** Query-string appended to the path (`URLSearchParams`, a record, or a raw string). */ query?: RESTQuery;\n /** Extra request headers merged in (library headers such as `Authorization` win). */ headers?: Record<\n string,\n string\n >;\n /** Audit-log reason, sent as the `X-Audit-Log-Reason` header. */ reason?: string;\n /** Set `false` to omit the `Authorization` header for this request. Defaults to `true`. */ auth?: boolean;\n}\n\n/**\n * Discord.js-familiar request payload. Superset of {@link RESTRequestOptions} that also\n * carries the `body` and `files`, matching `@discordjs/rest`'s `RequestData`. It powers the\n * additive `method(path, { body })` overloads without breaking the positional signature.\n */\nexport interface RequestData extends RESTRequestOptions {\n /** Request body. Encoded as JSON unless `files` are present (then multipart). */ body?: unknown;\n /** File attachments; presence upgrades the request to `multipart/form-data`. */ files?: RESTFileAttachment[];\n}\n\n/** Keys recognised on a {@link RequestData} wrapper, used to disambiguate it from a raw body. */\nconst REQUEST_DATA_KEYS = new Set([\n \"body\",\n \"files\",\n \"query\",\n \"headers\",\n \"reason\",\n \"auth\",\n \"signal\",\n]);\n\n/**\n * Detects a Discord.js-style `RequestData` wrapper so verb helpers can accept both\n * `post(path, rawBody)` (Lunibee-canonical) and `post(path, { body })` (Discord.js-familiar).\n * Conservative by design: only a plain object whose every own key is a known `RequestData`\n * key counts — a raw Discord payload (which always carries entity keys like `content`/`name`)\n * never matches, so existing positional callers are unaffected.\n */\nfunction isRequestData(value: unknown): value is RequestData {\n if (value === null || typeof value !== \"object\") return false;\n if (Array.isArray(value)) return false;\n if (typeof FormData !== \"undefined\" && value instanceof FormData)\n return false;\n if (\n value instanceof Blob ||\n value instanceof Uint8Array ||\n value instanceof ArrayBuffer\n )\n return false;\n const keys = Object.keys(value);\n if (keys.length === 0) return false;\n return keys.every((key) => REQUEST_DATA_KEYS.has(key));\n}\n\n// ─── REST Hooks ───────────────────────────────────────────────────────────────\n\n/** Context passed to `RESTHooks.onRequest`. */\nexport interface RESTRequestContext {\n method: string;\n path: string;\n attempt: number;\n}\n/** Context passed to `RESTHooks.onResponse`. */\nexport interface RESTResponseContext {\n method: string;\n path: string;\n status: number;\n durationMs: number;\n}\n/** Context passed to `RESTHooks.onRateLimit`. */\nexport interface RESTRateLimitContext {\n method: string;\n path: string;\n retryAfterMs: number;\n global: boolean;\n bucket?: string;\n}\n/** Context passed to `RESTHooks.onRetry`. */\nexport interface RESTRetryContext {\n method: string;\n path: string;\n attempt: number;\n status: number;\n delayMs: number;\n}\n\n/**\n * Lightweight callback hooks for REST request lifecycle events.\n *\n * All callbacks are optional. They are dispatched in isolation from the request\n * path (deferred to a microtask, and any thrown error is swallowed), so a hook\n * cannot break or reject a request. Even so, hooks **must** be fast and\n * non-blocking: heavy synchronous work in a hook still steals event-loop time\n * from in-flight requests. Offload anything expensive to your own queue.\n */\nexport interface RESTHooks {\n /** Called just before every HTTP attempt. */\n onRequest?(ctx: RESTRequestContext): void;\n /** Called after a successful or failed response is received. */\n onResponse?(ctx: RESTResponseContext): void;\n /** Called when a rate limit is encountered and the client is about to wait. */\n onRateLimit?(ctx: RESTRateLimitContext): void;\n /** Called when a failed request is about to be retried. */\n onRetry?(ctx: RESTRetryContext): void;\n}\n\n/** Configures which REST failures may be retried. */\nexport interface RetryPolicy {\n /** Maximum retry attempts. */ maxRetries: number;\n /** Determines whether a request may be retried. @param method HTTP method. @param status HTTP status, or zero for transport errors. @returns True when retrying is safe under the policy. */ shouldRetry(\n method: string,\n status: number,\n ): boolean;\n /** Calculates delay before the next attempt. @param attempt Zero-based retry number. @param retryAfter Server-provided delay, when available. @returns Delay in milliseconds. */ getDelay(\n attempt: number,\n retryAfter?: number,\n ): number;\n}\n/** Creates the default conservative REST retry policy. @param maxRetries Maximum retries. @returns Retry policy that retries rate limits and idempotent transient failures. @throws {TypeError} If maxRetries is negative or not finite. */\nexport function createRetryPolicy(maxRetries = 2): RetryPolicy {\n if (!Number.isFinite(maxRetries) || maxRetries < 0)\n throw new TypeError(\"maxRetries must be a non-negative finite number.\");\n return {\n maxRetries: Math.floor(maxRetries),\n shouldRetry(method, status) {\n const normalized = method.toUpperCase();\n const idempotent = [\"GET\", \"HEAD\", \"PUT\", \"DELETE\"].includes(\n normalized,\n );\n // Status 0 is a transport failure (DNS, reset connection, TLS):\n // no response reached Discord's handlers, so replaying an\n // idempotent request is as safe as replaying it after a 5xx.\n if (status === 0) return idempotent;\n return (\n status === 429 || (status >= 500 && status <= 599 && idempotent)\n );\n },\n getDelay(attempt, retryAfter) {\n if (retryAfter !== undefined) return Math.max(0, retryAfter * 1000);\n return Math.min(10_000, 500 * 2 ** attempt) + Math.random() * 250;\n },\n };\n}\n\n/** Bun-native REST transport with Discord bucket-aware rate limiting, retries, and cancellation. */\nexport class REST {\n readonly #retryPolicy: RetryPolicy;\n #token?: string;\n /** Rate-limit state: when a request may go out, what a response says. */\n readonly #limiter: RateLimiter;\n /** Per-bucket ordering. */\n readonly #scheduler = new RequestScheduler();\n /** One HTTP attempt, with timeout and cancellation. */\n readonly #transport: HttpTransport;\n /** Response payload and error metadata. */\n readonly #decoder = new ResponseDecoder();\n #hooks: RESTHooks = {};\n /** Whether requests on a known bucket may run concurrently. */\n readonly #concurrentBuckets: boolean;\n /** Creates a REST transport. @param options Transport configuration. @throws {TypeError} If retry configuration is invalid. */\n public constructor(\n options: {\n token?: string;\n timeout?: number;\n retries?: number;\n retryPolicy?: RetryPolicy;\n baseURL?: string;\n hooks?: RESTHooks;\n store?: RateLimitStore;\n /** Replaces the HTTP stage, e.g. with a recording transport in tests. */\n transport?: HttpTransport;\n /**\n * Lets requests on a bucket whose limit is known run concurrently, up\n * to its `remaining` allowance, instead of one at a time. Requires a\n * store with `reserve`. Requests on one bucket may then complete out\n * of order (e.g. messages to one channel). Defaults to `false`.\n */\n concurrentBuckets?: boolean;\n } = {},\n ) {\n this.#token = options.token;\n this.#retryPolicy =\n options.retryPolicy ?? createRetryPolicy(options.retries ?? 2);\n this.#transport =\n options.transport ??\n new HttpTransport({\n baseURL: options.baseURL,\n timeout: options.timeout,\n });\n const store = options.store ?? new MemoryRateLimitStore();\n this.#concurrentBuckets =\n (options.concurrentBuckets ?? false) &&\n typeof store.reserve === \"function\";\n this.#limiter = new RateLimiter(store, {\n concurrent: this.#concurrentBuckets,\n });\n if (options.hooks) this.#hooks = options.hooks;\n }\n /** The rate-limit store backing this transport. */\n public get store(): RateLimitStore {\n return this.#limiter.store;\n }\n /** Replaces the current hook set. Pass an empty object to clear all hooks. */\n public setHooks(hooks: RESTHooks): this {\n this.#hooks = hooks;\n return this;\n }\n /** Sets the authentication token. @param token Discord bot token. @returns Nothing. @throws {TypeError} If token is empty. */\n public setToken(token: string): void {\n if (!token.trim())\n throw new TypeError(\"A Discord bot token is required.\");\n this.#token = token;\n }\n /** Executes an HTTP request with Discord bucket/global rate limits, retry handling, and AbortSignal support.\n * Accepts a JSON body, a FormData body (for file uploads), or undefined.\n * @param method HTTP method.\n * @param path API path.\n * @param body Optional JSON body, FormData for file uploads, or undefined.\n * @param options Request options: cancellation `signal` plus the Discord.js-familiar\n * `query`, `headers`, `reason`, `auth`, and `files` (which upgrade to multipart).\n * @returns Decoded response body.\n * @throws {RESTError} If Discord or transport rejects the request.\n */\n public async request<T>(\n method: string,\n path: string,\n body?: unknown,\n options: RequestData = {},\n ): Promise<T> {\n if (!method.toUpperCase())\n throw new TypeError(\"REST method is required.\");\n if (!path.startsWith(\"/\"))\n throw new TypeError(\"REST paths must start with '/'.\");\n const route = createRouteKey(method, path);\n // Upgrade to multipart when file attachments are supplied via options.\n const files = options.files;\n if (files && files.length > 0 && !(body instanceof FormData))\n body = this.#fileForm(body, files);\n const query = serializeQuery(options.query);\n const requestPath = query ? `${path}${query}` : path;\n\n // Discord scopes a rate limit by (bucket hash, major parameter): two\n // channels sharing an endpoint have independent limits, while two\n // different routes can share one hash. The key is therefore resolved\n // again once the slot is acquired, so a request that queued under its\n // route-derived key joins the shared bucket's queue if one was\n // discovered while it waited.\n return this.#scheduler.runResolved(\n () => this.#limiter.resolveBucketKey(route.route, route.major),\n options.signal,\n path,\n (bucketKey, release) =>\n this.#attempts<T>(\n route,\n requestPath,\n body,\n options,\n bucketKey,\n release,\n ),\n );\n }\n /**\n * Runs the retry loop for one scheduled request: acquire limits, send,\n * record what the response says, decode, and decide whether to try again.\n */\n async #attempts<T>(\n route: RouteKey,\n requestPath: string,\n body: unknown,\n options: RequestData,\n initialBucketKey: string,\n release: () => void,\n ): Promise<T> {\n const { method, path } = route;\n let bucketKey = initialBucketKey;\n for (\n let attempt = 0;\n attempt <= this.#retryPolicy.maxRetries;\n attempt++\n ) {\n await this.#limiter.acquire(bucketKey, options.signal, path);\n // The reservation already claimed this request's unit, so once the\n // bucket's window is known the next request need not wait for our\n // response. An unknown bucket stays serial until a response\n // reveals its limit.\n if (this.#concurrentBuckets) {\n const bucket = await this.#limiter.store.getBucket(bucketKey);\n if (bucket && bucket.resetAt > Date.now()) release();\n }\n this.#emit(this.#hooks.onRequest, { method, path, attempt });\n const requestStart = Date.now();\n let response: Response;\n try {\n response = await this.#transport.send({\n method,\n path: requestPath,\n headers: this.#headers(body, options),\n body: this.#encodeBody(body),\n signal: options.signal,\n });\n } catch (error) {\n if (error instanceof RESTError) throw error;\n if (options.signal?.aborted)\n throw abortError(path, options.signal.reason);\n const failure =\n error instanceof TransportError\n ? error\n : new TransportError(\n \"Discord REST request failed\",\n false,\n error,\n );\n if (\n !failure.timedOut &&\n attempt < this.#retryPolicy.maxRetries &&\n this.#retryPolicy.shouldRetry(method, 0)\n ) {\n await sleep(\n this.#retryPolicy.getDelay(attempt),\n options.signal,\n path,\n );\n continue;\n }\n throw new RESTError(failure.message, 0, undefined, undefined, {\n method,\n path,\n cause: failure.cause ?? failure,\n kind: failure.timedOut ? \"timeout\" : \"network\",\n });\n }\n this.#emit(this.#hooks.onResponse, {\n method,\n path,\n status: response.status,\n durationMs: Date.now() - requestStart,\n });\n bucketKey = await this.#limiter.applyResponse(\n response,\n bucketKey,\n route.route,\n route.major,\n );\n const payload = await this.#decoder.read(response);\n if (response.ok)\n return (response.status === 204 ? undefined : payload) as T;\n\n const data = this.#decoder.errorData(payload);\n const retryAfter =\n response.status === 429\n ? this.#decoder.retryAfter(response, data)\n : undefined;\n if (data.global && retryAfter !== undefined)\n await this.#limiter.noteGlobalReset(\n Date.now() + retryAfter * 1000,\n );\n // Fire for ANY 429, including a global limit that arrives without a\n // Retry-After header; fall back to 1s in that case.\n if (response.status === 429)\n this.#emit(this.#hooks.onRateLimit, {\n method,\n path,\n retryAfterMs: (retryAfter ?? 1) * 1000,\n global: data.global ?? false,\n bucket: await this.#limiter.store.getBucketHash(\n route.route,\n ),\n });\n if (\n attempt < this.#retryPolicy.maxRetries &&\n this.#retryPolicy.shouldRetry(method, response.status)\n ) {\n const delay = this.#retryPolicy.getDelay(attempt, retryAfter);\n this.#emit(this.#hooks.onRetry, {\n method,\n path,\n attempt,\n status: response.status,\n delayMs: delay,\n });\n await sleep(delay, options.signal, path);\n continue;\n }\n throw new RESTError(\n data.message ??\n response.statusText ??\n `Discord REST request failed with status ${response.status}`,\n response.status,\n data.code,\n payload,\n { method, path },\n );\n }\n throw new RESTError(\n \"Discord REST request exhausted its retry attempts\",\n 0,\n undefined,\n undefined,\n { method, path },\n );\n }\n /** Builds the header set for one attempt; library headers win over caller headers. */\n #headers(body: unknown, options: RequestData): Record<string, string> {\n const isFormData =\n typeof FormData !== \"undefined\" && body instanceof FormData;\n const headers: Record<string, string> = { ...options.headers };\n if (options.auth !== false && this.#token)\n headers[\"Authorization\"] = `Bot ${this.#token}`;\n headers[\"User-Agent\"] = USER_AGENT;\n if (options.reason !== undefined)\n headers[\"X-Audit-Log-Reason\"] = encodeURIComponent(options.reason);\n if (!isFormData) headers[\"Content-Type\"] = \"application/json\";\n return headers;\n }\n /** Encodes a body as multipart (passed through) or JSON. */\n #encodeBody(body: unknown): BodyInit | undefined {\n if (typeof FormData !== \"undefined\" && body instanceof FormData)\n return body;\n return body === undefined ? undefined : JSON.stringify(body);\n }\n /**\n * Normalizes a verb helper's second argument into `(body, options)`.\n * Supports both `verb(path, rawBody, options?)` (Lunibee-canonical positional) and the\n * Discord.js-familiar `verb(path, { body, query, headers, reason, files })` wrapper.\n */\n #dispatch<T>(\n method: string,\n path: string,\n bodyOrOptions?: unknown,\n options?: RequestData,\n ): Promise<T> {\n if (options === undefined && isRequestData(bodyOrOptions))\n return this.request<T>(\n method,\n path,\n bodyOrOptions.body,\n bodyOrOptions,\n );\n return this.request<T>(method, path, bodyOrOptions, options);\n }\n /** Sends a GET request. @param path API path. @param options Request options (`query`, `headers`, `signal`, …). @returns Decoded response. @throws {RESTError} When the request fails. */ public get<\n T,\n >(path: string, options?: RequestData): Promise<T> {\n return this.request<T>(\"GET\", path, options?.body, options);\n }\n /** Sends a POST request. Accepts a raw body (`post(path, body)`) or a Discord.js-familiar `post(path, { body })`. @param path API path. @param body Optional JSON body, or a `RequestData` wrapper. @param options Request options. @returns Decoded response. @throws {RESTError} When the request fails. */\n public post<T>(path: string, options: RequestData): Promise<T>;\n public post<T>(\n path: string,\n body?: unknown,\n options?: RequestData,\n ): Promise<T>;\n public post<T>(\n path: string,\n body?: unknown,\n options?: RequestData,\n ): Promise<T> {\n return this.#dispatch<T>(\"POST\", path, body, options);\n }\n /** Sends a PATCH request. Accepts a raw body (`patch(path, body)`) or a Discord.js-familiar `patch(path, { body })`. @param path API path. @param body Optional JSON body, or a `RequestData` wrapper. @param options Request options. @returns Decoded response. @throws {RESTError} When the request fails. */\n public patch<T>(path: string, options: RequestData): Promise<T>;\n public patch<T>(\n path: string,\n body?: unknown,\n options?: RequestData,\n ): Promise<T>;\n public patch<T>(\n path: string,\n body?: unknown,\n options?: RequestData,\n ): Promise<T> {\n return this.#dispatch<T>(\"PATCH\", path, body, options);\n }\n /** Sends a PUT request. Accepts a raw body (`put(path, body)`) or a Discord.js-familiar `put(path, { body })`. @param path API path. @param body Optional JSON body, or a `RequestData` wrapper. @param options Request options. @returns Decoded response. @throws {RESTError} When the request fails. */\n public put<T>(path: string, options: RequestData): Promise<T>;\n public put<T>(\n path: string,\n body?: unknown,\n options?: RequestData,\n ): Promise<T>;\n public put<T>(\n path: string,\n body?: unknown,\n options?: RequestData,\n ): Promise<T> {\n return this.#dispatch<T>(\"PUT\", path, body, options);\n }\n /** Sends a DELETE request. @param path API path. @param options Request options (`reason`, `headers`, `signal`, …). @returns Decoded response. @throws {RESTError} When the request fails. */ public delete<\n T,\n >(path: string, options?: RequestData): Promise<T> {\n return this.request<T>(\"DELETE\", path, options?.body, options);\n }\n /**\n * Builds a multipart form with a JSON payload and file attachments.\n */\n #fileForm(payload: unknown, files: RESTFileAttachment[]): FormData {\n const form = new FormData();\n form.append(\"payload_json\", JSON.stringify(payload));\n for (let i = 0; i < files.length; i++) {\n const file = files[i]!;\n const blob =\n file.data instanceof Blob\n ? file.data\n : new Blob([file.data as ArrayBuffer], {\n type: file.contentType ?? \"application/octet-stream\",\n });\n form.append(`files[${i}]`, blob, file.name);\n }\n return form;\n }\n\n /**\n * Sends a multipart/form-data POST request for file uploads.\n * Attaches a JSON payload as `payload_json` and files as additional fields.\n * @param path API path.\n * @param payload JSON payload (e.g. message content, embeds).\n * @param files Array of file attachments.\n * @param options Cancellation options.\n * @returns Decoded response.\n * @throws {RESTError} When the request fails.\n */\n public postWithFiles<T>(\n path: string,\n payload: unknown,\n files: RESTFileAttachment[],\n options?: RESTRequestOptions,\n ): Promise<T> {\n return this.request<T>(\n \"POST\",\n path,\n this.#fileForm(payload, files),\n options,\n );\n }\n\n /**\n * Sends a multipart/form-data PATCH request for editing messages with files.\n * @param path API path.\n * @param payload JSON payload.\n * @param files Array of file attachments.\n * @param options Cancellation options.\n * @returns Decoded response.\n * @throws {RESTError} When the request fails.\n */\n public patchWithFiles<T>(\n path: string,\n payload: unknown,\n files: RESTFileAttachment[],\n options?: RESTRequestOptions,\n ): Promise<T> {\n return this.request<T>(\n \"PATCH\",\n path,\n this.#fileForm(payload, files),\n options,\n );\n }\n /** Dispatches a lifecycle hook in isolation: deferred to a microtask so it\n * cannot block the request path, with any thrown error swallowed so a faulty\n * hook cannot reject the request. @param hook Optional callback. @param ctx Event context. */\n #emit<C>(hook: ((ctx: C) => void) | undefined, ctx: C): void {\n if (!hook) return;\n const withPath = ctx as { path?: unknown };\n if (typeof withPath.path === \"string\")\n ctx = { ...ctx, path: redactPath(withPath.path) };\n Promise.resolve()\n .then(() => hook(ctx))\n .catch(() => {});\n }\n}\n\nexport { Routes } from \"./routes.js\";\nexport {\n RESTError,\n abortError,\n redactPath,\n type RESTErrorKind,\n} from \"./errors.js\";\nexport {\n createRouteKey,\n normalizeRoutePath,\n majorParameter,\n scopeBucket,\n serializeQuery,\n type RouteKey,\n type RESTQuery,\n} from \"./route.js\";\nexport { RequestScheduler } from \"./scheduler.js\";\nexport { RateLimiter } from \"./limiter.js\";\nexport {\n HttpTransport,\n TransportError,\n type TransportRequest,\n type FetchLike,\n} from \"./transport.js\";\nexport { ResponseDecoder, type DecodedError } from \"./decoder.js\";\nexport {\n type RateLimitStore,\n type BucketState,\n type Reservation,\n MemoryRateLimitStore,\n} from \"./store.js\";\nexport {\n RedisRateLimitStore,\n type RedisRateLimitStoreOptions,\n type MinimalRedisClient,\n} from \"./redis.js\";\n\nexport {\n WebhookClient,\n type WebhookClientOptions,\n type WebhookMessageOptions,\n} from \"./webhook.js\";\n\n/**\n * Discord.js-familiar alias for {@link RESTError}. `@discordjs/rest` throws `DiscordAPIError`\n * on a Discord-rejected request; Lunibee keeps `RESTError` as the canonical class and exports\n * this alias so Discord.js-shaped `catch (err) { if (err instanceof DiscordAPIError) … }` works.\n */\nexport { RESTError as DiscordAPIError };\n",
10
+ "import { Manager, ResourceManager } from \"./base.js\";\nexport { Manager, ResourceManager } from \"./base.js\";\n/** Discord.js-familiar alias for {@link ResourceManager}. */\nexport { ResourceManager as CachedManager } from \"./base.js\";\nimport { Collection } from \"@lunibee/collection\";\nimport { REST, Routes } from \"@lunibee/rest\";\nimport {\n Channel,\n createChannel,\n Message,\n User,\n Guild,\n type ResourceContext,\n} from \"@lunibee/structures\";\nimport {\n MessageManager,\n type MessageCacheOptions,\n type MessageCreateOptions as ManagerMessageCreateOptions,\n} from \"./message.js\";\nimport { ThreadManager } from \"./thread.js\";\n\nexport { UserManager } from \"./user.js\";\nexport { GuildManager } from \"./guild.js\";\nexport type { AuditLogEntry, AuditLogResponse } from \"./guild.js\";\nexport { AuditLogEvent } from \"./guild.js\";\n\nexport type MessageCreateOptions = ManagerMessageCreateOptions;\nexport type MessageEditOptions = Record<string, unknown> & { content?: string };\n/** Discord only bulk-deletes messages younger than two weeks. */\nconst BULK_DELETE_MAX_AGE_MS = 14 * 24 * 60 * 60_000;\n/** Creation time (ms) encoded in a snowflake. */\nfunction snowflakeTime(id: string): number {\n return Number((BigInt(id) >> 22n) + 1_420_070_400_000n);\n}\nexport interface MessageFetchOptions {\n cache?: boolean;\n}\nexport interface MessageQueryOptions {\n before?: string;\n after?: string;\n around?: string;\n limit?: number;\n}\nexport interface MessageThreadOptions {\n name: string;\n autoArchiveDuration?: 60 | 1440 | 4320 | 10080;\n rateLimitPerUser?: number;\n}\nexport interface ReactionFetchOptions {\n limit?: number;\n after?: string;\n}\n\nexport interface ChannelCreateOptions extends Record<string, unknown> {\n name: string;\n type: number;\n guild_id?: string;\n parent_id?: string | null;\n}\nexport type ChannelEditOptions = Record<string, unknown>;\n\nimport { PermissionOverwriteManager } from \"./guild-resources.js\";\n\nexport class ChannelManager extends Manager<string, Channel> {\n readonly #rest: REST;\n readonly #context: ResourceContext;\n readonly #messageManagers = new Map<string, MessageManager>();\n readonly #messageCache?: MessageCacheOptions;\n /** @param options.messageCache Enables a bounded per-channel message cache; messages are not cached by default. */\n public constructor(\n rest: REST,\n options: { messageCache?: MessageCacheOptions } = {},\n ) {\n super();\n this.#rest = rest;\n this.#messageCache = options.messageCache;\n this.#context = {\n sendMessage: (channelId, options) => this.send(channelId, options),\n editMessage: (channelId, messageId, options) =>\n this.editMessage(channelId, messageId, options),\n deleteMessage: (channelId, messageId) =>\n this.deleteMessage(channelId, messageId),\n crosspostMessage: (channelId, messageId) =>\n this.crosspostMessage(channelId, messageId),\n editChannel: (channelId, options) => this.edit(channelId, options),\n deleteChannel: (channelId) => this.deleteChannel(channelId),\n addReaction: (channelId, messageId, emoji) =>\n this.addReaction(channelId, messageId, emoji),\n removeOwnReaction: (channelId, messageId, emoji) =>\n this.removeOwnReaction(channelId, messageId, emoji),\n removeReaction: (channelId, messageId, emoji, userId) =>\n this.removeReaction(channelId, messageId, emoji, userId),\n removeAllReactions: (channelId, messageId) =>\n this.removeAllReactions(channelId, messageId),\n pinMessage: (channelId, messageId) =>\n this.pinMessage(channelId, messageId),\n unpinMessage: (channelId, messageId) =>\n this.unpinMessage(channelId, messageId),\n };\n }\n public messages(channelId: string): MessageManager {\n let manager = this.#messageManagers.get(channelId);\n if (!manager) {\n manager = new MessageManager(\n this.#rest,\n this.#context,\n channelId,\n this.#messageCache,\n );\n this.#messageManagers.set(channelId, manager);\n }\n return manager;\n }\n /** Permission overwrite manager for a channel. */\n public permissionOverwrites(channelId: string): PermissionOverwriteManager {\n return new PermissionOverwriteManager(this.#rest, channelId);\n }\n public threads(channelId: string): ThreadManager {\n return new ThreadManager(this.#rest, this.#context, channelId);\n }\n /** Fetches a channel; concurrent fetches share a request and a stale result never overwrites newer state. */\n public fetch(channelId: string): Promise<Channel> {\n return this.fetchOnce(\n channelId,\n async () =>\n createChannel(\n await this.#rest.get<\n ConstructorParameters<typeof Channel>[0]\n >(Routes.channel(channelId)),\n this.#context,\n ),\n (channel) => this.#merge(channel),\n );\n }\n public async resolve(channelId: string): Promise<Channel> {\n return this.get(channelId) ?? this.fetch(channelId);\n }\n public upsert(data: ConstructorParameters<typeof Channel>[0]): Channel {\n return this.#merge(createChannel(data, this.#context));\n }\n /** Merges into the cached instance; a type change (e.g. text -> announcement) needs the new subclass. */\n #merge(channel: Channel): Channel {\n const existing = this.get(channel.id);\n if (existing && existing.type === channel.type) {\n Object.assign(existing, channel);\n return existing;\n }\n this.set(channel.id, channel);\n return channel;\n }\n public update(channel: Channel): this {\n return this.set(channel.id, channel);\n }\n /** Removes every cached channel that belongs to a guild. @returns Number removed. */\n public deleteGuildChannels(guildId: string): number {\n let removed = 0;\n for (const channel of this.values())\n if (channel.guildId === guildId && this.delete(channel.id))\n removed++;\n return removed;\n }\n /** Ends a poll now; returns the updated message. */\n public async endPoll(\n channelId: string,\n messageId: string,\n ): Promise<Message> {\n return this.messages(channelId).upsert(\n await this.#rest.post<ConstructorParameters<typeof Message>[0]>(\n Routes.pollExpire(channelId, messageId),\n ),\n );\n }\n /** Fetches users who voted for one poll answer. @param options.limit 1-100 (default 25). */\n public async fetchPollVoters(\n channelId: string,\n messageId: string,\n answerId: number,\n options: { after?: string; limit?: number } = {},\n ): Promise<User[]> {\n if (\n options.limit !== undefined &&\n (!Number.isInteger(options.limit) ||\n options.limit < 1 ||\n options.limit > 100)\n )\n throw new RangeError(\"Poll voter limit must be 1-100.\");\n const params = new URLSearchParams();\n if (options.after) params.set(\"after\", options.after);\n if (options.limit !== undefined)\n params.set(\"limit\", String(options.limit));\n const suffix = params.toString();\n const { users } = await this.#rest.get<{\n users: ConstructorParameters<typeof User>[0][];\n }>(\n `${Routes.pollAnswerVoters(channelId, messageId, answerId)}${suffix ? `?${suffix}` : \"\"}`,\n );\n return users.map((user) => new User(user));\n }\n /** Plays a soundboard sound in a voice channel the bot is connected to. */\n public async sendSoundboardSound(\n channelId: string,\n options: { soundId: string; sourceGuildId?: string },\n ): Promise<void> {\n await this.#rest.post(Routes.sendSoundboardSound(channelId), {\n sound_id: options.soundId,\n source_guild_id: options.sourceGuildId,\n });\n }\n /** Returns the message manager for a channel only if one already exists. */\n public cachedMessages(channelId: string): MessageManager | undefined {\n return this.#messageManagers.get(channelId);\n }\n public async create(\n guildId: string,\n options: ChannelCreateOptions,\n ): Promise<Channel> {\n return this.upsert(\n await this.#rest.post<ConstructorParameters<typeof Channel>[0]>(\n Routes.guildChannels(guildId),\n options,\n ),\n );\n }\n public async edit(\n channelId: string,\n options: ChannelEditOptions,\n ): Promise<Channel> {\n return this.upsert(\n await this.#rest.patch<ConstructorParameters<typeof Channel>[0]>(\n Routes.channel(channelId),\n options,\n ),\n );\n }\n\n public async deleteChannel(channelId: string): Promise<void> {\n await this.#rest.delete(Routes.channel(channelId));\n this.delete(channelId);\n }\n /** Evicts a channel, dropping its per-channel message manager with it.\n * Overrides {@link Manager.delete} so cache eviction driven by a Gateway\n * `CHANNEL_DELETE`/`THREAD_DELETE` — which calls `delete` rather than\n * {@link deleteChannel} — releases the message manager and its cached\n * messages too, instead of retaining them for the client's lifetime. */\n public override delete(channelId: string): boolean {\n this.#messageManagers.delete(channelId);\n return super.delete(channelId);\n }\n public send(\n channelId: string,\n options: MessageCreateOptions,\n ): Promise<Message> {\n return this.messages(channelId).send(options);\n }\n public sendMessage(\n channelId: string,\n options: MessageCreateOptions,\n ): Promise<Message> {\n return this.send(channelId, options);\n }\n public async fetchMessage(\n channelId: string,\n messageId: string,\n options: MessageFetchOptions = {},\n ): Promise<Message> {\n void options;\n return this.messages(channelId).fetch(messageId);\n }\n public fetchMessages(\n channelId: string,\n query: MessageQueryOptions | Iterable<string>,\n ): Promise<Message[]> {\n if (isMessageQuery(query)) {\n const params = new URLSearchParams();\n if (query.before) params.set(\"before\", query.before);\n if (query.after) params.set(\"after\", query.after);\n if (query.around) params.set(\"around\", query.around);\n if (query.limit !== undefined)\n params.set(\"limit\", String(query.limit));\n const suffix = params.toString();\n return this.#rest\n .get<ConstructorParameters<typeof Message>[0][]>(\n `${Routes.channelMessages(channelId)}${suffix ? `?${suffix}` : \"\"}`,\n )\n .then((data) =>\n data.map((item) => this.messages(channelId).upsert(item)),\n );\n }\n return this.messages(channelId).fetchMany(query);\n }\n public upsertMessage(\n data: ConstructorParameters<typeof Message>[0],\n ): Message {\n return this.messages(data.channel_id).upsert(data);\n }\n public async editMessage(\n channelId: string,\n messageId: string,\n options: MessageEditOptions,\n ): Promise<Message> {\n return this.messages(channelId).upsert(\n await this.#rest.patch<ConstructorParameters<typeof Message>[0]>(\n Routes.message(channelId, messageId),\n options,\n ),\n );\n }\n public async deleteMessage(\n channelId: string,\n messageId: string,\n ): Promise<void> {\n await this.#rest.delete(Routes.message(channelId, messageId));\n this.messages(channelId).delete(messageId);\n }\n public deleteCachedMessage(channelId: string, messageId: string): boolean {\n return this.messages(channelId).delete(messageId);\n }\n public async crosspostMessage(\n channelId: string,\n messageId: string,\n ): Promise<Message> {\n return this.messages(channelId).upsert(\n await this.#rest.post<ConstructorParameters<typeof Message>[0]>(\n Routes.crosspostMessage(channelId, messageId),\n ),\n );\n }\n /** Bulk-deletes messages in a channel. Duplicate IDs are ignored and a\n * single ID falls back to a normal delete.\n * @throws {RangeError} If no IDs or more than 100 are provided, or any\n * message is older than 14 days (Discord refuses to bulk-delete those). */\n public async bulkDeleteMessages(\n channelId: string,\n messageIds: Iterable<string>,\n ): Promise<void> {\n const ids = [...new Set(messageIds)];\n if (ids.length < 1 || ids.length > 100)\n throw new RangeError(\n \"bulkDelete requires between 1 and 100 message IDs.\",\n );\n if (ids.length === 1) return this.deleteMessage(channelId, ids[0]!);\n const cutoff = Date.now() - BULK_DELETE_MAX_AGE_MS;\n const tooOld = ids.filter((id) => snowflakeTime(id) < cutoff);\n if (tooOld.length)\n throw new RangeError(\n `bulkDelete cannot delete messages older than 14 days: ${tooOld.join(\", \")}`,\n );\n await this.#rest.post(Routes.channelBulkDelete(channelId), {\n messages: ids,\n });\n for (const id of ids) this.messages(channelId).delete(id);\n }\n /**\n * Iterates a channel's history newest-first, 100 messages per request,\n * starting before `before` (or the latest message) and stopping after\n * `limit` messages or at the start of the channel.\n */\n public async *iterateMessages(\n channelId: string,\n options: { before?: string; limit?: number } = {},\n ): AsyncGenerator<Message, void, undefined> {\n let before = options.before;\n let remaining = options.limit ?? Infinity;\n while (remaining > 0) {\n const page = await this.fetchMessages(channelId, {\n before,\n limit: Math.min(100, remaining),\n });\n for (const message of page) yield message;\n remaining -= page.length;\n if (page.length < 100) return;\n before = page.at(-1)!.id;\n }\n }\n public async addReaction(\n channelId: string,\n messageId: string,\n emoji: string,\n ): Promise<void> {\n // Discord's create-reaction endpoint is\n // PUT .../reactions/{emoji}/@me — the bare .../reactions/{emoji} path\n // is not a valid target for PUT.\n await this.#rest.put(\n `${Routes.messageReactions(channelId, messageId, emoji)}/@me`,\n );\n }\n public async fetchReactions(\n channelId: string,\n messageId: string,\n emoji: string,\n options: ReactionFetchOptions = {},\n ): Promise<User[]> {\n const params = new URLSearchParams();\n if (options.limit !== undefined)\n params.set(\"limit\", String(options.limit));\n if (options.after) params.set(\"after\", options.after);\n const suffix = params.toString();\n const data = await this.#rest.get<\n ConstructorParameters<typeof User>[0][]\n >(\n `${Routes.messageReactions(channelId, messageId, emoji)}${suffix ? `?${suffix}` : \"\"}`,\n );\n return data.map((user) => new User(user));\n }\n public async removeOwnReaction(\n channelId: string,\n messageId: string,\n emoji: string,\n ): Promise<void> {\n await this.#rest.delete(\n `${Routes.messageReactions(channelId, messageId, emoji)}/@me`,\n );\n }\n public async removeReaction(\n channelId: string,\n messageId: string,\n emoji: string,\n userId: string,\n ): Promise<void> {\n await this.#rest.delete(\n `${Routes.messageReactions(channelId, messageId, emoji)}/${userId}`,\n );\n }\n public async removeAllReactions(\n channelId: string,\n messageId: string,\n ): Promise<void> {\n await this.#rest.delete(\n Routes.messageReactionsAll(channelId, messageId),\n );\n }\n public async fetchPinnedMessages(channelId: string): Promise<Message[]> {\n const data = await this.#rest.get<\n ConstructorParameters<typeof Message>[0][]\n >(Routes.channelPins(channelId));\n return data.map((item) => this.messages(channelId).upsert(item));\n }\n public async pinMessage(\n channelId: string,\n messageId: string,\n ): Promise<void> {\n await this.#rest.put(Routes.channelPin(channelId, messageId));\n }\n public async unpinMessage(\n channelId: string,\n messageId: string,\n ): Promise<void> {\n await this.#rest.delete(Routes.channelPin(channelId, messageId));\n }\n public createThreadFromMessage(\n channelId: string,\n messageId: string,\n options: MessageThreadOptions,\n ): Promise<Channel> {\n return this.threads(channelId).createFromMessage(messageId, options);\n }\n /**\n * Fetches a page of messages with cursor metadata.\n * @param channelId Channel to fetch from.\n * @param options Page options — `before`, `after`, `around`, and `limit` (max 100).\n * @returns `{ messages, before, after, hasMore }` — use `before` or `after` as cursors for the next page.\n */\n public async fetchPage(\n channelId: string,\n options: MessageQueryOptions = {},\n ): Promise<{\n messages: Message[];\n before?: string;\n after?: string;\n hasMore: boolean;\n }> {\n const limit = Math.min(100, Math.max(1, options.limit ?? 50));\n const messages = await this.fetchMessages(channelId, {\n ...options,\n limit,\n });\n return {\n messages,\n before: messages[0]?.id,\n after: messages[messages.length - 1]?.id,\n hasMore: messages.length === limit,\n };\n }\n /**\n * Bulk-deletes 2–100 messages from a channel.\n * Only messages younger than 14 days are accepted by Discord.\n * @param channelId Channel to delete from.\n * @param messageIds Array of message IDs to delete.\n * @throws {RangeError} If fewer than 2 or more than 100 IDs are provided.\n */\n public async bulkDelete(\n channelId: string,\n messageIds: string[],\n ): Promise<void> {\n // Validation lives in bulkDeleteMessages so the public entry point is guarded too.\n return this.bulkDeleteMessages(channelId, messageIds);\n }\n public clear(): void {\n this.#messageManagers.clear();\n super.clear();\n }\n}\n\nfunction isMessageQuery(\n value: MessageQueryOptions | Iterable<string>,\n): value is MessageQueryOptions {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !(Symbol.iterator in value)\n );\n}\nexport type CreateMessageOptions = MessageCreateOptions;\nexport { MessageManager, type MessageCacheOptions } from \"./message.js\";\nexport { ThreadManager } from \"./thread.js\";\nexport {\n RoleManager,\n type RoleCreateOptions,\n type RoleEditOptions,\n} from \"./role.js\";\nexport {\n GuildMemberManager,\n type MemberEditOptions,\n type BanOptions,\n} from \"./member.js\";\nexport { ApplicationCommandManager } from \"./application.js\";\nexport {\n GuildBanManager,\n GuildScheduledEventManager,\n StageInstanceManager,\n PermissionOverwriteManager,\n type APIBan,\n type GuildBanCreateOptions,\n type GuildScheduledEventOptions,\n type StageInstanceCreateOptions,\n type PermissionOverwriteOptions,\n type PermissionOverwriteTargetType,\n} from \"./guild-resources.js\";\nexport {\n EmojiManager,\n type EmojiCreateOptions,\n type EmojiEditOptions,\n} from \"./emoji.js\";\nexport {\n GuildStickerManager,\n GuildSoundboardManager,\n MonetizationManager,\n type APIEntitlement,\n type APISKU,\n type APISoundboardSound,\n type APISubscription,\n type EntitlementQuery,\n type GuildStickerCreateOptions,\n type SoundboardSoundCreateOptions,\n} from \"./advanced.js\";\n",
10
11
  "/**\n * Discord Gateway close codes.\n *\n * Discord.js-familiar names and numeric values, matching the Discord Gateway\n * protocol. Exposed so consumers can branch on named codes instead of magic\n * numbers; {@link Gateway} uses them internally to decide resume/identify/stop.\n */\nexport const GatewayCloseCodes = {\n UnknownError: 4000,\n UnknownOpcode: 4001,\n DecodeError: 4002,\n NotAuthenticated: 4003,\n AuthenticationFailed: 4004,\n AlreadyAuthenticated: 4005,\n InvalidSeq: 4007,\n RateLimited: 4008,\n SessionTimedOut: 4009,\n InvalidShard: 4010,\n ShardingRequired: 4011,\n InvalidAPIVersion: 4012,\n InvalidIntents: 4013,\n DisallowedIntents: 4014,\n} as const;\n",
11
12
  "/**\n * Reconnect policy and scheduling for one Gateway connection.\n *\n * Owns how a close code is classified, whether another attempt is allowed, how\n * long to wait, and the coordination that keeps at most one logical connection\n * attempt in flight. It owns no socket, no session state, no heartbeat and no\n * event emission: it is told a close code and whether a resume is possible, and\n * answers with a decision.\n */\nimport { GatewayCloseCodes } from \"./close-codes.js\";\n\n/** What a closed connection should do next. */\nexport type CloseAction =\n /** Reconnect and RESUME the existing session. */\n | \"resume\"\n /** Reconnect, but IDENTIFY afresh: the session cannot be resumed. */\n | \"identify\"\n /** Do not reconnect; the condition will not fix itself. */\n | \"stop\";\n\n/**\n * Close codes that no reconnect can recover from: bad token, bad shard\n * configuration, bad API version, or intents the application is not approved\n * for. Retrying these hammers Discord with a request that cannot succeed.\n */\nexport const FATAL_CLOSE_CODES: readonly number[] = [\n GatewayCloseCodes.AuthenticationFailed,\n GatewayCloseCodes.InvalidShard,\n GatewayCloseCodes.ShardingRequired,\n GatewayCloseCodes.InvalidAPIVersion,\n GatewayCloseCodes.InvalidIntents,\n GatewayCloseCodes.DisallowedIntents,\n];\n\n/**\n * Close codes that keep the connection recoverable but destroy the session, so\n * the next connection must IDENTIFY rather than RESUME.\n */\nexport const IDENTIFY_CLOSE_CODES: readonly number[] = [\n GatewayCloseCodes.InvalidSeq,\n GatewayCloseCodes.SessionTimedOut,\n];\n\n/**\n * Classifies a close code.\n *\n * Any code outside the two tables above is **reconnectable**: transport-level\n * closes (`1006`), server restarts (`1001`), Discord's own `4000`, and the\n * `1000` the Gateway itself sends after a non-resumable `op 9` all belong here.\n * Whether that reconnect resumes or identifies is not a property of the code —\n * it is whether a session survives, which is why `canResume` is a parameter\n * rather than something this module works out for itself.\n *\n * @param code WebSocket close code.\n * @param canResume Whether the session can still be resumed.\n */\nexport function classifyCloseCode(\n code: number,\n canResume: boolean,\n): CloseAction {\n if (FATAL_CLOSE_CODES.includes(code)) return \"stop\";\n if (IDENTIFY_CLOSE_CODES.includes(code)) return \"identify\";\n return canResume ? \"resume\" : \"identify\";\n}\n\n/** Why a reconnect was not scheduled. */\nexport type ScheduleRefusal =\n /** Automatic reconnect is disabled for this Gateway. */\n | \"disabled\"\n /** A reconnect is already armed; a second would open a second socket. */\n | \"pending\"\n /** The attempt budget is spent. */\n | \"exhausted\";\n\n/** Outcome of asking for a reconnect. */\nexport type ScheduleResult =\n | { scheduled: true; delayMs: number; attempt: number }\n | { scheduled: false; reason: ScheduleRefusal };\n\n/** Configuration for {@link GatewayReconnect}. */\nexport interface ReconnectOptions {\n /** Whether automatic reconnect is permitted at all. */\n enabled: boolean;\n /** Maximum consecutive attempts before giving up. */\n maxAttempts: number;\n /** Delay for the first attempt, doubled per attempt. */\n baseDelay: number;\n /** Ceiling for the backoff. */\n maxDelay: number;\n /** Randomness source for jitter; injected in tests. */\n random?: () => number;\n}\n\n/** Reconnect scheduling, backoff and attempt coordination. */\nexport class GatewayReconnect {\n readonly #options: ReconnectOptions;\n readonly #random: () => number;\n #attempt = 0;\n #timer?: ReturnType<typeof setTimeout>;\n #promise?: Promise<void>;\n #resolve?: () => void;\n #reject?: (error: Error) => void;\n\n public constructor(options: ReconnectOptions) {\n this.#options = options;\n this.#random = options.random ?? Math.random;\n }\n\n /** Whether automatic reconnect is permitted. */\n public get enabled(): boolean {\n return this.#options.enabled;\n }\n\n /** Consecutive attempts made since the last {@link reset}. */\n public get attempts(): number {\n return this.#attempt;\n }\n\n /** Whether a reconnect timer is currently armed. */\n public get pending(): boolean {\n return this.#timer !== undefined;\n }\n\n /** Whether the attempt budget is spent. */\n public get exhausted(): boolean {\n return this.#attempt >= this.#options.maxAttempts;\n }\n\n /** Whether a connection attempt is currently in flight. */\n public get connecting(): boolean {\n return this.#promise !== undefined;\n }\n\n /** The in-flight attempt, or undefined when none is active. */\n public get attemptPromise(): Promise<void> | undefined {\n return this.#promise;\n }\n\n /** Classifies a close code against this Gateway's policy. */\n public classifyClose(code: number, canResume: boolean): CloseAction {\n return classifyCloseCode(code, canResume);\n }\n\n /** Whether another reconnect is currently allowed. */\n public canReconnect(): boolean {\n return this.#options.enabled && !this.exhausted;\n }\n\n /**\n * Arms a reconnect, unless one is already armed or no attempt is allowed.\n *\n * Refusing while `pending` is what keeps repeated closes from stacking\n * timers: several closes in a row produce one reconnect, not several\n * competing sockets.\n */\n public schedule(run: () => void): ScheduleResult {\n if (!this.#options.enabled)\n return { scheduled: false, reason: \"disabled\" };\n if (this.#timer) return { scheduled: false, reason: \"pending\" };\n if (this.exhausted) return { scheduled: false, reason: \"exhausted\" };\n\n const attempt = this.#attempt;\n const delay = Math.min(\n this.#options.maxDelay,\n this.#options.baseDelay * 2 ** this.#attempt++,\n );\n // Jitter must scale with the delay: a fixed ceiling would reconnect\n // every shard inside the same narrow window after a gateway-wide\n // restart, which is exactly when decorrelation matters.\n const jitter = this.#random() * Math.max(1, delay * 0.25);\n const delayMs = delay + jitter;\n this.#timer = setTimeout(() => {\n this.#timer = undefined;\n run();\n }, delayMs);\n return { scheduled: true, delayMs, attempt };\n }\n\n /** Cancels an armed reconnect. Safe to call when none is armed. */\n public cancel(): void {\n if (this.#timer) clearTimeout(this.#timer);\n this.#timer = undefined;\n }\n\n /** Clears the attempt counter after a connection succeeds. */\n public reset(): void {\n this.#attempt = 0;\n }\n\n /**\n * Coordinates one logical connection attempt.\n *\n * Callers that ask while an attempt is in flight join it instead of\n * starting a second: three `connect()` calls produce one socket attempt and\n * one shared promise.\n *\n * @param start Invoked exactly once, when this call begins a new attempt.\n */\n public attempt(start: () => void): Promise<void> {\n if (this.#promise) return this.#promise;\n this.#promise = new Promise<void>((resolve, reject) => {\n this.#resolve = resolve;\n this.#reject = reject;\n start();\n });\n return this.#promise;\n }\n\n /** Settles the in-flight attempt, resolving it or rejecting with `error`. */\n public settle(error?: Error): void {\n const resolve = this.#resolve;\n const reject = this.#reject;\n this.#resolve = undefined;\n this.#reject = undefined;\n this.#promise = undefined;\n if (error) reject?.(error);\n else resolve?.();\n }\n}\n",
12
13
  "import { BaseStructure, Channel, User, CDN_BASE, cdnURL } from \"./base.js\";\nimport { PermissionsBitField } from \"@lunibee/core\";\nimport type { ImageURLOptions } from \"./base.js\";\n\n/** Parses a Discord ISO timestamp into a Date, returning null for absent or invalid values. */\nfunction toDateOrNull(value?: string | null): Date | null {\n if (!value) return null;\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\n// ─── GuildMember ───────────────────────────────────────────────────────────────\n\n/** A Discord guild member. */\nexport class GuildMember {\n /** User represented by the member. */ public readonly user: User;\n /** Guild containing the member. */ public readonly guildId: string;\n /** Nickname, if configured. */ public nickname: string | null;\n /** Role IDs assigned to the member. */ public readonly roleIds: string[];\n /** Whether the member is pending membership screening. */ public pending: boolean;\n /** Member join timestamp. */ public joinedAt?: Date;\n /** Raw effective permission bitfield supplied by Discord. */ public readonly permissions: PermissionsBitField;\n /** Member-specific avatar hash, if set. */ public avatarHash:\n string | null;\n /** When the member started boosting the guild. */ public premiumSince: Date | null;\n /** When the member's timeout expires (null if not timed out). */ public timedOutUntil: Date | null;\n /** Member flags bitfield. */ public flags: number;\n\n /** Creates a guild member from Discord data. @param data Discord guild-member payload. @throws {TypeError} If the guild ID is invalid. @throws {RangeError} If joined_at is invalid. */\n public constructor(data: {\n user: {\n id: string;\n username: string;\n global_name?: string | null;\n avatar?: string | null;\n bot?: boolean;\n system?: boolean;\n public_flags?: number;\n discriminator?: string;\n };\n guild_id: string;\n nick?: string | null;\n roles?: string[];\n pending?: boolean;\n joined_at?: string;\n permissions?: string;\n avatar?: string | null;\n premium_since?: string | null;\n communication_disabled_until?: string | null;\n flags?: number;\n }) {\n this.user = new User(data.user);\n if (!/^\\d{1,20}$/.test(data.guild_id))\n throw new TypeError(\"Member guild_id must be a valid snowflake.\");\n this.guildId = data.guild_id;\n this.nickname = data.nick ?? null;\n this.roleIds = [...(data.roles ?? [])];\n this.pending = data.pending ?? false;\n this.joinedAt = data.joined_at ? new Date(data.joined_at) : undefined;\n if (this.joinedAt?.toString() === \"Invalid Date\")\n throw new RangeError(\"Member joined_at must be a valid date.\");\n this.permissions = new PermissionsBitField(data.permissions ?? 0n);\n this.avatarHash = data.avatar ?? null;\n // Like joinedAt, coerce malformed timestamps to null instead of an Invalid Date.\n this.premiumSince = toDateOrNull(data.premium_since);\n this.timedOutUntil = toDateOrNull(data.communication_disabled_until);\n this.flags = data.flags ?? 0;\n }\n\n /** Effective member display name — nickname, falling back to user display name. */\n public get displayName(): string {\n return this.nickname ?? this.user.displayName;\n }\n\n /** Whether this member is currently timed out. */\n public get isTimedOut(): boolean {\n return this.timedOutUntil !== null && this.timedOutUntil > new Date();\n }\n\n /** Returns the member-specific avatar URL, falling back to the user's avatar, or null if none. */\n public avatarURL(options: ImageURLOptions = {}): string | null {\n if (this.avatarHash)\n return cdnURL(\n `/guilds/${this.guildId}/users/${this.user.id}/avatars`,\n this.avatarHash,\n options,\n );\n // User always exposes avatarURL(); returns null when the user has no avatar.\n return this.user.avatarURL(options);\n }\n\n /** Returns the resolved avatar URL — member avatar, user avatar, or default. */\n public displayAvatarURL(options: ImageURLOptions = {}): string {\n return this.avatarURL(options) ?? this.user.displayAvatarURL(options);\n }\n\n /** Returns the Discord user mention for this member. */\n public toString(): string {\n return this.user.toString();\n }\n}\n\n// ─── Role ──────────────────────────────────────────────────────────────────────\n\n/** A Discord guild role. */\nexport class Role extends BaseStructure {\n /** Role name. */ public name: string;\n /** Role color as a 24-bit RGB integer. */ public color: number;\n /** Whether the role is hoisted. */ public hoist: boolean;\n /** Permission bitfield. */ public permissions: PermissionsBitField;\n /** Whether the role is managed by an integration. */ public managed: boolean;\n /** Whether the role is mentionable. */ public mentionable: boolean;\n /** Role position in the hierarchy. */ public position: number;\n /** Unicode emoji used as the role icon, if any. */ public unicodeEmoji:\n string | null;\n /** Hash of the role's custom icon image, if any. */ public iconHash:\n string | null;\n /** Role tags metadata (bot, premium subscriber, etc). */ public tags: Record<\n string,\n unknown\n > | null;\n\n /** Creates a role from Discord data. @param data Discord role payload. */\n public constructor(data: {\n id: string;\n name: string;\n color?: number;\n hoist?: boolean;\n permissions?: string;\n managed?: boolean;\n mentionable?: boolean;\n position?: number;\n unicode_emoji?: string | null;\n icon?: string | null;\n tags?: Record<string, unknown> | null;\n }) {\n super(data.id);\n if (!data.name) throw new TypeError(\"Role name cannot be empty.\");\n this.name = data.name;\n this.color = data.color ?? 0;\n this.hoist = data.hoist ?? false;\n this.permissions = new PermissionsBitField(data.permissions ?? 0n);\n this.managed = data.managed ?? false;\n this.mentionable = data.mentionable ?? false;\n this.position = data.position ?? 0;\n this.unicodeEmoji = data.unicode_emoji ?? null;\n this.iconHash = data.icon ?? null;\n this.tags = data.tags ?? null;\n }\n\n /** Returns the role's color as a `#RRGGBB` hex string. Returns `#000000` for colorless roles. */\n public get colorHex(): string {\n return `#${this.color.toString(16).padStart(6, \"0\").toUpperCase()}`;\n }\n\n /** Returns the role's custom icon URL, or null if the role has no icon. */\n public iconURL(options: ImageURLOptions = {}): string | null {\n if (!this.iconHash) return null;\n return cdnURL(`/role-icons/${this.id}`, this.iconHash, options);\n }\n\n /** Whether this is the `@everyone` base role (its ID equals the guild ID). */\n public isEveryone(guildId: string): boolean {\n return this.id === guildId;\n }\n\n /** Discord role mention string. Used automatically in template literals. */\n public override toString(): string {\n return `<@&${this.id}>`;\n }\n}\n\n// ─── TextChannel ──────────────────────────────────────────────────────────────\n\n/** A Discord text-capable channel. */\nexport class TextChannel extends Channel {\n /** Creates a text channel from Discord data. @param data Discord channel payload. */\n public constructor(\n data: {\n id: string;\n type: number;\n name?: string | null;\n parent_id?: string | null;\n guild_id?: string;\n } & Partial<import(\"@lunibee/types\").APIChannel>,\n context?: import(\"./base.js\").ResourceContext,\n ) {\n super(data, context);\n }\n /** Discord channel mention string. Used automatically in template literals. */\n public override toString(): string {\n return `<#${this.id}>`;\n }\n}\n\n// ─── Invite ───────────────────────────────────────────────────────────────────\n\n/** A Discord invite link and its metadata. */\nexport class Invite {\n /** Invite code (the unique part of the URL). */ public readonly code: string;\n /** Guild this invite belongs to, if any. */ public readonly guildId:\n string | null;\n /** Channel this invite points to, if any. */ public readonly channelId:\n string | null;\n /** User who created the invite, if available. */ public readonly inviter: User | null;\n /** Number of times the invite has been used. */ public uses: number;\n /** Maximum number of uses (0 = unlimited). */ public maxUses: number;\n /** Duration in seconds until the invite expires (0 = never). */ public maxAge: number;\n /** Whether the invite is temporary (kicks uninducted members on disconnect). */ public temporary: boolean;\n /** When the invite was created. */ public readonly createdAt: Date | null;\n /** When the invite expires, or null if it never expires. */ public readonly expiresAt: Date | null;\n\n /** Creates an invite from Discord data. */\n public constructor(data: {\n code: string;\n guild?: { id: string } | null;\n channel?: { id: string } | null;\n inviter?: {\n id: string;\n username: string;\n global_name?: string | null;\n avatar?: string | null;\n bot?: boolean;\n system?: boolean;\n public_flags?: number;\n discriminator?: string;\n } | null;\n uses?: number;\n max_uses?: number;\n max_age?: number;\n temporary?: boolean;\n created_at?: string | null;\n expires_at?: string | null;\n }) {\n if (!data.code) throw new TypeError(\"An invite requires a code.\");\n this.code = data.code;\n this.guildId = data.guild?.id ?? null;\n this.channelId = data.channel?.id ?? null;\n this.inviter = data.inviter ? new User(data.inviter) : null;\n this.uses = data.uses ?? 0;\n this.maxUses = data.max_uses ?? 0;\n this.maxAge = data.max_age ?? 0;\n this.temporary = data.temporary ?? false;\n this.createdAt = data.created_at ? new Date(data.created_at) : null;\n this.expiresAt = data.expires_at ? new Date(data.expires_at) : null;\n }\n\n /** The full invite URL. */\n public get url(): string {\n return `https://discord.gg/${this.code}`;\n }\n\n /** Returns the invite URL. Used automatically in template literals. */\n public toString(): string {\n return this.url;\n }\n}\n\n// ─── Webhook ──────────────────────────────────────────────────────────────────\n\n/** Webhook type constants. */\nexport const WebhookType = {\n Incoming: 1,\n ChannelFollower: 2,\n Application: 3,\n} as const;\n\n/** A Discord webhook — an HTTP endpoint that can post messages to a channel. */\nexport class Webhook extends BaseStructure {\n /** Webhook type. */ public readonly type: number;\n /** Webhook display name. */ public name: string | null;\n /** Webhook avatar hash. */ public avatarHash: string | null;\n /** Channel this webhook posts to. */ public readonly channelId:\n string | null;\n /** Guild this webhook belongs to. */ public readonly guildId:\n string | null;\n /** Application that created this webhook, if any. */ public readonly applicationId:\n string | null;\n /** Webhook token (only present for incoming webhooks). */ public readonly token:\n string | null;\n\n /** Creates a webhook from Discord data. */\n public constructor(data: {\n id: string;\n type?: number;\n name?: string | null;\n avatar?: string | null;\n channel_id?: string | null;\n guild_id?: string | null;\n application_id?: string | null;\n token?: string;\n }) {\n super(data.id);\n this.type = data.type ?? WebhookType.Incoming;\n this.name = data.name ?? null;\n this.avatarHash = data.avatar ?? null;\n this.channelId = data.channel_id ?? null;\n this.guildId = data.guild_id ?? null;\n this.applicationId = data.application_id ?? null;\n this.token = data.token ?? null;\n }\n\n /** Returns the webhook avatar URL, or null if no avatar is set. */\n public avatarURL(options: ImageURLOptions = {}): string | null {\n if (!this.avatarHash) return null;\n return cdnURL(`/avatars/${this.id}`, this.avatarHash, options);\n }\n\n /** Returns the webhook execution URL, or null if no token is set. */\n public get url(): string | null {\n return this.token\n ? `https://discord.com/api/webhooks/${this.id}/${this.token}`\n : null;\n }\n\n /** Returns the webhook URL or its ID as a string. */\n public override toString(): string {\n return this.url ?? this.id;\n }\n}\n\n// ─── Emoji ────────────────────────────────────────────────────────────────────\n\n/** A Discord emoji. */\nexport class Emoji extends BaseStructure {\n /** Emoji name. */ public name: string | null;\n /** Roles allowed to use this emoji. */ public roleIds: string[];\n /** User that created this emoji. */ public user: User | null;\n /** Whether this emoji must be wrapped in colons. */ public requireColons: boolean;\n /** Whether this emoji is managed. */ public managed: boolean;\n /** Whether this emoji is animated. */ public animated: boolean;\n /** Whether this emoji can be used, may be false due to loss of Server Boosts. */ public available: boolean;\n\n /** Creates an emoji from Discord data. */\n public constructor(data: {\n id: string | null;\n name: string | null;\n roles?: string[];\n user?: import(\"@lunibee/types\").UserData;\n require_colons?: boolean;\n managed?: boolean;\n animated?: boolean;\n available?: boolean;\n }) {\n // Unicode emoji have no snowflake: pass the base check with a\n // placeholder, then expose the documented \"unicode\" sentinel id.\n super(data.id ?? \"0\");\n if (data.id === null) (this as { id: string }).id = \"unicode\";\n this.name = data.name;\n this.roleIds = data.roles ?? [];\n this.user = data.user ? new User(data.user) : null;\n this.requireColons = data.require_colons ?? false;\n this.managed = data.managed ?? false;\n this.animated = data.animated ?? false;\n this.available = data.available ?? true;\n }\n\n /** Returns the URL for this emoji if it is custom, or null for unicode emojis. */\n public url(options: ImageURLOptions = {}): string | null {\n if (!this.id || this.id === \"unicode\") return null;\n const ext = options.extension ?? (this.animated ? \"gif\" : \"png\");\n const size = options.size ? `?size=${options.size}` : \"\";\n return `${CDN_BASE}/emojis/${this.id}.${ext}${size}`;\n }\n\n /** Returns the text required to render this emoji in Discord. */\n public override toString(): string {\n return this.id !== \"unicode\"\n ? `<${this.animated ? \"a\" : \"\"}:${this.name}:${this.id}>`\n : (this.name ?? \"\");\n }\n}\n\n// --- AutoModerationRule --------------------------------------------------------\n\n/** A Discord AutoModeration Rule. */\nexport class AutoModerationRule extends BaseStructure {\n public guildId: string;\n public name: string;\n public creatorId: string;\n public eventType: number;\n public triggerType: number;\n public triggerMetadata: Record<string, unknown>;\n public actions: import(\"@lunibee/types\").APIAutoModerationAction[];\n public enabled: boolean;\n public exemptRoles: string[];\n public exemptChannels: string[];\n\n /** Creates an auto moderation rule from Discord data. */\n public constructor(data: import(\"@lunibee/types\").APIAutoModerationRule) {\n super(data.id);\n if (!/^\\d{1,20}$/.test(data.guild_id))\n throw new TypeError(\n \"AutoModerationRule guild_id must be a valid snowflake.\",\n );\n this.guildId = data.guild_id;\n this.name = data.name;\n this.creatorId = data.creator_id;\n this.eventType = data.event_type;\n this.triggerType = data.trigger_type;\n this.triggerMetadata = data.trigger_metadata;\n this.actions = data.actions;\n this.enabled = data.enabled;\n this.exemptRoles = data.exempt_roles;\n this.exemptChannels = data.exempt_channels;\n }\n\n public toJSON(): Record<string, unknown> {\n return {\n id: this.id,\n guildId: this.guildId,\n name: this.name,\n creatorId: this.creatorId,\n eventType: this.eventType,\n triggerType: this.triggerType,\n triggerMetadata: this.triggerMetadata,\n actions: this.actions,\n enabled: this.enabled,\n exemptRoles: this.exemptRoles,\n exemptChannels: this.exemptChannels,\n };\n }\n}\n\n// --- Welcome Screen -----------------------------------------------------------\n\n/** A channel listed in a guild's Welcome Screen. */\nexport class WelcomeScreenChannel {\n public channelId: string;\n public description: string;\n public emojiId: string | null;\n public emojiName: string | null;\n\n public constructor(data: import(\"@lunibee/types\").APIWelcomeScreenChannel) {\n this.channelId = data.channel_id;\n this.description = data.description;\n this.emojiId = data.emoji_id;\n this.emojiName = data.emoji_name;\n }\n}\n\n/** A Discord Guild Welcome Screen. */\nexport class GuildWelcomeScreen {\n public description: string | null;\n public channels: WelcomeScreenChannel[];\n\n public constructor(data: import(\"@lunibee/types\").APIGuildWelcomeScreen) {\n this.description = data.description;\n this.channels = data.welcome_channels.map(\n (c) => new WelcomeScreenChannel(c),\n );\n }\n}\n\n// --- Guild Onboarding ---------------------------------------------------------\n\n/** An option within a Guild Onboarding Prompt. */\nexport class OnboardingPromptOption extends BaseStructure {\n public channelIds: string[];\n public roleIds: string[];\n public emoji: import(\"@lunibee/types\").APIPartialEmoji | undefined;\n public title: string;\n public description: string | null;\n\n public constructor(\n data: import(\"@lunibee/types\").APIOnboardingPromptOption,\n ) {\n super(data.id);\n this.channelIds = data.channel_ids;\n this.roleIds = data.role_ids;\n this.emoji = data.emoji;\n this.title = data.title;\n this.description = data.description;\n }\n}\n\n/** A prompt shown during Guild Onboarding. */\nexport class OnboardingPrompt extends BaseStructure {\n public type: number;\n public options: OnboardingPromptOption[];\n public title: string;\n public singleSelect: boolean;\n public required: boolean;\n public inOnboarding: boolean;\n\n public constructor(data: import(\"@lunibee/types\").APIOnboardingPrompt) {\n super(data.id);\n this.type = data.type;\n this.options = data.options.map((o) => new OnboardingPromptOption(o));\n this.title = data.title;\n this.singleSelect = data.single_select;\n this.required = data.required;\n this.inOnboarding = data.in_onboarding;\n }\n}\n\n/** A Discord Guild Onboarding setup. */\nexport class GuildOnboarding extends BaseStructure {\n public prompts: OnboardingPrompt[];\n public defaultChannelIds: string[];\n public enabled: boolean;\n public mode: number;\n\n public constructor(data: import(\"@lunibee/types\").APIGuildOnboarding) {\n super(data.guild_id);\n this.prompts = data.prompts.map((p) => new OnboardingPrompt(p));\n this.defaultChannelIds = data.default_channel_ids;\n this.enabled = data.enabled;\n this.mode = data.mode;\n }\n}\n",
13
14
  "import { Channel, User, type ResourceContext } from \"./base.js\";\nimport { TextChannel } from \"./resources.js\";\nimport type {\n APIChannel,\n APIForumTag,\n APIPartialEmoji,\n APIThreadMetadata,\n} from \"@lunibee/types\";\n\n// Discord.js-familiar channel subclasses. Every class extends Channel, so\n// existing `instanceof Channel` checks and Channel methods keep working.\n\n/** A guild announcement (news) channel. */\nexport class NewsChannel extends TextChannel {}\n\n/** A direct-message or group DM channel. */\nexport class DMChannel extends Channel {\n /** Users in the conversation. */ public readonly recipients: User[];\n /** Owner of a group DM. */ public readonly ownerId: string | null;\n\n public constructor(data: APIChannel, context?: ResourceContext) {\n super(data, context);\n this.recipients = (data.recipients ?? []).map((u) => new User(u));\n this.ownerId = data.owner_id ?? null;\n }\n}\n\n/** A guild voice channel. */\nexport class VoiceChannel extends Channel {\n /** Bitrate in bits per second. */ public bitrate: number;\n /** User limit (0 = unlimited). */ public userLimit: number;\n /** Voice region override, or null for automatic. */ public rtcRegion:\n string | null;\n /** Camera video quality mode. */ public videoQualityMode: number;\n\n public constructor(data: APIChannel, context?: ResourceContext) {\n super(data, context);\n this.bitrate = data.bitrate ?? 64000;\n this.userLimit = data.user_limit ?? 0;\n this.rtcRegion = data.rtc_region ?? null;\n this.videoQualityMode = data.video_quality_mode ?? 1;\n }\n}\n\n/** A guild stage channel. */\nexport class StageChannel extends VoiceChannel {}\n\n/** A guild category. */\nexport class CategoryChannel extends Channel {}\n\n/** A thread (announcement, public or private). */\nexport class ThreadChannel extends Channel {\n /** User who created the thread. */ public readonly ownerId: string | null;\n /** Approximate message count. */ public messageCount: number;\n /** Approximate member count (stops counting at 50). */ public memberCount: number;\n /** Thread metadata. */ public metadata: APIThreadMetadata | null;\n\n public constructor(data: APIChannel, context?: ResourceContext) {\n super(data, context);\n this.ownerId = data.owner_id ?? null;\n this.messageCount = data.message_count ?? 0;\n this.memberCount = data.member_count ?? 0;\n this.metadata = data.thread_metadata ?? null;\n }\n\n /** Whether the thread is archived. */\n public get archived(): boolean {\n return this.metadata?.archived ?? false;\n }\n\n /** Whether the thread is locked. */\n public get locked(): boolean {\n return this.metadata?.locked ?? false;\n }\n\n /** Minutes of inactivity before the thread auto-archives. */\n public get autoArchiveDuration(): number | null {\n return this.metadata?.auto_archive_duration ?? null;\n }\n}\n\n/** A guild forum channel. */\nexport class ForumChannel extends Channel {\n /** Tags that threads can apply. */ public availableTags: APIForumTag[];\n /** Default reaction for new threads. */ public defaultReactionEmoji: APIPartialEmoji | null;\n /** Default slowmode for new threads. */ public defaultThreadRateLimitPerUser: number;\n /** Default auto-archive duration for new threads. */ public defaultAutoArchiveDuration:\n number | null;\n\n public constructor(data: APIChannel, context?: ResourceContext) {\n super(data, context);\n this.availableTags = data.available_tags ?? [];\n this.defaultReactionEmoji = data.default_reaction_emoji ?? null;\n this.defaultThreadRateLimitPerUser =\n data.default_thread_rate_limit_per_user ?? 0;\n this.defaultAutoArchiveDuration =\n data.default_auto_archive_duration ?? null;\n }\n}\n\n/** A guild media channel. */\nexport class MediaChannel extends ForumChannel {}\n\n/**\n * Builds the most specific channel class for a payload's `type`, falling back\n * to {@link Channel} for types without a dedicated class.\n */\nexport function createChannel(\n data: APIChannel,\n context?: ResourceContext,\n): Channel {\n switch (data.type) {\n case 0:\n return new TextChannel(data, context);\n case 1:\n case 3:\n return new DMChannel(data, context);\n case 2:\n return new VoiceChannel(data, context);\n case 4:\n return new CategoryChannel(data, context);\n case 5:\n return new NewsChannel(data, context);\n case 10:\n case 11:\n case 12:\n return new ThreadChannel(data, context);\n case 13:\n return new StageChannel(data, context);\n case 15:\n return new ForumChannel(data, context);\n case 16:\n return new MediaChannel(data, context);\n default:\n return new Channel(data, context);\n }\n}\n",
14
15
  "// ─── Raw option type from Discord ────────────────────────────────────────────\n\n/** Raw Discord application command interaction data option. */\nexport interface APIInteractionDataOption {\n name: string;\n type: number;\n value?: string | number | boolean;\n options?: APIInteractionDataOption[];\n focused?: boolean;\n}\n\n// ─── CommandOptions resolver ──────────────────────────────────────────────────\n\n/** Application command option types mirroring Discord's enum. */\nconst OptionType = {\n SubCommand: 1,\n SubCommandGroup: 2,\n String: 3,\n Integer: 4,\n Boolean: 5,\n User: 6,\n Channel: 7,\n Role: 8,\n Mentionable: 9,\n Number: 10,\n Attachment: 11,\n} as const;\n\n/**\n * Typed resolver for application command options.\n * Attached as `CommandInteraction.options`.\n */\nexport class CommandOptions {\n readonly #options: APIInteractionDataOption[];\n readonly #resolved: Record<string, unknown>;\n\n /** @internal */\n public constructor(\n options: APIInteractionDataOption[],\n resolved: Record<string, unknown> = {},\n ) {\n let currentOptions = options;\n let group: string | null = null;\n let sub: string | null = null;\n\n // Drill down to the deepest options level for nested subcommands\n while (currentOptions.length === 1) {\n const opt = currentOptions[0]!;\n if (opt.type === OptionType.SubCommandGroup) {\n group = opt.name;\n currentOptions = opt.options ?? [];\n } else if (opt.type === OptionType.SubCommand) {\n sub = opt.name;\n currentOptions = opt.options ?? [];\n } else {\n break;\n }\n }\n\n this.#options = currentOptions;\n this.#resolved = resolved;\n this.#subcommandGroup = group;\n this.#subcommand = sub;\n }\n\n readonly #subcommandGroup: string | null;\n readonly #subcommand: string | null;\n\n /** Finds a raw option by name (case-insensitive). */\n #get(name: string): APIInteractionDataOption | undefined {\n return this.#options.find(\n (o) => o.name.toLowerCase() === name.toLowerCase(),\n );\n }\n\n // ── Subcommand resolution ──────────────────────────────────────────────────\n\n /** Returns the invoked subcommand name, or null if none. */\n public getSubcommand(required?: false): string | null;\n public getSubcommand(required: true): string;\n public getSubcommand(required = false): string | null {\n if (!this.#subcommand && required) {\n throw new TypeError(\"No subcommand was provided.\");\n }\n return this.#subcommand;\n }\n\n /** Returns the invoked subcommand group name, or null if none. */\n public getSubcommandGroup(required?: false): string | null;\n public getSubcommandGroup(required: true): string;\n public getSubcommandGroup(required = false): string | null {\n if (!this.#subcommandGroup && required) {\n throw new TypeError(\"No subcommand group was provided.\");\n }\n return this.#subcommandGroup;\n }\n\n // ── Autocomplete ───────────────────────────────────────────────────────────\n\n /** Returns the focused option's value (autocomplete), or the full option when `full` is true. @throws {TypeError} If no option is focused. */\n public getFocused(full: true): APIInteractionDataOption;\n public getFocused(full?: false): string | number | boolean;\n public getFocused(\n full = false,\n ): APIInteractionDataOption | string | number | boolean {\n const focused = this.#options.find((o) => o.focused);\n if (!focused) throw new TypeError(\"No focused option was provided.\");\n return full ? focused : (focused.value ?? \"\");\n }\n\n // ── Primitive value options ────────────────────────────────────────────────\n\n /** Gets a string option. @param name Option name. @param required If true, throws when missing. */\n public getString(name: string, required?: false): string | null;\n public getString(name: string, required: true): string;\n public getString(name: string, required = false): string | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.String) {\n if (required)\n throw new TypeError(\n `Required option \"${name}\" (string) is missing.`,\n );\n return null;\n }\n return typeof opt.value === \"string\" ? opt.value : null;\n }\n\n /** Gets an integer option. @param name Option name. @param required If true, throws when missing. */\n public getInteger(name: string, required?: false): number | null;\n public getInteger(name: string, required: true): number;\n public getInteger(name: string, required = false): number | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.Integer) {\n if (required)\n throw new TypeError(\n `Required option \"${name}\" (integer) is missing.`,\n );\n return null;\n }\n return typeof opt.value === \"number\" ? Math.trunc(opt.value) : null;\n }\n\n /** Gets a number (float) option. @param name Option name. @param required If true, throws when missing. */\n public getNumber(name: string, required?: false): number | null;\n public getNumber(name: string, required: true): number;\n public getNumber(name: string, required = false): number | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.Number) {\n if (required)\n throw new TypeError(\n `Required option \"${name}\" (number) is missing.`,\n );\n return null;\n }\n return typeof opt.value === \"number\" ? opt.value : null;\n }\n\n /** Gets a boolean option. @param name Option name. @param required If true, throws when missing. */\n public getBoolean(name: string, required?: false): boolean | null;\n public getBoolean(name: string, required: true): boolean;\n public getBoolean(name: string, required = false): boolean | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.Boolean) {\n if (required)\n throw new TypeError(\n `Required option \"${name}\" (boolean) is missing.`,\n );\n return null;\n }\n return typeof opt.value === \"boolean\" ? opt.value : null;\n }\n\n // ── Resolved entity options ────────────────────────────────────────────────\n\n /** Gets the raw resolved user data for a user option. @param name Option name. @param required If true, throws when missing. */\n public getUser(\n name: string,\n required?: false,\n ): Record<string, unknown> | null;\n public getUser(name: string, required: true): Record<string, unknown>;\n public getUser(\n name: string,\n required = false,\n ): Record<string, unknown> | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.User) {\n if (required)\n throw new TypeError(\n `Required option \"${name}\" (user) is missing.`,\n );\n return null;\n }\n const userId = String(opt.value);\n const resolved = (this.#resolved as any)?.users?.[userId] ?? null;\n if (!resolved && required)\n throw new TypeError(\n `Resolved user for option \"${name}\" is missing.`,\n );\n return resolved;\n }\n\n /** Gets the raw resolved channel data for a channel option. @param name Option name. @param required If true, throws when missing. */\n public getChannel(\n name: string,\n required?: false,\n ): Record<string, unknown> | null;\n public getChannel(name: string, required: true): Record<string, unknown>;\n public getChannel(\n name: string,\n required = false,\n ): Record<string, unknown> | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.Channel) {\n if (required)\n throw new TypeError(\n `Required option \"${name}\" (channel) is missing.`,\n );\n return null;\n }\n const channelId = String(opt.value);\n const resolved = (this.#resolved as any)?.channels?.[channelId] ?? null;\n if (!resolved && required)\n throw new TypeError(\n `Resolved channel for option \"${name}\" is missing.`,\n );\n return resolved;\n }\n\n /** Gets the raw resolved role data for a role option. @param name Option name. @param required If true, throws when missing. */\n public getRole(\n name: string,\n required?: false,\n ): Record<string, unknown> | null;\n public getRole(name: string, required: true): Record<string, unknown>;\n public getRole(\n name: string,\n required = false,\n ): Record<string, unknown> | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.Role) {\n if (required)\n throw new TypeError(\n `Required option \"${name}\" (role) is missing.`,\n );\n return null;\n }\n const roleId = String(opt.value);\n const resolved = (this.#resolved as any)?.roles?.[roleId] ?? null;\n if (!resolved && required)\n throw new TypeError(\n `Resolved role for option \"${name}\" is missing.`,\n );\n return resolved;\n }\n\n /** Gets the raw resolved user or role data for a mentionable option. @param name Option name. @param required If true, throws when missing. */\n public getMentionable(\n name: string,\n required?: false,\n ): Record<string, unknown> | null;\n public getMentionable(\n name: string,\n required: true,\n ): Record<string, unknown>;\n public getMentionable(\n name: string,\n required = false,\n ): Record<string, unknown> | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.Mentionable) {\n if (required)\n throw new TypeError(\n `Required option \"${name}\" (mentionable) is missing.`,\n );\n return null;\n }\n const id = String(opt.value);\n const resolved =\n (this.#resolved as any)?.users?.[id] ??\n (this.#resolved as any)?.roles?.[id] ??\n null;\n if (!resolved && required)\n throw new TypeError(\n `Resolved mentionable for option \"${name}\" is missing.`,\n );\n return resolved;\n }\n\n /** Gets the raw resolved attachment data for an attachment option. @param name Option name. @param required If true, throws when missing. */\n public getAttachment(\n name: string,\n required?: false,\n ): Record<string, unknown> | null;\n public getAttachment(name: string, required: true): Record<string, unknown>;\n public getAttachment(\n name: string,\n required = false,\n ): Record<string, unknown> | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.Attachment) {\n if (required)\n throw new TypeError(\n `Required option \"${name}\" (attachment) is missing.`,\n );\n return null;\n }\n const attachmentId = String(opt.value);\n const resolved =\n (this.#resolved as any)?.attachments?.[attachmentId] ?? null;\n if (!resolved && required)\n throw new TypeError(\n `Resolved attachment for option \"${name}\" is missing.`,\n );\n return resolved;\n }\n\n /** Returns the raw option list for advanced use cases. */\n public get raw(): readonly APIInteractionDataOption[] {\n return this.#options;\n }\n}\n",
15
- "import { InteractionResponseType } from \"@lunibee/types\";\n\n/** Discord interaction type constants. */\nexport const InteractionType = {\n Ping: 1,\n ApplicationCommand: 2,\n MessageComponent: 3,\n ApplicationCommandAutocomplete: 4,\n ModalSubmit: 5,\n} as const;\n// Re-export for consumers who import from structures directly\nexport { InteractionResponseType } from \"@lunibee/types\";\n/** Data shared by Discord interactions. */\nexport interface InteractionData {\n /** Interaction identifier. */ id: string;\n /** Application identifier. */ application_id: string;\n /** Interaction type. */ type: number;\n /** Interaction token. */ token: string;\n /** Gateway/API version. */ version?: number;\n /** Guild identifier. */ guild_id?: string;\n /** Channel identifier. */ channel_id?: string;\n /** Interaction-specific data. */ data?: Record<string, unknown>;\n [key: string]: unknown;\n}\n/** Options for an interaction response message. */\nexport interface InteractionReplyOptions {\n /** Message content. */ content?: string;\n /** Whether the response is ephemeral. */ ephemeral?: boolean;\n /** Message components. */ components?: unknown[];\n /** Message embeds. */ embeds?: unknown[];\n /** Discord message flags. */ flags?: number;\n [key: string]: unknown;\n}\n/** Transport required by an interaction structure. */\nexport interface InteractionClient {\n /** Sends the initial interaction callback. @param id Interaction identifier. @param token Interaction token. @param response Callback payload. @returns Discord response. @throws {Error} When REST fails. */ postInteractionResponse(\n id: string,\n token: string,\n response: InteractionResponse,\n ): Promise<unknown>;\n /** Edits the original interaction response. @param token Interaction token. @param data Message payload. @returns Discord response. @throws {Error} When REST fails. */ editInteractionReply(\n token: string,\n data: InteractionReplyOptions,\n ): Promise<unknown>;\n /** Deletes the original interaction response. @param token Interaction token. @returns Promise fulfilled after deletion. @throws {Error} When REST fails. */ deleteInteractionReply(\n token: string,\n ): Promise<void>;\n /** Sends a follow-up interaction webhook message. @param token Interaction token. @param data Message payload. @returns Discord response. @throws {Error} When REST fails. */ followUpInteraction(\n token: string,\n data: InteractionReplyOptions,\n ): Promise<unknown>;\n}\n\nexport { CommandOptions, type APIInteractionDataOption } from \"./options.js\";\nimport { CommandOptions, type APIInteractionDataOption } from \"./options.js\";\n\n// ─── Response class ───────────────────────────────────────────────────────────\n\n/** A Discord interaction callback payload. */\nexport class InteractionResponse {\n readonly type: number;\n readonly data?: InteractionReplyOptions;\n /** Creates a response payload. @param type Discord callback type. @param data Optional callback data. @throws {TypeError} If type is not finite. */\n public constructor(type: number, data?: InteractionReplyOptions) {\n if (!Number.isFinite(type))\n throw new TypeError(\"Interaction response type must be finite.\");\n this.type = type;\n this.data = data;\n }\n /** Serializes the response for Discord. @returns Discord callback payload. */ public toJSON(): {\n type: number;\n data?: InteractionReplyOptions;\n } {\n return this.data === undefined\n ? { type: this.type }\n : { type: this.type, data: this.data };\n }\n /** Creates an immediate message response. @param options Response message options. @returns Callback payload. */ public static message(\n options: InteractionReplyOptions,\n ): InteractionResponse {\n const data: InteractionReplyOptions = { ...options };\n if (options.ephemeral) {\n data.flags =\n (typeof options.flags === \"number\" ? options.flags : 0) | 64;\n }\n return new InteractionResponse(\n InteractionResponseType.ChannelMessage,\n data,\n );\n }\n /** Creates a deferred channel response. @param ephemeral Whether the eventual response is ephemeral. @returns Callback payload. */ public static defer(\n ephemeral = false,\n ): InteractionResponse {\n return new InteractionResponse(\n InteractionResponseType.DeferredChannelMessage,\n ephemeral ? { flags: 64 } : undefined,\n );\n }\n /** Creates a Pong response. @returns Callback payload. */ public static pong(): InteractionResponse {\n return new InteractionResponse(InteractionResponseType.Pong);\n }\n}\n\n// ─── Base Interaction ─────────────────────────────────────────────────────────\n\n/** Base interaction structure. */\nexport class Interaction<TData extends InteractionData = InteractionData> {\n /** Interaction identifier. */ public readonly id: string;\n /** Application identifier. */ public readonly applicationId: string;\n /** Interaction token. */ public readonly token: string;\n /** Guild identifier. */ public readonly guildId?: string;\n /** Channel identifier. */ public readonly channelId?: string;\n /** Interaction type. */ public readonly type: number;\n /** Raw interaction data. */ public readonly data: TData;\n /** Whether the initial response was sent. */ public replied = false;\n /** Whether the initial response was deferred. */ public deferred = false;\n readonly #client: InteractionClient;\n /** Creates an interaction from a Gateway payload. @param client Interaction transport. @param data Gateway interaction payload. @throws {TypeError} If required identifiers are missing. */ public constructor(\n client: InteractionClient,\n data: TData,\n ) {\n if (!data.id || !data.token)\n throw new TypeError(\"Interaction ID and token are required.\");\n this.#client = client;\n this.id = data.id;\n this.applicationId = data.application_id;\n this.token = data.token;\n this.guildId = data.guild_id;\n this.channelId = data.channel_id;\n this.type = data.type;\n this.data = data;\n }\n /** Whether this interaction is an application command. @returns True for application command interactions. */ public isChatInputCommand(): this is CommandInteraction {\n return this.type === InteractionType.ApplicationCommand;\n }\n /** Whether this interaction is a message component. @returns True for component interactions. */ public isMessageComponent(): this is ComponentInteraction {\n return this.type === InteractionType.MessageComponent;\n }\n /** Whether this interaction is a modal submission. @returns True for modal submissions. */ public isModalSubmit(): this is ModalSubmitInteraction {\n return this.type === InteractionType.ModalSubmit;\n }\n /** Whether this interaction is autocomplete. @returns True for autocomplete interactions. */ public isAutocomplete(): this is AutocompleteInteraction {\n return this.type === InteractionType.ApplicationCommandAutocomplete;\n }\n /** Message component type of this interaction, or 0 when it is not a component. */\n #componentType(): number {\n return this.isMessageComponent()\n ? ((this.data.data?.component_type as number | undefined) ?? 0)\n : 0;\n }\n /** Whether this is a button interaction. */ public isButton(): this is ComponentInteraction {\n return this.#componentType() === 2;\n }\n /** Whether this is a string select menu interaction. */ public isStringSelectMenu(): this is ComponentInteraction {\n return this.#componentType() === 3;\n }\n /** Whether this is a user select menu interaction. */ public isUserSelectMenu(): this is ComponentInteraction {\n return this.#componentType() === 5;\n }\n /** Whether this is a role select menu interaction. */ public isRoleSelectMenu(): this is ComponentInteraction {\n return this.#componentType() === 6;\n }\n /** Whether this is a mentionable select menu interaction. */ public isMentionableSelectMenu(): this is ComponentInteraction {\n return this.#componentType() === 7;\n }\n /** Whether this is a channel select menu interaction. */ public isChannelSelectMenu(): this is ComponentInteraction {\n return this.#componentType() === 8;\n }\n /** Whether this is any select menu interaction. */ public isAnySelectMenu(): this is ComponentInteraction {\n return [3, 5, 6, 7, 8].includes(this.#componentType());\n }\n /** Ensures the interaction has not already been acknowledged. @returns Nothing. @throws {Error} When already acknowledged. */ protected assertUnacknowledged(): void {\n if (this.replied || this.deferred)\n throw new Error(\"Interaction has already been acknowledged.\");\n }\n /** Ensures the interaction has been acknowledged. @returns Nothing. @throws {Error} When not acknowledged. */ protected assertAcknowledged(): void {\n if (!this.replied && !this.deferred)\n throw new Error(\"Interaction has not been acknowledged.\");\n }\n /** Posts a raw interaction response callback. */\n protected postResponse(response: InteractionResponse): Promise<unknown> {\n return this.#client.postInteractionResponse(\n this.id,\n this.token,\n response,\n );\n }\n /** Sends the initial interaction response. @param options Response message options. @returns Discord response. @throws {Error} When already acknowledged or REST fails. */ public async reply(\n options: InteractionReplyOptions | string,\n ): Promise<unknown> {\n this.assertUnacknowledged();\n const payload =\n typeof options === \"string\" ? { content: options } : options;\n const result = await this.#client.postInteractionResponse(\n this.id,\n this.token,\n InteractionResponse.message(payload),\n );\n this.replied = true;\n return result;\n }\n /** Defers the initial interaction response. @param ephemeral Whether the eventual response is ephemeral. @returns Promise fulfilled after acknowledgement. @throws {Error} When already acknowledged or REST fails. */ public async deferReply(\n ephemeral = false,\n ): Promise<void> {\n this.assertUnacknowledged();\n await this.#client.postInteractionResponse(\n this.id,\n this.token,\n InteractionResponse.defer(ephemeral),\n );\n this.deferred = true;\n }\n /** Edits the original response. @param options Replacement message options. @returns Discord response. @throws {Error} When not acknowledged or REST fails. */ public editReply(\n options: InteractionReplyOptions,\n ): Promise<unknown> {\n this.assertAcknowledged();\n return this.#client.editInteractionReply(this.token, options);\n }\n /** Deletes the original response. @returns Promise fulfilled after deletion. @throws {Error} When not acknowledged or REST fails. */ public deleteReply(): Promise<void> {\n this.assertAcknowledged();\n return this.#client.deleteInteractionReply(this.token);\n }\n /** Sends a follow-up message using the interaction webhook. @param options Follow-up message options. @returns Discord response. @throws {Error} When REST fails. */ public followUp(\n options: InteractionReplyOptions | string,\n ): Promise<unknown> {\n const payload =\n typeof options === \"string\" ? { content: options } : options;\n return this.#client.followUpInteraction(this.token, payload);\n }\n /** Updates the message for a component interaction. */ public async update(\n options: InteractionReplyOptions | string,\n ): Promise<unknown> {\n this.assertUnacknowledged();\n const payload =\n typeof options === \"string\" ? { content: options } : options;\n const result = await this.#client.postInteractionResponse(\n this.id,\n this.token,\n new InteractionResponse(\n InteractionResponseType.MessageUpdate,\n payload,\n ),\n );\n this.replied = true;\n return result;\n }\n /** Opens a modal dialog in the user's client. @param modal Modal builder output or raw modal callback data. @returns Discord response. @throws {Error} When already acknowledged or REST fails. */\n public async showModal(modal: {\n custom_id: string;\n title: string;\n components: unknown[];\n [key: string]: unknown;\n }): Promise<unknown> {\n this.assertUnacknowledged();\n const result = await this.#client.postInteractionResponse(\n this.id,\n this.token,\n new InteractionResponse(\n InteractionResponseType.Modal,\n modal as InteractionReplyOptions,\n ),\n );\n this.replied = true;\n return result;\n }\n}\n\n// ─── CommandInteraction ───────────────────────────────────────────────────────\n\n/** Application command interaction with fully typed option resolver. */\nexport class CommandInteraction extends Interaction {\n /** Typed option resolver. Access slash command options with full type safety. */\n public readonly options: CommandOptions;\n\n /** Invoked command name. @returns Command name or an empty string. */ public get commandName(): string {\n return typeof this.data.data?.name === \"string\"\n ? this.data.data.name\n : \"\";\n }\n\n public constructor(client: InteractionClient, data: InteractionData) {\n super(client, data);\n const rawOptions =\n (data.data?.options as APIInteractionDataOption[]) ?? [];\n const resolved = (data.data?.resolved as Record<string, unknown>) ?? {};\n // Hand the resolver the *top-level* options. CommandOptions performs the\n // subcommand/group drill itself and records the names it walks through;\n // pre-drilling here would strip those wrappers before it sees them, so\n // getSubcommand()/getSubcommandGroup() would report null.\n this.options = new CommandOptions(rawOptions, resolved);\n }\n}\n\n// ─── ComponentInteraction ─────────────────────────────────────────────────────\n\n/** Message component interaction. */\nexport class ComponentInteraction extends Interaction {\n /** Gets component custom ID. */\n public get customId(): string {\n return (this.data as any)?.data?.custom_id ?? \"\";\n }\n /** Gets component type. */\n public get componentType(): number {\n return (this.data as any)?.data?.component_type ?? 0;\n }\n /** Gets selected values for select menu component interactions. */\n public get values(): string[] {\n return (this.data as any)?.data?.values ?? [];\n }\n /** Defers updating the message to which the component was attached. */\n public async deferUpdate(): Promise<void> {\n this.assertUnacknowledged();\n await this.postResponse(\n new InteractionResponse(\n InteractionResponseType.DeferredMessageUpdate,\n ),\n );\n this.deferred = true;\n }\n /** Updates the message to which the component was attached. */\n public override async update(\n options: InteractionReplyOptions | string,\n ): Promise<unknown> {\n this.assertUnacknowledged();\n const payload =\n typeof options === \"string\" ? { content: options } : options;\n const result = await this.postResponse(\n new InteractionResponse(\n InteractionResponseType.MessageUpdate,\n payload,\n ),\n );\n this.replied = true;\n return result;\n }\n}\n\n// ─── ModalSubmitInteraction ───────────────────────────────────────────────────\n\n/** Represents a Discord modal submission interaction. */\nexport class ModalSubmitInteraction extends Interaction {\n /** Gets the submitted modal custom ID. */\n public get customId(): string {\n return (this.data as any)?.data?.custom_id ?? \"\";\n }\n\n /** Retrieves the text value for a specific text input custom ID. @param customId The custom_id of the text input component. @returns The submitted text, or undefined if not found. */\n public getInputValue(customId: string): string | undefined {\n const rows = (this.data as any)?.data?.components ?? [];\n for (const row of rows) {\n for (const comp of row.components ?? []) {\n if (comp.custom_id === customId) return comp.value;\n }\n }\n return undefined;\n }\n\n /** Retrieves the text value for a text input, throwing if missing. @param customId The custom_id of the text input component. @returns The submitted text. @throws {TypeError} If the field is not found. */\n public getRequiredInputValue(customId: string): string {\n const value = this.getInputValue(customId);\n if (value === undefined)\n throw new TypeError(\n `Modal input \"${customId}\" was not found in the submission.`,\n );\n return value;\n }\n}\n\n// ─── AutocompleteInteraction ──────────────────────────────────────────────────\n\n/** Represents a Discord slash command autocomplete interaction. */\nexport class AutocompleteInteraction extends Interaction {\n /** Option resolver; use `options.getFocused()` for the focused value. */\n public readonly options: CommandOptions;\n\n public constructor(client: InteractionClient, data: InteractionData) {\n super(client, data);\n this.options = new CommandOptions(\n (data.data?.options as APIInteractionDataOption[]) ?? [],\n );\n }\n\n /** Gets the target command name. */\n public get commandName(): string {\n return (this.data as any)?.data?.name ?? \"\";\n }\n\n /** Gets the currently focused autocomplete option. */\n public get focusedOption():\n { name: string; value: unknown; type: number } | undefined {\n const options = (this.data as any)?.data?.options ?? [];\n return findFocused(options);\n }\n\n /** Responds to Discord with autocomplete choices. @param choices Array of name/value pairs to show. @throws {TypeError} If choices is not an array. */\n public async respond(\n choices: { name: string; value: string | number }[],\n ): Promise<void> {\n if (!Array.isArray(choices))\n throw new TypeError(\"Autocomplete choices must be an array.\");\n const response = new InteractionResponse(\n InteractionResponseType.Autocomplete,\n { choices } as InteractionReplyOptions,\n );\n await this.postResponse(response);\n this.replied = true;\n }\n}\n\n/** Recursively finds the focused option in a nested options tree. */\nfunction findFocused(\n options: any[],\n): { name: string; value: unknown; type: number } | undefined {\n for (const opt of options) {\n if (opt.focused)\n return { name: opt.name, value: opt.value, type: opt.type };\n if (Array.isArray(opt.options)) {\n const found = findFocused(opt.options);\n if (found) return found;\n }\n }\n return undefined;\n}\n\n// ─── Factory ──────────────────────────────────────────────────────────────────\n\n/**\n * Creates a specialized interaction structure for a Gateway payload.\n * @param client Interaction transport.\n * @param data Gateway interaction payload.\n * @returns Specialized interaction structure.\n * @throws {TypeError} If required identifiers are missing.\n */\nexport function createInteraction(\n client: InteractionClient,\n data: InteractionData,\n): Interaction {\n switch (data.type) {\n case InteractionType.ApplicationCommand:\n return new CommandInteraction(client, data);\n case InteractionType.ApplicationCommandAutocomplete:\n return new AutocompleteInteraction(client, data);\n case InteractionType.MessageComponent:\n return new ComponentInteraction(client, data);\n case InteractionType.ModalSubmit:\n return new ModalSubmitInteraction(client, data);\n default:\n return new Interaction(client, data);\n }\n}\n",
16
+ "import { InteractionResponseType } from \"@lunibee/types\";\nimport { User } from \"./base.js\";\nimport { GuildMember } from \"./resources.js\";\n\n/** Discord interaction type constants. */\nexport const InteractionType = {\n Ping: 1,\n ApplicationCommand: 2,\n MessageComponent: 3,\n ApplicationCommandAutocomplete: 4,\n ModalSubmit: 5,\n} as const;\n// Re-export for consumers who import from structures directly\nexport { InteractionResponseType } from \"@lunibee/types\";\n/** Data shared by Discord interactions. */\nexport interface InteractionData {\n /** Interaction identifier. */ id: string;\n /** Application identifier. */ application_id: string;\n /** Interaction type. */ type: number;\n /** Interaction token. */ token: string;\n /** Gateway/API version. */ version?: number;\n /** Guild identifier. */ guild_id?: string;\n /** Channel identifier. */ channel_id?: string;\n /** Interaction-specific data. */ data?: Record<string, unknown>;\n [key: string]: unknown;\n}\n/** Options for an interaction response message. */\nexport interface InteractionReplyOptions {\n /** Message content. */ content?: string;\n /** Whether the response is ephemeral. */ ephemeral?: boolean;\n /** Message components. */ components?: unknown[];\n /** Message embeds. */ embeds?: unknown[];\n /** Discord message flags. */ flags?: number;\n [key: string]: unknown;\n}\n/** Transport required by an interaction structure. */\nexport interface InteractionClient {\n /** Sends the initial interaction callback. @param id Interaction identifier. @param token Interaction token. @param response Callback payload. @returns Discord response. @throws {Error} When REST fails. */ postInteractionResponse(\n id: string,\n token: string,\n response: InteractionResponse,\n ): Promise<unknown>;\n /** Edits the original interaction response. @param token Interaction token. @param data Message payload. @returns Discord response. @throws {Error} When REST fails. */ editInteractionReply(\n token: string,\n data: InteractionReplyOptions,\n ): Promise<unknown>;\n /** Deletes the original interaction response. @param token Interaction token. @returns Promise fulfilled after deletion. @throws {Error} When REST fails. */ deleteInteractionReply(\n token: string,\n ): Promise<void>;\n /** Sends a follow-up interaction webhook message. @param token Interaction token. @param data Message payload. @returns Discord response. @throws {Error} When REST fails. */ followUpInteraction(\n token: string,\n data: InteractionReplyOptions,\n ): Promise<unknown>;\n /** Reads, edits or deletes an interaction webhook message (`@original` or a follow-up ID). Optional; required for {@link Interaction.fetchReply}, {@link Interaction.editFollowUp} and {@link Interaction.deleteFollowUp}. */\n interactionWebhookMessage?(\n method: \"GET\" | \"PATCH\" | \"DELETE\",\n applicationId: string,\n token: string,\n messageId: string,\n data?: InteractionReplyOptions,\n ): Promise<unknown>;\n}\n\n/** Discord's ephemeral message flag. */\nconst EPHEMERAL = 64;\n/** Interaction tokens stay valid for 15 minutes. */\nconst TOKEN_LIFETIME_MS = 15 * 60_000;\nconst DISCORD_EPOCH = 1_420_070_400_000n;\n\n/** Turns `{ ephemeral: true }` into Discord's flag and drops the local-only key. */\nfunction toMessageData(\n options: InteractionReplyOptions | string,\n): InteractionReplyOptions {\n if (typeof options === \"string\") return { content: options };\n const { ephemeral, ...data } = options;\n if (ephemeral)\n data.flags =\n (typeof data.flags === \"number\" ? data.flags : 0) | EPHEMERAL;\n return data;\n}\n\nexport { CommandOptions, type APIInteractionDataOption } from \"./options.js\";\nimport { CommandOptions, type APIInteractionDataOption } from \"./options.js\";\n\n// ─── Response class ───────────────────────────────────────────────────────────\n\n/** A Discord interaction callback payload. */\nexport class InteractionResponse {\n readonly type: number;\n readonly data?: InteractionReplyOptions;\n /** Creates a response payload. @param type Discord callback type. @param data Optional callback data. @throws {TypeError} If type is not finite. */\n public constructor(type: number, data?: InteractionReplyOptions) {\n if (!Number.isFinite(type))\n throw new TypeError(\"Interaction response type must be finite.\");\n this.type = type;\n this.data = data;\n }\n /** Serializes the response for Discord. @returns Discord callback payload. */ public toJSON(): {\n type: number;\n data?: InteractionReplyOptions;\n } {\n return this.data === undefined\n ? { type: this.type }\n : { type: this.type, data: this.data };\n }\n /** Creates an immediate message response. @param options Response message options. @returns Callback payload. */ public static message(\n options: InteractionReplyOptions,\n ): InteractionResponse {\n return new InteractionResponse(\n InteractionResponseType.ChannelMessage,\n toMessageData(options),\n );\n }\n /** Creates a deferred channel response. @param ephemeral Whether the eventual response is ephemeral. @returns Callback payload. */ public static defer(\n ephemeral = false,\n ): InteractionResponse {\n return new InteractionResponse(\n InteractionResponseType.DeferredChannelMessage,\n ephemeral ? { flags: EPHEMERAL } : undefined,\n );\n }\n /** Creates a Pong response. @returns Callback payload. */ public static pong(): InteractionResponse {\n return new InteractionResponse(InteractionResponseType.Pong);\n }\n}\n\n// ─── Base Interaction ─────────────────────────────────────────────────────────\n\n/** Base interaction structure. */\nexport class Interaction<TData extends InteractionData = InteractionData> {\n /** Interaction identifier. */ public readonly id: string;\n /** Application identifier. */ public readonly applicationId: string;\n /** Interaction token. */ public readonly token: string;\n /** Guild identifier. */ public readonly guildId?: string;\n /** Channel identifier. */ public readonly channelId?: string;\n /** Interaction type. */ public readonly type: number;\n /** Raw interaction data. */ public readonly data: TData;\n /** Whether the initial response was sent. */ public replied = false;\n /** Whether the initial response was deferred. */ public deferred = false;\n readonly #client: InteractionClient;\n /** An initial response is in flight; a second one must not be sent. */\n #acknowledging = false;\n /** Creates an interaction from a Gateway payload. @param client Interaction transport. @param data Gateway interaction payload. @throws {TypeError} If required identifiers are missing. */ public constructor(\n client: InteractionClient,\n data: TData,\n ) {\n if (!data.id || !data.token)\n throw new TypeError(\"Interaction ID and token are required.\");\n this.#client = client;\n this.id = data.id;\n this.applicationId = data.application_id;\n this.token = data.token;\n this.guildId = data.guild_id;\n this.channelId = data.channel_id;\n this.type = data.type;\n this.data = data;\n }\n /** Whether this interaction is an application command. @returns True for application command interactions. */ public isChatInputCommand(): this is CommandInteraction {\n return this.type === InteractionType.ApplicationCommand;\n }\n /** Whether this interaction is a message component. @returns True for component interactions. */ public isMessageComponent(): this is ComponentInteraction {\n return this.type === InteractionType.MessageComponent;\n }\n /** Whether this interaction is a modal submission. @returns True for modal submissions. */ public isModalSubmit(): this is ModalSubmitInteraction {\n return this.type === InteractionType.ModalSubmit;\n }\n /** Whether this interaction is autocomplete. @returns True for autocomplete interactions. */ public isAutocomplete(): this is AutocompleteInteraction {\n return this.type === InteractionType.ApplicationCommandAutocomplete;\n }\n /** Message component type of this interaction, or 0 when it is not a component. */\n #componentType(): number {\n return this.isMessageComponent()\n ? ((this.data.data?.component_type as number | undefined) ?? 0)\n : 0;\n }\n /** Whether this is a button interaction. */ public isButton(): this is ComponentInteraction {\n return this.#componentType() === 2;\n }\n /** Whether this is a string select menu interaction. */ public isStringSelectMenu(): this is ComponentInteraction {\n return this.#componentType() === 3;\n }\n /** Whether this is a user select menu interaction. */ public isUserSelectMenu(): this is ComponentInteraction {\n return this.#componentType() === 5;\n }\n /** Whether this is a role select menu interaction. */ public isRoleSelectMenu(): this is ComponentInteraction {\n return this.#componentType() === 6;\n }\n /** Whether this is a mentionable select menu interaction. */ public isMentionableSelectMenu(): this is ComponentInteraction {\n return this.#componentType() === 7;\n }\n /** Whether this is a channel select menu interaction. */ public isChannelSelectMenu(): this is ComponentInteraction {\n return this.#componentType() === 8;\n }\n /** Whether this is any select menu interaction. */ public isAnySelectMenu(): this is ComponentInteraction {\n return [3, 5, 6, 7, 8].includes(this.#componentType());\n }\n /** Ensures the interaction has not already been acknowledged. @returns Nothing. @throws {Error} When already acknowledged. */ protected assertUnacknowledged(): void {\n if (this.replied || this.deferred || this.#acknowledging)\n throw new Error(\"Interaction has already been acknowledged.\");\n }\n /**\n * Sends the initial response exactly once. The in-flight flag is set\n * before the request, so two concurrent calls cannot both send; it is\n * cleared if the request fails so the caller may try again.\n */\n protected async acknowledge(\n response: InteractionResponse,\n state: \"replied\" | \"deferred\",\n ): Promise<unknown> {\n this.assertUnacknowledged();\n this.#acknowledging = true;\n try {\n const result = await this.postResponse(response);\n this[state] = true;\n return result;\n } finally {\n this.#acknowledging = false;\n }\n }\n /** The invoking user (from `member.user` in guilds, `user` in DMs). */\n public get user(): User | null {\n const raw =\n (this.data.member as { user?: unknown } | undefined)?.user ??\n this.data.user;\n return raw\n ? new User(raw as ConstructorParameters<typeof User>[0])\n : null;\n }\n /** The invoking guild member, or null outside a guild. */\n public get member(): GuildMember | null {\n const raw = this.data.member;\n if (!raw || !this.guildId) return null;\n return new GuildMember({\n ...(raw as Omit<\n ConstructorParameters<typeof GuildMember>[0],\n \"guild_id\"\n >),\n guild_id: this.guildId,\n });\n }\n /** Unix timestamp (ms) at which the interaction was created, from its snowflake. */\n public get createdTimestamp(): number {\n return Number((BigInt(this.id) >> 22n) + DISCORD_EPOCH);\n }\n /** When the interaction token stops working (15 minutes after creation). */\n public get expiresAt(): Date {\n return new Date(this.createdTimestamp + TOKEN_LIFETIME_MS);\n }\n /** Whether the token has expired; no response, edit or follow-up can succeed after that. */\n public get isExpired(): boolean {\n return Date.now() >= this.createdTimestamp + TOKEN_LIFETIME_MS;\n }\n #webhookMessage(\n method: \"GET\" | \"PATCH\" | \"DELETE\",\n messageId: string,\n data?: InteractionReplyOptions,\n ): Promise<unknown> {\n if (!this.#client.interactionWebhookMessage)\n return Promise.reject(\n new Error(\n \"This interaction client does not support webhook message access.\",\n ),\n );\n return this.#client.interactionWebhookMessage(\n method,\n this.applicationId,\n this.token,\n messageId,\n data,\n );\n }\n /** Fetches the original response message. */\n public fetchReply(): Promise<unknown> {\n this.assertAcknowledged();\n return this.#webhookMessage(\"GET\", \"@original\");\n }\n /** Edits a follow-up message. @param messageId Follow-up message ID. */\n public editFollowUp(\n messageId: string,\n options: InteractionReplyOptions | string,\n ): Promise<unknown> {\n return this.#webhookMessage(\"PATCH\", messageId, toMessageData(options));\n }\n /** Deletes a follow-up message. @param messageId Follow-up message ID. */\n public async deleteFollowUp(messageId: string): Promise<void> {\n await this.#webhookMessage(\"DELETE\", messageId);\n }\n /** Ensures the interaction has been acknowledged. @returns Nothing. @throws {Error} When not acknowledged. */ protected assertAcknowledged(): void {\n if (!this.replied && !this.deferred)\n throw new Error(\"Interaction has not been acknowledged.\");\n }\n /** Posts a raw interaction response callback. */\n protected postResponse(response: InteractionResponse): Promise<unknown> {\n return this.#client.postInteractionResponse(\n this.id,\n this.token,\n response,\n );\n }\n /** Sends the initial interaction response. @param options Response message options. @returns Discord response. @throws {Error} When already acknowledged or REST fails. */ public async reply(\n options: InteractionReplyOptions | string,\n ): Promise<unknown> {\n return this.acknowledge(\n InteractionResponse.message(toMessageData(options)),\n \"replied\",\n );\n }\n /** Defers the initial interaction response. @param ephemeral Whether the eventual response is ephemeral. @returns Promise fulfilled after acknowledgement. @throws {Error} When already acknowledged or REST fails. */ public async deferReply(\n ephemeral = false,\n ): Promise<void> {\n await this.acknowledge(\n InteractionResponse.defer(ephemeral),\n \"deferred\",\n );\n }\n /** Edits the original response. @param options Replacement message options. @returns Discord response. @throws {Error} When not acknowledged or REST fails. */ public editReply(\n options: InteractionReplyOptions,\n ): Promise<unknown> {\n this.assertAcknowledged();\n return this.#client.editInteractionReply(\n this.token,\n toMessageData(options),\n );\n }\n /** Deletes the original response. @returns Promise fulfilled after deletion. @throws {Error} When not acknowledged or REST fails. */ public deleteReply(): Promise<void> {\n this.assertAcknowledged();\n return this.#client.deleteInteractionReply(this.token);\n }\n /** Sends a follow-up message using the interaction webhook. @param options Follow-up message options. @returns Discord response. @throws {Error} When REST fails. */ public followUp(\n options: InteractionReplyOptions | string,\n ): Promise<unknown> {\n return this.#client.followUpInteraction(\n this.token,\n toMessageData(options),\n );\n }\n /** Updates the message for a component interaction. */ public async update(\n options: InteractionReplyOptions | string,\n ): Promise<unknown> {\n return this.acknowledge(\n new InteractionResponse(\n InteractionResponseType.MessageUpdate,\n toMessageData(options),\n ),\n \"replied\",\n );\n }\n /** Opens a modal dialog in the user's client. @param modal Modal builder output or raw modal callback data. @returns Discord response. @throws {Error} When already acknowledged or REST fails. */\n public async showModal(modal: {\n custom_id: string;\n title: string;\n components: unknown[];\n [key: string]: unknown;\n }): Promise<unknown> {\n return this.acknowledge(\n new InteractionResponse(\n InteractionResponseType.Modal,\n modal as InteractionReplyOptions,\n ),\n \"replied\",\n );\n }\n}\n\n// ─── CommandInteraction ───────────────────────────────────────────────────────\n\n/** Application command interaction with fully typed option resolver. */\nexport class CommandInteraction extends Interaction {\n /** Typed option resolver. Access slash command options with full type safety. */\n public readonly options: CommandOptions;\n\n /** Invoked command name. @returns Command name or an empty string. */ public get commandName(): string {\n return typeof this.data.data?.name === \"string\"\n ? this.data.data.name\n : \"\";\n }\n\n public constructor(client: InteractionClient, data: InteractionData) {\n super(client, data);\n const rawOptions =\n (data.data?.options as APIInteractionDataOption[]) ?? [];\n const resolved = (data.data?.resolved as Record<string, unknown>) ?? {};\n // Hand the resolver the *top-level* options. CommandOptions performs the\n // subcommand/group drill itself and records the names it walks through;\n // pre-drilling here would strip those wrappers before it sees them, so\n // getSubcommand()/getSubcommandGroup() would report null.\n this.options = new CommandOptions(rawOptions, resolved);\n }\n}\n\n// ─── ComponentInteraction ─────────────────────────────────────────────────────\n\n/** Message component interaction. */\nexport class ComponentInteraction extends Interaction {\n /** Gets component custom ID. */\n public get customId(): string {\n return (this.data as any)?.data?.custom_id ?? \"\";\n }\n /** Gets component type. */\n public get componentType(): number {\n return (this.data as any)?.data?.component_type ?? 0;\n }\n /** Gets selected values for select menu component interactions. */\n public get values(): string[] {\n return (this.data as any)?.data?.values ?? [];\n }\n /** Defers updating the message to which the component was attached. */\n public async deferUpdate(): Promise<void> {\n await this.acknowledge(\n new InteractionResponse(\n InteractionResponseType.DeferredMessageUpdate,\n ),\n \"deferred\",\n );\n }\n /** Updates the message to which the component was attached. */\n public override async update(\n options: InteractionReplyOptions | string,\n ): Promise<unknown> {\n return this.acknowledge(\n new InteractionResponse(\n InteractionResponseType.MessageUpdate,\n toMessageData(options),\n ),\n \"replied\",\n );\n }\n}\n\n// ─── ModalSubmitInteraction ───────────────────────────────────────────────────\n\n/** Represents a Discord modal submission interaction. */\nexport class ModalSubmitInteraction extends Interaction {\n /** Gets the submitted modal custom ID. */\n public get customId(): string {\n return (this.data as any)?.data?.custom_id ?? \"\";\n }\n\n /** Retrieves the text value for a specific text input custom ID. @param customId The custom_id of the text input component. @returns The submitted text, or undefined if not found. */\n public getInputValue(customId: string): string | undefined {\n const rows = (this.data as any)?.data?.components ?? [];\n for (const row of rows) {\n for (const comp of row.components ?? []) {\n if (comp.custom_id === customId) return comp.value;\n }\n }\n return undefined;\n }\n\n /** Retrieves the text value for a text input, throwing if missing. @param customId The custom_id of the text input component. @returns The submitted text. @throws {TypeError} If the field is not found. */\n public getRequiredInputValue(customId: string): string {\n const value = this.getInputValue(customId);\n if (value === undefined)\n throw new TypeError(\n `Modal input \"${customId}\" was not found in the submission.`,\n );\n return value;\n }\n}\n\n// ─── AutocompleteInteraction ──────────────────────────────────────────────────\n\n/** Represents a Discord slash command autocomplete interaction. */\nexport class AutocompleteInteraction extends Interaction {\n /** Option resolver; use `options.getFocused()` for the focused value. */\n public readonly options: CommandOptions;\n\n public constructor(client: InteractionClient, data: InteractionData) {\n super(client, data);\n this.options = new CommandOptions(\n (data.data?.options as APIInteractionDataOption[]) ?? [],\n );\n }\n\n /** Gets the target command name. */\n public get commandName(): string {\n return (this.data as any)?.data?.name ?? \"\";\n }\n\n /** Gets the currently focused autocomplete option. */\n public get focusedOption():\n { name: string; value: unknown; type: number } | undefined {\n const options = (this.data as any)?.data?.options ?? [];\n return findFocused(options);\n }\n\n /** Responds to Discord with autocomplete choices. @param choices Array of name/value pairs to show. @throws {TypeError} If choices is not an array. */\n public async respond(\n choices: { name: string; value: string | number }[],\n ): Promise<void> {\n if (!Array.isArray(choices))\n throw new TypeError(\"Autocomplete choices must be an array.\");\n const response = new InteractionResponse(\n InteractionResponseType.Autocomplete,\n { choices } as InteractionReplyOptions,\n );\n await this.acknowledge(response, \"replied\");\n }\n}\n\n/** Recursively finds the focused option in a nested options tree. */\nfunction findFocused(\n options: any[],\n): { name: string; value: unknown; type: number } | undefined {\n for (const opt of options) {\n if (opt.focused)\n return { name: opt.name, value: opt.value, type: opt.type };\n if (Array.isArray(opt.options)) {\n const found = findFocused(opt.options);\n if (found) return found;\n }\n }\n return undefined;\n}\n\n// ─── Factory ──────────────────────────────────────────────────────────────────\n\n/**\n * Creates a specialized interaction structure for a Gateway payload.\n * @param client Interaction transport.\n * @param data Gateway interaction payload.\n * @returns Specialized interaction structure.\n * @throws {TypeError} If required identifiers are missing.\n */\nexport function createInteraction(\n client: InteractionClient,\n data: InteractionData,\n): Interaction {\n switch (data.type) {\n case InteractionType.ApplicationCommand:\n return new CommandInteraction(client, data);\n case InteractionType.ApplicationCommandAutocomplete:\n return new AutocompleteInteraction(client, data);\n case InteractionType.MessageComponent:\n return new ComponentInteraction(client, data);\n case InteractionType.ModalSubmit:\n return new ModalSubmitInteraction(client, data);\n default:\n return new Interaction(client, data);\n }\n}\n",
16
17
  "import type {\n APIEmbed,\n APIEmbedAuthor,\n APIEmbedField,\n APIEmbedFooter,\n APIEmbedMedia,\n} from \"@lunibee/types\";\n\n/**\n * A rich Embed structure that wraps a Discord API embed object.\n * Provides typed accessors and a fluent builder interface.\n */\nexport class Embed {\n #data: APIEmbed;\n\n /** Creates an Embed from raw Discord API data, or starts a blank embed. */\n public constructor(data: APIEmbed = {}) {\n this.#data = { ...data };\n if (this.#data.fields) this.#data.fields = [...this.#data.fields];\n }\n\n // ── Read accessors ───────────────────────────────────────────────────────\n\n /** Embed title. */\n public get title(): string | undefined {\n return this.#data.title;\n }\n /** Embed description. */\n public get description(): string | undefined {\n return this.#data.description;\n }\n /** Embed URL. */\n public get url(): string | undefined {\n return this.#data.url;\n }\n /** Embed color as an integer. */\n public get color(): number | undefined {\n return this.#data.color;\n }\n /** Embed timestamp ISO 8601 string. */\n public get timestamp(): string | undefined {\n return this.#data.timestamp;\n }\n /** Embed timestamp as a Date object, or undefined. */\n public get createdAt(): Date | undefined {\n return this.#data.timestamp\n ? new Date(this.#data.timestamp)\n : undefined;\n }\n /** Embed footer. */\n public get footer(): APIEmbedFooter | undefined {\n return this.#data.footer;\n }\n /** Embed image. */\n public get image(): APIEmbedMedia | undefined {\n return this.#data.image;\n }\n /** Embed thumbnail. */\n public get thumbnail(): APIEmbedMedia | undefined {\n return this.#data.thumbnail;\n }\n /** Embed video. */\n public get video(): APIEmbedMedia | undefined {\n return this.#data.video;\n }\n /** Embed author. */\n public get author(): APIEmbedAuthor | undefined {\n return this.#data.author;\n }\n /** Embed fields (read-only copy). */\n public get fields(): readonly APIEmbedField[] {\n return this.#data.fields ?? [];\n }\n\n // ── Fluent builder methods ────────────────────────────────────────────────\n\n /** Sets the embed title. @param title Embed title text (max 256 chars). @throws {TypeError} If title exceeds 256 characters. */\n public setTitle(title: string): this {\n if (title.length > 256)\n throw new TypeError(\"Embed title must not exceed 256 characters.\");\n this.#data.title = title;\n return this;\n }\n\n /** Sets the embed description. @param description Embed description (max 4096 chars). @throws {TypeError} If description exceeds 4096 characters. */\n public setDescription(description: string): this {\n if (description.length > 4096)\n throw new TypeError(\n \"Embed description must not exceed 4096 characters.\",\n );\n this.#data.description = description;\n return this;\n }\n\n /** Sets the embed URL. @param url A valid URL string. */\n public setURL(url: string): this {\n this.#data.url = url;\n return this;\n }\n\n /** Sets the embed color. Accepts a hex number (0xff0000), decimal integer, or hex string (\"#ff0000\"). @param color Color value. */\n public setColor(color: number | string): this {\n if (typeof color === \"string\") {\n const hex = color.replace(/^#/, \"\");\n this.#data.color = parseInt(hex, 16);\n } else {\n this.#data.color = color;\n }\n return this;\n }\n\n /** Sets the embed timestamp. Accepts a Date, ISO string, or number (ms since epoch). Defaults to now. */\n public setTimestamp(timestamp: Date | string | number = Date.now()): this {\n this.#data.timestamp = new Date(timestamp).toISOString();\n return this;\n }\n\n /** Sets the embed footer. @param text Footer text (max 2048 chars). @param iconURL Optional footer icon URL. */\n public setFooter(text: string, iconURL?: string): this {\n if (text.length > 2048)\n throw new TypeError(\n \"Embed footer text must not exceed 2048 characters.\",\n );\n this.#data.footer = iconURL ? { text, icon_url: iconURL } : { text };\n return this;\n }\n\n /** Sets the embed image. @param url Image URL. */\n public setImage(url: string): this {\n this.#data.image = { url };\n return this;\n }\n\n /** Sets the embed thumbnail. @param url Thumbnail URL. */\n public setThumbnail(url: string): this {\n this.#data.thumbnail = { url };\n return this;\n }\n\n /** Sets the embed author. @param name Author name (max 256 chars). @param options Optional URL and icon URL. */\n public setAuthor(\n name: string,\n options: { url?: string; iconURL?: string } = {},\n ): this {\n if (name.length > 256)\n throw new TypeError(\n \"Embed author name must not exceed 256 characters.\",\n );\n this.#data.author = {\n name,\n url: options.url,\n icon_url: options.iconURL,\n };\n return this;\n }\n\n /** Adds one or more fields to the embed. @param fields Fields to add (max 25 total). @throws {TypeError} If adding exceeds 25 fields. */\n public addFields(...fields: APIEmbedField[]): this {\n const existing = this.#data.fields ?? [];\n if (existing.length + fields.length > 25)\n throw new TypeError(\"Embeds cannot have more than 25 fields.\");\n for (const field of fields) {\n if (field.name.length > 256)\n throw new TypeError(\n \"Embed field name must not exceed 256 characters.\",\n );\n if (field.value.length > 1024)\n throw new TypeError(\n \"Embed field value must not exceed 1024 characters.\",\n );\n }\n this.#data.fields = [...existing, ...fields];\n return this;\n }\n\n /** Removes all fields from the embed. */\n public clearFields(): this {\n this.#data.fields = [];\n return this;\n }\n\n /** Splices the fields array, replacing, inserting, or deleting fields. @param index Start index. @param deleteCount Number of fields to remove. @param fields Replacement fields. */\n public spliceFields(\n index: number,\n deleteCount: number,\n ...fields: APIEmbedField[]\n ): this {\n const next = [...(this.#data.fields ?? [])];\n next.splice(index, deleteCount, ...fields);\n if (next.length > 25)\n throw new TypeError(\"Embeds cannot have more than 25 fields.\");\n for (const field of fields) {\n if (field.name.length > 256)\n throw new TypeError(\n \"Embed field name must not exceed 256 characters.\",\n );\n if (field.value.length > 1024)\n throw new TypeError(\n \"Embed field value must not exceed 1024 characters.\",\n );\n }\n this.#data.fields = next;\n return this;\n }\n\n // ── Serialization ─────────────────────────────────────────────────────────\n\n /** Returns the raw Discord API embed payload. */\n public toJSON(): APIEmbed {\n const json = { ...this.#data };\n if (json.fields) json.fields = [...json.fields];\n return json;\n }\n\n /** Creates an Embed from an existing raw API embed object. */\n public static from(data: APIEmbed): Embed {\n return new Embed(data);\n }\n}\n",
17
18
  "import { BaseStructure } from \"./base.js\";\nimport type {\n APIAuditLog,\n APIAuditLogEntry,\n APIAuditLogChange,\n APIAuditLogOptions,\n} from \"@lunibee/types\";\n\n/** Represents a single entry in a Discord audit log. */\nexport class AuditLogEntry extends BaseStructure {\n /** The ID of the affected entity. */\n public readonly targetId: string | null;\n /** The ID of the user who made the changes. */\n public readonly userId: string | null;\n /** The action type of this entry. */\n public readonly actionType: number;\n /** The changes made to the target. */\n public readonly changes: APIAuditLogChange[];\n /** Additional info for certain action types. */\n public readonly options: APIAuditLogOptions | null;\n /** The reason for the change, if any. */\n public readonly reason: string | null;\n\n /** Creates an audit log entry. */\n public constructor(data: APIAuditLogEntry) {\n super(data.id);\n this.targetId = data.target_id;\n this.userId = data.user_id;\n this.actionType = data.action_type;\n this.changes = data.changes ?? [];\n this.options = data.options ?? null;\n this.reason = data.reason ?? null;\n }\n}\n\n/** Represents a Discord audit log. */\nexport class AuditLog {\n /** The entries in the audit log. */\n public readonly entries: Map<string, AuditLogEntry>;\n // Depending on what else is needed, we could parse the users, webhooks, etc.\n // However, the typical structure mainly exposes the entries.\n\n /** Creates an audit log. */\n public constructor(data: APIAuditLog) {\n this.entries = new Map();\n for (const entryData of data.audit_log_entries) {\n this.entries.set(entryData.id, new AuditLogEntry(entryData));\n }\n }\n}\n",
18
19
  "/** Resource structures for Discord messages and related entities. */\nimport { BaseStructure, Channel, User } from \"./base.js\";\nimport type { ResourceContext } from \"./base.js\";\n\n/** discord.js user-authored (non-system) message types: Default, Reply,\n * ChatInputCommand and ContextMenuCommand. Any other type is a system message. */\nconst NON_SYSTEM_MESSAGE_TYPES = new Set([0, 19, 20, 23]);\n\nexport { BaseStructure, Channel, Guild, User } from \"./base.js\";\nexport type { ResourceContext } from \"./base.js\";\n\nexport class Message extends BaseStructure {\n public content: string;\n public author: User;\n public channelId: string;\n public readonly channel: Channel;\n public guildId?: string;\n public flags: number;\n /** Message creation timestamp (from timestamp field or snowflake). */\n public readonly timestamp: Date;\n public readonly attachments: import(\"@lunibee/types\").APIAttachment[];\n public readonly embeds: import(\"@lunibee/types\").APIEmbed[];\n public readonly mentions: User[];\n public readonly mentionRoles: string[];\n public pinned: boolean;\n public mentionEveryone: boolean;\n public type: number;\n public readonly reference?: import(\"@lunibee/types\").APIMessageReference;\n public readonly components: import(\"@lunibee/types\").APIMessageComponent[];\n public readonly referencedMessage?: Message | null;\n readonly #context?: ResourceContext;\n\n /** Creates a message structure from Discord message data. */\n public constructor(\n data: import(\"@lunibee/types\").APIMessage,\n context?: ResourceContext,\n ) {\n super(data.id);\n if (!/^\\d{1,20}$/.test(data.channel_id))\n throw new TypeError(\n \"Message channel_id must be a valid snowflake.\",\n );\n this.content = data.content ?? \"\";\n this.author = new User(data.author);\n this.channelId = data.channel_id;\n this.guildId = data.guild_id;\n this.flags = data.flags ?? 0;\n this.timestamp = new Date(\n data.timestamp ?? Number((BigInt(this.id) >> 22n) + 1420070400000n),\n );\n this.attachments = data.attachments ?? [];\n this.embeds = data.embeds ?? [];\n this.components = data.components ?? [];\n this.mentions = (data.mentions ?? []).map((user) => new User(user));\n this.mentionRoles = data.mention_roles ?? [];\n this.pinned = data.pinned ?? false;\n this.mentionEveryone = data.mention_everyone ?? false;\n this.type = data.type ?? 0;\n this.reference = data.message_reference;\n this.referencedMessage = data.referenced_message\n ? new Message(data.referenced_message, context)\n : data.referenced_message === null\n ? null\n : undefined;\n this.#context = context;\n this.channel = new Channel(\n { id: data.channel_id, type: 0, guild_id: data.guild_id },\n context,\n );\n }\n\n /** Whether embeds are suppressed on this message. */\n public get embedsSuppressed(): boolean {\n return (this.flags & 4) !== 0;\n }\n\n /** Unix timestamp (ms) at which the message was created — discord.js parity.\n * Derived from the message `timestamp`, which itself falls back to the id snowflake. */\n public get createdTimestamp(): number {\n return this.timestamp.getTime();\n }\n\n /** Date at which the message was created — discord.js parity. Overrides the\n * snowflake-only `BaseStructure.createdAt` to honour the message `timestamp`. */\n public override get createdAt(): Date {\n return this.timestamp;\n }\n\n /** Edits this message. @param options Message fields to change. @returns The updated message. @throws {Error} If the message is not attached to a client. */\n public edit(\n options: Record<string, unknown> & { content?: string },\n ): Promise<Message> {\n if (!this.#context)\n throw new Error(\"This message is not attached to a client.\");\n return this.#context.editMessage(this.channelId, this.id, options);\n }\n\n /** Updates this message using the same resource operation as edit. @param options Message fields to change. @returns The updated message. @throws {Error} If the message is not attached to a client. */\n public update(\n options: Record<string, unknown> & { content?: string },\n ): Promise<Message> {\n return this.edit(options);\n }\n\n /** Deletes this message. @returns A promise fulfilled when Discord confirms deletion. @throws {Error} If the message is not attached to a client. */\n public delete(): Promise<void> {\n if (!this.#context)\n throw new Error(\"This message is not attached to a client.\");\n return this.#context.deleteMessage(this.channelId, this.id);\n }\n\n /** Replies to this message. @param options Message content or payload. @returns The created reply message. @throws {Error} If the message is not attached to a client. */\n public reply(\n options: string | (Record<string, unknown> & { content?: string }),\n ): Promise<Message> {\n if (!this.#context)\n throw new Error(\"This message is not attached to a client.\");\n const payload =\n typeof options === \"string\" ? { content: options } : { ...options };\n payload.message_reference = {\n message_id: this.id,\n channel_id: this.channelId,\n guild_id: this.guildId,\n };\n return this.#context.sendMessage(this.channelId, payload);\n }\n\n /** Crossposts this message. @returns The resulting message. @throws {Error} If the message is not attached to a client. */\n public crosspost(): Promise<Message> {\n if (!this.#context)\n throw new Error(\"This message is not attached to a client.\");\n return this.#context.crosspostMessage(this.channelId, this.id);\n }\n\n /** Adds a reaction to this message. @param emoji Emoji identifier. @returns A promise fulfilled when the reaction is added. @throws {Error} If reactions are unavailable. */\n public react(emoji: string): Promise<void> {\n if (!this.#context?.addReaction)\n throw new Error(\"This message is not attached to a client.\");\n return this.#context.addReaction(this.channelId, this.id, emoji);\n }\n\n /** Removes a reaction from this message. @param emoji Emoji identifier. @param userId User whose reaction should be removed; omit to remove the current user's reaction. @returns A promise fulfilled when the reaction is removed. @throws {Error} If reaction operations are unavailable. */\n public removeReaction(emoji: string, userId?: string): Promise<void> {\n if (!this.#context)\n throw new Error(\"This message is not attached to a client.\");\n return userId\n ? (this.#context.removeReaction?.(\n this.channelId,\n this.id,\n emoji,\n userId,\n ) ??\n Promise.reject(\n new Error(\"Reaction operations are unavailable.\"),\n ))\n : (this.#context.removeOwnReaction?.(\n this.channelId,\n this.id,\n emoji,\n ) ??\n Promise.reject(\n new Error(\"Reaction operations are unavailable.\"),\n ));\n }\n\n /** Removes all reactions from this message. @returns A promise fulfilled when reactions are removed. @throws {Error} If reaction operations are unavailable. */\n public removeAllReactions(): Promise<void> {\n if (!this.#context?.removeAllReactions)\n throw new Error(\"This message is not attached to a client.\");\n return this.#context.removeAllReactions(this.channelId, this.id);\n }\n\n /** Pins this message. @returns A promise fulfilled when the message is pinned. @throws {Error} If pin operations are unavailable. */\n public pin(): Promise<void> {\n if (!this.#context?.pinMessage)\n throw new Error(\"This message is not attached to a client.\");\n return this.#context.pinMessage(this.channelId, this.id);\n }\n\n /** Unpins this message. @returns A promise fulfilled when the message is unpinned. @throws {Error} If pin operations are unavailable. */\n public unpin(): Promise<void> {\n if (!this.#context?.unpinMessage)\n throw new Error(\"This message is not attached to a client.\");\n return this.#context.unpinMessage(this.channelId, this.id);\n }\n\n // ─── Flag-based getters ───────────────────────────────────────────────────────\n\n /** Whether this message was sent ephemerally (only visible to the recipient). */\n public get isEphemeral(): boolean {\n return (this.flags & 64) !== 0;\n }\n\n /** Whether this message is currently pinned in its channel. */\n public get isPinned(): boolean {\n return this.pinned;\n }\n\n /** Whether this is a system-generated message (join, boost, etc). Mirrors\n * discord.js: a message is \"system\" unless its type is one of the user-authored\n * types — Default (0), Reply (19), ChatInputCommand (20) or ContextMenuCommand (23). */\n public get isSystemMessage(): boolean {\n return !NON_SYSTEM_MESSAGE_TYPES.has(this.type);\n }\n\n /** Whether this message was crossposted from an announcement channel. */\n public get isCrosspost(): boolean {\n return (this.flags & 2) !== 0;\n }\n\n /** Whether this message has file attachments. */\n public get hasAttachments(): boolean {\n return this.attachments.length > 0;\n }\n\n /** Whether this message contains embeds. */\n public get hasEmbeds(): boolean {\n return this.embeds.length > 0;\n }\n\n /** Whether this message contains interactive components. */\n public get hasComponents(): boolean {\n return this.components.length > 0;\n }\n\n /** Edits this message to suppress its embeds. @returns The updated message. */\n public suppressEmbeds(): Promise<Message> {\n return this.edit({ flags: this.flags | 4 });\n }\n\n /** Returns a plain-object snapshot of all message fields. */\n public toJSON(): Record<string, unknown> {\n return {\n id: this.id,\n content: this.content,\n channelId: this.channelId,\n guildId: this.guildId,\n flags: this.flags,\n pinned: this.pinned,\n mentionEveryone: this.mentionEveryone,\n type: this.type,\n timestamp: this.timestamp.toISOString(),\n author: { id: this.author.id, username: this.author.username },\n attachments: [...this.attachments],\n embeds: [...this.embeds],\n components: [...this.components],\n mentions: this.mentions.map((u) => u.id),\n mentionRoles: [...this.mentionRoles],\n reference: this.reference,\n referencedMessage: this.referencedMessage\n ? this.referencedMessage.id\n : this.referencedMessage,\n };\n }\n}\n\nexport {\n GuildMember,\n Role,\n TextChannel,\n Invite,\n Webhook,\n WebhookType,\n Emoji,\n AutoModerationRule,\n WelcomeScreenChannel,\n GuildWelcomeScreen,\n OnboardingPromptOption,\n OnboardingPrompt,\n GuildOnboarding,\n} from \"./resources.js\";\nexport {\n NewsChannel,\n DMChannel,\n VoiceChannel,\n StageChannel,\n CategoryChannel,\n ThreadChannel,\n ForumChannel,\n MediaChannel,\n createChannel,\n} from \"./channels.js\";\nexport * from \"./interactions.js\";\nexport { Embed } from \"./embed.js\";\nexport { AuditLog, AuditLogEntry } from \"./audit-log.js\";\n// KI-4: PermissionsBitField lives canonically in @lunibee/core (single source of\n// truth). Re-export it here for discord.js-style top-level access from structures,\n// replacing the former structures-local duplicate.\nexport { PermissionsBitField } from \"@lunibee/core\";\n"
19
20
  ],
20
- "mappings": "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",
21
- "debugId": "8FB0F7F12180BD8364756E2164756E21",
21
+ "mappings": "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",
22
+ "debugId": "39460C3E91D6CD3564756E2164756E21",
22
23
  "names": []
23
24
  }