lunibee 0.1.7 → 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.
- package/LICENSE +21 -21
- package/README.md +225 -223
- package/dist/builders/commands.d.ts +6 -4
- package/dist/builders/components.d.ts +23 -0
- package/dist/builders/index.d.ts +2 -2
- package/dist/builders/index.js +120 -24
- package/dist/builders/index.js.map +9 -8
- package/dist/collection/index.d.ts +68 -1
- package/dist/collection/index.js +335 -1
- package/dist/collection/index.js.map +4 -4
- package/dist/core/collector.d.ts +13 -0
- package/dist/core/events.d.ts +112 -2
- package/dist/core/index.d.ts +30 -93
- package/dist/core/index.js +3386 -957
- package/dist/core/index.js.map +48 -24
- package/dist/core/permissions.d.ts +48 -0
- package/dist/formatters/index.js.map +1 -1
- package/dist/handlers/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3806 -1193
- package/dist/index.js.map +64 -43
- package/dist/managers/advanced.d.ts +116 -0
- package/dist/managers/base.d.ts +13 -2
- package/dist/managers/emoji.d.ts +1 -1
- package/dist/managers/guild-resources.d.ts +109 -0
- package/dist/managers/guild.d.ts +33 -2
- package/dist/managers/index.d.ts +44 -6
- package/dist/managers/index.js +1186 -150
- package/dist/managers/index.js.map +27 -21
- package/dist/managers/message.d.ts +10 -1
- package/dist/rest/decoder.d.ts +23 -0
- package/dist/rest/errors.d.ts +53 -0
- package/dist/rest/index.d.ts +21 -17
- package/dist/rest/index.js +526 -264
- package/dist/rest/index.js.map +14 -8
- package/dist/rest/limiter.d.ts +42 -0
- package/dist/rest/redis.d.ts +18 -1
- package/dist/rest/route.d.ts +31 -0
- package/dist/rest/routes.d.ts +22 -0
- package/dist/rest/scheduler.d.ts +42 -0
- package/dist/rest/store.d.ts +29 -0
- package/dist/rest/transport.d.ts +40 -0
- package/dist/sharding/bus.d.ts +31 -0
- package/dist/sharding/cluster.d.ts +10 -0
- package/dist/sharding/index.d.ts +39 -2
- package/dist/sharding/index.js +1105 -404
- package/dist/sharding/index.js.map +18 -8
- package/dist/structures/base.d.ts +10 -0
- package/dist/structures/channels.d.ts +56 -0
- package/dist/structures/index.d.ts +1 -0
- package/dist/structures/index.js +305 -311
- package/dist/structures/index.js.map +18 -14
- package/dist/structures/interactions.d.ts +38 -52
- package/dist/structures/options.d.ts +55 -0
- package/dist/structures/resources.d.ts +3 -3
- package/dist/types/gateway-events.d.ts +132 -0
- package/dist/types/gateway.d.ts +197 -0
- package/dist/types/index.d.ts +53 -260
- package/dist/types/index.js +44 -2
- package/dist/types/index.js.map +5 -4
- package/dist/utils/index.js.map +1 -1
- package/dist/voice/index.d.ts +32 -1
- package/dist/voice/index.js +73 -7
- package/dist/voice/index.js.map +3 -3
- package/dist/ws/close-codes.d.ts +23 -0
- package/dist/ws/decoder.d.ts +58 -0
- package/dist/ws/heartbeat.d.ts +87 -0
- package/dist/ws/index.d.ts +18 -65
- package/dist/ws/index.js +911 -385
- package/dist/ws/index.js.map +15 -5
- package/dist/ws/opcodes.d.ts +14 -0
- package/dist/ws/protocol.d.ts +110 -0
- package/dist/ws/reconnect.d.ts +108 -0
- package/dist/ws/send-budget.d.ts +17 -0
- package/dist/ws/session.d.ts +100 -0
- package/dist/ws/state.d.ts +27 -0
- package/dist/ws/transport.d.ts +80 -0
- package/package.json +21 -20
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../packages/builders/src/embed.ts", "../../packages/types/src/index.ts", "../../packages/builders/src/components.ts", "../../packages/builders/src/commands.ts", "../../packages/builders/src/attachment.ts"],
|
|
3
|
+
"sources": ["../../packages/builders/src/embed.ts", "../../packages/types/src/gateway.ts", "../../packages/types/src/index.ts", "../../packages/builders/src/components.ts", "../../packages/builders/src/commands.ts", "../../packages/builders/src/attachment.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/** Discord API embed field payload. */\
|
|
6
|
-
"/** Discord API snowflake identifier. */\r\nexport type Snowflake = string;\r\n\r\n// ─── Gateway Intents ─────────────────────────────────────────────────────────\r\n\r\n/** Gateway intent bit flags supported by Discord (PascalCase). */\r\nexport const GatewayIntentBits = {\r\n Guilds: 1 << 0,\r\n GuildMembers: 1 << 1,\r\n GuildModeration: 1 << 2,\r\n GuildExpressions: 1 << 3,\r\n GuildIntegrations: 1 << 4,\r\n GuildWebhooks: 1 << 5,\r\n GuildInvites: 1 << 6,\r\n GuildVoiceStates: 1 << 7,\r\n GuildPresences: 1 << 8,\r\n GuildMessages: 1 << 9,\r\n GuildMessageReactions: 1 << 10,\r\n GuildMessageTyping: 1 << 11,\r\n DirectMessages: 1 << 12,\r\n DirectMessageReactions: 1 << 13,\r\n DirectMessageTyping: 1 << 14,\r\n MessageContent: 1 << 15,\r\n GuildScheduledEvents: 1 << 16,\r\n AutoModerationConfiguration: 1 << 20,\r\n AutoModerationExecution: 1 << 21,\r\n GuildMessagePolls: 1 << 24,\r\n DirectMessagePolls: 1 << 25,\r\n} as const;\r\n\r\n/** Idiomatic camelCase Gateway intent bit flags supported by Discord. */\r\nexport const IntentBits = {\r\n guild: 1 << 0,\r\n guilds: 1 << 0,\r\n guildMembers: 1 << 1,\r\n guildModeration: 1 << 2,\r\n guildBans: 1 << 2,\r\n guildExpressions: 1 << 3,\r\n guildEmojis: 1 << 3,\r\n guildEmojisAndStickers: 1 << 3,\r\n guildIntegrations: 1 << 4,\r\n guildWebhooks: 1 << 5,\r\n guildInvites: 1 << 6,\r\n guildVoiceStates: 1 << 7,\r\n guildPresences: 1 << 8,\r\n guildMessages: 1 << 9,\r\n guildMessage: 1 << 9,\r\n guildMessageReactions: 1 << 10,\r\n guildMessageTyping: 1 << 11,\r\n directMessages: 1 << 12,\r\n directMessageReactions: 1 << 13,\r\n directMessageTyping: 1 << 14,\r\n messageContent: 1 << 15,\r\n guildScheduledEvents: 1 << 16,\r\n autoModerationConfiguration: 1 << 20,\r\n autoModerationExecution: 1 << 21,\r\n guildMessagePolls: 1 << 24,\r\n directMessagePolls: 1 << 25,\r\n} as const;\r\n\r\n/** Alias for IntentBits. */\r\nexport const Intents = IntentBits;\r\n\r\n/** Gateway intent resolvable value (single bitfield, enum key, or array of bitfields/strings). */\r\nexport type GatewayIntentResolvable =\r\n | number\r\n | keyof typeof GatewayIntentBits\r\n | keyof typeof IntentBits\r\n | (\r\n | number\r\n | keyof typeof GatewayIntentBits\r\n | keyof typeof IntentBits\r\n | string\r\n )[];\r\n\r\n/** Resolves any GatewayIntentResolvable into a raw bitfield integer. */\r\nexport function resolveGatewayIntents(\r\n intents: GatewayIntentResolvable,\r\n): number {\r\n if (typeof intents === \"number\") return intents;\r\n if (Array.isArray(intents)) {\r\n return intents.reduce<number>((acc, intent) => {\r\n return acc | resolveGatewayIntents(intent as any);\r\n }, 0);\r\n }\r\n if (typeof intents === \"string\") {\r\n if (intents in GatewayIntentBits)\r\n return (GatewayIntentBits as Record<string, number>)[intents]!;\r\n if (intents in IntentBits)\r\n return (IntentBits as Record<string, number>)[intents]!;\r\n const lower = intents.charAt(0).toLowerCase() + intents.slice(1);\r\n if (lower in IntentBits)\r\n return (IntentBits as Record<string, number>)[lower]!;\r\n const num = Number(intents);\r\n if (!Number.isNaN(num)) return num;\r\n }\r\n return 0;\r\n}\r\n\r\n// ─── Gateway Config ───────────────────────────────────────────────────────────\r\n\r\n/** Gateway connection properties (OS, browser, device). */\r\nexport interface GatewayProperties {\r\n os?: string;\r\n browser?: string;\r\n device?: string;\r\n [key: string]: unknown;\r\n}\r\n/** Gateway presence activity. */\r\nexport interface GatewayPresenceActivity {\r\n name: string;\r\n type?: number;\r\n url?: string;\r\n state?: string;\r\n}\r\n/** Gateway presence data. */\r\nexport interface GatewayPresence {\r\n status?: \"online\" | \"dnd\" | \"idle\" | \"invisible\" | \"offline\";\r\n activities?: GatewayPresenceActivity[];\r\n afk?: boolean;\r\n since?: number | null;\r\n}\r\n/** Client configuration. */\r\nexport interface ClientOptions {\r\n token: string;\r\n intents: GatewayIntentResolvable;\r\n gateway?: GatewayOptions;\r\n rest?: RESTOptions;\r\n}\r\n/** Gateway connection configuration. */\r\nexport interface GatewayOptions {\r\n intents?: GatewayIntentResolvable;\r\n reconnect?: boolean;\r\n maxReconnectAttempts?: number;\r\n reconnectBaseDelay?: number;\r\n reconnectMaxDelay?: number;\r\n shardId?: number;\r\n shardCount?: number;\r\n properties?: GatewayProperties;\r\n presence?: GatewayPresence;\r\n}\r\n\r\n/** REST request configuration. */\r\nexport interface RESTOptions {\r\n timeout?: number;\r\n retries?: number;\r\n baseURL?: string;\r\n}\r\n\r\n// ─── Core Discord Objects ─────────────────────────────────────────────────────\r\n\r\n/** Discord user object. */\r\nexport interface UserData {\r\n id: Snowflake;\r\n username: string;\r\n discriminator?: string;\r\n global_name?: string | null;\r\n avatar?: string | null;\r\n bot?: boolean;\r\n system?: boolean;\r\n public_flags?: number;\r\n}\r\n/** Current authenticated bot user. */\r\nexport type ClientUser = UserData;\r\n/** Discord Gateway payload envelope. */\r\nexport interface GatewayPayload<T = unknown> {\r\n op: number;\r\n d: T | null;\r\n s: number | null;\r\n t: string | null;\r\n}\r\n/** Generic Discord API error payload. */\r\nexport interface APIError {\r\n code?: number;\r\n message?: string;\r\n errors?: Record<string, unknown>;\r\n}\r\n\r\n// ─── Discord Flags & Enums ────────────────────────────────────────────────────\r\n\r\n/** Discord message flags. */\r\nexport const MessageFlags = {\r\n Crossposted: 1,\r\n IsCrosspost: 2,\r\n SuppressEmbeds: 4,\r\n SourceMessageDeleted: 8,\r\n Urgent: 16,\r\n HasThread: 32,\r\n Ephemeral: 64,\r\n Loading: 128,\r\n IsComponentsV2: 32768,\r\n} as const;\r\n\r\n/** Discord channel types. */\r\nexport const ChannelType = {\r\n GuildText: 0,\r\n DM: 1,\r\n GuildVoice: 2,\r\n GroupDM: 3,\r\n GuildCategory: 4,\r\n GuildAnnouncement: 5,\r\n AnnouncementThread: 10,\r\n PublicThread: 11,\r\n PrivateThread: 12,\r\n GuildStageVoice: 13,\r\n GuildDirectory: 14,\r\n GuildForum: 15,\r\n GuildMedia: 16,\r\n} as const;\r\n\r\n/** Discord component types. */\r\nexport const ComponentType = {\r\n ActionRow: 1,\r\n Button: 2,\r\n StringSelect: 3,\r\n TextInput: 4,\r\n UserSelect: 5,\r\n RoleSelect: 6,\r\n MentionableSelect: 7,\r\n ChannelSelect: 8,\r\n Section: 9,\r\n TextDisplay: 10,\r\n Thumbnail: 11,\r\n MediaGallery: 12,\r\n File: 13,\r\n Separator: 14,\r\n ContentInventoryEntry: 16,\r\n Container: 17,\r\n} as const;\r\n\r\n/** Discord button style types. */\r\nexport const ButtonStyle = {\r\n Primary: 1,\r\n Secondary: 2,\r\n Success: 3,\r\n Danger: 4,\r\n Link: 5,\r\n Premium: 6,\r\n} as const;\r\n\r\n/** Discord text input style types. */\r\nexport const TextInputStyle = {\r\n Short: 1,\r\n Paragraph: 2,\r\n} as const;\r\n\r\n/** Discord interaction response types. */\r\nexport const InteractionResponseType = {\r\n Pong: 1,\r\n ChannelMessage: 4,\r\n DeferredChannelMessage: 5,\r\n DeferredMessageUpdate: 6,\r\n MessageUpdate: 7,\r\n Autocomplete: 8,\r\n Modal: 9,\r\n} as const;\r\n\r\n/** Discord sticker format types. */\r\nexport const StickerFormatType = {\r\n PNG: 1,\r\n APNG: 2,\r\n Lottie: 3,\r\n GIF: 4,\r\n} as const;\r\n\r\n/** Discord sticker types. */\r\nexport const StickerType = {\r\n Standard: 1,\r\n Guild: 2,\r\n} as const;\r\n\r\n/** Discord verification levels. */\r\nexport const VerificationLevel = {\r\n None: 0,\r\n Low: 1,\r\n Medium: 2,\r\n High: 3,\r\n VeryHigh: 4,\r\n} as const;\r\n\r\n/** Discord premium tiers. */\r\nexport const PremiumTier = {\r\n None: 0,\r\n Tier1: 1,\r\n Tier2: 2,\r\n Tier3: 3,\r\n} as const;\r\n\r\n// ─── Embeds ───────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord embed footer object. */\r\nexport interface APIEmbedFooter {\r\n text: string;\r\n icon_url?: string;\r\n proxy_icon_url?: string;\r\n}\r\n/** Raw Discord embed image/thumbnail/video object. */\r\nexport interface APIEmbedMedia {\r\n url: string;\r\n proxy_url?: string;\r\n height?: number;\r\n width?: number;\r\n}\r\n/** Raw Discord embed provider object. */\r\nexport interface APIEmbedProvider {\r\n name?: string;\r\n url?: string;\r\n}\r\n/** Raw Discord embed author object. */\r\nexport interface APIEmbedAuthor {\r\n name: string;\r\n url?: string;\r\n icon_url?: string;\r\n proxy_icon_url?: string;\r\n}\r\n/** Raw Discord embed field object. */\r\nexport interface APIEmbedField {\r\n name: string;\r\n value: string;\r\n inline?: boolean;\r\n}\r\n/** Raw Discord embed object. */\r\nexport interface APIEmbed {\r\n title?: string;\r\n type?: string;\r\n description?: string;\r\n url?: string;\r\n timestamp?: string;\r\n color?: number;\r\n footer?: APIEmbedFooter;\r\n image?: APIEmbedMedia;\r\n thumbnail?: APIEmbedMedia;\r\n video?: APIEmbedMedia;\r\n provider?: APIEmbedProvider;\r\n author?: APIEmbedAuthor;\r\n fields?: APIEmbedField[];\r\n}\r\n\r\n// ─── Message Components ───────────────────────────────────────────────────────\r\n\r\n/** Raw Discord select menu option. */\r\nexport interface APISelectMenuOption {\r\n label: string;\r\n value: string;\r\n description?: string;\r\n emoji?: APIPartialEmoji;\r\n default?: boolean;\r\n}\r\n/** Raw Discord emoji (partial, as used in components). */\r\nexport interface APIPartialEmoji {\r\n id?: Snowflake | null;\r\n name?: string | null;\r\n animated?: boolean;\r\n}\r\n/** Raw Discord button component. */\r\nexport interface APIButtonComponent {\r\n type: 2;\r\n style: number;\r\n label?: string;\r\n emoji?: APIPartialEmoji;\r\n custom_id?: string;\r\n url?: string;\r\n sku_id?: string;\r\n disabled?: boolean;\r\n}\r\n/** Raw Discord select menu component. */\r\nexport interface APISelectMenuComponent {\r\n type: 3 | 5 | 6 | 7 | 8;\r\n custom_id: string;\r\n options?: APISelectMenuOption[];\r\n channel_types?: number[];\r\n placeholder?: string;\r\n min_values?: number;\r\n max_values?: number;\r\n disabled?: boolean;\r\n}\r\n/** Raw Discord text input component. */\r\nexport interface APITextInputComponent {\r\n type: 4;\r\n custom_id: string;\r\n style: number;\r\n label: string;\r\n min_length?: number;\r\n max_length?: number;\r\n required?: boolean;\r\n value?: string;\r\n placeholder?: string;\r\n}\r\n/** Union of all raw message component types. */\r\nexport type APIMessageActionRowComponent =\r\n APIButtonComponent | APISelectMenuComponent | APITextInputComponent;\r\n/** Raw Discord action row component. */\r\nexport interface APIActionRowComponent {\r\n type: 1;\r\n id?: number;\r\n components: APIMessageActionRowComponent[];\r\n}\r\n/** Union including action rows and V2 components. */\r\nexport type APIMessageComponent =\r\n APIActionRowComponent | { type: Exclude<number, 1>; [key: string]: any };\r\n\r\n// ─── Attachments ─────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord attachment object. */\r\nexport interface APIAttachment {\r\n id: Snowflake;\r\n filename: string;\r\n description?: string | null;\r\n content_type?: string;\r\n size: number;\r\n url: string;\r\n proxy_url: string;\r\n height?: number | null;\r\n width?: number | null;\r\n ephemeral?: boolean;\r\n duration_secs?: number;\r\n waveform?: string;\r\n flags?: number;\r\n}\r\n\r\n// ─── Stickers ────────────────────────────────────────────────────────────────\r\n\r\n/** Compact sticker item as included in messages. */\r\nexport interface APIStickerItem {\r\n id: Snowflake;\r\n name: string;\r\n format_type: number;\r\n}\r\n/** Full Discord sticker object. */\r\nexport interface APISticker {\r\n id: Snowflake;\r\n pack_id?: Snowflake;\r\n name: string;\r\n description?: string | null;\r\n tags?: string;\r\n type: number;\r\n format_type: number;\r\n available?: boolean;\r\n guild_id?: Snowflake;\r\n user?: UserData;\r\n sort_value?: number;\r\n}\r\n\r\n// ─── Messages ────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord message reference. */\r\nexport interface APIMessageReference {\r\n type?: number;\r\n message_id?: Snowflake;\r\n channel_id?: Snowflake;\r\n guild_id?: Snowflake;\r\n fail_if_not_exists?: boolean;\r\n}\r\n/** Raw Discord message reaction. */\r\nexport interface APIMessageReaction {\r\n count: number;\r\n count_details?: Record<string, number>;\r\n me?: boolean;\r\n me_burst?: boolean;\r\n emoji: APIPartialEmoji;\r\n burst_colors?: string[];\r\n}\r\n/** Raw Discord message object. */\r\nexport interface APIMessage {\r\n id: Snowflake;\r\n channel_id: Snowflake;\r\n author: UserData;\r\n content: string;\r\n timestamp?: string;\r\n edited_timestamp?: string | null;\r\n tts?: boolean;\r\n mention_everyone?: boolean;\r\n mentions?: UserData[];\r\n mention_roles?: Snowflake[];\r\n mention_channels?: Array<Record<string, unknown>>;\r\n attachments?: APIAttachment[];\r\n embeds?: APIEmbed[];\r\n reactions?: APIMessageReaction[];\r\n nonce?: string | number | null;\r\n pinned?: boolean;\r\n webhook_id?: Snowflake;\r\n type?: number;\r\n activity?: Record<string, unknown>;\r\n application?: Record<string, unknown>;\r\n application_id?: Snowflake;\r\n message_reference?: APIMessageReference;\r\n flags?: number;\r\n referenced_message?: APIMessage | null;\r\n interaction_metadata?: Record<string, unknown>;\r\n thread?: Record<string, unknown>;\r\n components?: APIMessageComponent[];\r\n sticker_items?: APIStickerItem[];\r\n stickers?: APISticker[];\r\n position?: number;\r\n role_subscription_data?: Record<string, unknown>;\r\n purchase_notification?: Record<string, unknown>;\r\n poll?: Record<string, unknown>;\r\n guild_id?: Snowflake;\r\n}\r\n\r\n// ─── Channels ────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord channel object. */\r\nexport interface APIChannel {\r\n id: Snowflake;\r\n type: number;\r\n guild_id?: Snowflake;\r\n position?: number;\r\n permission_overwrites?: Array<Record<string, unknown>>;\r\n name?: string | null;\r\n topic?: string | null;\r\n nsfw?: boolean;\r\n last_message_id?: Snowflake | null;\r\n bitrate?: number;\r\n user_limit?: number;\r\n rate_limit_per_user?: number;\r\n recipients?: UserData[];\r\n icon?: string | null;\r\n owner_id?: Snowflake;\r\n application_id?: Snowflake;\r\n parent_id?: Snowflake | null;\r\n last_pin_timestamp?: string | null;\r\n rtc_region?: string | null;\r\n video_quality_mode?: number;\r\n message_count?: number;\r\n member_count?: number;\r\n thread_metadata?: APIThreadMetadata;\r\n default_auto_archive_duration?: number;\r\n flags?: number;\r\n total_message_sent?: number;\r\n available_tags?: APIForumTag[];\r\n default_reaction_emoji?: APIPartialEmoji | null;\r\n default_thread_rate_limit_per_user?: number;\r\n default_sort_order?: number | null;\r\n default_forum_layout?: number;\r\n}\r\n\r\n/** Raw Discord thread metadata. */\r\nexport interface APIThreadMetadata {\r\n archived: boolean;\r\n auto_archive_duration: number;\r\n archive_timestamp: string;\r\n locked: boolean;\r\n invitable?: boolean;\r\n create_timestamp?: string | null;\r\n}\r\n\r\n/** Raw Discord forum tag. */\r\nexport interface APIForumTag {\r\n id: Snowflake;\r\n name: string;\r\n moderated: boolean;\r\n emoji_id?: Snowflake | null;\r\n emoji_name?: string | null;\r\n}\r\n\r\n/** Raw Discord thread member. */\r\nexport interface APIThreadMember {\r\n id?: Snowflake;\r\n user_id?: Snowflake;\r\n join_timestamp: string;\r\n flags: number;\r\n member?: APIGuildMember;\r\n}\r\n\r\n// ─── Roles ────────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord role object. */\r\nexport interface APIRole {\r\n id: Snowflake;\r\n name: string;\r\n color: number;\r\n hoist: boolean;\r\n icon?: string | null;\r\n unicode_emoji?: string | null;\r\n position: number;\r\n permissions: string;\r\n managed: boolean;\r\n mentionable: boolean;\r\n tags?: Record<string, unknown>;\r\n flags?: number;\r\n}\r\n\r\n// ─── Emoji ────────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord emoji object. */\r\nexport interface APIEmoji {\r\n id: Snowflake | null;\r\n name: string | null;\r\n roles?: Snowflake[];\r\n user?: UserData;\r\n require_colons?: boolean;\r\n managed?: boolean;\r\n animated?: boolean;\r\n available?: boolean;\r\n}\r\n\r\n// ─── Guilds ───────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord guild object. */\r\nexport interface APIGuild {\r\n id: Snowflake;\r\n name: string;\r\n icon?: string | null;\r\n icon_hash?: string | null;\r\n splash?: string | null;\r\n discovery_splash?: string | null;\r\n owner?: boolean;\r\n owner_id?: Snowflake;\r\n permissions?: string;\r\n afk_channel_id?: Snowflake | null;\r\n afk_timeout?: number;\r\n widget_enabled?: boolean;\r\n widget_channel_id?: Snowflake | null;\r\n verification_level?: number;\r\n default_message_notifications?: number;\r\n explicit_content_filter?: number;\r\n roles?: APIRole[];\r\n emojis?: APIEmoji[];\r\n stickers?: APISticker[];\r\n features?: string[];\r\n mfa_level?: number;\r\n application_id?: Snowflake | null;\r\n system_channel_id?: Snowflake | null;\r\n system_channel_flags?: number;\r\n rules_channel_id?: Snowflake | null;\r\n max_presences?: number | null;\r\n max_members?: number;\r\n vanity_url_code?: string | null;\r\n description?: string | null;\r\n banner?: string | null;\r\n premium_tier?: number;\r\n premium_subscription_count?: number;\r\n preferred_locale?: string;\r\n public_updates_channel_id?: Snowflake | null;\r\n max_video_channel_users?: number;\r\n approximate_member_count?: number;\r\n approximate_presence_count?: number;\r\n nsfw_level?: number;\r\n safety_alerts_channel_id?: Snowflake | null;\r\n member_count?: number;\r\n}\r\n\r\n// ─── Welcome Screen ───────────────────────────────────────────────────────────\r\n\r\nexport interface APIWelcomeScreenChannel {\r\n channel_id: Snowflake;\r\n description: string;\r\n emoji_id: Snowflake | null;\r\n emoji_name: string | null;\r\n}\r\n\r\nexport interface APIGuildWelcomeScreen {\r\n description: string | null;\r\n welcome_channels: APIWelcomeScreenChannel[];\r\n}\r\n\r\n// ─── Guild Onboarding ─────────────────────────────────────────────────────────\r\n\r\nexport interface APIOnboardingPromptOption {\r\n id: Snowflake;\r\n channel_ids: Snowflake[];\r\n role_ids: Snowflake[];\r\n emoji?: APIPartialEmoji;\r\n title: string;\r\n description: string | null;\r\n}\r\n\r\nexport interface APIOnboardingPrompt {\r\n id: Snowflake;\r\n type: number;\r\n options: APIOnboardingPromptOption[];\r\n title: string;\r\n single_select: boolean;\r\n required: boolean;\r\n in_onboarding: boolean;\r\n}\r\n\r\nexport interface APIGuildOnboarding {\r\n guild_id: Snowflake;\r\n prompts: APIOnboardingPrompt[];\r\n default_channel_ids: Snowflake[];\r\n enabled: boolean;\r\n mode: number;\r\n}\r\n\r\n/** Raw Discord guild member object. */\r\nexport interface APIGuildMember {\r\n user: UserData;\r\n nick?: string | null;\r\n avatar?: string | null;\r\n roles: Snowflake[];\r\n joined_at: string;\r\n premium_since?: string | null;\r\n deaf?: boolean;\r\n mute?: boolean;\r\n flags?: number;\r\n pending?: boolean;\r\n permissions?: string;\r\n communication_disabled_until?: string | null;\r\n guild_id?: Snowflake;\r\n}\r\n\r\n// ─── Voice ────────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord voice state object. */\r\nexport interface APIVoiceState {\r\n guild_id?: Snowflake;\r\n channel_id?: Snowflake | null;\r\n user_id: Snowflake;\r\n member?: APIGuildMember;\r\n session_id: string;\r\n deaf: boolean;\r\n mute: boolean;\r\n self_deaf: boolean;\r\n self_mute: boolean;\r\n self_stream?: boolean;\r\n self_video: boolean;\r\n suppress: boolean;\r\n request_to_speak_timestamp?: string | null;\r\n}\r\n\r\n/** Raw Discord voice server update event. */\r\nexport interface APIVoiceServerUpdate {\r\n token: string;\r\n guild_id: Snowflake;\r\n endpoint?: string | null;\r\n}\r\n\r\n// ─── Presence ────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord activity object. */\r\nexport interface APIActivity {\r\n name: string;\r\n type: number;\r\n url?: string | null;\r\n created_at: number;\r\n state?: string | null;\r\n details?: string | null;\r\n emoji?: APIPartialEmoji | null;\r\n}\r\n\r\n/** Raw Discord presence update event. */\r\nexport interface APIPresenceUpdate {\r\n user: { id: Snowflake } & Partial<UserData>;\r\n guild_id: Snowflake;\r\n status: string;\r\n activities: APIActivity[];\r\n client_status: { desktop?: string; mobile?: string; web?: string };\r\n}\r\n\r\n// ─── Typing ───────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord typing start event. */\r\nexport interface APITypingStart {\r\n channel_id: Snowflake;\r\n guild_id?: Snowflake;\r\n user_id: Snowflake;\r\n timestamp: number;\r\n member?: APIGuildMember;\r\n}\r\n\r\n// ─── Guilds ──────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord guild preview. */\r\nexport interface APIGuildPreview {\r\n id: Snowflake;\r\n name: string;\r\n icon: string | null;\r\n splash: string | null;\r\n discovery_splash: string | null;\r\n emojis: unknown[];\r\n features: string[];\r\n approximate_member_count: number;\r\n approximate_presence_count: number;\r\n description: string | null;\r\n stickers: unknown[];\r\n}\r\n\r\n// ─── Invites ─────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord invite. */\r\nexport interface APIInvite {\r\n code: string;\r\n guild?: Partial<APIGuild>;\r\n channel: Partial<APIChannel>;\r\n inviter?: UserData;\r\n target_type?: number;\r\n target_user?: UserData;\r\n approximate_presence_count?: number;\r\n approximate_member_count?: number;\r\n}\r\n\r\n/** Raw Discord invite create event. */\r\nexport interface APIInviteCreate {\r\n channel_id: Snowflake;\r\n code: string;\r\n created_at: string;\r\n guild_id?: Snowflake;\r\n inviter?: UserData;\r\n max_age: number;\r\n max_uses: number;\r\n target_type?: number;\r\n target_user?: UserData;\r\n temporary: boolean;\r\n uses: number;\r\n}\r\n\r\n/** Raw Discord invite delete event. */\r\nexport interface APIInviteDelete {\r\n channel_id: Snowflake;\r\n guild_id?: Snowflake;\r\n code: string;\r\n}\r\n\r\n// ─── Webhooks ────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord webhooks update event. */\r\nexport interface APIWebhooksUpdate {\r\n guild_id: Snowflake;\r\n channel_id: Snowflake;\r\n}\r\n\r\n/** Raw Discord webhook object. */\r\nexport interface APIWebhook {\r\n id: Snowflake;\r\n type: number;\r\n guild_id?: Snowflake | null;\r\n channel_id?: Snowflake | null;\r\n user?: UserData;\r\n name?: string | null;\r\n avatar?: string | null;\r\n token?: string;\r\n application_id?: Snowflake | null;\r\n url?: string;\r\n}\r\n\r\n// ─── AutoMod ─────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord AutoMod action. */\r\nexport interface APIAutoModerationAction {\r\n type: number;\r\n metadata?: {\r\n channel_id?: Snowflake;\r\n duration_seconds?: number;\r\n custom_message?: string;\r\n };\r\n}\r\n\r\n// ─── Audit Logs ──────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord audit log change object. */\r\nexport interface APIAuditLogChange {\r\n new_value?: unknown;\r\n old_value?: unknown;\r\n key: string;\r\n}\r\n\r\n/** Raw Discord audit log entry options object. */\r\nexport interface APIAuditLogOptions {\r\n app_id?: Snowflake;\r\n auto_moderation_rule_name?: string;\r\n auto_moderation_rule_trigger_type?: string;\r\n channel_id?: Snowflake;\r\n count?: string;\r\n delete_member_days?: string;\r\n id?: Snowflake;\r\n members_removed?: string;\r\n message_id?: Snowflake;\r\n role_name?: string;\r\n type?: string;\r\n integration_type?: string;\r\n}\r\n\r\n/** Raw Discord audit log entry object. */\r\nexport interface APIAuditLogEntry {\r\n target_id: string | null;\r\n changes?: APIAuditLogChange[];\r\n user_id: Snowflake | null;\r\n id: Snowflake;\r\n action_type: number;\r\n options?: APIAuditLogOptions;\r\n reason?: string;\r\n}\r\n\r\n/** Raw Discord audit log object. */\r\nexport interface APIAuditLog {\r\n audit_log_entries: APIAuditLogEntry[];\r\n guild_scheduled_events: APIGuildScheduledEvent[];\r\n integrations: Array<Record<string, unknown>>;\r\n threads: APIChannel[];\r\n users: UserData[];\r\n webhooks: APIWebhook[];\r\n application_commands: APIApplicationCommand[];\r\n auto_moderation_rules: APIAutoModerationRule[];\r\n}\r\n\r\n/** Raw Discord AutoMod rule object. */\r\nexport interface APIAutoModerationRule {\r\n id: Snowflake;\r\n guild_id: Snowflake;\r\n name: string;\r\n creator_id: Snowflake;\r\n event_type: number;\r\n trigger_type: number;\r\n trigger_metadata: Record<string, unknown>;\r\n actions: APIAutoModerationAction[];\r\n enabled: boolean;\r\n exempt_roles: Snowflake[];\r\n exempt_channels: Snowflake[];\r\n}\r\n\r\n/** Raw Discord AutoMod action execution event. */\r\nexport interface APIAutoModerationActionExecution {\r\n guild_id: Snowflake;\r\n action: APIAutoModerationAction;\r\n rule_id: Snowflake;\r\n rule_trigger_type: number;\r\n user_id: Snowflake;\r\n channel_id?: Snowflake;\r\n message_id?: Snowflake;\r\n alert_system_message_id?: Snowflake;\r\n content: string;\r\n matched_keyword?: string | null;\r\n matched_content?: string | null;\r\n}\r\n\r\n// ─── Scheduled Events ─────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord guild scheduled event entity metadata. */\r\nexport interface APIGuildScheduledEventEntityMetadata {\r\n location?: string;\r\n}\r\n\r\n/** Raw Discord guild scheduled event object. */\r\nexport interface APIGuildScheduledEvent {\r\n id: Snowflake;\r\n guild_id: Snowflake;\r\n channel_id?: Snowflake | null;\r\n creator_id?: Snowflake | null;\r\n name: string;\r\n description?: string | null;\r\n scheduled_start_time: string;\r\n scheduled_end_time?: string | null;\r\n privacy_level: number;\r\n status: number;\r\n entity_type: number;\r\n entity_id?: Snowflake | null;\r\n entity_metadata?: APIGuildScheduledEventEntityMetadata | null;\r\n creator?: UserData;\r\n user_count?: number;\r\n image?: string | null;\r\n}\r\n\r\n// ─── Stage Instances ─────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord stage instance object. */\r\nexport interface APIStageInstance {\r\n id: Snowflake;\r\n guild_id: Snowflake;\r\n channel_id: Snowflake;\r\n topic: string;\r\n privacy_level: number;\r\n discoverable_disabled?: boolean;\r\n guild_scheduled_event_id?: Snowflake | null;\r\n}\r\n\r\n// ─── Application Commands ─────────────────────────────────────────────────────\r\n\r\n/** Discord application command option types. */\r\nexport const ApplicationCommandOptionType = {\r\n SubCommand: 1,\r\n SubCommandGroup: 2,\r\n String: 3,\r\n Integer: 4,\r\n Boolean: 5,\r\n User: 6,\r\n Channel: 7,\r\n Role: 8,\r\n Mentionable: 9,\r\n Number: 10,\r\n Attachment: 11,\r\n} as const;\r\n\r\n/** Discord application command types. */\r\nexport const ApplicationCommandType = {\r\n ChatInput: 1,\r\n User: 2,\r\n Message: 3,\r\n} as const;\r\n\r\n/** Raw Discord application command option. */\r\nexport interface APIApplicationCommandOption {\r\n type: number;\r\n name: string;\r\n description: string;\r\n required?: boolean;\r\n choices?: Array<{ name: string; value: string | number }>;\r\n options?: APIApplicationCommandOption[];\r\n min_value?: number;\r\n max_value?: number;\r\n min_length?: number;\r\n max_length?: number;\r\n autocomplete?: boolean;\r\n channel_types?: number[];\r\n}\r\n\r\n/** Raw Discord application command object (from API). */\r\nexport interface APIApplicationCommand {\r\n id: Snowflake;\r\n type?: number;\r\n application_id: Snowflake;\r\n guild_id?: Snowflake;\r\n name: string;\r\n description: string;\r\n options?: APIApplicationCommandOption[];\r\n default_member_permissions?: string | null;\r\n dm_permission?: boolean;\r\n nsfw?: boolean;\r\n version: Snowflake;\r\n}\r\n\r\n/** Data for creating/overwriting an application command. */\r\nexport interface ApplicationCommandData {\r\n name: string;\r\n description: string;\r\n type?: number;\r\n options?: APIApplicationCommandOption[];\r\n default_member_permissions?: string | null;\r\n dm_permission?: boolean;\r\n nsfw?: boolean;\r\n}\r\n\r\n// ─── Gateway Events ───────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord READY event payload. */\r\nexport interface APIReadyEvent {\r\n v: number;\r\n user: UserData;\r\n guilds: Array<{ id: Snowflake; unavailable?: boolean }>;\r\n session_id: string;\r\n resume_gateway_url: string;\r\n shard?: [number, number];\r\n application?: { id: Snowflake; flags: number; [key: string]: unknown };\r\n}\r\n\r\n/** Raw Discord reaction event payload. */\r\nexport interface APIMessageReactionEvent {\r\n user_id: Snowflake;\r\n channel_id: Snowflake;\r\n message_id: Snowflake;\r\n guild_id?: Snowflake;\r\n member?: APIGuildMember;\r\n emoji: APIPartialEmoji;\r\n message_author_id?: Snowflake;\r\n burst?: boolean;\r\n type?: number;\r\n}\r\n\r\n/** Raw Discord reaction remove emoji event payload. */\r\nexport interface APIMessageReactionRemoveEmojiEvent {\r\n channel_id: Snowflake;\r\n guild_id?: Snowflake;\r\n message_id: Snowflake;\r\n emoji: APIPartialEmoji;\r\n}\r\n\r\n/** Raw Discord message deletion event payload. */\r\nexport interface APIMessageDeleteEvent {\r\n id: Snowflake;\r\n channel_id: Snowflake;\r\n guild_id?: Snowflake;\r\n}\r\n\r\n/** Raw Discord bulk message deletion event payload. */\r\nexport interface APIMessageDeleteBulkEvent {\r\n ids: Snowflake[];\r\n channel_id: Snowflake;\r\n guild_id?: Snowflake;\r\n}\r\n\r\n/** Raw Discord channel deletion event payload. */\r\nexport interface APIChannelDeleteEvent extends APIChannel {}\r\n\r\n/** Raw Discord guild deletion event payload. */\r\nexport interface APIGuildDeleteEvent {\r\n id: Snowflake;\r\n unavailable?: boolean;\r\n}\r\n\r\n/** Raw Discord thread lifecycle payload. */\r\nexport interface APIThreadEvent extends APIChannel {\r\n guild_id: Snowflake;\r\n member?: APIThreadMember;\r\n}\r\n\r\n/** Raw Discord thread list sync event. */\r\nexport interface APIThreadListSync {\r\n guild_id: Snowflake;\r\n channel_ids?: Snowflake[];\r\n threads: APIChannel[];\r\n members: APIThreadMember[];\r\n}\r\n\r\n/** Raw Discord thread members update event. */\r\nexport interface APIThreadMembersUpdate {\r\n id: Snowflake;\r\n guild_id: Snowflake;\r\n member_count: number;\r\n added_members?: APIThreadMember[];\r\n removed_member_ids?: Snowflake[];\r\n}\r\n\r\n/** Raw Discord guild role event payload. */\r\nexport interface APIGuildRoleEvent {\r\n guild_id: Snowflake;\r\n role: APIRole;\r\n}\r\n\r\n/** Raw Discord guild role delete event payload. */\r\nexport interface APIGuildRoleDeleteEvent {\r\n guild_id: Snowflake;\r\n role_id: Snowflake;\r\n}\r\n\r\n/** Raw Discord guild ban event payload. */\r\nexport interface APIGuildBanEvent {\r\n guild_id: Snowflake;\r\n user: UserData;\r\n}\r\n\r\n/** Raw Discord guild emojis update event payload. */\r\nexport interface APIGuildEmojisUpdateEvent {\r\n guild_id: Snowflake;\r\n emojis: APIEmoji[];\r\n}\r\n\r\n/** Raw Discord guild stickers update event payload. */\r\nexport interface APIGuildStickersUpdateEvent {\r\n guild_id: Snowflake;\r\n stickers: APISticker[];\r\n}\r\n\r\n/** Raw Discord channel pins update event. */\r\nexport interface APIChannelPinsUpdate {\r\n guild_id?: Snowflake;\r\n channel_id: Snowflake;\r\n last_pin_timestamp?: string | null;\r\n}\r\n\r\n/** Raw Discord guild members chunk event. */\r\nexport interface APIGuildMembersChunk {\r\n guild_id: Snowflake;\r\n members: APIGuildMember[];\r\n chunk_index: number;\r\n chunk_count: number;\r\n not_found?: Snowflake[];\r\n presences?: APIPresenceUpdate[];\r\n nonce?: string;\r\n}\r\n\r\n/** Raw Discord guild scheduled event user add/remove event. */\r\nexport interface APIGuildScheduledEventUserEvent {\r\n guild_scheduled_event_id: Snowflake;\r\n user_id: Snowflake;\r\n guild_id: Snowflake;\r\n}\r\n\r\n/** Raw Discord message poll vote add/remove event. */\r\nexport interface APIMessagePollVoteEvent {\r\n user_id: Snowflake;\r\n channel_id: Snowflake;\r\n message_id: Snowflake;\r\n guild_id?: Snowflake;\r\n answer_id: number;\r\n}\r\n",
|
|
7
|
-
"// Re-export the canonical ButtonStyle from @lunibee/types so the builders package\r\n// never ships a drifting duplicate (the old local copy was missing `Premium: 6`).\r\nimport { ButtonStyle } from \"@lunibee/types\";\r\nexport { ButtonStyle };\r\n\r\n/** Component type constants exposed by Lunibee. */\r\nexport const ComponentType = {\r\n ActionRow: 1,\r\n Button: 2,\r\n StringSelect: 3,\r\n TextInput: 4,\r\n UserSelect: 5,\r\n RoleSelect: 6,\r\n MentionableSelect: 7,\r\n ChannelSelect: 8,\r\n Section: 9,\r\n TextDisplay: 10,\r\n Thumbnail: 11,\r\n MediaGallery: 12,\r\n File: 13,\r\n Separator: 14,\r\n ContentInventoryEntry: 16,\r\n Container: 17,\r\n} as const;\r\nexport const TextInputStyle = { Short: 1, Paragraph: 2 } as const;\r\nexport interface APIComponentEmoji {\r\n id?: string | null;\r\n name?: string | null;\r\n animated?: boolean;\r\n}\r\nexport interface APIButtonComponent {\r\n type: typeof ComponentType.Button;\r\n style: 1 | 2 | 3 | 4 | 5 | 6;\r\n custom_id?: string;\r\n label?: string;\r\n emoji?: APIComponentEmoji;\r\n url?: string;\r\n disabled?: boolean;\r\n}\r\nexport interface APISelectOption {\r\n label: string;\r\n value: string;\r\n description?: string;\r\n emoji?: APIComponentEmoji;\r\n default?: boolean;\r\n}\r\nexport interface APIStringSelectComponent {\r\n type: typeof ComponentType.StringSelect;\r\n custom_id?: string;\r\n placeholder?: string;\r\n min_values?: number;\r\n max_values?: number;\r\n required?: boolean;\r\n disabled?: boolean;\r\n options?: APISelectOption[];\r\n}\r\nexport interface APIEntitySelectComponent {\r\n type:\r\n | typeof ComponentType.UserSelect\r\n | typeof ComponentType.RoleSelect\r\n | typeof ComponentType.MentionableSelect\r\n | typeof ComponentType.ChannelSelect;\r\n custom_id?: string;\r\n placeholder?: string;\r\n min_values?: number;\r\n max_values?: number;\r\n required?: boolean;\r\n disabled?: boolean;\r\n default_values?: APISelectDefaultValue[];\r\n}\r\nexport interface APITextInputComponent {\r\n type: typeof ComponentType.TextInput;\r\n style: typeof TextInputStyle.Short | typeof TextInputStyle.Paragraph;\r\n custom_id?: string;\r\n label?: string;\r\n placeholder?: string;\r\n min_length?: number;\r\n max_length?: number;\r\n required?: boolean;\r\n value?: string;\r\n}\r\nexport interface APIModalComponent {\r\n type: 9;\r\n custom_id?: string;\r\n title?: string;\r\n components: APIActionRowComponent[];\r\n}\r\nexport type APIActionRowChild =\r\n | APIButtonComponent\r\n | APIStringSelectComponent\r\n | APIEntitySelectComponent\r\n | APITextInputComponent;\r\nexport interface APIActionRowComponent {\r\n type: typeof ComponentType.ActionRow;\r\n components: APIActionRowChild[];\r\n}\r\nexport interface APISectionComponent {\r\n type: typeof ComponentType.Section;\r\n components?: APIComponent[]; // text displays\r\n accessory?: APIComponent; // buttons, thumbnails, etc.\r\n}\r\nexport interface APITextDisplayComponent {\r\n type: typeof ComponentType.TextDisplay;\r\n content: string;\r\n}\r\nexport interface APIMediaGalleryComponent {\r\n type: typeof ComponentType.MediaGallery;\r\n items: { media: { url: string; description?: string } }[];\r\n}\r\n/** Default values accepted by an auto-populated entity select. */\r\nexport interface APISelectDefaultValue {\r\n id: string;\r\n type: \"user\" | \"role\" | \"channel\";\r\n}\r\nexport interface APIFileComponent {\r\n type: typeof ComponentType.File;\r\n file: { url: string };\r\n spoiler?: boolean;\r\n}\r\nexport interface APISeparatorComponent {\r\n type: typeof ComponentType.Separator;\r\n spacing?: 1 | 2;\r\n divider?: boolean;\r\n}\r\nexport interface APIThumbnailComponent {\r\n type: typeof ComponentType.Thumbnail;\r\n url: string;\r\n proxy_url?: string;\r\n width?: number;\r\n height?: number;\r\n description?: string;\r\n spoiler?: boolean;\r\n}\r\nexport interface APIContentInventoryEntryComponent {\r\n type: typeof ComponentType.ContentInventoryEntry;\r\n id: string;\r\n}\r\nexport interface APIContainerComponent {\r\n type: typeof ComponentType.Container;\r\n components: APIComponent[];\r\n accent_color?: number;\r\n spoiler?: boolean;\r\n}\r\nexport type APIComponent =\r\n | APIActionRowComponent\r\n | APIButtonComponent\r\n | APIStringSelectComponent\r\n | APIEntitySelectComponent\r\n | APITextInputComponent\r\n | APISectionComponent\r\n | APITextDisplayComponent\r\n | APIThumbnailComponent\r\n | APIMediaGalleryComponent\r\n | APIFileComponent\r\n | APISeparatorComponent\r\n | APIContentInventoryEntryComponent\r\n | APIContainerComponent;\r\n\r\nexport class ActionRowBuilder<\r\n T extends { toJSON(): APIActionRowChild } = { toJSON(): APIActionRowChild },\r\n> {\r\n readonly #components: T[] = [];\r\n public addComponents(...components: T[]): this {\r\n if (!components.length)\r\n throw new TypeError(\"At least one component is required.\");\r\n if (this.#components.length + components.length > 5)\r\n throw new RangeError(\r\n \"An action row cannot contain more than 5 components.\",\r\n );\r\n this.#components.push(...components);\r\n return this;\r\n }\r\n public clearComponents(): this {\r\n this.#components.length = 0;\r\n return this;\r\n }\r\n public toJSON(): APIActionRowComponent {\r\n return {\r\n type: ComponentType.ActionRow,\r\n components: this.#components.map((component) => component.toJSON()),\r\n };\r\n }\r\n}\r\nexport class StringSelectBuilder {\r\n readonly #data: APIStringSelectComponent = {\r\n type: ComponentType.StringSelect,\r\n };\r\n public setCustomId(value: string): this {\r\n validateText(value, 100, \"Component custom ID\");\r\n this.#data.custom_id = value;\r\n return this;\r\n }\r\n public setPlaceholder(value: string): this {\r\n validateText(value, 150, \"Component placeholder\");\r\n this.#data.placeholder = value;\r\n return this;\r\n }\r\n public setMinValues(value: number): this {\r\n validateCount(value, \"min_values\", 0);\r\n this.#data.min_values = value;\r\n return this;\r\n }\r\n public setMaxValues(value: number): this {\r\n validateCount(value, \"max_values\", 1);\r\n this.#data.max_values = value;\r\n return this;\r\n }\r\n public setRequired(value = true): this {\r\n this.#data.required = value;\r\n return this;\r\n }\r\n public setDisabled(value = true): this {\r\n this.#data.disabled = value;\r\n return this;\r\n }\r\n public addOptions(...options: APISelectOption[]): this {\r\n if (!options.length)\r\n throw new TypeError(\"At least one select option is required.\");\r\n const current = this.#data.options ?? [];\r\n if (current.length + options.length > 25)\r\n throw new RangeError(\r\n \"A string select cannot contain more than 25 options.\",\r\n );\r\n for (const option of options) {\r\n validateText(option.label, 100, \"Select option label\");\r\n validateText(option.value, 100, \"Select option value\");\r\n if (option.description)\r\n validateText(\r\n option.description,\r\n 100,\r\n \"Select option description\",\r\n );\r\n }\r\n this.#data.options = [\r\n ...current,\r\n ...options.map((option) => ({ ...option })),\r\n ];\r\n return this;\r\n }\r\n public toJSON(): APIStringSelectComponent {\r\n return structuredClone(this.#data);\r\n }\r\n}\r\nexport class ButtonBuilder {\r\n readonly #data: APIButtonComponent = {\r\n type: ComponentType.Button,\r\n style: ButtonStyle.Secondary,\r\n };\r\n public setStyle(style: APIButtonComponent[\"style\"]): this {\r\n this.#data.style = style;\r\n if (style === ButtonStyle.Link) delete this.#data.custom_id;\r\n return this;\r\n }\r\n public setCustomId(value: string): this {\r\n validateText(value, 100, \"Button custom ID\");\r\n if (this.#data.style === ButtonStyle.Link)\r\n throw new TypeError(\"Link buttons cannot use custom IDs.\");\r\n this.#data.custom_id = value;\r\n return this;\r\n }\r\n public setLabel(value: string): this {\r\n validateText(value, 80, \"Button label\");\r\n this.#data.label = value;\r\n return this;\r\n }\r\n public setURL(value: string): this {\r\n validateText(value, 512, \"Button URL\");\r\n let url: URL;\r\n try {\r\n url = new URL(value);\r\n } catch (error) {\r\n throw new TypeError(\"Button URL must be a valid URL.\", {\r\n cause: error,\r\n });\r\n }\r\n this.#data.style = ButtonStyle.Link;\r\n delete this.#data.custom_id;\r\n this.#data.url = url.toString();\r\n return this;\r\n }\r\n public setEmoji(emoji: APIComponentEmoji | string): this {\r\n this.#data.emoji =\r\n typeof emoji === \"string\" ? { name: emoji } : { ...emoji };\r\n return this;\r\n }\r\n public setDisabled(value = true): this {\r\n this.#data.disabled = value;\r\n return this;\r\n }\r\n public toJSON(): APIButtonComponent {\r\n return structuredClone(this.#data);\r\n }\r\n}\r\nexport class EntitySelectBuilder {\r\n readonly #data: APIEntitySelectComponent;\r\n public constructor(\r\n type:\r\n | typeof ComponentType.UserSelect\r\n | typeof ComponentType.RoleSelect\r\n | typeof ComponentType.MentionableSelect\r\n | typeof ComponentType.ChannelSelect,\r\n ) {\r\n if (\r\n type !== ComponentType.UserSelect &&\r\n type !== ComponentType.RoleSelect &&\r\n type !== ComponentType.MentionableSelect &&\r\n type !== ComponentType.ChannelSelect\r\n )\r\n throw new TypeError(\"Invalid select component type.\");\r\n this.#data = { type };\r\n }\r\n public setCustomId(value: string): this {\r\n validateText(value, 100, \"Component custom ID\");\r\n this.#data.custom_id = value;\r\n return this;\r\n }\r\n public setPlaceholder(value: string): this {\r\n validateText(value, 150, \"Component placeholder\");\r\n this.#data.placeholder = value;\r\n return this;\r\n }\r\n public setMinValues(value: number): this {\r\n validateCount(value, \"min_values\", 0);\r\n this.#data.min_values = value;\r\n return this;\r\n }\r\n public setMaxValues(value: number): this {\r\n validateCount(value, \"max_values\", 1);\r\n this.#data.max_values = value;\r\n return this;\r\n }\r\n public setRequired(value = true): this {\r\n this.#data.required = value;\r\n return this;\r\n }\r\n public setDisabled(value = true): this {\r\n this.#data.disabled = value;\r\n return this;\r\n }\r\n public setDefaultValues(...values: APISelectDefaultValue[]): this {\r\n this.#data.default_values = values.map((value) => ({ ...value }));\r\n return this;\r\n }\r\n public toJSON(): APIEntitySelectComponent {\r\n return structuredClone(this.#data);\r\n }\r\n}\r\nexport class ModalBuilder {\r\n readonly #components: Array<{ toJSON(): APIActionRowComponent }> = [];\r\n #custom_id?: string;\r\n #title?: string;\r\n public setCustomId(value: string): this {\r\n validateText(value, 100, \"Modal custom ID\");\r\n this.#custom_id = value;\r\n return this;\r\n }\r\n public setTitle(value: string): this {\r\n validateText(value, 45, \"Modal title\");\r\n this.#title = value;\r\n return this;\r\n }\r\n public addComponents(\r\n ...components: Array<{ toJSON(): APIActionRowComponent }>\r\n ): this {\r\n if (!components.length)\r\n throw new TypeError(\"At least one modal component is required.\");\r\n if (this.#components.length + components.length > 5)\r\n throw new RangeError(\r\n \"A modal cannot contain more than 5 action rows.\",\r\n );\r\n this.#components.push(...components);\r\n return this;\r\n }\r\n public toJSON(): APIModalComponent {\r\n return {\r\n type: 9,\r\n ...(this.#custom_id ? { custom_id: this.#custom_id } : {}),\r\n ...(this.#title ? { title: this.#title } : {}),\r\n components: this.#components.map((component) => component.toJSON()),\r\n };\r\n }\r\n}\r\nexport class TextInputBuilder {\r\n readonly #data: APITextInputComponent = {\r\n type: ComponentType.TextInput,\r\n style: TextInputStyle.Short,\r\n };\r\n public setStyle(style: APITextInputComponent[\"style\"]): this {\r\n this.#data.style = style;\r\n return this;\r\n }\r\n public setCustomId(value: string): this {\r\n validateText(value, 100, \"Text input custom ID\");\r\n this.#data.custom_id = value;\r\n return this;\r\n }\r\n public setLabel(value: string): this {\r\n validateText(value, 45, \"Text input label\");\r\n this.#data.label = value;\r\n return this;\r\n }\r\n public setPlaceholder(value: string): this {\r\n validateText(value, 100, \"Text input placeholder\");\r\n this.#data.placeholder = value;\r\n return this;\r\n }\r\n public setMinLength(value: number): this {\r\n validateLength(value, \"min_length\", 4000);\r\n this.#data.min_length = value;\r\n return this;\r\n }\r\n public setMaxLength(value: number): this {\r\n validateLength(value, \"max_length\", 4000);\r\n this.#data.max_length = value;\r\n return this;\r\n }\r\n public setRequired(value = true): this {\r\n this.#data.required = value;\r\n return this;\r\n }\r\n public setValue(value: string): this {\r\n validateText(value, 4000, \"Text input value\");\r\n this.#data.value = value;\r\n return this;\r\n }\r\n public toJSON(): APITextInputComponent {\r\n return structuredClone(this.#data);\r\n }\r\n}\r\n\r\nexport class ContainerBuilder {\r\n readonly #components: { toJSON(): APIComponent }[] = [];\r\n #accentColor?: number;\r\n #spoiler?: boolean;\r\n public addComponents(...components: { toJSON(): APIComponent }[]): this {\r\n if (!components.length)\r\n throw new TypeError(\"At least one component is required.\");\r\n this.#components.push(...components);\r\n return this;\r\n }\r\n public setAccentColor(color: number): this {\r\n if (!Number.isInteger(color) || color < 0 || color > 0xffffff) {\r\n throw new RangeError(\r\n \"Accent color must be an integer between 0 and 16777215 (0xFFFFFF).\",\r\n );\r\n }\r\n this.#accentColor = color;\r\n return this;\r\n }\r\n /** Marks the whole container as a spoiler (blurred until clicked). */\r\n public setSpoiler(spoiler = true): this {\r\n this.#spoiler = spoiler;\r\n return this;\r\n }\r\n public toJSON(): APIContainerComponent {\r\n const data: APIContainerComponent = {\r\n type: ComponentType.Container,\r\n components: this.#components.map((c) => c.toJSON()),\r\n };\r\n if (this.#accentColor !== undefined)\r\n data.accent_color = this.#accentColor;\r\n if (this.#spoiler !== undefined) data.spoiler = this.#spoiler;\r\n return data;\r\n }\r\n}\r\n\r\nexport class SectionBuilder {\r\n readonly #components: { toJSON(): APIComponent }[] = [];\r\n #accessory?: { toJSON(): APIComponent };\r\n public addComponents(...components: { toJSON(): APIComponent }[]): this {\r\n if (!components.length)\r\n throw new TypeError(\"At least one component is required.\");\r\n this.#components.push(...components);\r\n return this;\r\n }\r\n public setAccessory(accessory: { toJSON(): APIComponent }): this {\r\n this.#accessory = accessory;\r\n return this;\r\n }\r\n public toJSON(): APISectionComponent {\r\n return {\r\n type: ComponentType.Section,\r\n components: this.#components.length\r\n ? this.#components.map((c) => c.toJSON())\r\n : undefined,\r\n accessory: this.#accessory?.toJSON(),\r\n };\r\n }\r\n}\r\n\r\nexport class TextDisplayBuilder {\r\n #content = \"\";\r\n public setContent(content: string): this {\r\n validateText(content, 4000, \"Text display content\");\r\n this.#content = content;\r\n return this;\r\n }\r\n public toJSON(): APITextDisplayComponent {\r\n return {\r\n type: ComponentType.TextDisplay,\r\n content: this.#content,\r\n };\r\n }\r\n}\r\n\r\nexport class MediaGalleryBuilder {\r\n readonly #items: { media: { url: string; description?: string } }[] = [];\r\n public addItems(...items: { url: string; description?: string }[]): this {\r\n if (!items.length) {\r\n throw new TypeError(\"At least one media gallery item is required.\");\r\n }\r\n if (this.#items.length + items.length > 10) {\r\n throw new RangeError(\r\n \"MediaGallery can only contain up to 10 items.\",\r\n );\r\n }\r\n this.#items.push(...items.map((item) => ({ media: item })));\r\n return this;\r\n }\r\n public toJSON(): APIMediaGalleryComponent {\r\n return {\r\n type: ComponentType.MediaGallery,\r\n items: structuredClone(this.#items),\r\n };\r\n }\r\n}\r\n\r\nexport class FileComponentBuilder {\r\n #url = \"\";\r\n #spoiler?: boolean;\r\n public setUrl(url: string): this {\r\n validateText(url, 2048, \"File component URL\");\r\n this.#url = url;\r\n return this;\r\n }\r\n public setSpoiler(spoiler = true): this {\r\n this.#spoiler = spoiler;\r\n return this;\r\n }\r\n public toJSON(): APIFileComponent {\r\n if (!this.#url) throw new Error(\"File component must have a URL.\");\r\n const data: APIFileComponent = {\r\n type: ComponentType.File,\r\n file: { url: this.#url },\r\n };\r\n if (this.#spoiler !== undefined) data.spoiler = this.#spoiler;\r\n return data;\r\n }\r\n}\r\n\r\nexport class SeparatorBuilder {\r\n #spacing?: 1 | 2;\r\n #divider?: boolean;\r\n public setSpacing(spacing: 1 | 2): this {\r\n this.#spacing = spacing;\r\n return this;\r\n }\r\n public setDivider(divider = true): this {\r\n this.#divider = divider;\r\n return this;\r\n }\r\n public toJSON(): APISeparatorComponent {\r\n const data: APISeparatorComponent = {\r\n type: ComponentType.Separator,\r\n };\r\n if (this.#spacing !== undefined) data.spacing = this.#spacing;\r\n if (this.#divider !== undefined) data.divider = this.#divider;\r\n return data;\r\n }\r\n}\r\n\r\nexport class ThumbnailBuilder {\r\n #url = \"\";\r\n #description?: string;\r\n #spoiler?: boolean;\r\n public setUrl(url: string): this {\r\n validateText(url, 2048, \"Thumbnail URL\");\r\n this.#url = url;\r\n return this;\r\n }\r\n /** Sets the thumbnail's alt-text description. */\r\n public setDescription(description: string): this {\r\n validateText(description, 1024, \"Thumbnail description\");\r\n this.#description = description;\r\n return this;\r\n }\r\n /** Marks the thumbnail as a spoiler (blurred until clicked). */\r\n public setSpoiler(spoiler = true): this {\r\n this.#spoiler = spoiler;\r\n return this;\r\n }\r\n public toJSON(): APIThumbnailComponent {\r\n const data: APIThumbnailComponent = {\r\n type: ComponentType.Thumbnail,\r\n url: this.#url,\r\n };\r\n if (this.#description !== undefined)\r\n data.description = this.#description;\r\n if (this.#spoiler !== undefined) data.spoiler = this.#spoiler;\r\n return data;\r\n }\r\n}\r\n\r\nexport class ContentInventoryEntryBuilder {\r\n #id = \"\";\r\n public setId(id: string): this {\r\n validateText(id, 100, \"Content inventory entry ID\");\r\n this.#id = id;\r\n return this;\r\n }\r\n public toJSON(): APIContentInventoryEntryComponent {\r\n return {\r\n type: ComponentType.ContentInventoryEntry,\r\n id: this.#id,\r\n };\r\n }\r\n}\r\n\r\nfunction validateText(value: string, max: number, field: string): void {\r\n if (typeof value !== \"string\")\r\n throw new TypeError(`${field} must be a string.`);\r\n if (!value.trim())\r\n throw new RangeError(`${field} must be a non-empty string.`);\r\n if (value.length > max)\r\n throw new RangeError(`${field} cannot exceed ${max} characters.`);\r\n}\r\nfunction validateCount(\r\n value: number,\r\n field: string,\r\n min: number,\r\n max = 25,\r\n): void {\r\n if (!Number.isInteger(value) || value < min || value > max)\r\n throw new RangeError(\r\n `${field} must be an integer between ${min} and ${max}.`,\r\n );\r\n}\r\nfunction validateLength(value: number, field: string, max = 4000): void {\r\n if (!Number.isInteger(value) || value < 0 || value > max)\r\n throw new RangeError(\r\n `${field} must be an integer between 0 and ${max}.`,\r\n );\r\n}\r\n",
|
|
8
|
-
"/** Discord application command option types. */\r\nexport const ApplicationCommandOptionType = {\r\n Subcommand: 1,\r\n SubcommandGroup: 2,\r\n String: 3,\r\n Integer: 4,\r\n Boolean: 5,\r\n User: 6,\r\n Channel: 7,\r\n Role: 8,\r\n Mentionable: 9,\r\n Number: 10,\r\n Attachment: 11,\r\n} as const;\r\n\r\n/** Builds Discord application command payloads. */\r\nexport class SlashCommandBuilder {\r\n readonly #data: Record<string, unknown> = { type: 1 };\r\n /** Sets the command name. */ public setName(name: string): this {\r\n validateName(name, \"Command name\");\r\n this.#data.name = name;\r\n return this;\r\n }\r\n /** Sets the command description. */ public setDescription(\r\n description: string,\r\n ): this {\r\n validateText(description, \"Command description\", 100);\r\n this.#data.description = description;\r\n return this;\r\n }\r\n /** Sets whether the command is available in direct messages. */ public setDMPermission(\r\n enabled: boolean,\r\n ): this {\r\n this.#data.dm_permission = enabled;\r\n return this;\r\n }\r\n /** Sets whether the command is NSFW. */\r\n public setNSFW(nsfw = true): this {\r\n this.#data.nsfw = nsfw;\r\n return this;\r\n }\r\n /** Sets whether the command is NSFW. */\r\n public setNsfw(nsfw = true): this {\r\n return this.setNSFW(nsfw);\r\n }\r\n /** Sets command default member permissions. */ public setDefaultMemberPermissions(\r\n permissions: bigint | number | string | null,\r\n ): this {\r\n this.#data.default_member_permissions =\r\n permissions === null ? null : BigInt(permissions).toString();\r\n return this;\r\n }\r\n /** Sets command integration types. */ public setIntegrationTypes(\r\n ...types: number[]\r\n ): this {\r\n this.#data.integration_types = [...types];\r\n return this;\r\n }\r\n /** Adds a string option. */ public addStringOption(\r\n configure: (option: StringOptionBuilder) => StringOptionBuilder,\r\n ): this {\r\n return this.addOption(configure(new StringOptionBuilder()));\r\n }\r\n /** Adds an integer option. */ public addIntegerOption(\r\n configure: (option: IntegerOptionBuilder) => IntegerOptionBuilder,\r\n ): this {\r\n return this.addOption(configure(new IntegerOptionBuilder()));\r\n }\r\n /** Adds a number option. */ public addNumberOption(\r\n configure: (option: NumberOptionBuilder) => NumberOptionBuilder,\r\n ): this {\r\n return this.addOption(configure(new NumberOptionBuilder()));\r\n }\r\n /** Adds a boolean option. */ public addBooleanOption(\r\n configure: (option: BooleanOptionBuilder) => BooleanOptionBuilder,\r\n ): this {\r\n return this.addOption(configure(new BooleanOptionBuilder()));\r\n }\r\n /** Adds a user option. */ public addUserOption(\r\n configure: (option: UserOptionBuilder) => UserOptionBuilder,\r\n ): this {\r\n return this.addOption(configure(new UserOptionBuilder()));\r\n }\r\n /** Adds a channel option. */ public addChannelOption(\r\n configure: (option: ChannelOptionBuilder) => ChannelOptionBuilder,\r\n ): this {\r\n return this.addOption(configure(new ChannelOptionBuilder()));\r\n }\r\n /** Adds a role option. */ public addRoleOption(\r\n configure: (option: RoleOptionBuilder) => RoleOptionBuilder,\r\n ): this {\r\n return this.addOption(configure(new RoleOptionBuilder()));\r\n }\r\n /** Adds a mentionable option. */ public addMentionableOption(\r\n configure: (\r\n option: MentionableOptionBuilder,\r\n ) => MentionableOptionBuilder,\r\n ): this {\r\n return this.addOption(configure(new MentionableOptionBuilder()));\r\n }\r\n /** Adds an attachment option. */ public addAttachmentOption(\r\n configure: (option: AttachmentOptionBuilder) => AttachmentOptionBuilder,\r\n ): this {\r\n return this.addOption(configure(new AttachmentOptionBuilder()));\r\n }\r\n /** Adds a subcommand. */ public addSubcommand(\r\n configure: (option: SubcommandBuilder) => SubcommandBuilder,\r\n ): this {\r\n return this.addOption(configure(new SubcommandBuilder()));\r\n }\r\n /** Adds a subcommand group. */ public addSubcommandGroup(\r\n configure: (option: SubcommandGroupBuilder) => SubcommandGroupBuilder,\r\n ): this {\r\n return this.addOption(configure(new SubcommandGroupBuilder()));\r\n }\r\n /** Serializes the command payload. */ public toJSON(): Record<\r\n string,\r\n unknown\r\n > {\r\n return structuredClone(this.#data);\r\n }\r\n /** Adds a validated top-level command option. */ protected addOption(\r\n option: CommandOptionBuilder,\r\n ): this {\r\n const options = (this.#data.options as unknown[] | undefined) ?? [];\r\n if (options.length >= 25)\r\n throw new RangeError(\r\n \"An application command cannot contain more than 25 options.\",\r\n );\r\n const payload = option.toJSON();\r\n if (\r\n options.some(\r\n (existing) =>\r\n (existing as Record<string, unknown>).name === payload.name,\r\n )\r\n )\r\n throw new RangeError(\r\n `Duplicate option name: ${String(payload.name)}.`,\r\n );\r\n if (\r\n payload.required === true &&\r\n options.some(\r\n (existing) =>\r\n (existing as Record<string, unknown>).required !== true,\r\n )\r\n )\r\n throw new RangeError(\r\n \"Required application command options must be placed before optional options.\",\r\n );\r\n options.push(payload);\r\n this.#data.options = options;\r\n return this;\r\n }\r\n}\r\n\r\n/** Base builder for command options. */\r\nexport class CommandOptionBuilder {\r\n protected readonly data: Record<string, unknown>;\r\n /** Creates an option builder. */ public constructor(type: number) {\r\n this.data = { type };\r\n }\r\n /** Sets the option name. */ public setName(name: string): this {\r\n validateName(name, \"Option name\");\r\n this.data.name = name;\r\n return this;\r\n }\r\n /** Sets the option description. */ public setDescription(\r\n description: string,\r\n ): this {\r\n validateText(description, \"Option description\", 100);\r\n this.data.description = description;\r\n return this;\r\n }\r\n /** Makes the option required or optional. */ public setRequired(\r\n required = true,\r\n ): this {\r\n this.data.required = required;\r\n return this;\r\n }\r\n /** Sets autocomplete. */ public setAutocomplete(enabled = true): this {\r\n this.data.autocomplete = enabled;\r\n return this;\r\n }\r\n /** Serializes the option payload. */ public toJSON(): Record<\r\n string,\r\n unknown\r\n > {\r\n return structuredClone(this.data);\r\n }\r\n}\r\n\r\n/** Builds a string command option. */\r\nexport class StringOptionBuilder extends CommandOptionBuilder {\r\n /** Creates a string option. */ public constructor() {\r\n super(ApplicationCommandOptionType.String);\r\n }\r\n /** Adds string choices. */ public addChoices(\r\n ...choices: Array<{ name: string; value: string }>\r\n ): this {\r\n const current = (this.data.choices as unknown[] | undefined) ?? [];\r\n if (!choices.length)\r\n throw new TypeError(\"At least one choice is required.\");\r\n if (this.data.autocomplete === true)\r\n throw new RangeError(\"Autocomplete options cannot define choices.\");\r\n if (current.length + choices.length > 25)\r\n throw new RangeError(\r\n \"An option cannot contain more than 25 choices.\",\r\n );\r\n for (const choice of choices) {\r\n validateText(choice.name, \"Choice name\", 100);\r\n validateText(choice.value, \"Choice value\", 100);\r\n }\r\n this.data.choices = [\r\n ...current,\r\n ...choices.map((choice) => ({ ...choice })),\r\n ];\r\n return this;\r\n }\r\n /** Sets the minimum string length. */ public setMinLength(\r\n value: number,\r\n ): this {\r\n validateIntegerRange(value, 0, 6000, \"min_length\");\r\n this.data.min_length = value;\r\n return this;\r\n }\r\n /** Sets the maximum string length. */ public setMaxLength(\r\n value: number,\r\n ): this {\r\n validateIntegerRange(value, 1, 6000, \"max_length\");\r\n if (\r\n (this.data.min_length as number | undefined) !== undefined &&\r\n (this.data.min_length as number) > value\r\n )\r\n throw new RangeError(\"min_length cannot exceed max_length.\");\r\n this.data.max_length = value;\r\n return this;\r\n }\r\n}\r\n/** Builds an integer command option. */\r\nexport class IntegerOptionBuilder extends CommandOptionBuilder {\r\n public constructor() {\r\n super(ApplicationCommandOptionType.Integer);\r\n }\r\n public setMinValue(value: number): this {\r\n validateNumberRange(\r\n value,\r\n -9_007_199_254_740_991,\r\n 9_007_199_254_740_991,\r\n \"min_value\",\r\n true,\r\n );\r\n this.data.min_value = value;\r\n return this;\r\n }\r\n public setMaxValue(value: number): this {\r\n validateNumberRange(\r\n value,\r\n -9_007_199_254_740_991,\r\n 9_007_199_254_740_991,\r\n \"max_value\",\r\n true,\r\n );\r\n if (\r\n (this.data.min_value as number | undefined) !== undefined &&\r\n (this.data.min_value as number) > value\r\n )\r\n throw new RangeError(\"min_value cannot exceed max_value.\");\r\n this.data.max_value = value;\r\n return this;\r\n }\r\n public setAutocomplete(enabled = true): this {\r\n if (\r\n enabled &&\r\n Array.isArray(this.data.choices) &&\r\n this.data.choices.length\r\n )\r\n throw new RangeError(\"Autocomplete options cannot define choices.\");\r\n this.data.autocomplete = enabled;\r\n return this;\r\n }\r\n public addChoices(...choices: { name: string; value: number }[]): this {\r\n const current = (this.data.choices as unknown[] | undefined) ?? [];\r\n if (!choices.length)\r\n throw new TypeError(\"At least one choice is required.\");\r\n if (this.data.autocomplete === true)\r\n throw new RangeError(\"Autocomplete options cannot define choices.\");\r\n if (current.length + choices.length > 25)\r\n throw new RangeError(\r\n \"An option cannot contain more than 25 choices.\",\r\n );\r\n this.data.choices = [...current, ...choices];\r\n return this;\r\n }\r\n}\r\n/** Builds a number command option. */\r\nexport class NumberOptionBuilder extends CommandOptionBuilder {\r\n public constructor() {\r\n super(ApplicationCommandOptionType.Number);\r\n }\r\n public setMinValue(value: number): this {\r\n validateNumberRange(\r\n value,\r\n -9_007_199_254_740_991,\r\n 9_007_199_254_740_991,\r\n \"min_value\",\r\n false,\r\n );\r\n this.data.min_value = value;\r\n return this;\r\n }\r\n public setMaxValue(value: number): this {\r\n validateNumberRange(\r\n value,\r\n -9_007_199_254_740_991,\r\n 9_007_199_254_740_991,\r\n \"max_value\",\r\n false,\r\n );\r\n if (\r\n (this.data.min_value as number | undefined) !== undefined &&\r\n (this.data.min_value as number) > value\r\n )\r\n throw new RangeError(\"min_value cannot exceed max_value.\");\r\n this.data.max_value = value;\r\n return this;\r\n }\r\n public setAutocomplete(enabled = true): this {\r\n if (\r\n enabled &&\r\n Array.isArray(this.data.choices) &&\r\n this.data.choices.length\r\n )\r\n throw new RangeError(\"Autocomplete options cannot define choices.\");\r\n this.data.autocomplete = enabled;\r\n return this;\r\n }\r\n public addChoices(...choices: { name: string; value: number }[]): this {\r\n const current = (this.data.choices as unknown[] | undefined) ?? [];\r\n if (!choices.length)\r\n throw new TypeError(\"At least one choice is required.\");\r\n if (this.data.autocomplete === true)\r\n throw new RangeError(\"Autocomplete options cannot define choices.\");\r\n if (current.length + choices.length > 25)\r\n throw new RangeError(\r\n \"An option cannot contain more than 25 choices.\",\r\n );\r\n this.data.choices = [...current, ...choices];\r\n return this;\r\n }\r\n}\r\n/** Builds a boolean command option. */ export class BooleanOptionBuilder extends CommandOptionBuilder {\r\n /** Creates a boolean option. */ public constructor() {\r\n super(ApplicationCommandOptionType.Boolean);\r\n }\r\n}\r\n/** Builds a user command option. */ export class UserOptionBuilder extends CommandOptionBuilder {\r\n /** Creates a user option. */ public constructor() {\r\n super(ApplicationCommandOptionType.User);\r\n }\r\n}\r\n/** Builds a role command option. */ export class RoleOptionBuilder extends CommandOptionBuilder {\r\n /** Creates a role option. */ public constructor() {\r\n super(ApplicationCommandOptionType.Role);\r\n }\r\n}\r\n/** Builds a mentionable command option. */ export class MentionableOptionBuilder extends CommandOptionBuilder {\r\n /** Creates a mentionable option. */ public constructor() {\r\n super(ApplicationCommandOptionType.Mentionable);\r\n }\r\n}\r\n/** Builds an attachment command option. */ export class AttachmentOptionBuilder extends CommandOptionBuilder {\r\n /** Creates an attachment option. */ public constructor() {\r\n super(ApplicationCommandOptionType.Attachment);\r\n }\r\n}\r\n/** Builds a channel command option. */ export class ChannelOptionBuilder extends CommandOptionBuilder {\r\n /** Creates a channel option. */ public constructor() {\r\n super(ApplicationCommandOptionType.Channel);\r\n }\r\n /** Restricts accepted channel types. */ public addChannelTypes(\r\n ...types: number[]\r\n ): this {\r\n if (types.some((type) => !Number.isInteger(type) || type < 0))\r\n throw new RangeError(\r\n \"Channel types must be non-negative integers.\",\r\n );\r\n this.data.channel_types = [...new Set(types)];\r\n return this;\r\n }\r\n}\r\n/** Builds a nested subcommand. */ export class SubcommandBuilder extends CommandOptionBuilder {\r\n /** Creates a subcommand. */ public constructor() {\r\n super(ApplicationCommandOptionType.Subcommand);\r\n }\r\n /** Adds a string option to this subcommand. */ public addStringOption(\r\n configure: (option: StringOptionBuilder) => StringOptionBuilder,\r\n ): this {\r\n return this.addChildOption(configure(new StringOptionBuilder()));\r\n }\r\n /** Adds an integer option to this subcommand. */ public addIntegerOption(\r\n configure: (option: IntegerOptionBuilder) => IntegerOptionBuilder,\r\n ): this {\r\n return this.addChildOption(configure(new IntegerOptionBuilder()));\r\n }\r\n /** Adds a number option to this subcommand. */ public addNumberOption(\r\n configure: (option: NumberOptionBuilder) => NumberOptionBuilder,\r\n ): this {\r\n return this.addChildOption(configure(new NumberOptionBuilder()));\r\n }\r\n /** Adds a boolean option to this subcommand. */ public addBooleanOption(\r\n configure: (option: BooleanOptionBuilder) => BooleanOptionBuilder,\r\n ): this {\r\n return this.addChildOption(configure(new BooleanOptionBuilder()));\r\n }\r\n /** Adds a user option to this subcommand. */ public addUserOption(\r\n configure: (option: UserOptionBuilder) => UserOptionBuilder,\r\n ): this {\r\n return this.addChildOption(configure(new UserOptionBuilder()));\r\n }\r\n /** Adds a channel option to this subcommand. */ public addChannelOption(\r\n configure: (option: ChannelOptionBuilder) => ChannelOptionBuilder,\r\n ): this {\r\n return this.addChildOption(configure(new ChannelOptionBuilder()));\r\n }\r\n /** Adds a role option to this subcommand. */ public addRoleOption(\r\n configure: (option: RoleOptionBuilder) => RoleOptionBuilder,\r\n ): this {\r\n return this.addChildOption(configure(new RoleOptionBuilder()));\r\n }\r\n /** Adds a mentionable option to this subcommand. */ public addMentionableOption(\r\n configure: (\r\n option: MentionableOptionBuilder,\r\n ) => MentionableOptionBuilder,\r\n ): this {\r\n return this.addChildOption(configure(new MentionableOptionBuilder()));\r\n }\r\n /** Adds an attachment option to this subcommand. */ public addAttachmentOption(\r\n configure: (option: AttachmentOptionBuilder) => AttachmentOptionBuilder,\r\n ): this {\r\n return this.addChildOption(configure(new AttachmentOptionBuilder()));\r\n }\r\n protected addChildOption(option: CommandOptionBuilder): this {\r\n const options = (this.data.options as unknown[] | undefined) ?? [];\r\n if (options.length >= 25)\r\n throw new RangeError(\r\n \"A subcommand cannot contain more than 25 options.\",\r\n );\r\n const payload = option.toJSON();\r\n if (\r\n options.some(\r\n (existing) =>\r\n (existing as Record<string, unknown>).name === payload.name,\r\n )\r\n )\r\n throw new RangeError(\r\n `Duplicate option name: ${String(payload.name)}.`,\r\n );\r\n if (\r\n payload.required === true &&\r\n options.some(\r\n (existing) =>\r\n (existing as Record<string, unknown>).required !== true,\r\n )\r\n )\r\n throw new RangeError(\r\n \"Required subcommand options must be placed before optional options.\",\r\n );\r\n if (\r\n options.some(\r\n (existing) =>\r\n (existing as Record<string, unknown>).type ===\r\n ApplicationCommandOptionType.Subcommand,\r\n )\r\n )\r\n throw new RangeError(\r\n \"Subcommands cannot contain nested subcommands.\",\r\n );\r\n options.push(payload);\r\n this.data.options = options;\r\n return this;\r\n }\r\n}\r\n/** Builds a nested subcommand group. */ export class SubcommandGroupBuilder extends CommandOptionBuilder {\r\n /** Creates a subcommand group. */ public constructor() {\r\n super(ApplicationCommandOptionType.SubcommandGroup);\r\n }\r\n /** Adds a subcommand to this group. */ public addSubcommand(\r\n configure: (option: SubcommandBuilder) => SubcommandBuilder,\r\n ): this {\r\n const options = (this.data.options as unknown[] | undefined) ?? [];\r\n if (options.length >= 25)\r\n throw new RangeError(\r\n \"A subcommand group cannot contain more than 25 subcommands.\",\r\n );\r\n const payload = configure(new SubcommandBuilder()).toJSON();\r\n if (\r\n options.some(\r\n (existing) =>\r\n (existing as Record<string, unknown>).name === payload.name,\r\n )\r\n )\r\n throw new RangeError(\r\n `Duplicate subcommand name: ${String(payload.name)}.`,\r\n );\r\n if (payload.type !== ApplicationCommandOptionType.Subcommand)\r\n throw new TypeError(\r\n \"Subcommand group children must be subcommands.\",\r\n );\r\n options.push(payload);\r\n this.data.options = options;\r\n return this;\r\n }\r\n}\r\nfunction validateName(value: string, field: string): void {\r\n if (!/^[\\p{L}\\p{N}_-]{1,32}$/u.test(value) || value !== value.toLowerCase())\r\n throw new RangeError(\r\n `${field} must contain 1-32 lowercase letters, numbers, underscores, or hyphens.`,\r\n );\r\n}\r\nfunction validateText(value: string, field: string, max: number): void {\r\n if (typeof value !== \"string\" || !value.trim() || value.length > max)\r\n throw new RangeError(`${field} must contain 1-${max} characters.`);\r\n}\r\nfunction validateIntegerRange(\r\n value: number,\r\n minimum: number,\r\n maximum: number,\r\n field: string,\r\n): void {\r\n if (!Number.isInteger(value) || value < minimum || value > maximum)\r\n throw new RangeError(\r\n `${field} must be an integer between ${minimum} and ${maximum}.`,\r\n );\r\n}\r\nfunction validateNumberRange(\r\n value: number,\r\n minimum: number,\r\n maximum: number,\r\n field: string,\r\n integerOnly = true,\r\n): void {\r\n if (\r\n !Number.isFinite(value) ||\r\n (integerOnly && !Number.isInteger(value)) ||\r\n value < minimum ||\r\n value > maximum\r\n )\r\n throw new RangeError(\r\n `${field} must be ${integerOnly ? \"an integer\" : \"a number\"} between ${minimum} and ${maximum}.`,\r\n );\r\n}\r\n\r\n// ─── Context Menu Builders ────────────────────────────────────────────────────\r\n\r\n/** Base builder for application commands that appear in right-click context menus. */\r\nclass ContextMenuCommandBuilder {\r\n protected readonly data: Record<string, unknown>;\r\n public constructor(type: 2 | 3) {\r\n this.data = { type };\r\n }\r\n /** Sets the command name (shown in the right-click menu).\r\n * Unlike CHAT_INPUT commands, USER (type 2) and MESSAGE (type 3) context-menu\r\n * command names may contain uppercase letters and spaces, so no lowercase/charset\r\n * validation is applied here — only Discord's 1-32 length limit and a non-empty\r\n * (non-whitespace) requirement are enforced.\r\n * @param name Display name; 1-32 characters, mixed case and spaces allowed.\r\n * @throws {RangeError} If the name is empty/whitespace-only or exceeds 32 characters.\r\n */\r\n public setName(name: string): this {\r\n if (\r\n typeof name !== \"string\" ||\r\n name.trim().length < 1 ||\r\n name.length > 32\r\n )\r\n throw new RangeError(\"Command name must contain 1-32 characters.\");\r\n this.data.name = name;\r\n return this;\r\n }\r\n /** Sets default member permissions required to see this command. */\r\n public setDefaultMemberPermissions(\r\n permissions: bigint | number | string | null,\r\n ): this {\r\n this.data.default_member_permissions =\r\n permissions === null ? null : BigInt(permissions).toString();\r\n return this;\r\n }\r\n /** Sets whether the command is available in direct messages. */\r\n public setDMPermission(enabled: boolean): this {\r\n this.data.dm_permission = enabled;\r\n return this;\r\n }\r\n /** Sets command integration types. */\r\n public setIntegrationTypes(...types: number[]): this {\r\n this.data.integration_types = [...types];\r\n return this;\r\n }\r\n /** Serializes the command payload for the Discord API. */\r\n public toJSON(): Record<string, unknown> {\r\n return structuredClone(this.data);\r\n }\r\n}\r\n\r\n/** Builds a User context menu command (appears when right-clicking a user, type 2).\r\n * @example\r\n * new UserCommandBuilder().setName(\"View Profile\").toJSON()\r\n */\r\nexport class UserCommandBuilder extends ContextMenuCommandBuilder {\r\n public constructor() {\r\n super(2);\r\n }\r\n}\r\n\r\n/** Builds a Message context menu command (appears when right-clicking a message, type 3).\r\n * @example\r\n * new MessageCommandBuilder().setName(\"Translate Message\").toJSON()\r\n */\r\nexport class MessageCommandBuilder extends ContextMenuCommandBuilder {\r\n public constructor() {\r\n super(3);\r\n }\r\n}\r\n",
|
|
9
|
-
"import { readFile } from \"node:fs/promises\";\r\nimport { basename } from \"node:path\";\r\n\r\nexport interface AttachmentData {\r\n name: string;\r\n description?: string;\r\n file: Uint8Array | ArrayBuffer | Blob | Buffer | string;\r\n}\r\n\r\n/** Builder for message attachments and file uploads. */\r\nexport class AttachmentBuilder {\r\n public name: string;\r\n public description?: string;\r\n public file: Uint8Array | ArrayBuffer | Blob | Buffer | string;\r\n\r\n public constructor(\r\n file: Uint8Array | ArrayBuffer | Blob | Buffer | string,\r\n data?: Partial<Omit<AttachmentData, \"file\">> | string,\r\n ) {\r\n this.file = file;\r\n if (typeof data === \"string\") {\r\n this.name = data;\r\n } else {\r\n this.name =\r\n data?.name ??\r\n (typeof file === \"string\" ? basename(file) : \"file.bin\");\r\n this.description = data?.description;\r\n }\r\n }\r\n\r\n /** Sets the attachment filename. */\r\n public setName(name: string): this {\r\n this.name = name;\r\n return this;\r\n }\r\n\r\n /** Sets the attachment description / alt text. */\r\n public setDescription(description: string): this {\r\n this.description = description;\r\n return this;\r\n }\r\n\r\n /** Sets the file contents. */\r\n public setFile(\r\n file: Uint8Array | ArrayBuffer | Blob | Buffer | string,\r\n ): this {\r\n this.file = file;\r\n return this;\r\n }\r\n\r\n /** Resolves the attachment payload to a binary Uint8Array. */\r\n public async toBuffer(): Promise<Uint8Array> {\r\n if (typeof this.file === \"string\") {\r\n const buffer = await readFile(this.file);\r\n return new Uint8Array(buffer);\r\n }\r\n if (this.file instanceof Uint8Array) return this.file;\r\n if (this.file instanceof ArrayBuffer) return new Uint8Array(this.file);\r\n if (this.file instanceof Blob) {\r\n const buf = await this.file.arrayBuffer();\r\n return new Uint8Array(buf);\r\n }\r\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(this.file)) {\r\n return new Uint8Array(this.file);\r\n }\r\n throw new TypeError(\"Attachment file must be a supported binary value or file path.\");\r\n }\r\n}\r\n"
|
|
5
|
+
"/** Discord API embed field payload. */\nexport interface EmbedField {\n /** Field name. */ name: string;\n /** Field value. */ value: string;\n /** Whether the field is displayed inline. */ inline?: boolean;\n}\n/** Discord API embed footer payload. */\nexport interface EmbedFooter {\n /** Footer text. */ text: string;\n /** Footer icon URL. */ icon_url?: string;\n}\n/** Discord API embed author payload. */\nexport interface EmbedAuthor {\n /** Author display name. */ name: string;\n /** Author URL. */ url?: string;\n /** Author icon URL. */ icon_url?: string;\n}\n/** Strict Discord API embed payload. */\nexport interface APIEmbed {\n /** Embed title. */ title?: string;\n /** Embed description. */ description?: string;\n /** Embed URL. */ url?: string;\n /** Embed color. */ color?: number;\n /** ISO-8601 timestamp. */ timestamp?: string;\n /** Embed footer. */ footer?: EmbedFooter;\n /** Embed author. */ author?: EmbedAuthor;\n /** Thumbnail payload. */ thumbnail?: { /** Thumbnail URL. */ url: string };\n /** Image payload. */ image?: { /** Image URL. */ url: string };\n /** Embed fields. */ fields?: EmbedField[];\n}\n\n/** Builds compile-time-safe rich embed payloads for Discord API requests. */\nexport class EmbedBuilder {\n readonly #data: APIEmbed = {};\n /** Sets the embed title. @param value Title text. @returns This builder. @throws {RangeError} If title exceeds Discord's limit. */ public setTitle(\n value: string,\n ): this {\n this.#data.title = validate(value, 256, \"Embed title\");\n return this;\n }\n /** Sets the embed description. @param value Description text. @returns This builder. @throws {RangeError} If description exceeds Discord's limit. */ public setDescription(\n value: string,\n ): this {\n this.#data.description = validate(value, 4096, \"Embed description\");\n return this;\n }\n /** Sets the embed URL. @param value Absolute URL. @returns This builder. @throws {TypeError} If URL is invalid. */ public setURL(\n value: string,\n ): this {\n this.#data.url = url(value, \"Embed URL\");\n return this;\n }\n /** Sets the embed color. @param value RGB integer. @returns This builder. @throws {RangeError} If color is outside 24-bit RGB range. */ public setColor(\n value: number,\n ): this {\n if (!Number.isInteger(value) || value < 0 || value > 0xffffff)\n throw new RangeError(\n \"Embed color must be an integer between 0 and 16777215.\",\n );\n this.#data.color = value;\n return this;\n }\n /** Sets the embed timestamp. @param value Date value. @returns This builder. @throws {RangeError} If date is invalid. */ public setTimestamp(\n value = new Date(),\n ): this {\n const date = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(date.getTime()))\n throw new RangeError(\"Embed timestamp must be a valid date.\");\n this.#data.timestamp = date.toISOString();\n return this;\n }\n /** Sets the embed footer. @param value Footer payload. @returns This builder. @throws {RangeError} If footer text exceeds Discord's limit. */ public setFooter(\n value: EmbedFooter,\n ): this {\n this.#data.footer = {\n text: validate(value.text, 2048, \"Footer text\"),\n ...(value.icon_url\n ? { icon_url: url(value.icon_url, \"Footer icon URL\") }\n : {}),\n };\n return this;\n }\n /** Sets the embed author. @param value Author payload. @returns This builder. @throws {RangeError} If author name exceeds Discord's limit. */ public setAuthor(\n value: EmbedAuthor,\n ): this {\n this.#data.author = {\n name: validate(value.name, 256, \"Author name\"),\n ...(value.url ? { url: url(value.url, \"Author URL\") } : {}),\n ...(value.icon_url\n ? { icon_url: url(value.icon_url, \"Author icon URL\") }\n : {}),\n };\n return this;\n }\n /** Sets the thumbnail URL. @param value Thumbnail URL or payload. @returns This builder. @throws {TypeError} If URL is invalid. */ public setThumbnail(\n value: { url: string } | string,\n ): this {\n const valueURL = typeof value === \"string\" ? value : value.url;\n this.#data.thumbnail = { url: url(valueURL, \"Thumbnail URL\") };\n return this;\n }\n /** Sets the image URL. @param value Image URL or payload. @returns This builder. @throws {TypeError} If URL is invalid. */ public setImage(\n value: { url: string } | string,\n ): this {\n const valueURL = typeof value === \"string\" ? value : value.url;\n this.#data.image = { url: url(valueURL, \"Image URL\") };\n return this;\n }\n /** Adds embed fields. Accepts both the spread form `addFields(a, b)` and the\n * single-array form `addFields([a, b])` for discord.js `RestOrArray` parity.\n * @param fields Field payloads, spread or as a single array. @returns This builder. @throws {RangeError} If the 25-field limit is exceeded. */ public addFields(\n ...fields: EmbedField[] | [EmbedField[]]\n ): this {\n const resolved = (\n fields.length === 1 && Array.isArray(fields[0]) ? fields[0] : fields\n ) as EmbedField[];\n if (!resolved.length)\n throw new TypeError(\"At least one embed field is required.\");\n const current = this.#data.fields ?? [];\n if (current.length + resolved.length > 25)\n throw new RangeError(\n \"An embed cannot contain more than 25 fields.\",\n );\n for (const field of resolved) {\n validate(field.name, 256, \"Embed field name\");\n validate(field.value, 1024, \"Embed field value\");\n }\n this.#data.fields = [\n ...current,\n ...resolved.map((field) => ({ ...field })),\n ];\n return this;\n }\n public setFields(fields: EmbedField[]): this {\n this.#data.fields = [];\n return this.addFields(...fields);\n }\n /** Replaces fields starting at an index. @param index Start index. @param deleteCount Number of fields to remove. @param fields Replacement fields. @returns This builder. @throws {RangeError} If arguments are invalid or the 25-field limit is exceeded. */ public spliceFields(\n index: number,\n deleteCount: number,\n ...fields: EmbedField[]\n ): this {\n const current = [...(this.#data.fields ?? [])];\n if (\n !Number.isInteger(index) ||\n !Number.isInteger(deleteCount) ||\n index < 0 ||\n deleteCount < 0\n )\n throw new RangeError(\n \"Field index and delete count must be non-negative integers.\",\n );\n current.splice(index, deleteCount, ...fields);\n if (current.length > 25)\n throw new RangeError(\n \"An embed cannot contain more than 25 fields.\",\n );\n this.#data.fields = current;\n return this;\n }\n /** Removes all embed fields. @returns This builder. */ public clearFields(): this {\n delete this.#data.fields;\n return this;\n }\n /** Removes the embed title. @returns This builder. */ public clearTitle(): this {\n delete this.#data.title;\n return this;\n }\n /** Removes the embed description. @returns This builder. */ public clearDescription(): this {\n delete this.#data.description;\n return this;\n }\n /** Returns a deep-cloned Discord API payload. @returns Strict embed payload. */ public get data(): APIEmbed {\n return this.toJSON();\n }\n public toJSON(): APIEmbed {\n return structuredClone(this.#data);\n }\n}\n/** Validates a bounded Discord string field. @param value Field value. @param max Maximum length. @param field Human-readable field name. @returns Validated value. @throws {RangeError} If length is invalid. */\nfunction validate(value: string, max: number, field: string): string {\n if (typeof value !== \"string\" || value.length === 0 || value.length > max)\n throw new RangeError(`${field} must contain 1-${max} characters.`);\n return value;\n}\n/** Validates and normalizes an absolute URL. @param value URL value. @param field Human-readable field name. @returns Normalized URL. @throws {TypeError} If URL is invalid. */\nfunction url(value: string, field: string): string {\n try {\n return new URL(value).toString();\n } catch (error) {\n throw new TypeError(`${field} must be a valid URL.`, { cause: error });\n }\n}\n",
|
|
6
|
+
"// ─── 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",
|
|
7
|
+
"/** 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",
|
|
8
|
+
"// Re-export the canonical ButtonStyle from @lunibee/types so the builders package\n// never ships a drifting duplicate (the old local copy was missing `Premium: 6`).\nimport { ButtonStyle } from \"@lunibee/types\";\nexport { ButtonStyle };\n\n/** Component type constants exposed by Lunibee. */\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;\nexport const TextInputStyle = { Short: 1, Paragraph: 2 } as const;\nexport interface APIComponentEmoji {\n id?: string | null;\n name?: string | null;\n animated?: boolean;\n}\nexport interface APIButtonComponent {\n type: typeof ComponentType.Button;\n style: 1 | 2 | 3 | 4 | 5 | 6;\n custom_id?: string;\n label?: string;\n emoji?: APIComponentEmoji;\n url?: string;\n /** SKU for premium (style 6) buttons. */\n sku_id?: string;\n disabled?: boolean;\n}\nexport interface APISelectOption {\n label: string;\n value: string;\n description?: string;\n emoji?: APIComponentEmoji;\n default?: boolean;\n}\nexport interface APIStringSelectComponent {\n type: typeof ComponentType.StringSelect;\n custom_id?: string;\n placeholder?: string;\n min_values?: number;\n max_values?: number;\n required?: boolean;\n disabled?: boolean;\n options?: APISelectOption[];\n}\nexport interface APIEntitySelectComponent {\n type:\n | typeof ComponentType.UserSelect\n | typeof ComponentType.RoleSelect\n | typeof ComponentType.MentionableSelect\n | typeof ComponentType.ChannelSelect;\n custom_id?: string;\n placeholder?: string;\n min_values?: number;\n max_values?: number;\n required?: boolean;\n disabled?: boolean;\n default_values?: APISelectDefaultValue[];\n}\nexport interface APITextInputComponent {\n type: typeof ComponentType.TextInput;\n style: typeof TextInputStyle.Short | typeof TextInputStyle.Paragraph;\n custom_id?: string;\n label?: string;\n placeholder?: string;\n min_length?: number;\n max_length?: number;\n required?: boolean;\n value?: string;\n}\nexport interface APIModalComponent {\n type: 9;\n custom_id?: string;\n title?: string;\n components: APIActionRowComponent[];\n}\nexport type APIActionRowChild =\n | APIButtonComponent\n | APIStringSelectComponent\n | APIEntitySelectComponent\n | APITextInputComponent;\nexport interface APIActionRowComponent {\n type: typeof ComponentType.ActionRow;\n components: APIActionRowChild[];\n}\nexport interface APISectionComponent {\n type: typeof ComponentType.Section;\n components?: APIComponent[]; // text displays\n accessory?: APIComponent; // buttons, thumbnails, etc.\n}\nexport interface APITextDisplayComponent {\n type: typeof ComponentType.TextDisplay;\n content: string;\n}\nexport interface APIMediaGalleryComponent {\n type: typeof ComponentType.MediaGallery;\n items: { media: { url: string; description?: string } }[];\n}\n/** Default values accepted by an auto-populated entity select. */\nexport interface APISelectDefaultValue {\n id: string;\n type: \"user\" | \"role\" | \"channel\";\n}\nexport interface APIFileComponent {\n type: typeof ComponentType.File;\n file: { url: string };\n spoiler?: boolean;\n}\nexport interface APISeparatorComponent {\n type: typeof ComponentType.Separator;\n spacing?: 1 | 2;\n divider?: boolean;\n}\nexport interface APIThumbnailComponent {\n type: typeof ComponentType.Thumbnail;\n url: string;\n proxy_url?: string;\n width?: number;\n height?: number;\n description?: string;\n spoiler?: boolean;\n}\nexport interface APIContentInventoryEntryComponent {\n type: typeof ComponentType.ContentInventoryEntry;\n id: string;\n}\nexport interface APIContainerComponent {\n type: typeof ComponentType.Container;\n components: APIComponent[];\n accent_color?: number;\n spoiler?: boolean;\n}\nexport type APIComponent =\n | APIActionRowComponent\n | APIButtonComponent\n | APIStringSelectComponent\n | APIEntitySelectComponent\n | APITextInputComponent\n | APISectionComponent\n | APITextDisplayComponent\n | APIThumbnailComponent\n | APIMediaGalleryComponent\n | APIFileComponent\n | APISeparatorComponent\n | APIContentInventoryEntryComponent\n | APIContainerComponent;\n\nexport class ActionRowBuilder<\n T extends { toJSON(): APIActionRowChild } = { toJSON(): APIActionRowChild },\n> {\n readonly #components: T[] = [];\n public addComponents(...components: T[]): this {\n if (!components.length)\n throw new TypeError(\"At least one component is required.\");\n if (this.#components.length + components.length > 5)\n throw new RangeError(\n \"An action row cannot contain more than 5 components.\",\n );\n this.#components.push(...components);\n return this;\n }\n public clearComponents(): this {\n this.#components.length = 0;\n return this;\n }\n public toJSON(): APIActionRowComponent {\n const components = this.#components.map((component) =>\n component.toJSON(),\n );\n if (components.length === 0)\n throw new RangeError(\"An action row needs at least one component.\");\n const types = components.map((component) => component.type);\n if (\n types.some((type) => type !== ComponentType.Button) &&\n components.length > 1\n )\n throw new RangeError(\n \"A select menu or text input must be alone in its action row.\",\n );\n return { type: ComponentType.ActionRow, components };\n }\n}\nexport class StringSelectBuilder {\n readonly #data: APIStringSelectComponent = {\n type: ComponentType.StringSelect,\n };\n public setCustomId(value: string): this {\n validateText(value, 100, \"Component custom ID\");\n this.#data.custom_id = value;\n return this;\n }\n public setPlaceholder(value: string): this {\n validateText(value, 150, \"Component placeholder\");\n this.#data.placeholder = value;\n return this;\n }\n public setMinValues(value: number): this {\n validateCount(value, \"min_values\", 0);\n this.#data.min_values = value;\n return this;\n }\n public setMaxValues(value: number): this {\n validateCount(value, \"max_values\", 1);\n this.#data.max_values = value;\n return this;\n }\n public setRequired(value = true): this {\n this.#data.required = value;\n return this;\n }\n public setDisabled(value = true): this {\n this.#data.disabled = value;\n return this;\n }\n public addOptions(...options: APISelectOption[]): this {\n if (!options.length)\n throw new TypeError(\"At least one select option is required.\");\n const current = this.#data.options ?? [];\n if (current.length + options.length > 25)\n throw new RangeError(\n \"A string select cannot contain more than 25 options.\",\n );\n for (const option of options) {\n validateText(option.label, 100, \"Select option label\");\n validateText(option.value, 100, \"Select option value\");\n if (option.description)\n validateText(\n option.description,\n 100,\n \"Select option description\",\n );\n }\n this.#data.options = [\n ...current,\n ...options.map((option) => ({ ...option })),\n ];\n return this;\n }\n public toJSON(): APIStringSelectComponent {\n assertSelect(this.#data);\n const count = this.#data.options?.length ?? 0;\n if (count === 0)\n throw new RangeError(\"A string select needs at least one option.\");\n if ((this.#data.max_values ?? 1) > count)\n throw new RangeError(\n \"max_values cannot exceed the number of options.\",\n );\n return structuredClone(this.#data);\n }\n}\nexport class ButtonBuilder {\n readonly #data: APIButtonComponent = {\n type: ComponentType.Button,\n style: ButtonStyle.Secondary,\n };\n /** Sets the style and drops fields that style cannot carry. */\n public setStyle(style: APIButtonComponent[\"style\"]): this {\n const data = this.#data;\n data.style = style;\n if (style === ButtonStyle.Link) {\n delete data.custom_id;\n delete data.sku_id;\n } else if (style === ButtonStyle.Premium) {\n delete data.custom_id;\n delete data.url;\n delete data.label;\n delete data.emoji;\n } else {\n delete data.url;\n delete data.sku_id;\n }\n return this;\n }\n public setCustomId(value: string): this {\n validateText(value, 100, \"Button custom ID\");\n if (this.#data.style === ButtonStyle.Link)\n throw new TypeError(\"Link buttons cannot use custom IDs.\");\n this.#data.custom_id = value;\n return this;\n }\n public setLabel(value: string): this {\n validateText(value, 80, \"Button label\");\n this.#data.label = value;\n return this;\n }\n public setURL(value: string): this {\n validateText(value, 512, \"Button URL\");\n let url: URL;\n try {\n url = new URL(value);\n } catch (error) {\n throw new TypeError(\"Button URL must be a valid URL.\", {\n cause: error,\n });\n }\n this.setStyle(ButtonStyle.Link);\n this.#data.url = url.toString();\n return this;\n }\n /** Makes this a premium (purchase) button for a SKU. Premium buttons carry no label, emoji, custom ID or URL. */\n public setSKUId(skuId: string): this {\n validateText(skuId, 20, \"Button SKU ID\");\n this.setStyle(ButtonStyle.Premium);\n this.#data.sku_id = skuId;\n return this;\n }\n public setEmoji(emoji: APIComponentEmoji | string): this {\n this.#data.emoji =\n typeof emoji === \"string\" ? { name: emoji } : { ...emoji };\n return this;\n }\n public setDisabled(value = true): this {\n this.#data.disabled = value;\n return this;\n }\n public toJSON(): APIButtonComponent {\n const data = this.#data;\n if (data.style === ButtonStyle.Link) {\n if (!data.url) throw new TypeError(\"Link buttons require a URL.\");\n if (data.custom_id || data.sku_id)\n throw new TypeError(\n \"Link buttons cannot have a custom ID or SKU ID.\",\n );\n } else if (data.style === ButtonStyle.Premium) {\n if (!data.sku_id)\n throw new TypeError(\"Premium buttons require a SKU ID.\");\n if (data.custom_id || data.url || data.label || data.emoji)\n throw new TypeError(\n \"Premium buttons cannot have a custom ID, URL, label or emoji.\",\n );\n } else {\n if (!data.custom_id)\n throw new TypeError(\"Non-link buttons require a custom ID.\");\n if (data.url || data.sku_id)\n throw new TypeError(\n \"Only link buttons have a URL and only premium buttons have a SKU ID.\",\n );\n }\n if (data.style !== ButtonStyle.Premium && !data.label && !data.emoji)\n throw new TypeError(\"Buttons require a label or an emoji.\");\n return structuredClone(data);\n }\n}\nexport class EntitySelectBuilder {\n readonly #data: APIEntitySelectComponent;\n public constructor(\n type:\n | typeof ComponentType.UserSelect\n | typeof ComponentType.RoleSelect\n | typeof ComponentType.MentionableSelect\n | typeof ComponentType.ChannelSelect,\n ) {\n if (\n type !== ComponentType.UserSelect &&\n type !== ComponentType.RoleSelect &&\n type !== ComponentType.MentionableSelect &&\n type !== ComponentType.ChannelSelect\n )\n throw new TypeError(\"Invalid select component type.\");\n this.#data = { type };\n }\n public setCustomId(value: string): this {\n validateText(value, 100, \"Component custom ID\");\n this.#data.custom_id = value;\n return this;\n }\n public setPlaceholder(value: string): this {\n validateText(value, 150, \"Component placeholder\");\n this.#data.placeholder = value;\n return this;\n }\n public setMinValues(value: number): this {\n validateCount(value, \"min_values\", 0);\n this.#data.min_values = value;\n return this;\n }\n public setMaxValues(value: number): this {\n validateCount(value, \"max_values\", 1);\n this.#data.max_values = value;\n return this;\n }\n public setRequired(value = true): this {\n this.#data.required = value;\n return this;\n }\n public setDisabled(value = true): this {\n this.#data.disabled = value;\n return this;\n }\n public setDefaultValues(...values: APISelectDefaultValue[]): this {\n this.#data.default_values = values.map((value) => ({ ...value }));\n return this;\n }\n public toJSON(): APIEntitySelectComponent {\n assertSelect(this.#data);\n return structuredClone(this.#data);\n }\n}\nexport class ModalBuilder {\n readonly #components: Array<{ toJSON(): APIActionRowComponent }> = [];\n #custom_id?: string;\n #title?: string;\n public setCustomId(value: string): this {\n validateText(value, 100, \"Modal custom ID\");\n this.#custom_id = value;\n return this;\n }\n public setTitle(value: string): this {\n validateText(value, 45, \"Modal title\");\n this.#title = value;\n return this;\n }\n public addComponents(\n ...components: Array<{ toJSON(): APIActionRowComponent }>\n ): this {\n if (!components.length)\n throw new TypeError(\"At least one modal component is required.\");\n if (this.#components.length + components.length > 5)\n throw new RangeError(\n \"A modal cannot contain more than 5 action rows.\",\n );\n this.#components.push(...components);\n return this;\n }\n public toJSON(): APIModalComponent {\n if (!this.#custom_id || !this.#title)\n throw new TypeError(\"Modals require a custom ID and a title.\");\n if (this.#components.length === 0)\n throw new RangeError(\"Modals require at least one component.\");\n return {\n type: 9,\n ...(this.#custom_id ? { custom_id: this.#custom_id } : {}),\n ...(this.#title ? { title: this.#title } : {}),\n components: this.#components.map((component) => component.toJSON()),\n };\n }\n}\nexport class TextInputBuilder {\n readonly #data: APITextInputComponent = {\n type: ComponentType.TextInput,\n style: TextInputStyle.Short,\n };\n public setStyle(style: APITextInputComponent[\"style\"]): this {\n this.#data.style = style;\n return this;\n }\n public setCustomId(value: string): this {\n validateText(value, 100, \"Text input custom ID\");\n this.#data.custom_id = value;\n return this;\n }\n public setLabel(value: string): this {\n validateText(value, 45, \"Text input label\");\n this.#data.label = value;\n return this;\n }\n public setPlaceholder(value: string): this {\n validateText(value, 100, \"Text input placeholder\");\n this.#data.placeholder = value;\n return this;\n }\n public setMinLength(value: number): this {\n validateLength(value, \"min_length\", 4000);\n this.#data.min_length = value;\n return this;\n }\n public setMaxLength(value: number): this {\n validateLength(value, \"max_length\", 4000);\n this.#data.max_length = value;\n return this;\n }\n public setRequired(value = true): this {\n this.#data.required = value;\n return this;\n }\n public setValue(value: string): this {\n validateText(value, 4000, \"Text input value\");\n this.#data.value = value;\n return this;\n }\n public toJSON(): APITextInputComponent {\n const data = this.#data;\n if (!data.custom_id)\n throw new TypeError(\"Text inputs require a custom ID.\");\n if (\n data.min_length !== undefined &&\n data.max_length !== undefined &&\n data.min_length > data.max_length\n )\n throw new RangeError(\"min_length cannot exceed max_length.\");\n return structuredClone(data);\n }\n}\n\nexport class ContainerBuilder {\n readonly #components: { toJSON(): APIComponent }[] = [];\n #accentColor?: number;\n #spoiler?: boolean;\n public addComponents(...components: { toJSON(): APIComponent }[]): this {\n if (!components.length)\n throw new TypeError(\"At least one component is required.\");\n this.#components.push(...components);\n return this;\n }\n public setAccentColor(color: number): this {\n if (!Number.isInteger(color) || color < 0 || color > 0xffffff) {\n throw new RangeError(\n \"Accent color must be an integer between 0 and 16777215 (0xFFFFFF).\",\n );\n }\n this.#accentColor = color;\n return this;\n }\n /** Marks the whole container as a spoiler (blurred until clicked). */\n public setSpoiler(spoiler = true): this {\n this.#spoiler = spoiler;\n return this;\n }\n public toJSON(): APIContainerComponent {\n const data: APIContainerComponent = {\n type: ComponentType.Container,\n components: this.#components.map((c) => c.toJSON()),\n };\n if (this.#accentColor !== undefined)\n data.accent_color = this.#accentColor;\n if (this.#spoiler !== undefined) data.spoiler = this.#spoiler;\n return data;\n }\n}\n\nexport class SectionBuilder {\n readonly #components: { toJSON(): APIComponent }[] = [];\n #accessory?: { toJSON(): APIComponent };\n public addComponents(...components: { toJSON(): APIComponent }[]): this {\n if (!components.length)\n throw new TypeError(\"At least one component is required.\");\n this.#components.push(...components);\n return this;\n }\n public setAccessory(accessory: { toJSON(): APIComponent }): this {\n this.#accessory = accessory;\n return this;\n }\n public toJSON(): APISectionComponent {\n return {\n type: ComponentType.Section,\n components: this.#components.length\n ? this.#components.map((c) => c.toJSON())\n : undefined,\n accessory: this.#accessory?.toJSON(),\n };\n }\n}\n\nexport class TextDisplayBuilder {\n #content = \"\";\n public setContent(content: string): this {\n validateText(content, 4000, \"Text display content\");\n this.#content = content;\n return this;\n }\n public toJSON(): APITextDisplayComponent {\n return {\n type: ComponentType.TextDisplay,\n content: this.#content,\n };\n }\n}\n\nexport class MediaGalleryBuilder {\n readonly #items: { media: { url: string; description?: string } }[] = [];\n public addItems(...items: { url: string; description?: string }[]): this {\n if (!items.length) {\n throw new TypeError(\"At least one media gallery item is required.\");\n }\n if (this.#items.length + items.length > 10) {\n throw new RangeError(\n \"MediaGallery can only contain up to 10 items.\",\n );\n }\n this.#items.push(...items.map((item) => ({ media: item })));\n return this;\n }\n public toJSON(): APIMediaGalleryComponent {\n return {\n type: ComponentType.MediaGallery,\n items: structuredClone(this.#items),\n };\n }\n}\n\nexport class FileComponentBuilder {\n #url = \"\";\n #spoiler?: boolean;\n public setUrl(url: string): this {\n validateText(url, 2048, \"File component URL\");\n this.#url = url;\n return this;\n }\n public setSpoiler(spoiler = true): this {\n this.#spoiler = spoiler;\n return this;\n }\n public toJSON(): APIFileComponent {\n if (!this.#url) throw new Error(\"File component must have a URL.\");\n const data: APIFileComponent = {\n type: ComponentType.File,\n file: { url: this.#url },\n };\n if (this.#spoiler !== undefined) data.spoiler = this.#spoiler;\n return data;\n }\n}\n\nexport class SeparatorBuilder {\n #spacing?: 1 | 2;\n #divider?: boolean;\n public setSpacing(spacing: 1 | 2): this {\n this.#spacing = spacing;\n return this;\n }\n public setDivider(divider = true): this {\n this.#divider = divider;\n return this;\n }\n public toJSON(): APISeparatorComponent {\n const data: APISeparatorComponent = {\n type: ComponentType.Separator,\n };\n if (this.#spacing !== undefined) data.spacing = this.#spacing;\n if (this.#divider !== undefined) data.divider = this.#divider;\n return data;\n }\n}\n\nexport class ThumbnailBuilder {\n #url = \"\";\n #description?: string;\n #spoiler?: boolean;\n public setUrl(url: string): this {\n validateText(url, 2048, \"Thumbnail URL\");\n this.#url = url;\n return this;\n }\n /** Sets the thumbnail's alt-text description. */\n public setDescription(description: string): this {\n validateText(description, 1024, \"Thumbnail description\");\n this.#description = description;\n return this;\n }\n /** Marks the thumbnail as a spoiler (blurred until clicked). */\n public setSpoiler(spoiler = true): this {\n this.#spoiler = spoiler;\n return this;\n }\n public toJSON(): APIThumbnailComponent {\n const data: APIThumbnailComponent = {\n type: ComponentType.Thumbnail,\n url: this.#url,\n };\n if (this.#description !== undefined)\n data.description = this.#description;\n if (this.#spoiler !== undefined) data.spoiler = this.#spoiler;\n return data;\n }\n}\n\nexport class ContentInventoryEntryBuilder {\n #id = \"\";\n public setId(id: string): this {\n validateText(id, 100, \"Content inventory entry ID\");\n this.#id = id;\n return this;\n }\n public toJSON(): APIContentInventoryEntryComponent {\n return {\n type: ComponentType.ContentInventoryEntry,\n id: this.#id,\n };\n }\n}\n\nfunction validateText(value: string, max: number, field: string): void {\n if (typeof value !== \"string\")\n throw new TypeError(`${field} must be a string.`);\n if (!value.trim())\n throw new RangeError(`${field} must be a non-empty string.`);\n if (value.length > max)\n throw new RangeError(`${field} cannot exceed ${max} characters.`);\n}\nfunction validateCount(\n value: number,\n field: string,\n min: number,\n max = 25,\n): void {\n if (!Number.isInteger(value) || value < min || value > max)\n throw new RangeError(\n `${field} must be an integer between ${min} and ${max}.`,\n );\n}\nfunction validateLength(value: number, field: string, max = 4000): void {\n if (!Number.isInteger(value) || value < 0 || value > max)\n throw new RangeError(\n `${field} must be an integer between 0 and ${max}.`,\n );\n}\n\n/** Discord.js-familiar alias for {@link StringSelectBuilder}. */\nexport { StringSelectBuilder as StringSelectMenuBuilder };\n/** User select menu builder (Discord.js-familiar). */\nexport class UserSelectMenuBuilder extends EntitySelectBuilder {\n public constructor() {\n super(ComponentType.UserSelect);\n }\n}\n/** Role select menu builder (Discord.js-familiar). */\nexport class RoleSelectMenuBuilder extends EntitySelectBuilder {\n public constructor() {\n super(ComponentType.RoleSelect);\n }\n}\n/** Mentionable select menu builder (Discord.js-familiar). */\nexport class MentionableSelectMenuBuilder extends EntitySelectBuilder {\n public constructor() {\n super(ComponentType.MentionableSelect);\n }\n}\n/** Channel select menu builder (Discord.js-familiar). */\nexport class ChannelSelectMenuBuilder extends EntitySelectBuilder {\n public constructor() {\n super(ComponentType.ChannelSelect);\n }\n}\n\n/** Checks the fields every select menu needs. */\nfunction assertSelect(data: {\n custom_id?: string;\n min_values?: number;\n max_values?: number;\n}): void {\n if (!data.custom_id)\n throw new TypeError(\"Select menus require a custom ID.\");\n if ((data.min_values ?? 1) > (data.max_values ?? 1))\n throw new RangeError(\"min_values cannot exceed max_values.\");\n}\n",
|
|
9
|
+
"/** 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/** Builds Discord application command payloads. */\nexport class SlashCommandBuilder {\n readonly #data: Record<string, unknown> = { type: 1 };\n /** Sets the command name. */ public setName(name: string): this {\n validateName(name, \"Command name\");\n this.#data.name = name;\n return this;\n }\n /** Sets the command description. */ public setDescription(\n description: string,\n ): this {\n validateText(description, \"Command description\", 100);\n this.#data.description = description;\n return this;\n }\n /** Sets whether the command is available in direct messages. */ public setDMPermission(\n enabled: boolean,\n ): this {\n this.#data.dm_permission = enabled;\n return this;\n }\n /** Sets whether the command is NSFW. */\n public setNSFW(nsfw = true): this {\n this.#data.nsfw = nsfw;\n return this;\n }\n /** Sets whether the command is NSFW. */\n public setNsfw(nsfw = true): this {\n return this.setNSFW(nsfw);\n }\n /** Sets command default member permissions. */ public setDefaultMemberPermissions(\n permissions: bigint | number | string | null,\n ): this {\n this.#data.default_member_permissions =\n permissions === null ? null : BigInt(permissions).toString();\n return this;\n }\n /** Sets command integration types. */ public setIntegrationTypes(\n ...types: number[]\n ): this {\n this.#data.integration_types = [...types];\n return this;\n }\n /** Adds a string option. */ public addStringOption(\n configure: (option: StringOptionBuilder) => StringOptionBuilder,\n ): this {\n return this.addOption(configure(new StringOptionBuilder()));\n }\n /** Adds an integer option. */ public addIntegerOption(\n configure: (option: IntegerOptionBuilder) => IntegerOptionBuilder,\n ): this {\n return this.addOption(configure(new IntegerOptionBuilder()));\n }\n /** Adds a number option. */ public addNumberOption(\n configure: (option: NumberOptionBuilder) => NumberOptionBuilder,\n ): this {\n return this.addOption(configure(new NumberOptionBuilder()));\n }\n /** Adds a boolean option. */ public addBooleanOption(\n configure: (option: BooleanOptionBuilder) => BooleanOptionBuilder,\n ): this {\n return this.addOption(configure(new BooleanOptionBuilder()));\n }\n /** Adds a user option. */ public addUserOption(\n configure: (option: UserOptionBuilder) => UserOptionBuilder,\n ): this {\n return this.addOption(configure(new UserOptionBuilder()));\n }\n /** Adds a channel option. */ public addChannelOption(\n configure: (option: ChannelOptionBuilder) => ChannelOptionBuilder,\n ): this {\n return this.addOption(configure(new ChannelOptionBuilder()));\n }\n /** Adds a role option. */ public addRoleOption(\n configure: (option: RoleOptionBuilder) => RoleOptionBuilder,\n ): this {\n return this.addOption(configure(new RoleOptionBuilder()));\n }\n /** Adds a mentionable option. */ public addMentionableOption(\n configure: (\n option: MentionableOptionBuilder,\n ) => MentionableOptionBuilder,\n ): this {\n return this.addOption(configure(new MentionableOptionBuilder()));\n }\n /** Adds an attachment option. */ public addAttachmentOption(\n configure: (option: AttachmentOptionBuilder) => AttachmentOptionBuilder,\n ): this {\n return this.addOption(configure(new AttachmentOptionBuilder()));\n }\n /** Adds a subcommand. */ public addSubcommand(\n configure: (option: SubcommandBuilder) => SubcommandBuilder,\n ): this {\n return this.addOption(configure(new SubcommandBuilder()));\n }\n /** Adds a subcommand group. */ public addSubcommandGroup(\n configure: (option: SubcommandGroupBuilder) => SubcommandGroupBuilder,\n ): this {\n return this.addOption(configure(new SubcommandGroupBuilder()));\n }\n /** Serializes the command payload. */ public toJSON(): Record<\n string,\n unknown\n > {\n return structuredClone(this.#data);\n }\n /** Adds a validated top-level command option. */ protected addOption(\n option: CommandOptionBuilder,\n ): this {\n const options = (this.#data.options as unknown[] | undefined) ?? [];\n if (options.length >= 25)\n throw new RangeError(\n \"An application command cannot contain more than 25 options.\",\n );\n const payload = option.toJSON();\n if (\n options.some(\n (existing) =>\n (existing as Record<string, unknown>).name === payload.name,\n )\n )\n throw new RangeError(\n `Duplicate option name: ${String(payload.name)}.`,\n );\n if (\n payload.required === true &&\n options.some(\n (existing) =>\n (existing as Record<string, unknown>).required !== true,\n )\n )\n throw new RangeError(\n \"Required application command options must be placed before optional options.\",\n );\n options.push(payload);\n this.#data.options = options;\n return this;\n }\n}\n\n/** Base builder for command options. */\nexport class CommandOptionBuilder {\n protected readonly data: Record<string, unknown>;\n /** Creates an option builder. */ public constructor(type: number) {\n this.data = { type };\n }\n /** Sets the option name. */ public setName(name: string): this {\n validateName(name, \"Option name\");\n this.data.name = name;\n return this;\n }\n /** Sets the option description. */ public setDescription(\n description: string,\n ): this {\n validateText(description, \"Option description\", 100);\n this.data.description = description;\n return this;\n }\n /** Makes the option required or optional. */ public setRequired(\n required = true,\n ): this {\n this.data.required = required;\n return this;\n }\n /** Sets autocomplete. */ public setAutocomplete(enabled = true): this {\n this.data.autocomplete = enabled;\n return this;\n }\n /** Serializes the option payload. */ public toJSON(): Record<\n string,\n unknown\n > {\n return structuredClone(this.data);\n }\n}\n\n/** Builds a string command option. */\nexport class StringOptionBuilder extends CommandOptionBuilder {\n /** Creates a string option. */ public constructor() {\n super(ApplicationCommandOptionType.String);\n }\n /** Adds string choices. */ public addChoices(\n ...choices: Array<{ name: string; value: string }>\n ): this {\n const current = (this.data.choices as unknown[] | undefined) ?? [];\n if (!choices.length)\n throw new TypeError(\"At least one choice is required.\");\n if (this.data.autocomplete === true)\n throw new RangeError(\"Autocomplete options cannot define choices.\");\n if (current.length + choices.length > 25)\n throw new RangeError(\n \"An option cannot contain more than 25 choices.\",\n );\n for (const choice of choices) {\n validateText(choice.name, \"Choice name\", 100);\n validateText(choice.value, \"Choice value\", 100);\n }\n this.data.choices = [\n ...current,\n ...choices.map((choice) => ({ ...choice })),\n ];\n return this;\n }\n /** Sets the minimum string length. */ public setMinLength(\n value: number,\n ): this {\n validateIntegerRange(value, 0, 6000, \"min_length\");\n this.data.min_length = value;\n return this;\n }\n /** Sets the maximum string length. */ public setMaxLength(\n value: number,\n ): this {\n validateIntegerRange(value, 1, 6000, \"max_length\");\n if (\n (this.data.min_length as number | undefined) !== undefined &&\n (this.data.min_length as number) > value\n )\n throw new RangeError(\"min_length cannot exceed max_length.\");\n this.data.max_length = value;\n return this;\n }\n}\n/** Builds an integer command option. */\nexport class IntegerOptionBuilder extends CommandOptionBuilder {\n public constructor() {\n super(ApplicationCommandOptionType.Integer);\n }\n public setMinValue(value: number): this {\n validateNumberRange(\n value,\n -9_007_199_254_740_991,\n 9_007_199_254_740_991,\n \"min_value\",\n true,\n );\n this.data.min_value = value;\n return this;\n }\n public setMaxValue(value: number): this {\n validateNumberRange(\n value,\n -9_007_199_254_740_991,\n 9_007_199_254_740_991,\n \"max_value\",\n true,\n );\n if (\n (this.data.min_value as number | undefined) !== undefined &&\n (this.data.min_value as number) > value\n )\n throw new RangeError(\"min_value cannot exceed max_value.\");\n this.data.max_value = value;\n return this;\n }\n public setAutocomplete(enabled = true): this {\n if (\n enabled &&\n Array.isArray(this.data.choices) &&\n this.data.choices.length\n )\n throw new RangeError(\"Autocomplete options cannot define choices.\");\n this.data.autocomplete = enabled;\n return this;\n }\n public addChoices(...choices: { name: string; value: number }[]): this {\n const current = (this.data.choices as unknown[] | undefined) ?? [];\n if (!choices.length)\n throw new TypeError(\"At least one choice is required.\");\n if (this.data.autocomplete === true)\n throw new RangeError(\"Autocomplete options cannot define choices.\");\n if (current.length + choices.length > 25)\n throw new RangeError(\n \"An option cannot contain more than 25 choices.\",\n );\n this.data.choices = [...current, ...choices];\n return this;\n }\n}\n/** Builds a number command option. */\nexport class NumberOptionBuilder extends CommandOptionBuilder {\n public constructor() {\n super(ApplicationCommandOptionType.Number);\n }\n public setMinValue(value: number): this {\n validateNumberRange(\n value,\n -9_007_199_254_740_991,\n 9_007_199_254_740_991,\n \"min_value\",\n false,\n );\n this.data.min_value = value;\n return this;\n }\n public setMaxValue(value: number): this {\n validateNumberRange(\n value,\n -9_007_199_254_740_991,\n 9_007_199_254_740_991,\n \"max_value\",\n false,\n );\n if (\n (this.data.min_value as number | undefined) !== undefined &&\n (this.data.min_value as number) > value\n )\n throw new RangeError(\"min_value cannot exceed max_value.\");\n this.data.max_value = value;\n return this;\n }\n public setAutocomplete(enabled = true): this {\n if (\n enabled &&\n Array.isArray(this.data.choices) &&\n this.data.choices.length\n )\n throw new RangeError(\"Autocomplete options cannot define choices.\");\n this.data.autocomplete = enabled;\n return this;\n }\n public addChoices(...choices: { name: string; value: number }[]): this {\n const current = (this.data.choices as unknown[] | undefined) ?? [];\n if (!choices.length)\n throw new TypeError(\"At least one choice is required.\");\n if (this.data.autocomplete === true)\n throw new RangeError(\"Autocomplete options cannot define choices.\");\n if (current.length + choices.length > 25)\n throw new RangeError(\n \"An option cannot contain more than 25 choices.\",\n );\n this.data.choices = [...current, ...choices];\n return this;\n }\n}\n/** Builds a boolean command option. */ export class BooleanOptionBuilder extends CommandOptionBuilder {\n /** Creates a boolean option. */ public constructor() {\n super(ApplicationCommandOptionType.Boolean);\n }\n}\n/** Builds a user command option. */ export class UserOptionBuilder extends CommandOptionBuilder {\n /** Creates a user option. */ public constructor() {\n super(ApplicationCommandOptionType.User);\n }\n}\n/** Builds a role command option. */ export class RoleOptionBuilder extends CommandOptionBuilder {\n /** Creates a role option. */ public constructor() {\n super(ApplicationCommandOptionType.Role);\n }\n}\n/** Builds a mentionable command option. */ export class MentionableOptionBuilder extends CommandOptionBuilder {\n /** Creates a mentionable option. */ public constructor() {\n super(ApplicationCommandOptionType.Mentionable);\n }\n}\n/** Builds an attachment command option. */ export class AttachmentOptionBuilder extends CommandOptionBuilder {\n /** Creates an attachment option. */ public constructor() {\n super(ApplicationCommandOptionType.Attachment);\n }\n}\n/** Builds a channel command option. */ export class ChannelOptionBuilder extends CommandOptionBuilder {\n /** Creates a channel option. */ public constructor() {\n super(ApplicationCommandOptionType.Channel);\n }\n /** Restricts accepted channel types. */ public addChannelTypes(\n ...types: number[]\n ): this {\n if (types.some((type) => !Number.isInteger(type) || type < 0))\n throw new RangeError(\n \"Channel types must be non-negative integers.\",\n );\n this.data.channel_types = [...new Set(types)];\n return this;\n }\n}\n/** Builds a nested subcommand. */ export class SubcommandBuilder extends CommandOptionBuilder {\n /** Creates a subcommand. */ public constructor() {\n super(ApplicationCommandOptionType.Subcommand);\n }\n /** Adds a string option to this subcommand. */ public addStringOption(\n configure: (option: StringOptionBuilder) => StringOptionBuilder,\n ): this {\n return this.addChildOption(configure(new StringOptionBuilder()));\n }\n /** Adds an integer option to this subcommand. */ public addIntegerOption(\n configure: (option: IntegerOptionBuilder) => IntegerOptionBuilder,\n ): this {\n return this.addChildOption(configure(new IntegerOptionBuilder()));\n }\n /** Adds a number option to this subcommand. */ public addNumberOption(\n configure: (option: NumberOptionBuilder) => NumberOptionBuilder,\n ): this {\n return this.addChildOption(configure(new NumberOptionBuilder()));\n }\n /** Adds a boolean option to this subcommand. */ public addBooleanOption(\n configure: (option: BooleanOptionBuilder) => BooleanOptionBuilder,\n ): this {\n return this.addChildOption(configure(new BooleanOptionBuilder()));\n }\n /** Adds a user option to this subcommand. */ public addUserOption(\n configure: (option: UserOptionBuilder) => UserOptionBuilder,\n ): this {\n return this.addChildOption(configure(new UserOptionBuilder()));\n }\n /** Adds a channel option to this subcommand. */ public addChannelOption(\n configure: (option: ChannelOptionBuilder) => ChannelOptionBuilder,\n ): this {\n return this.addChildOption(configure(new ChannelOptionBuilder()));\n }\n /** Adds a role option to this subcommand. */ public addRoleOption(\n configure: (option: RoleOptionBuilder) => RoleOptionBuilder,\n ): this {\n return this.addChildOption(configure(new RoleOptionBuilder()));\n }\n /** Adds a mentionable option to this subcommand. */ public addMentionableOption(\n configure: (\n option: MentionableOptionBuilder,\n ) => MentionableOptionBuilder,\n ): this {\n return this.addChildOption(configure(new MentionableOptionBuilder()));\n }\n /** Adds an attachment option to this subcommand. */ public addAttachmentOption(\n configure: (option: AttachmentOptionBuilder) => AttachmentOptionBuilder,\n ): this {\n return this.addChildOption(configure(new AttachmentOptionBuilder()));\n }\n protected addChildOption(option: CommandOptionBuilder): this {\n const options = (this.data.options as unknown[] | undefined) ?? [];\n if (options.length >= 25)\n throw new RangeError(\n \"A subcommand cannot contain more than 25 options.\",\n );\n const payload = option.toJSON();\n if (\n options.some(\n (existing) =>\n (existing as Record<string, unknown>).name === payload.name,\n )\n )\n throw new RangeError(\n `Duplicate option name: ${String(payload.name)}.`,\n );\n if (\n payload.required === true &&\n options.some(\n (existing) =>\n (existing as Record<string, unknown>).required !== true,\n )\n )\n throw new RangeError(\n \"Required subcommand options must be placed before optional options.\",\n );\n if (\n options.some(\n (existing) =>\n (existing as Record<string, unknown>).type ===\n ApplicationCommandOptionType.Subcommand,\n )\n )\n throw new RangeError(\n \"Subcommands cannot contain nested subcommands.\",\n );\n options.push(payload);\n this.data.options = options;\n return this;\n }\n}\n/** Builds a nested subcommand group. */ export class SubcommandGroupBuilder extends CommandOptionBuilder {\n /** Creates a subcommand group. */ public constructor() {\n super(ApplicationCommandOptionType.SubcommandGroup);\n }\n /** Adds a subcommand to this group. */ public addSubcommand(\n configure: (option: SubcommandBuilder) => SubcommandBuilder,\n ): this {\n const options = (this.data.options as unknown[] | undefined) ?? [];\n if (options.length >= 25)\n throw new RangeError(\n \"A subcommand group cannot contain more than 25 subcommands.\",\n );\n const payload = configure(new SubcommandBuilder()).toJSON();\n if (\n options.some(\n (existing) =>\n (existing as Record<string, unknown>).name === payload.name,\n )\n )\n throw new RangeError(\n `Duplicate subcommand name: ${String(payload.name)}.`,\n );\n if (payload.type !== ApplicationCommandOptionType.Subcommand)\n throw new TypeError(\n \"Subcommand group children must be subcommands.\",\n );\n options.push(payload);\n this.data.options = options;\n return this;\n }\n}\nfunction validateName(value: string, field: string): void {\n if (!/^[\\p{L}\\p{N}_-]{1,32}$/u.test(value) || value !== value.toLowerCase())\n throw new RangeError(\n `${field} must contain 1-32 lowercase letters, numbers, underscores, or hyphens.`,\n );\n}\nfunction validateText(value: string, field: string, max: number): void {\n if (typeof value !== \"string\" || !value.trim() || value.length > max)\n throw new RangeError(`${field} must contain 1-${max} characters.`);\n}\nfunction validateIntegerRange(\n value: number,\n minimum: number,\n maximum: number,\n field: string,\n): void {\n if (!Number.isInteger(value) || value < minimum || value > maximum)\n throw new RangeError(\n `${field} must be an integer between ${minimum} and ${maximum}.`,\n );\n}\nfunction validateNumberRange(\n value: number,\n minimum: number,\n maximum: number,\n field: string,\n integerOnly = true,\n): void {\n if (\n !Number.isFinite(value) ||\n (integerOnly && !Number.isInteger(value)) ||\n value < minimum ||\n value > maximum\n )\n throw new RangeError(\n `${field} must be ${integerOnly ? \"an integer\" : \"a number\"} between ${minimum} and ${maximum}.`,\n );\n}\n\n// ─── Context Menu Builders ────────────────────────────────────────────────────\n\n/** Builder for application commands that appear in right-click context menus.\n * Discord.js-familiar: `new ContextMenuCommandBuilder().setName(\"x\").setType(2)`. */\nexport class ContextMenuCommandBuilder {\n protected readonly data: Record<string, unknown>;\n public constructor(type: 2 | 3 = 2) {\n this.data = { type };\n }\n /** Sets the command type: 2 = USER, 3 = MESSAGE. @throws {RangeError} For any other type. */\n public setType(type: 2 | 3): this {\n if (type !== 2 && type !== 3)\n throw new RangeError(\"Context menu command type must be 2 or 3.\");\n this.data.type = type;\n return this;\n }\n /** Sets the command name (shown in the right-click menu).\n * Unlike CHAT_INPUT commands, USER (type 2) and MESSAGE (type 3) context-menu\n * command names may contain uppercase letters and spaces, so no lowercase/charset\n * validation is applied here — only Discord's 1-32 length limit and a non-empty\n * (non-whitespace) requirement are enforced.\n * @param name Display name; 1-32 characters, mixed case and spaces allowed.\n * @throws {RangeError} If the name is empty/whitespace-only or exceeds 32 characters.\n */\n public setName(name: string): this {\n if (\n typeof name !== \"string\" ||\n name.trim().length < 1 ||\n name.length > 32\n )\n throw new RangeError(\"Command name must contain 1-32 characters.\");\n this.data.name = name;\n return this;\n }\n /** Sets default member permissions required to see this command. */\n public setDefaultMemberPermissions(\n permissions: bigint | number | string | null,\n ): this {\n this.data.default_member_permissions =\n permissions === null ? null : BigInt(permissions).toString();\n return this;\n }\n /** Sets whether the command is available in direct messages. */\n public setDMPermission(enabled: boolean): this {\n this.data.dm_permission = enabled;\n return this;\n }\n /** Sets command integration types. */\n public setIntegrationTypes(...types: number[]): this {\n this.data.integration_types = [...types];\n return this;\n }\n /** Serializes the command payload for the Discord API. */\n public toJSON(): Record<string, unknown> {\n return structuredClone(this.data);\n }\n}\n\n/** Builds a User context menu command (appears when right-clicking a user, type 2).\n * @example\n * new UserCommandBuilder().setName(\"View Profile\").toJSON()\n */\nexport class UserCommandBuilder extends ContextMenuCommandBuilder {\n public constructor() {\n super(2);\n }\n}\n\n/** Builds a Message context menu command (appears when right-clicking a message, type 3).\n * @example\n * new MessageCommandBuilder().setName(\"Translate Message\").toJSON()\n */\nexport class MessageCommandBuilder extends ContextMenuCommandBuilder {\n public constructor() {\n super(3);\n }\n}\n",
|
|
10
|
+
"import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\n\nexport interface AttachmentData {\n name: string;\n description?: string;\n file: Uint8Array | ArrayBuffer | Blob | Buffer | string;\n}\n\n/** Builder for message attachments and file uploads. */\nexport class AttachmentBuilder {\n public name: string;\n public description?: string;\n public file: Uint8Array | ArrayBuffer | Blob | Buffer | string;\n\n public constructor(\n file: Uint8Array | ArrayBuffer | Blob | Buffer | string,\n data?: Partial<Omit<AttachmentData, \"file\">> | string,\n ) {\n this.file = file;\n if (typeof data === \"string\") {\n this.name = data;\n } else {\n this.name =\n data?.name ??\n (typeof file === \"string\" ? basename(file) : \"file.bin\");\n this.description = data?.description;\n }\n }\n\n /** Sets the attachment filename. */\n public setName(name: string): this {\n this.name = name;\n return this;\n }\n\n /** Sets the attachment description / alt text. */\n public setDescription(description: string): this {\n this.description = description;\n return this;\n }\n\n /** Sets the file contents. */\n public setFile(\n file: Uint8Array | ArrayBuffer | Blob | Buffer | string,\n ): this {\n this.file = file;\n return this;\n }\n\n /** Resolves the attachment payload to a binary Uint8Array. */\n public async toBuffer(): Promise<Uint8Array> {\n if (typeof this.file === \"string\") {\n const buffer = await readFile(this.file);\n return new Uint8Array(buffer);\n }\n if (this.file instanceof Uint8Array) return this.file;\n if (this.file instanceof ArrayBuffer) return new Uint8Array(this.file);\n if (this.file instanceof Blob) {\n const buf = await this.file.arrayBuffer();\n return new Uint8Array(buf);\n }\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(this.file)) {\n return new Uint8Array(this.file);\n }\n throw new TypeError(\n \"Attachment file must be a supported binary value or file path.\",\n );\n }\n}\n"
|
|
10
11
|
],
|
|
11
|
-
"mappings": "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",
|
|
12
|
-
"debugId": "
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "91BF5BFA3419A2E364756E2164756E21",
|
|
13
14
|
"names": []
|
|
14
15
|
}
|