lunibee 0.3.3 → 0.4.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/README.md +1 -1
- package/dist/builders/commands.d.ts +1 -1
- package/dist/builders/components.d.ts +9 -11
- package/dist/builders/embed.d.ts +1 -1
- package/dist/builders/index.d.ts +1 -1
- package/dist/builders/index.js +87 -1298
- package/dist/builders/index.js.map +3 -11
- package/dist/chunks/index-0wn81eng.js +2492 -0
- package/dist/chunks/index-0wn81eng.js.map +17 -0
- package/dist/chunks/index-2en489j6.js +40 -0
- package/dist/chunks/index-2en489j6.js.map +10 -0
- package/dist/chunks/index-3hyps48a.js +203 -0
- package/dist/chunks/index-3hyps48a.js.map +11 -0
- package/dist/chunks/index-57c5n3ms.js +2274 -0
- package/dist/chunks/index-57c5n3ms.js.map +19 -0
- package/dist/chunks/index-5yx92e36.js +1170 -0
- package/dist/chunks/index-5yx92e36.js.map +14 -0
- package/dist/chunks/index-690bp093.js +95 -0
- package/dist/chunks/index-690bp093.js.map +10 -0
- package/dist/chunks/index-7fp2hvmg.js +2155 -0
- package/dist/chunks/index-7fp2hvmg.js.map +24 -0
- package/dist/chunks/index-cnmsajvk.js +1119 -0
- package/dist/chunks/index-cnmsajvk.js.map +12 -0
- package/dist/chunks/index-fdvgk2sw.js +1310 -0
- package/dist/chunks/index-fdvgk2sw.js.map +21 -0
- package/dist/chunks/index-gyvps8b9.js +214 -0
- package/dist/chunks/index-gyvps8b9.js.map +12 -0
- package/dist/chunks/index-jzg4bh99.js +1533 -0
- package/dist/chunks/index-jzg4bh99.js.map +21 -0
- package/dist/chunks/index-mgw2yvrm.js +3547 -0
- package/dist/chunks/index-mgw2yvrm.js.map +25 -0
- package/dist/chunks/index-yh76b55h.js +3449 -0
- package/dist/chunks/index-yh76b55h.js.map +29 -0
- package/dist/collection/index.js +9 -1118
- package/dist/collection/index.js.map +3 -6
- package/dist/core/api.d.ts +3 -3
- package/dist/core/channel-create.d.ts +2 -2
- package/dist/core/commands.d.ts +3 -3
- package/dist/core/events.d.ts +4 -4
- package/dist/core/handles.d.ts +4 -4
- package/dist/core/index.d.ts +25 -20
- package/dist/core/index.js +68 -10130
- package/dist/core/index.js.map +3 -65
- package/dist/core/permissions.d.ts +1 -1
- package/dist/core/redis-cache.d.ts +1 -1
- package/dist/formatters/index.js +41 -110
- package/dist/formatters/index.js.map +3 -4
- package/dist/handlers/index.js +5 -37
- package/dist/handlers/index.js.map +3 -4
- package/dist/index.d.ts +21 -21
- package/dist/index.js +641 -16325
- package/dist/index.js.map +3 -92
- package/dist/managers/advanced.d.ts +3 -3
- package/dist/managers/application.d.ts +2 -2
- package/dist/managers/base.d.ts +1 -1
- package/dist/managers/emoji.d.ts +2 -2
- package/dist/managers/guild-resources.d.ts +6 -6
- package/dist/managers/guild.d.ts +3 -3
- package/dist/managers/index.d.ts +4 -8
- package/dist/managers/index.js +51 -4060
- package/dist/managers/index.js.map +3 -29
- package/dist/managers/member.d.ts +2 -2
- package/dist/managers/message.d.ts +14 -6
- package/dist/managers/role.d.ts +2 -2
- package/dist/managers/thread.d.ts +3 -3
- package/dist/managers/user.d.ts +7 -4
- package/dist/rest/index.d.ts +10 -35
- package/dist/rest/index.js +57 -2184
- package/dist/rest/index.js.map +3 -18
- package/dist/rest/limiter.d.ts +9 -1
- package/dist/rest/webhook.d.ts +2 -8
- package/dist/sharding/bus.d.ts +2 -2
- package/dist/sharding/cluster.d.ts +45 -5
- package/dist/sharding/context.d.ts +45 -3
- package/dist/sharding/gateway-bot.d.ts +2 -1
- package/dist/sharding/health.d.ts +1 -1
- package/dist/sharding/identify.d.ts +12 -0
- package/dist/sharding/index.d.ts +44 -11
- package/dist/sharding/index.js +60 -4620
- package/dist/sharding/index.js.map +3 -33
- package/dist/sharding/supervisor.d.ts +4 -2
- package/dist/structures/audit-log.d.ts +1 -1
- package/dist/structures/base.d.ts +6 -6
- package/dist/structures/channels.d.ts +1 -1
- package/dist/structures/embed.d.ts +1 -1
- package/dist/structures/index.d.ts +14 -14
- package/dist/structures/index.js +109 -2382
- package/dist/structures/index.js.map +3 -16
- package/dist/structures/interactions.d.ts +13 -9
- package/dist/structures/options.d.ts +1 -1
- package/dist/structures/permissions.d.ts +2 -2
- package/dist/structures/resources.d.ts +10 -10
- package/dist/structures/sticker.d.ts +1 -1
- package/dist/types/gateway.d.ts +2 -79
- package/dist/types/index.d.ts +0 -6
- package/dist/types/index.js +41 -272
- package/dist/types/index.js.map +3 -6
- package/dist/utils/index.js +23 -209
- package/dist/utils/index.js.map +3 -5
- package/dist/voice/connection.d.ts +200 -0
- package/dist/voice/crypto.d.ts +50 -0
- package/dist/voice/dave.d.ts +85 -0
- package/dist/voice/effects.d.ts +31 -0
- package/dist/voice/emitter.d.ts +14 -0
- package/dist/voice/gateway.d.ts +59 -0
- package/dist/voice/index.d.ts +25 -228
- package/dist/voice/index.js +111 -442
- package/dist/voice/index.js.map +3 -4
- package/dist/voice/libopus.d.ts +88 -0
- package/dist/voice/networking.d.ts +80 -0
- package/dist/voice/ogg.d.ts +24 -0
- package/dist/voice/opus.d.ts +18 -0
- package/dist/voice/player.d.ts +79 -0
- package/dist/voice/protocol.d.ts +76 -0
- package/dist/voice/receiver.d.ts +59 -0
- package/dist/voice/resource.d.ts +102 -0
- package/dist/voice/udp.d.ts +40 -0
- package/dist/ws/close-codes.d.ts +1 -1
- package/dist/ws/index.d.ts +25 -4
- package/dist/ws/index.js +47 -1336
- package/dist/ws/index.js.map +3 -17
- package/dist/ws/protocol.d.ts +1 -1
- package/dist/ws/send-budget.d.ts +0 -2
- package/dist/ws/state.d.ts +0 -10
- package/package.json +19 -16
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../packages/structures/src/base.ts", "../packages/structures/src/permissions.ts", "../packages/structures/src/resources.ts", "../packages/structures/src/channels.ts", "../packages/structures/src/options.ts", "../packages/structures/src/interactions.ts", "../packages/structures/src/embed.ts", "../packages/structures/src/audit-log.ts", "../packages/structures/src/sticker.ts", "../packages/structures/src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n channelKindOf,\n type ChannelKind,\n type MessageCreateOptions,\n type MessageEditOptions,\n type UnknownChannelKind,\n} from \"@lunibee/types\";\nimport type { ChannelOfKind } from \"./channels.js\";\n\n/** Common Discord snowflake-backed structure. */\nexport class BaseStructure {\n public readonly id: string;\n public constructor(id: string) {\n if (!/^\\d{1,20}$/.test(id))\n throw new TypeError(\n \"A Discord structure requires a valid snowflake ID.\",\n );\n this.id = id;\n }\n /** Returns the snowflake ID as a string. */\n public toString(): string {\n return this.id;\n }\n /** Milliseconds since the Unix epoch at which this snowflake was created. */\n public get createdTimestamp(): number {\n return Number((BigInt(this.id) >> 22n) + 1420070400000n);\n }\n /** Returns the timestamp this snowflake was created at. */\n public get createdAt(): Date {\n return new Date(this.createdTimestamp);\n }\n}\n\n/** What a structure uses to act on Discord (send, edit, fetch, compute permissions). `Client` supplies it; tests can supply their own. */\nexport interface ResourceContext {\n sendMessage(\n channelId: string,\n options: MessageCreateOptions,\n ): Promise<import(\"./index.js\").Message>;\n editMessage(\n channelId: string,\n messageId: string,\n options: MessageEditOptions,\n ): Promise<import(\"./index.js\").Message>;\n deleteMessage(\n channelId: string,\n messageId: string,\n reason?: string,\n ): Promise<void>;\n crosspostMessage(\n channelId: string,\n messageId: string,\n ): Promise<import(\"./index.js\").Message>;\n editChannel?(\n channelId: string,\n options: Record<string, unknown>,\n ): Promise<import(\"./base.js\").Channel>;\n deleteChannel?(channelId: string, reason?: string): Promise<void>;\n addReaction?(\n channelId: string,\n messageId: string,\n emoji: string,\n ): Promise<void>;\n removeOwnReaction?(\n channelId: string,\n messageId: string,\n emoji: string,\n ): Promise<void>;\n removeReaction?(\n channelId: string,\n messageId: string,\n emoji: string,\n userId: string,\n ): Promise<void>;\n removeAllReactions?(channelId: string, messageId: string): Promise<void>;\n pinMessage?(\n channelId: string,\n messageId: string,\n reason?: string,\n ): Promise<void>;\n unpinMessage?(\n channelId: string,\n messageId: string,\n reason?: string,\n ): Promise<void>;\n /**\n * A member's permissions from cached state: guild-level, or channel-level\n * (with overwrites) when a channel ID is given. Null when the guild (or\n * channel) is not cached.\n */\n /** The cached channel, when the client has a complete one (not a partial placeholder). */\n cachedChannel?(channelId: string): Channel | undefined;\n memberPermissions?(\n guildId: string,\n memberId: string,\n roleIds: readonly string[],\n channelId?: string,\n timedOutUntil?: Date | null,\n ): import(\"./permissions.js\").PermissionSet | null;\n kickMember?(\n guildId: string,\n userId: string,\n reason?: string,\n ): Promise<void>;\n banMember?(\n guildId: string,\n userId: string,\n options?: { reason?: string; deleteMessageSeconds?: number },\n ): Promise<void>;\n editMember?(\n guildId: string,\n userId: string,\n options: Record<string, unknown>,\n reason?: string,\n ): Promise<import(\"./resources.js\").GuildMember>;\n addMemberRole?(\n guildId: string,\n userId: string,\n roleId: string,\n reason?: string,\n ): Promise<void>;\n removeMemberRole?(\n guildId: string,\n userId: string,\n roleId: string,\n reason?: string,\n ): Promise<void>;\n /** Collects the client's interactions (a `Collector` over `interactionCreate`). Used by message and interaction collectors. */\n collectInteractions?(\n options: import(\"@lunibee/core\").CollectorOptions<\n import(\"./interactions.js\").Interaction\n >,\n ): import(\"@lunibee/core\").Collector<\n string,\n import(\"./interactions.js\").Interaction\n >;\n editPermissionOverwrite?(\n channelId: string,\n targetId: string,\n changes: PermissionOverwriteChanges,\n options?: { type?: 0 | 1; reason?: string },\n ): Promise<void>;\n}\n\n/**\n * Permissions to change on one overwrite: `true` allows, `false` denies,\n * `null` goes back to inheriting. Permissions not named keep their state.\n */\nexport type PermissionOverwriteChanges = Partial<\n Record<import(\"./permissions.js\").PermissionName, boolean | null>\n>;\n\n// ─── CDN helpers ──────────────────────────────────────────────────────────────\n\nexport const CDN_BASE = \"https://cdn.discordapp.com\";\n\n/** Options for CDN image URLs. */\nexport interface ImageURLOptions {\n extension?: \"png\" | \"jpg\" | \"webp\" | \"gif\" | \"jpeg\";\n size?: 16 | 32 | 64 | 128 | 256 | 512 | 1024 | 2048 | 4096;\n forceStatic?: boolean;\n}\n\n/** Builds a Discord CDN asset URL from a directory path and asset hash, applying\n * animated-hash (`a_`) gif detection, extension and size options. Shared by all\n * hash-backed asset accessors (user/member/role/webhook) to avoid duplicating the logic.\n * @param path CDN directory path, e.g. `/role-icons/{id}`. @param hash Asset hash. @param options Image URL options. */\nexport function cdnURL(\n path: string,\n hash: string,\n options: ImageURLOptions = {},\n): string {\n const isAnimated = hash.startsWith(\"a_\") && !options.forceStatic;\n const ext = options.extension ?? (isAnimated ? \"gif\" : \"png\");\n const size = options.size ? `?size=${options.size}` : \"\";\n // Encoded, so a hash holding `/`, `?` or `#` cannot change the CDN path.\n return `${CDN_BASE}${path}/${encodeURIComponent(hash)}.${ext}${size}`;\n}\n\n// ─── User ─────────────────────────────────────────────────────────────────────\n\nexport class User extends BaseStructure {\n public username: string;\n public globalName: string | null;\n public avatar: string | null;\n public bot: boolean;\n public system: boolean;\n public flags: number;\n public discriminator: string | null;\n public constructor(data: import(\"@lunibee/types\").UserData) {\n super(data.id);\n if (!data.username)\n throw new TypeError(\"A Discord user requires a username.\");\n this.username = data.username;\n this.globalName = data.global_name ?? null;\n this.avatar = data.avatar ?? null;\n this.bot = data.bot ?? false;\n this.system = data.system ?? false;\n this.flags = data.public_flags ?? 0;\n this.discriminator =\n data.discriminator && data.discriminator !== \"0\"\n ? data.discriminator\n : null;\n }\n /** Effective display name — global name, falling back to username. */\n public get displayName(): string {\n return this.globalName ?? this.username;\n }\n /** Returns the user's avatar URL, or null if they have no avatar. */\n public avatarURL(options: ImageURLOptions = {}): string | null {\n if (!this.avatar) return null;\n return cdnURL(`/avatars/${this.id}`, this.avatar, options);\n }\n /** Returns the default avatar URL based on the user's discriminator/snowflake. */\n public defaultAvatarURL(): string {\n const index = this.discriminator\n ? Number(this.discriminator) % 5\n : Number((BigInt(this.id) >> 22n) % 6n);\n return `${CDN_BASE}/embed/avatars/${index}.png`;\n }\n /** Returns the avatar URL if available, falling back to the default avatar URL. */\n public displayAvatarURL(options: ImageURLOptions = {}): string {\n return this.avatarURL(options) ?? this.defaultAvatarURL();\n }\n /** Returns the Discord mention string. Used automatically in template literals. */\n public override toString(): string {\n return `<@${this.id}>`;\n }\n}\n\n// ─── Channel ──────────────────────────────────────────────────────────────────\n\nexport class Channel extends BaseStructure {\n public type: number;\n public name?: string | null;\n public guildId?: string;\n public topic?: string | null;\n public parentId?: string | null;\n public nsfw?: boolean;\n public rateLimitPerUser?: number;\n public position?: number;\n /** Role and member permission overwrites (empty for DMs and when not provided). */\n public permissionOverwrites: import(\"@lunibee/types\").APIOverwrite[];\n /**\n * A placeholder built from a message's `channel_id`, not from channel\n * data: its `type`, `name`, `parentId` and `permissionOverwrites` are not\n * the real channel's, so nothing may decide access from them.\n */\n public partial: boolean;\n readonly #context?: ResourceContext;\n\n /** Creates a channel structure from Discord channel data. `options.partial` marks a placeholder. */\n public constructor(\n data: import(\"@lunibee/types\").APIChannel,\n context?: ResourceContext,\n options?: { partial?: boolean },\n ) {\n super(data.id);\n if (!Number.isInteger(data.type) || data.type < 0)\n throw new RangeError(\n \"A Discord channel requires a valid channel type.\",\n );\n this.type = data.type;\n this.name = data.name;\n this.guildId = data.guild_id;\n this.topic = data.topic;\n this.parentId = data.parent_id;\n this.nsfw = data.nsfw;\n this.rateLimitPerUser = data.rate_limit_per_user;\n this.position = data.position;\n this.permissionOverwrites = (data.permission_overwrites ?? []).map(\n (overwrite) => ({ ...overwrite }),\n );\n this.partial = options?.partial ?? false;\n this.#context = context;\n }\n\n /** Sends a message to this channel. @param options Message payload. @returns The created message. @throws {Error} If the channel is not attached to a client. */\n public send(\n options: MessageCreateOptions,\n ): Promise<import(\"./index.js\").Message> {\n if (!this.#context)\n throw new Error(\"This channel is not attached to a client.\");\n return this.#context.sendMessage(this.id, options);\n }\n\n /** Edits this channel. @param options Channel fields to change. @returns The updated channel. @throws {Error} If the channel is not attached to a client. */\n public edit(options: Record<string, unknown>): Promise<Channel> {\n if (!this.#context?.editChannel)\n throw new Error(\"This channel is not attached to a client.\");\n return this.#context.editChannel(this.id, options);\n }\n\n /** Changes only this channel's name. @param name New channel name. @returns The updated channel. @throws {TypeError} If the name is empty. @throws {Error} If the channel is not attached to a client. */\n public editName(name: string): Promise<Channel> {\n if (!name.trim()) throw new TypeError(\"Channel name cannot be empty.\");\n return this.edit({ name });\n }\n\n /** Changes only this channel's topic. @param topic New topic, or null to clear it. @returns The updated channel. @throws {Error} If the channel is not attached to a client. */\n public editTopic(topic: string | null): Promise<Channel> {\n return this.edit({ topic });\n }\n\n /** Moves this channel to another parent category. @param parentId Parent category ID, or null to remove the parent. @returns The updated channel. @throws {Error} If the channel is not attached to a client. */\n /**\n * Changes some permissions of one overwrite and keeps the rest: `true`\n * allows, `false` denies, `null` resets to inherited.\n * @param targetId Role or member ID. @param changes Permissions to change.\n * @param options `type` (0 role, 1 member) when the overwrite does not exist yet; audit-log `reason`.\n * @example channel.editPermissionOverwrite(userId, { ViewChannel: true, SendMessages: false }, { type: 1 })\n */\n public editPermissionOverwrite(\n targetId: string,\n changes: PermissionOverwriteChanges,\n options?: { type?: 0 | 1; reason?: string },\n ): Promise<void> {\n if (!this.#context?.editPermissionOverwrite)\n throw new Error(\"This channel is not attached to a client.\");\n return this.#context.editPermissionOverwrite(\n this.id,\n targetId,\n changes,\n options,\n );\n }\n\n public editParent(parentId: string | null): Promise<Channel> {\n return this.edit({ parent_id: parentId });\n }\n\n /** Deletes this channel. @param reason Audit-log reason. @returns A promise fulfilled when Discord confirms deletion. @throws {Error} If the channel is not attached to a client. */\n public delete(reason?: string): Promise<void> {\n if (!this.#context?.deleteChannel)\n throw new Error(\"This channel is not attached to a client.\");\n return this.#context.deleteChannel(this.id, reason);\n }\n\n /** Updates this channel using the same resource operation as edit. @param options Channel fields to change. @returns The updated channel. @throws {Error} If the channel is not attached to a client. */\n public update(options: Record<string, unknown>): Promise<Channel> {\n return this.edit(options);\n }\n\n /** What kind of channel this is: `\"text\"`, `\"voice\"`, `\"thread\"`, `\"forum\"`… (`\"unknown\"` for a type this version does not know). */\n public get kind(): ChannelKind | UnknownChannelKind {\n return channelKindOf(this.type);\n }\n\n /**\n * Whether this channel is one of `kinds`, narrowing its type to match.\n * @example if (channel.is(\"text\", \"announcement\")) await channel.send({ content: \"hi\" });\n */\n public is<K extends ChannelKind | UnknownChannelKind>(\n ...kinds: K[]\n ): this is ChannelOfKind<K> {\n return (kinds as string[]).includes(this.kind);\n }\n\n /**\n * Returns this channel typed as one of `kinds`.\n * @throws {TypeError} If it is a different kind.\n */\n public as<K extends ChannelKind | UnknownChannelKind>(\n ...kinds: K[]\n ): ChannelOfKind<K> {\n if (!this.is(...kinds))\n throw new TypeError(\n `Channel ${this.id} is a ${this.kind} channel, not ${kinds.join(\" or \")}.`,\n );\n return this;\n }\n\n /** Whether this is a thread (announcement, public or private). */\n public isThread(): boolean {\n return this.type === 10 || this.type === 11 || this.type === 12;\n }\n\n /** Whether messages can be sent in this channel (text, DM, announcement, voice, stage, threads). */\n public isTextBased(): boolean {\n return [0, 1, 2, 3, 5, 10, 11, 12, 13].includes(this.type);\n }\n\n /** Whether this is a voice or stage channel. */\n public isVoiceBased(): boolean {\n return this.type === 2 || this.type === 13;\n }\n\n /** Whether this is a direct-message channel (DM or group DM). */\n public isDMBased(): boolean {\n return this.type === 1 || this.type === 3;\n }\n\n /** Returns the Discord channel mention string. Used automatically in template literals. */\n public override toString(): string {\n return `<#${this.id}>`;\n }\n}\n\n// ─── Guild ────────────────────────────────────────────────────────────────────\n\nexport class Guild extends BaseStructure {\n public name: string;\n public icon: string | null;\n public splash: string | null;\n public banner: string | null;\n public description: string | null;\n public preferredLocale: string;\n public ownerId?: string;\n public features: string[];\n public verificationLevel: number;\n public premiumTier: number;\n public premiumSubscriptionCount: number;\n public memberCount?: number;\n public approximateMemberCount?: number;\n public approximatePresenceCount?: number;\n public vanityUrlCode: string | null;\n public nsfwLevel: number;\n public discoverySplash: string | null;\n /** ID of the rules channel for Community guilds. */\n public rulesChannelId: string | null;\n /** ID of the system messages channel. */\n public systemChannelId: string | null;\n /** Bitfield of system channel flags. */\n public systemChannelFlags: number;\n /** Maximum number of members the guild can have. */\n public maxMembers: number;\n /** Required MFA level for administrators. */\n public mfaLevel: number;\n /** Explicit content filter level. */\n public explicitContentFilter: number;\n /** Default notification level for new members. */\n public defaultMessageNotifications: number;\n /** AFK voice channel, or null. */\n public afkChannelId: string | null;\n /** Seconds before a silent member is moved to the AFK channel. */\n public afkTimeout?: number;\n /** Whether the server widget is on. */\n public widgetEnabled: boolean;\n /** Channel the widget invites to, or null. */\n public widgetChannelId: string | null;\n /** Application that created the guild, if a bot did. */\n public applicationId: string | null;\n /** Channel for Discord's community updates, or null. */\n public publicUpdatesChannelId: string | null;\n /** Channel for safety alerts, or null. */\n public safetyAlertsChannelId: string | null;\n /** Maximum presences (null for the default limit). */\n public maxPresences: number | null;\n /** Maximum users in a video channel. */\n public maxVideoChannelUsers?: number;\n /** Whether the boost progress bar shows. */\n public premiumProgressBarEnabled: boolean;\n\n public constructor(data: import(\"@lunibee/types\").APIGuild) {\n super(data.id);\n if (!data.name) throw new TypeError(\"A Discord guild requires a name.\");\n this.name = data.name;\n this.icon = data.icon ?? null;\n this.splash = data.splash ?? null;\n this.banner = data.banner ?? null;\n this.description = data.description ?? null;\n this.preferredLocale = data.preferred_locale ?? \"en-US\";\n this.ownerId = data.owner_id;\n this.features = data.features ?? [];\n this.verificationLevel = data.verification_level ?? 0;\n this.premiumTier = data.premium_tier ?? 0;\n this.premiumSubscriptionCount = data.premium_subscription_count ?? 0;\n this.memberCount = data.member_count ?? data.approximate_member_count;\n this.approximateMemberCount = data.approximate_member_count;\n this.approximatePresenceCount = data.approximate_presence_count;\n this.vanityUrlCode = data.vanity_url_code ?? null;\n this.nsfwLevel = data.nsfw_level ?? 0;\n this.discoverySplash = data.discovery_splash ?? null;\n this.rulesChannelId = data.rules_channel_id ?? null;\n this.systemChannelId = data.system_channel_id ?? null;\n this.systemChannelFlags = data.system_channel_flags ?? 0;\n this.maxMembers = data.max_members ?? 0;\n this.mfaLevel = data.mfa_level ?? 0;\n this.explicitContentFilter = data.explicit_content_filter ?? 0;\n this.defaultMessageNotifications =\n data.default_message_notifications ?? 0;\n this.afkChannelId = data.afk_channel_id ?? null;\n this.afkTimeout = data.afk_timeout;\n this.widgetEnabled = data.widget_enabled ?? false;\n this.widgetChannelId = data.widget_channel_id ?? null;\n this.applicationId = data.application_id ?? null;\n this.publicUpdatesChannelId = data.public_updates_channel_id ?? null;\n this.safetyAlertsChannelId = data.safety_alerts_channel_id ?? null;\n this.maxPresences = data.max_presences ?? null;\n this.maxVideoChannelUsers = data.max_video_channel_users;\n this.premiumProgressBarEnabled =\n data.premium_progress_bar_enabled ?? false;\n }\n\n /** Returns the guild icon URL, or null if no icon is set. */\n public iconURL(options: ImageURLOptions = {}): string | null {\n if (!this.icon) return null;\n return cdnURL(`/icons/${this.id}`, this.icon, options);\n }\n\n /** Returns the guild splash URL, or null if none. */\n public splashURL(options: ImageURLOptions = {}): string | null {\n if (!this.splash) return null;\n return cdnURL(`/splashes/${this.id}`, this.splash, options);\n }\n\n /** Returns the guild banner URL, or null if none. */\n public bannerURL(options: ImageURLOptions = {}): string | null {\n if (!this.banner) return null;\n return cdnURL(`/banners/${this.id}`, this.banner, options);\n }\n\n /** Returns the guild discovery splash URL, or null if none. */\n public discoverySplashURL(options: ImageURLOptions = {}): string | null {\n if (!this.discoverySplash) return null;\n return cdnURL(\n `/discovery-splashes/${this.id}`,\n this.discoverySplash,\n options,\n );\n }\n\n /** Returns a widget image URL for the guild.\n * @param style Widget style: shield (default), banner1, banner2, banner3, banner4.\n */\n public widgetImageURL(\n style:\n \"shield\" | \"banner1\" | \"banner2\" | \"banner3\" | \"banner4\" = \"shield\",\n ): string {\n return `https://discord.com/api/guilds/${this.id}/widget.png?style=${style}`;\n }\n\n /** Whether the guild has a given feature flag. @param feature Feature string, e.g. \"COMMUNITY\". */\n public hasFeature(feature: string): boolean {\n return this.features.includes(feature);\n }\n\n /** Whether the guild is a Community server. */\n public get isCommunity(): boolean {\n return this.hasFeature(\"COMMUNITY\");\n }\n\n /** Whether the guild is an official Discord Partner. */\n public get isPartnered(): boolean {\n return this.hasFeature(\"PARTNERED\");\n }\n\n /** Whether the guild is verified by Discord. */\n public get isVerified(): boolean {\n return this.hasFeature(\"VERIFIED\");\n }\n\n /** Whether the guild has any active boost subscriptions. */\n public get isBoosted(): boolean {\n return this.premiumSubscriptionCount > 0;\n }\n\n /** Alias for premiumTier — the guild's current Nitro boost level (0–3). */\n public get boostLevel(): number {\n return this.premiumTier;\n }\n\n /** Whether the guild has a vanity URL. */\n public get hasVanityUrl(): boolean {\n return this.vanityUrlCode !== null;\n }\n\n /** Returns the guild's vanity invite URL, or null if none. */\n public get vanityURL(): string | null {\n return this.vanityUrlCode\n ? `https://discord.gg/${this.vanityUrlCode}`\n : null;\n }\n\n /** Returns a human-readable string representation. */\n public override toString(): string {\n return this.name;\n }\n}\n",
|
|
6
|
+
"/** Permission overwrite target types. */\nexport enum PermissionOverwriteEnum {\n Role = 0,\n Member = 1,\n}\n\n/** Lunibee idiomatic camelCase permission bitflags. */\nexport const Permission = {\n createInstantInvite: 1n << 0n,\n kickMembers: 1n << 1n,\n banMembers: 1n << 2n,\n administrator: 1n << 3n,\n manageChannels: 1n << 4n,\n manageGuild: 1n << 5n,\n addReactions: 1n << 6n,\n viewAuditLog: 1n << 7n,\n prioritySpeaker: 1n << 8n,\n stream: 1n << 9n,\n viewChannel: 1n << 10n,\n sendMessages: 1n << 11n,\n sendTTSMessages: 1n << 12n,\n manageMessages: 1n << 13n,\n embedLinks: 1n << 14n,\n attachFiles: 1n << 15n,\n readMessageHistory: 1n << 16n,\n mentionEveryone: 1n << 17n,\n useExternalEmojis: 1n << 18n,\n viewGuildInsights: 1n << 19n,\n connect: 1n << 20n,\n speak: 1n << 21n,\n muteMembers: 1n << 22n,\n deafenMembers: 1n << 23n,\n moveMembers: 1n << 24n,\n useVAD: 1n << 25n,\n changeNickname: 1n << 26n,\n manageNicknames: 1n << 27n,\n manageRoles: 1n << 28n,\n manageWebhooks: 1n << 29n,\n manageGuildExpressions: 1n << 30n,\n useApplicationCommands: 1n << 31n,\n requestToSpeak: 1n << 32n,\n manageEvents: 1n << 33n,\n manageThreads: 1n << 34n,\n createPublicThreads: 1n << 35n,\n createPrivateThreads: 1n << 36n,\n useExternalStickers: 1n << 37n,\n sendMessagesInThreads: 1n << 38n,\n useEmbeddedActivities: 1n << 39n,\n moderateMembers: 1n << 40n,\n viewCreatorMonetizationAnalytics: 1n << 41n,\n useSoundboard: 1n << 42n,\n createGuildExpressions: 1n << 43n,\n createEvents: 1n << 44n,\n useExternalSounds: 1n << 45n,\n sendVoiceMessages: 1n << 46n,\n setVoiceChannelStatus: 1n << 48n,\n sendPolls: 1n << 49n,\n useExternalApps: 1n << 50n,\n pinMessages: 1n << 51n,\n bypassSlowmode: 1n << 52n,\n} as const;\n\n/** Canonical PascalCase permission constants. */\nexport const Permissions = {\n CreateInstantInvite: 1n << 0n,\n KickMembers: 1n << 1n,\n BanMembers: 1n << 2n,\n Administrator: 1n << 3n,\n ManageChannels: 1n << 4n,\n ManageGuild: 1n << 5n,\n AddReactions: 1n << 6n,\n ViewAuditLog: 1n << 7n,\n PrioritySpeaker: 1n << 8n,\n Stream: 1n << 9n,\n ViewChannel: 1n << 10n,\n SendMessages: 1n << 11n,\n SendTTSMessages: 1n << 12n,\n ManageMessages: 1n << 13n,\n EmbedLinks: 1n << 14n,\n AttachFiles: 1n << 15n,\n ReadMessageHistory: 1n << 16n,\n MentionEveryone: 1n << 17n,\n UseExternalEmojis: 1n << 18n,\n ViewGuildInsights: 1n << 19n,\n Connect: 1n << 20n,\n Speak: 1n << 21n,\n MuteMembers: 1n << 22n,\n DeafenMembers: 1n << 23n,\n MoveMembers: 1n << 24n,\n UseVAD: 1n << 25n,\n ChangeNickname: 1n << 26n,\n ManageNicknames: 1n << 27n,\n ManageRoles: 1n << 28n,\n ManageWebhooks: 1n << 29n,\n ManageGuildExpressions: 1n << 30n,\n UseApplicationCommands: 1n << 31n,\n RequestToSpeak: 1n << 32n,\n ManageEvents: 1n << 33n,\n ManageThreads: 1n << 34n,\n CreatePublicThreads: 1n << 35n,\n CreatePrivateThreads: 1n << 36n,\n UseExternalStickers: 1n << 37n,\n SendMessagesInThreads: 1n << 38n,\n UseEmbeddedActivities: 1n << 39n,\n ModerateMembers: 1n << 40n,\n ViewCreatorMonetizationAnalytics: 1n << 41n,\n UseSoundboard: 1n << 42n,\n CreateGuildExpressions: 1n << 43n,\n CreateEvents: 1n << 44n,\n UseExternalSounds: 1n << 45n,\n SendVoiceMessages: 1n << 46n,\n SetVoiceChannelStatus: 1n << 48n,\n SendPolls: 1n << 49n,\n UseExternalApps: 1n << 50n,\n PinMessages: 1n << 51n,\n BypassSlowmode: 1n << 52n,\n} as const;\n\n/**\n * Permission flag bits with **bigint** values matching Discord's permission bit\n * positions, so bitwise composition\n * (`Flags.A | Flags.B`) OR-s the bits instead of concatenating strings.\n *\n * The same object as {@link Permissions}, under another name. It is a\n * `const` object rather than a TS `enum` because enums cannot hold bigint\n * members; the same-named union type below preserves usage as a type.\n */\nexport const PermissionFlagsBits = Permissions;\n\n/** Union of {@link PermissionFlagsBits} values (all bigint). */\nexport type PermissionFlagsBits =\n (typeof PermissionFlagsBits)[keyof typeof PermissionFlagsBits];\n\n/** A permission flag name, such as `\"BanMembers\"`, accepted wherever a permission can be given by name. */\nexport type PermissionName =\n | keyof typeof Permission\n | keyof typeof Permissions\n | keyof typeof PermissionFlagsBits;\n\n/** Anything accepted as permissions: a bit, a name, a `PermissionSet`, or an array of these. */\nexport type PermissionResolvable =\n | bigint\n | number\n | string\n | PermissionName\n | PermissionFlagsBits\n | PermissionSet\n | PermissionResolvable[];\n\n/** Immutable permission bitfield with direct boolean getters. */\nexport class PermissionSet {\n /** Permission bitfield. */\n public readonly bitfield: bigint;\n\n /** Creates a permission set. @param value Initial permission bitfield or array of permissions. @throws {RangeError} If the value is negative. @throws {TypeError} If the value is not a valid integer. */\n public constructor(value: PermissionResolvable = 0n) {\n try {\n if (Array.isArray(value)) {\n let bit = 0n;\n for (const item of value) {\n bit |= this.#resolve(item);\n }\n this.bitfield = bit;\n } else if (value instanceof PermissionSet) {\n this.bitfield = value.bitfield;\n } else {\n const bitfield = this.#resolve(value);\n if (bitfield < 0n)\n throw new RangeError(\n \"Permission bitfield cannot be negative.\",\n );\n this.bitfield = bitfield;\n }\n } catch (error) {\n if (error instanceof RangeError) throw error;\n throw new TypeError(\n \"Permission bitfield must be a valid non-negative integer.\",\n { cause: error },\n );\n }\n }\n\n // Direct camelCase boolean getters for instant checks (e.g. member.permissions.kickMembers)\n public get createInstantInvite(): boolean {\n return (\n (this.bitfield & Permission.createInstantInvite) ===\n Permission.createInstantInvite\n );\n }\n public get kickMembers(): boolean {\n return (\n (this.bitfield & Permission.kickMembers) === Permission.kickMembers\n );\n }\n public get banMembers(): boolean {\n return (\n (this.bitfield & Permission.banMembers) === Permission.banMembers\n );\n }\n public get administrator(): boolean {\n return (\n (this.bitfield & Permission.administrator) ===\n Permission.administrator\n );\n }\n public get manageChannels(): boolean {\n return (\n (this.bitfield & Permission.manageChannels) ===\n Permission.manageChannels\n );\n }\n public get manageGuild(): boolean {\n return (\n (this.bitfield & Permission.manageGuild) === Permission.manageGuild\n );\n }\n public get addReactions(): boolean {\n return (\n (this.bitfield & Permission.addReactions) ===\n Permission.addReactions\n );\n }\n public get viewAuditLog(): boolean {\n return (\n (this.bitfield & Permission.viewAuditLog) ===\n Permission.viewAuditLog\n );\n }\n public get prioritySpeaker(): boolean {\n return (\n (this.bitfield & Permission.prioritySpeaker) ===\n Permission.prioritySpeaker\n );\n }\n public get stream(): boolean {\n return (this.bitfield & Permission.stream) === Permission.stream;\n }\n public get viewChannel(): boolean {\n return (\n (this.bitfield & Permission.viewChannel) === Permission.viewChannel\n );\n }\n public get sendMessages(): boolean {\n return (\n (this.bitfield & Permission.sendMessages) ===\n Permission.sendMessages\n );\n }\n public get sendTTSMessages(): boolean {\n return (\n (this.bitfield & Permission.sendTTSMessages) ===\n Permission.sendTTSMessages\n );\n }\n public get manageMessages(): boolean {\n return (\n (this.bitfield & Permission.manageMessages) ===\n Permission.manageMessages\n );\n }\n public get embedLinks(): boolean {\n return (\n (this.bitfield & Permission.embedLinks) === Permission.embedLinks\n );\n }\n public get attachFiles(): boolean {\n return (\n (this.bitfield & Permission.attachFiles) === Permission.attachFiles\n );\n }\n public get readMessageHistory(): boolean {\n return (\n (this.bitfield & Permission.readMessageHistory) ===\n Permission.readMessageHistory\n );\n }\n public get mentionEveryone(): boolean {\n return (\n (this.bitfield & Permission.mentionEveryone) ===\n Permission.mentionEveryone\n );\n }\n public get useExternalEmojis(): boolean {\n return (\n (this.bitfield & Permission.useExternalEmojis) ===\n Permission.useExternalEmojis\n );\n }\n public get viewGuildInsights(): boolean {\n return (\n (this.bitfield & Permission.viewGuildInsights) ===\n Permission.viewGuildInsights\n );\n }\n public get connect(): boolean {\n return (this.bitfield & Permission.connect) === Permission.connect;\n }\n public get speak(): boolean {\n return (this.bitfield & Permission.speak) === Permission.speak;\n }\n public get muteMembers(): boolean {\n return (\n (this.bitfield & Permission.muteMembers) === Permission.muteMembers\n );\n }\n public get deafenMembers(): boolean {\n return (\n (this.bitfield & Permission.deafenMembers) ===\n Permission.deafenMembers\n );\n }\n public get moveMembers(): boolean {\n return (\n (this.bitfield & Permission.moveMembers) === Permission.moveMembers\n );\n }\n public get useVAD(): boolean {\n return (this.bitfield & Permission.useVAD) === Permission.useVAD;\n }\n public get changeNickname(): boolean {\n return (\n (this.bitfield & Permission.changeNickname) ===\n Permission.changeNickname\n );\n }\n public get manageNicknames(): boolean {\n return (\n (this.bitfield & Permission.manageNicknames) ===\n Permission.manageNicknames\n );\n }\n public get manageRoles(): boolean {\n return (\n (this.bitfield & Permission.manageRoles) === Permission.manageRoles\n );\n }\n public get manageWebhooks(): boolean {\n return (\n (this.bitfield & Permission.manageWebhooks) ===\n Permission.manageWebhooks\n );\n }\n public get manageGuildExpressions(): boolean {\n return (\n (this.bitfield & Permission.manageGuildExpressions) ===\n Permission.manageGuildExpressions\n );\n }\n public get useApplicationCommands(): boolean {\n return (\n (this.bitfield & Permission.useApplicationCommands) ===\n Permission.useApplicationCommands\n );\n }\n public get requestToSpeak(): boolean {\n return (\n (this.bitfield & Permission.requestToSpeak) ===\n Permission.requestToSpeak\n );\n }\n public get manageEvents(): boolean {\n return (\n (this.bitfield & Permission.manageEvents) ===\n Permission.manageEvents\n );\n }\n public get manageThreads(): boolean {\n return (\n (this.bitfield & Permission.manageThreads) ===\n Permission.manageThreads\n );\n }\n public get createPublicThreads(): boolean {\n return (\n (this.bitfield & Permission.createPublicThreads) ===\n Permission.createPublicThreads\n );\n }\n public get createPrivateThreads(): boolean {\n return (\n (this.bitfield & Permission.createPrivateThreads) ===\n Permission.createPrivateThreads\n );\n }\n public get useExternalStickers(): boolean {\n return (\n (this.bitfield & Permission.useExternalStickers) ===\n Permission.useExternalStickers\n );\n }\n public get sendMessagesInThreads(): boolean {\n return (\n (this.bitfield & Permission.sendMessagesInThreads) ===\n Permission.sendMessagesInThreads\n );\n }\n public get useEmbeddedActivities(): boolean {\n return (\n (this.bitfield & Permission.useEmbeddedActivities) ===\n Permission.useEmbeddedActivities\n );\n }\n public get moderateMembers(): boolean {\n return (\n (this.bitfield & Permission.moderateMembers) ===\n Permission.moderateMembers\n );\n }\n public get viewCreatorMonetizationAnalytics(): boolean {\n return (\n (this.bitfield & Permission.viewCreatorMonetizationAnalytics) ===\n Permission.viewCreatorMonetizationAnalytics\n );\n }\n public get useSoundboard(): boolean {\n return (\n (this.bitfield & Permission.useSoundboard) ===\n Permission.useSoundboard\n );\n }\n public get createGuildExpressions(): boolean {\n return (\n (this.bitfield & Permission.createGuildExpressions) ===\n Permission.createGuildExpressions\n );\n }\n public get createEvents(): boolean {\n return (\n (this.bitfield & Permission.createEvents) ===\n Permission.createEvents\n );\n }\n public get useExternalSounds(): boolean {\n return (\n (this.bitfield & Permission.useExternalSounds) ===\n Permission.useExternalSounds\n );\n }\n public get sendVoiceMessages(): boolean {\n return (\n (this.bitfield & Permission.sendVoiceMessages) ===\n Permission.sendVoiceMessages\n );\n }\n public get sendPolls(): boolean {\n return (this.bitfield & Permission.sendPolls) === Permission.sendPolls;\n }\n public get useExternalApps(): boolean {\n return (\n (this.bitfield & Permission.useExternalApps) ===\n Permission.useExternalApps\n );\n }\n public get setVoiceChannelStatus(): boolean {\n return (\n (this.bitfield & Permission.setVoiceChannelStatus) ===\n Permission.setVoiceChannelStatus\n );\n }\n public get pinMessages(): boolean {\n return (\n (this.bitfield & Permission.pinMessages) === Permission.pinMessages\n );\n }\n public get bypassSlowmode(): boolean {\n return (\n (this.bitfield & Permission.bypassSlowmode) ===\n Permission.bypassSlowmode\n );\n }\n\n /** Checks whether all supplied permissions are present (AND). @param permissions Permission names or raw bits. @returns True when every requested permission is present. */\n public has(...permissions: PermissionResolvable[]): boolean {\n if (permissions.length === 1) {\n const p = permissions[0]!;\n const bit = typeof p === \"bigint\" ? p : this.#resolve(p);\n return (this.bitfield & bit) === bit;\n }\n for (let i = 0; i < permissions.length; i++) {\n const p = permissions[i]!;\n const bit = typeof p === \"bigint\" ? p : this.#resolve(p);\n if ((this.bitfield & bit) !== bit) return false;\n }\n return true;\n }\n\n /** Checks whether any supplied permission is present (OR). @param permissions Permission names or raw bits. @returns True when at least one requested permission is present. */\n public any(...permissions: PermissionResolvable[]): boolean {\n if (permissions.length === 1) {\n const p = permissions[0]!;\n const bit = typeof p === \"bigint\" ? p : this.#resolve(p);\n return (this.bitfield & bit) !== 0n;\n }\n for (let i = 0; i < permissions.length; i++) {\n const p = permissions[i]!;\n const bit = typeof p === \"bigint\" ? p : this.#resolve(p);\n if ((this.bitfield & bit) !== 0n) return true;\n }\n return false;\n }\n\n /** Returns the known permission names from `permissions` that this set lacks. @param permissions Permission names or raw bits. */\n public missing(...permissions: PermissionResolvable[]): PermissionName[] {\n const wanted = new PermissionSet(permissions);\n return wanted.toArray().filter((name) => !this.has(name));\n }\n\n /** Returns a new set with permissions added. @param permissions Permission names or raw bits. @returns A new permission set. */\n public add(...permissions: PermissionResolvable[]): PermissionSet {\n let bitfield = this.bitfield;\n for (let i = 0; i < permissions.length; i++) {\n const p = permissions[i]!;\n bitfield |= typeof p === \"bigint\" ? p : this.#resolve(p);\n }\n return new PermissionSet(bitfield);\n }\n\n /** Returns a new set with permissions removed. @param permissions Permission names or raw bits. @returns A new permission set. */\n public remove(...permissions: PermissionResolvable[]): PermissionSet {\n let bitfield = this.bitfield;\n for (let i = 0; i < permissions.length; i++) {\n const p = permissions[i]!;\n bitfield &= ~(typeof p === \"bigint\" ? p : this.#resolve(p));\n }\n return new PermissionSet(bitfield);\n }\n\n /** Checks equality with another permission set or raw bitfield. @param other Permission set or raw bitfield. @returns True when both values are equal. */\n public equals(other: PermissionSet | bigint | number | string): boolean {\n return (\n this.bitfield ===\n (other instanceof PermissionSet\n ? other.bitfield\n : new PermissionSet(other).bitfield)\n );\n }\n\n /** Returns the decimal permission representation. @returns Decimal permission bitfield. */\n public toString(): string {\n return this.bitfield.toString();\n }\n\n /** Returns known permission names contained in this set. @returns Names of all enabled known permissions. */\n public toArray(): PermissionName[] {\n return (Object.keys(Permission) as PermissionName[]).filter(\n (permission) => this.has(permission),\n );\n }\n\n /** Resolves a named permission, enum value, or raw bit. @param permission Permission name, enum value, or raw bit. @returns Numeric permission bit. */\n /** Names Discord has since renamed, still accepted when resolving a permission by name. */\n static readonly #renamed: Readonly<Record<string, string>> = {\n ManageEmojisAndStickers: \"ManageGuildExpressions\",\n ManageEmojis: \"ManageGuildExpressions\",\n UseSlashCommands: \"UseApplicationCommands\",\n };\n\n #resolve(permission: PermissionResolvable): bigint {\n if (typeof permission === \"bigint\") return permission;\n if (typeof permission === \"number\") return BigInt(permission);\n if (permission instanceof PermissionSet) return permission.bitfield;\n if (Array.isArray(permission)) {\n let bit = 0n;\n for (let i = 0; i < permission.length; i++)\n bit |= this.#resolve(permission[i]!);\n return bit;\n }\n if (typeof permission === \"string\") {\n const renamed = PermissionSet.#renamed[permission];\n if (renamed) return this.#resolve(renamed);\n if (permission in Permission)\n return (Permission as Record<string, bigint>)[permission]!;\n if (permission in Permissions)\n return (Permissions as Record<string, bigint>)[permission]!;\n if (permission in PermissionFlagsBits)\n return (PermissionFlagsBits as Record<string, bigint>)[\n permission\n ]!;\n const lower =\n permission.charAt(0).toLowerCase() + permission.slice(1);\n if (lower in Permission)\n return (Permission as Record<string, bigint>)[lower]!;\n return BigInt(permission);\n }\n return 0n;\n }\n}\n\n/** Permissions bitfield alias. */\nexport class PermissionsBitField extends PermissionSet {\n /** Permission flags bits enum. */\n public static readonly Flags = PermissionFlagsBits;\n /** Permission flags constants. */\n public static readonly All = Permission;\n\n /** Creates a permissions bitfield. @param value Initial permission bitfield or array of permissions. */\n public constructor(value: PermissionResolvable = 0n) {\n super(value);\n }\n}\n\n/** Every known permission bit. */\nconst ALL_PERMISSIONS = Object.values(Permission).reduce(\n (bits, bit) => bits | bit,\n 0n,\n);\n\n/** A role as needed for permission resolution. */\nexport interface PermissionRole {\n id: string;\n permissions: PermissionResolvable;\n}\n\n/** A channel permission overwrite (Discord's `permission_overwrites` entry). */\nexport interface PermissionOverwrite {\n id: string;\n type: PermissionOverwriteEnum | number;\n allow: PermissionResolvable;\n deny: PermissionResolvable;\n}\n\n/** Everything needed to resolve a member's permissions. */\nexport interface PermissionContext {\n guildId: string;\n /** Guild owner ID; the owner has every permission. */\n ownerId?: string;\n memberId: string;\n memberRoleIds: readonly string[];\n /** Guild roles, including `@everyone` (whose ID is the guild ID). */\n roles: readonly PermissionRole[];\n /** Channel overwrites; omit for guild-level permissions. */\n overwrites?: readonly PermissionOverwrite[];\n /** When the member's timeout ends; while it is in the future the member keeps only View Channel and Read Message History. */\n timedOutUntil?: Date | number | null;\n}\n\nconst bits = (value: PermissionResolvable): bigint =>\n new PermissionSet(value).bitfield;\n\n/**\n * Resolves a member's effective permissions the way Discord does: base\n * permissions from `@everyone` and the member's roles (owner and\n * administrator get everything), then the channel's `@everyone` overwrite,\n * the combined role overwrites, and finally the member overwrite. A member\n * whose timeout has not ended keeps only View Channel and Read Message History.\n */\nexport function computePermissions(context: PermissionContext): PermissionSet {\n if (context.ownerId !== undefined && context.ownerId === context.memberId)\n return new PermissionSet(ALL_PERMISSIONS);\n const roles = new Map(context.roles.map((role) => [role.id, role]));\n let base = bits(roles.get(context.guildId)?.permissions ?? 0n);\n for (const id of context.memberRoleIds)\n base |= bits(roles.get(id)?.permissions ?? 0n);\n if (base & Permission.administrator)\n return new PermissionSet(ALL_PERMISSIONS);\n const overwrites = context.overwrites ?? [];\n const everyone = overwrites.find((o) => o.id === context.guildId);\n if (everyone) base = (base & ~bits(everyone.deny)) | bits(everyone.allow);\n const memberRoles = new Set(context.memberRoleIds);\n let allow = 0n;\n let deny = 0n;\n for (const overwrite of overwrites)\n if (\n overwrite.type === PermissionOverwriteEnum.Role &&\n overwrite.id !== context.guildId &&\n memberRoles.has(overwrite.id)\n ) {\n allow |= bits(overwrite.allow);\n deny |= bits(overwrite.deny);\n }\n base = (base & ~deny) | allow;\n const member = overwrites.find(\n (o) =>\n o.type === PermissionOverwriteEnum.Member &&\n o.id === context.memberId,\n );\n if (member) base = (base & ~bits(member.deny)) | bits(member.allow);\n // Discord: timed-out members lose every permission except View Channel and\n // Read Message History. Owners and administrators returned above.\n const until =\n context.timedOutUntil instanceof Date\n ? context.timedOutUntil.getTime()\n : (context.timedOutUntil ?? 0);\n if (until > Date.now())\n base &= Permission.viewChannel | Permission.readMessageHistory;\n return new PermissionSet(base);\n}\n",
|
|
7
|
+
"import { BaseStructure, Channel, User, CDN_BASE, cdnURL } from \"./base.js\";\nimport { PermissionsBitField } from \"./permissions.js\";\nimport type { ImageURLOptions, ResourceContext } from \"./base.js\";\n\n/** Parses a Discord ISO timestamp into a Date, returning null for absent or invalid values. */\nfunction toDateOrNull(value?: string | null): Date | null {\n if (!value) return null;\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\n// ─── GuildMember ───────────────────────────────────────────────────────────────\n\n/** A Discord guild member. */\nexport class GuildMember {\n /** User represented by the member. */\n public readonly user: User;\n /** Guild containing the member. */\n public readonly guildId: string;\n /** Nickname, if configured. */\n public nickname: string | null;\n /** Role IDs assigned to the member. */\n public readonly roleIds: string[];\n /** Whether the member is pending membership screening. */\n public pending: boolean;\n /** Member join timestamp. */\n public joinedAt?: Date;\n /** Member-specific avatar hash, if set. */\n public avatarHash: string | null;\n /** When the member started boosting the guild. */\n public premiumSince: Date | null;\n /** When the member's timeout expires (null if not timed out). */\n public timedOutUntil: Date | null;\n /** Member flags bitfield. */\n public flags: number;\n /** Permissions Discord sent with the member (interactions only). */\n readonly #suppliedPermissions?: PermissionsBitField;\n readonly #context?: ResourceContext;\n\n /** Creates a guild member from Discord data. @param data Discord guild-member payload. @throws {TypeError} If the guild ID is invalid. @throws {RangeError} If joined_at is invalid. */\n public constructor(\n data: {\n user: {\n id: string;\n username: string;\n global_name?: string | null;\n avatar?: string | null;\n bot?: boolean;\n system?: boolean;\n public_flags?: number;\n discriminator?: string;\n };\n guild_id: string;\n nick?: string | null;\n roles?: string[];\n pending?: boolean;\n joined_at?: string;\n permissions?: string;\n avatar?: string | null;\n premium_since?: string | null;\n communication_disabled_until?: string | null;\n flags?: number;\n },\n context?: ResourceContext,\n ) {\n this.user = new User(data.user);\n this.#context = context;\n if (!/^\\d{1,20}$/.test(data.guild_id))\n throw new TypeError(\"Member guild_id must be a valid snowflake.\");\n this.guildId = data.guild_id;\n this.nickname = data.nick ?? null;\n this.roleIds = [...(data.roles ?? [])];\n this.pending = data.pending ?? false;\n this.joinedAt = data.joined_at ? new Date(data.joined_at) : undefined;\n if (this.joinedAt?.toString() === \"Invalid Date\")\n throw new RangeError(\"Member joined_at must be a valid date.\");\n if (data.permissions !== undefined)\n this.#suppliedPermissions = new PermissionsBitField(\n data.permissions,\n );\n this.avatarHash = data.avatar ?? null;\n // Like joinedAt, coerce malformed timestamps to null instead of an Invalid Date.\n this.premiumSince = toDateOrNull(data.premium_since);\n this.timedOutUntil = toDateOrNull(data.communication_disabled_until);\n this.flags = data.flags ?? 0;\n }\n\n /**\n * The member's permissions. Discord sends them with interactions (already\n * resolved for the channel); anywhere else they are computed at guild\n * level from the cached roles each time they are read, so they follow role\n * changes. Empty when the guild's roles are not cached.\n *\n * Interaction permissions are used as Discord sent them: Discord computes\n * them, so the local timeout mask is not applied on top.\n */\n public get permissions(): PermissionsBitField {\n if (this.#suppliedPermissions) return this.#suppliedPermissions;\n return new PermissionsBitField(\n this.#context?.memberPermissions?.(\n this.guildId,\n this.user.id,\n this.roleIds,\n undefined,\n this.timedOutUntil,\n ) ?? 0n,\n );\n }\n\n /** The member's permissions in a channel, with its overwrites. Null when the channel or guild is not cached. @param channelId Channel ID. */\n public permissionsIn(channelId: string): PermissionsBitField | null {\n const computed = this.#context?.memberPermissions?.(\n this.guildId,\n this.user.id,\n this.roleIds,\n channelId,\n this.timedOutUntil,\n );\n return computed ? new PermissionsBitField(computed) : null;\n }\n\n #action<K extends keyof ResourceContext>(\n name: K,\n ): NonNullable<ResourceContext[K]> {\n const action = this.#context?.[name];\n if (!action)\n throw new Error(\"This member is not attached to a client.\");\n return action as NonNullable<ResourceContext[K]>;\n }\n\n /** Kicks this member. @param reason Audit-log reason. */\n public kick(reason?: string): Promise<void> {\n return this.#action(\"kickMember\")(this.guildId, this.user.id, reason);\n }\n\n /** Bans this member. @param options Audit-log reason and seconds of messages to delete. */\n public ban(\n options: { reason?: string; deleteMessageSeconds?: number } = {},\n ): Promise<void> {\n return this.#action(\"banMember\")(this.guildId, this.user.id, options);\n }\n\n /** Edits this member (nickname, roles, voice state, timeout). @param options Discord member fields. @param reason Audit-log reason. */\n public edit(\n options: Record<string, unknown>,\n reason?: string,\n ): Promise<GuildMember> {\n return this.#action(\"editMember\")(\n this.guildId,\n this.user.id,\n options,\n reason,\n );\n }\n\n /** Times this member out, or clears the timeout with null. @param milliseconds Timeout length (Discord allows up to 28 days). @param reason Audit-log reason. */\n public timeout(\n milliseconds: number | null,\n reason?: string,\n ): Promise<GuildMember> {\n if (milliseconds !== null && !(milliseconds > 0))\n throw new RangeError(\n \"Timeout length must be a positive number of milliseconds.\",\n );\n return this.edit(\n {\n communication_disabled_until:\n milliseconds === null\n ? null\n : new Date(Date.now() + milliseconds).toISOString(),\n },\n reason,\n );\n }\n\n /** Sets or clears (null) this member's nickname. @param nickname New nickname. @param reason Audit-log reason. */\n public setNickname(\n nickname: string | null,\n reason?: string,\n ): Promise<GuildMember> {\n return this.edit({ nick: nickname }, reason);\n }\n\n /** Gives this member a role. @param roleId Role ID. @param reason Audit-log reason. */\n public addRole(roleId: string, reason?: string): Promise<void> {\n return this.#action(\"addMemberRole\")(\n this.guildId,\n this.user.id,\n roleId,\n reason,\n );\n }\n\n /** Takes a role from this member. @param roleId Role ID. @param reason Audit-log reason. */\n public removeRole(roleId: string, reason?: string): Promise<void> {\n return this.#action(\"removeMemberRole\")(\n this.guildId,\n this.user.id,\n roleId,\n reason,\n );\n }\n\n /** Effective member display name — nickname, falling back to user display name. */\n public get displayName(): string {\n return this.nickname ?? this.user.displayName;\n }\n\n /** Whether this member is currently timed out. */\n public get isTimedOut(): boolean {\n return this.timedOutUntil !== null && this.timedOutUntil > new Date();\n }\n\n /** Returns the member-specific avatar URL, falling back to the user's avatar, or null if none. */\n public avatarURL(options: ImageURLOptions = {}): string | null {\n if (this.avatarHash)\n return cdnURL(\n `/guilds/${this.guildId}/users/${this.user.id}/avatars`,\n this.avatarHash,\n options,\n );\n // User always exposes avatarURL(); returns null when the user has no avatar.\n return this.user.avatarURL(options);\n }\n\n /** Returns the resolved avatar URL — member avatar, user avatar, or default. */\n public displayAvatarURL(options: ImageURLOptions = {}): string {\n return this.avatarURL(options) ?? this.user.displayAvatarURL(options);\n }\n\n /** Returns the Discord user mention for this member. */\n public toString(): string {\n return this.user.toString();\n }\n}\n\n// ─── Role ──────────────────────────────────────────────────────────────────────\n\n/** A Discord guild role. */\nexport class Role extends BaseStructure {\n /** Role name. */\n public name: string;\n /** Role color as a 24-bit RGB integer. */\n public color: number;\n /** Whether the role is hoisted. */\n public hoist: boolean;\n /** Permission bitfield. */\n public permissions: PermissionsBitField;\n /** Whether the role is managed by an integration. */\n public managed: boolean;\n /** Whether the role is mentionable. */\n public mentionable: boolean;\n /** Role position in the hierarchy. */\n public position: number;\n /** Unicode emoji used as the role icon, if any. */\n public unicodeEmoji: string | null;\n /** Hash of the role's custom icon image, if any. */\n public iconHash: string | null;\n /** Gradient or holographic colours, when the role has more than a solid colour. */\n public colors: {\n primary: number;\n secondary: number | null;\n tertiary: number | null;\n } | null;\n /** Role tags metadata (bot, premium subscriber, etc). */\n public tags: Record<string, unknown> | null;\n\n /** Creates a role from Discord data. @param data Discord role payload. */\n public constructor(data: {\n id: string;\n name: string;\n color?: number;\n hoist?: boolean;\n permissions?: string;\n managed?: boolean;\n mentionable?: boolean;\n position?: number;\n unicode_emoji?: string | null;\n icon?: string | null;\n colors?: {\n primary_color: number;\n secondary_color: number | null;\n tertiary_color: number | null;\n };\n tags?: Record<string, unknown> | null;\n }) {\n super(data.id);\n if (!data.name) throw new TypeError(\"Role name cannot be empty.\");\n this.name = data.name;\n this.color = data.color ?? 0;\n this.hoist = data.hoist ?? false;\n this.permissions = new PermissionsBitField(data.permissions ?? 0n);\n this.managed = data.managed ?? false;\n this.mentionable = data.mentionable ?? false;\n this.position = data.position ?? 0;\n this.unicodeEmoji = data.unicode_emoji ?? null;\n this.colors = data.colors\n ? {\n primary: data.colors.primary_color,\n secondary: data.colors.secondary_color,\n tertiary: data.colors.tertiary_color,\n }\n : null;\n this.iconHash = data.icon ?? null;\n this.tags = data.tags ?? null;\n }\n\n /** Returns the role's color as a `#RRGGBB` hex string. Returns `#000000` for colorless roles. */\n public get colorHex(): string {\n return `#${this.color.toString(16).padStart(6, \"0\").toUpperCase()}`;\n }\n\n /** Returns the role's custom icon URL, or null if the role has no icon. */\n public iconURL(options: ImageURLOptions = {}): string | null {\n if (!this.iconHash) return null;\n return cdnURL(`/role-icons/${this.id}`, this.iconHash, options);\n }\n\n /** Whether this is the `@everyone` base role (its ID equals the guild ID). */\n public isEveryone(guildId: string): boolean {\n return this.id === guildId;\n }\n\n /** Discord role mention string. Used automatically in template literals. */\n public override toString(): string {\n return `<@&${this.id}>`;\n }\n}\n\n// ─── TextChannel ──────────────────────────────────────────────────────────────\n\n/** A Discord text-capable channel. */\nexport class TextChannel extends Channel {\n /** Creates a text channel from Discord data. @param data Discord channel payload. */\n public constructor(\n data: {\n id: string;\n type: number;\n name?: string | null;\n parent_id?: string | null;\n guild_id?: string;\n } & Partial<import(\"@lunibee/types\").APIChannel>,\n context?: import(\"./base.js\").ResourceContext,\n ) {\n super(data, context);\n }\n /** Discord channel mention string. Used automatically in template literals. */\n public override toString(): string {\n return `<#${this.id}>`;\n }\n}\n\n// ─── Invite ───────────────────────────────────────────────────────────────────\n\n/** A Discord invite link and its metadata. */\nexport class Invite {\n /** Invite code (the unique part of the URL). */\n public readonly code: string;\n /** Guild this invite belongs to, if any. */\n public readonly guildId: string | null;\n /** Channel this invite points to, if any. */\n public readonly channelId: string | null;\n /** User who created the invite, if available. */\n public readonly inviter: User | null;\n /** Number of times the invite has been used. */\n public uses: number;\n /** Maximum number of uses (0 = unlimited). */\n public maxUses: number;\n /** Duration in seconds until the invite expires (0 = never). */\n public maxAge: number;\n /** Whether the invite is temporary (kicks uninducted members on disconnect). */\n public temporary: boolean;\n /** When the invite was created. */\n public readonly createdAt: Date | null;\n /** When the invite expires, or null if it never expires. */\n public readonly expiresAt: Date | null;\n\n /** Creates an invite from Discord data. */\n public constructor(data: {\n code: string;\n guild?: { id: string } | null;\n channel?: { id: string } | null;\n inviter?: {\n id: string;\n username: string;\n global_name?: string | null;\n avatar?: string | null;\n bot?: boolean;\n system?: boolean;\n public_flags?: number;\n discriminator?: string;\n } | null;\n uses?: number;\n max_uses?: number;\n max_age?: number;\n temporary?: boolean;\n created_at?: string | null;\n expires_at?: string | null;\n }) {\n if (!data.code) throw new TypeError(\"An invite requires a code.\");\n this.code = data.code;\n this.guildId = data.guild?.id ?? null;\n this.channelId = data.channel?.id ?? null;\n this.inviter = data.inviter ? new User(data.inviter) : null;\n this.uses = data.uses ?? 0;\n this.maxUses = data.max_uses ?? 0;\n this.maxAge = data.max_age ?? 0;\n this.temporary = data.temporary ?? false;\n this.createdAt = data.created_at ? new Date(data.created_at) : null;\n this.expiresAt = data.expires_at ? new Date(data.expires_at) : null;\n }\n\n /** The full invite URL. */\n public get url(): string {\n return `https://discord.gg/${this.code}`;\n }\n\n /** Returns the invite URL. Used automatically in template literals. */\n public toString(): string {\n return this.url;\n }\n}\n\n// ─── Webhook ──────────────────────────────────────────────────────────────────\n\n/** Webhook type constants. */\nexport const WebhookEnum = {\n Incoming: 1,\n ChannelFollower: 2,\n Application: 3,\n} as const;\n/** One {@link WebhookEnum} value, usable as a type. */\nexport type WebhookEnum = (typeof WebhookEnum)[keyof typeof WebhookEnum];\n\n/** A Discord webhook — an HTTP endpoint that can post messages to a channel. */\nexport class Webhook extends BaseStructure {\n /** Webhook type. */\n public readonly type: number;\n /** Webhook display name. */\n public name: string | null;\n /** Webhook avatar hash. */\n public avatarHash: string | null;\n /** Channel this webhook posts to. */\n public readonly channelId: string | null;\n /** Guild this webhook belongs to. */\n public readonly guildId: string | null;\n /** Application that created this webhook, if any. */\n public readonly applicationId: string | null;\n /** Webhook token (only present for incoming webhooks). */\n public readonly token: string | null;\n\n /** Creates a webhook from Discord data. */\n public constructor(data: {\n id: string;\n type?: number;\n name?: string | null;\n avatar?: string | null;\n channel_id?: string | null;\n guild_id?: string | null;\n application_id?: string | null;\n token?: string;\n }) {\n super(data.id);\n this.type = data.type ?? WebhookEnum.Incoming;\n this.name = data.name ?? null;\n this.avatarHash = data.avatar ?? null;\n this.channelId = data.channel_id ?? null;\n this.guildId = data.guild_id ?? null;\n this.applicationId = data.application_id ?? null;\n this.token = data.token ?? null;\n }\n\n /** Returns the webhook avatar URL, or null if no avatar is set. */\n public avatarURL(options: ImageURLOptions = {}): string | null {\n if (!this.avatarHash) return null;\n return cdnURL(`/avatars/${this.id}`, this.avatarHash, options);\n }\n\n /** Returns the webhook execution URL, or null if no token is set. */\n public get url(): string | null {\n return this.token\n ? `https://discord.com/api/webhooks/${this.id}/${this.token}`\n : null;\n }\n\n /** Returns the webhook URL or its ID as a string. */\n public override toString(): string {\n return this.url ?? this.id;\n }\n}\n\n// ─── Emoji ────────────────────────────────────────────────────────────────────\n\n/** A Discord emoji. */\nexport class Emoji extends BaseStructure {\n /** Emoji name. */\n public name: string | null;\n /** Roles allowed to use this emoji. */\n public roleIds: string[];\n /** User that created this emoji. */\n public user: User | null;\n /** Whether this emoji must be wrapped in colons. */\n public requireColons: boolean;\n /** Whether this emoji is managed. */\n public managed: boolean;\n /** Whether this emoji is animated. */\n public animated: boolean;\n /** Whether this emoji can be used, may be false due to loss of Server Boosts. */\n public available: boolean;\n\n /** Creates an emoji from Discord data. */\n public constructor(data: {\n id: string | null;\n name: string | null;\n roles?: string[];\n user?: import(\"@lunibee/types\").UserData;\n require_colons?: boolean;\n managed?: boolean;\n animated?: boolean;\n available?: boolean;\n }) {\n // Unicode emoji have no snowflake: pass the base check with a\n // placeholder, then expose the documented \"unicode\" sentinel id.\n super(data.id ?? \"0\");\n if (data.id === null) (this as { id: string }).id = \"unicode\";\n this.name = data.name;\n this.roleIds = data.roles ?? [];\n this.user = data.user ? new User(data.user) : null;\n this.requireColons = data.require_colons ?? false;\n this.managed = data.managed ?? false;\n this.animated = data.animated ?? false;\n this.available = data.available ?? true;\n }\n\n /** Returns the URL for this emoji if it is custom, or null for unicode emojis. */\n public url(options: ImageURLOptions = {}): string | null {\n if (!this.id || this.id === \"unicode\") return null;\n const ext = options.extension ?? (this.animated ? \"gif\" : \"png\");\n const size = options.size ? `?size=${options.size}` : \"\";\n return `${CDN_BASE}/emojis/${this.id}.${ext}${size}`;\n }\n\n /** Returns the text required to render this emoji in Discord. */\n public override toString(): string {\n return this.id !== \"unicode\"\n ? `<${this.animated ? \"a\" : \"\"}:${this.name}:${this.id}>`\n : (this.name ?? \"\");\n }\n}\n\n// --- AutoModerationRule --------------------------------------------------------\n\n/** A Discord AutoModeration Rule. */\nexport class AutoModerationRule extends BaseStructure {\n public guildId: string;\n public name: string;\n public creatorId: string;\n public eventType: number;\n public triggerType: number;\n public triggerMetadata: Record<string, unknown>;\n public actions: import(\"@lunibee/types\").APIAutoModerationAction[];\n public enabled: boolean;\n public exemptRoles: string[];\n public exemptChannels: string[];\n\n /** Creates an auto moderation rule from Discord data. */\n public constructor(data: import(\"@lunibee/types\").APIAutoModerationRule) {\n super(data.id);\n if (!/^\\d{1,20}$/.test(data.guild_id))\n throw new TypeError(\n \"AutoModerationRule guild_id must be a valid snowflake.\",\n );\n this.guildId = data.guild_id;\n this.name = data.name;\n this.creatorId = data.creator_id;\n this.eventType = data.event_type;\n this.triggerType = data.trigger_type;\n this.triggerMetadata = data.trigger_metadata;\n this.actions = data.actions;\n this.enabled = data.enabled;\n this.exemptRoles = data.exempt_roles;\n this.exemptChannels = data.exempt_channels;\n }\n\n public toJSON(): Record<string, unknown> {\n return {\n id: this.id,\n guildId: this.guildId,\n name: this.name,\n creatorId: this.creatorId,\n eventType: this.eventType,\n triggerType: this.triggerType,\n triggerMetadata: this.triggerMetadata,\n actions: this.actions,\n enabled: this.enabled,\n exemptRoles: this.exemptRoles,\n exemptChannels: this.exemptChannels,\n };\n }\n}\n\n// --- Welcome Screen -----------------------------------------------------------\n\n/** A channel listed in a guild's Welcome Screen. */\nexport class WelcomeScreenChannel {\n public channelId: string;\n public description: string;\n public emojiId: string | null;\n public emojiName: string | null;\n\n public constructor(data: import(\"@lunibee/types\").APIWelcomeScreenChannel) {\n this.channelId = data.channel_id;\n this.description = data.description;\n this.emojiId = data.emoji_id;\n this.emojiName = data.emoji_name;\n }\n}\n\n/** A Discord Guild Welcome Screen. */\nexport class GuildWelcomeScreen {\n public description: string | null;\n public channels: WelcomeScreenChannel[];\n\n public constructor(data: import(\"@lunibee/types\").APIGuildWelcomeScreen) {\n this.description = data.description;\n this.channels = data.welcome_channels.map(\n (c) => new WelcomeScreenChannel(c),\n );\n }\n}\n\n// --- Guild Onboarding ---------------------------------------------------------\n\n/** An option within a Guild Onboarding Prompt. */\nexport class OnboardingPromptOption extends BaseStructure {\n public channelIds: string[];\n public roleIds: string[];\n public emoji: import(\"@lunibee/types\").APIPartialEmoji | undefined;\n public title: string;\n public description: string | null;\n\n public constructor(\n data: import(\"@lunibee/types\").APIOnboardingPromptOption,\n ) {\n super(data.id);\n this.channelIds = data.channel_ids;\n this.roleIds = data.role_ids;\n this.emoji = data.emoji;\n this.title = data.title;\n this.description = data.description;\n }\n}\n\n/** A prompt shown during Guild Onboarding. */\nexport class OnboardingPrompt extends BaseStructure {\n public type: number;\n public options: OnboardingPromptOption[];\n public title: string;\n public singleSelect: boolean;\n public required: boolean;\n public inOnboarding: boolean;\n\n public constructor(data: import(\"@lunibee/types\").APIOnboardingPrompt) {\n super(data.id);\n this.type = data.type;\n this.options = data.options.map((o) => new OnboardingPromptOption(o));\n this.title = data.title;\n this.singleSelect = data.single_select;\n this.required = data.required;\n this.inOnboarding = data.in_onboarding;\n }\n}\n\n/** A Discord Guild Onboarding setup. */\nexport class GuildOnboarding extends BaseStructure {\n public prompts: OnboardingPrompt[];\n public defaultChannelIds: string[];\n public enabled: boolean;\n public mode: number;\n\n public constructor(data: import(\"@lunibee/types\").APIGuildOnboarding) {\n super(data.guild_id);\n this.prompts = data.prompts.map((p) => new OnboardingPrompt(p));\n this.defaultChannelIds = data.default_channel_ids;\n this.enabled = data.enabled;\n this.mode = data.mode;\n }\n}\n",
|
|
8
|
+
"import { Channel, User, type ResourceContext } from \"./base.js\";\nimport { TextChannel } from \"./resources.js\";\nimport type {\n APIChannel,\n APIForumTag,\n APIPartialEmoji,\n APIThreadMetadata,\n} from \"@lunibee/types\";\n\n// Every channel class extends Channel, so `instanceof Channel` checks and\n// Channel methods keep working.\n\n/** A guild announcement (news) channel. */\nexport class NewsChannel extends TextChannel {}\n\n/** A direct-message or group DM channel. */\nexport class DMChannel extends Channel {\n /** Users in the conversation. */\n public readonly recipients: User[];\n /** Owner of a group DM. */\n public readonly ownerId: string | null;\n\n public constructor(data: APIChannel, context?: ResourceContext) {\n super(data, context);\n this.recipients = (data.recipients ?? []).map((u) => new User(u));\n this.ownerId = data.owner_id ?? null;\n }\n}\n\n/** A guild voice channel. */\nexport class VoiceChannel extends Channel {\n /** Bitrate in bits per second. */\n public bitrate: number;\n /** User limit (0 = unlimited). */\n public userLimit: number;\n /** Voice region override, or null for automatic. */\n public rtcRegion: string | null;\n /** Camera video quality mode. */\n public videoQualityMode: number;\n\n public constructor(data: APIChannel, context?: ResourceContext) {\n super(data, context);\n this.bitrate = data.bitrate ?? 64000;\n this.userLimit = data.user_limit ?? 0;\n this.rtcRegion = data.rtc_region ?? null;\n this.videoQualityMode = data.video_quality_mode ?? 1;\n }\n}\n\n/** A guild stage channel. */\nexport class StageChannel extends VoiceChannel {}\n\n/** A guild category. */\nexport class CategoryChannel extends Channel {}\n\n/** A thread (announcement, public or private). */\nexport class ThreadChannel extends Channel {\n /** User who created the thread. */\n public readonly ownerId: string | null;\n /** Approximate message count. */\n public messageCount: number;\n /** Approximate member count (stops counting at 50). */\n public memberCount: number;\n /** Thread metadata. */\n public metadata: APIThreadMetadata | null;\n\n public constructor(data: APIChannel, context?: ResourceContext) {\n super(data, context);\n this.ownerId = data.owner_id ?? null;\n this.messageCount = data.message_count ?? 0;\n this.memberCount = data.member_count ?? 0;\n this.metadata = data.thread_metadata ?? null;\n }\n\n /** Whether the thread is archived. */\n public get archived(): boolean {\n return this.metadata?.archived ?? false;\n }\n\n /** Whether the thread is locked. */\n public get locked(): boolean {\n return this.metadata?.locked ?? false;\n }\n\n /** Minutes of inactivity before the thread auto-archives. */\n public get autoArchiveDuration(): number | null {\n return this.metadata?.auto_archive_duration ?? null;\n }\n}\n\n/** A guild forum channel. */\nexport class ForumChannel extends Channel {\n /** Tags that threads can apply. */\n public availableTags: APIForumTag[];\n /** Default reaction for new threads. */\n public defaultReactionEmoji: APIPartialEmoji | null;\n /** Default slowmode for new threads. */\n public defaultThreadRateLimitPerUser: number;\n /** Default auto-archive duration for new threads. */\n public defaultAutoArchiveDuration: number | null;\n\n public constructor(data: APIChannel, context?: ResourceContext) {\n super(data, context);\n this.availableTags = data.available_tags ?? [];\n this.defaultReactionEmoji = data.default_reaction_emoji ?? null;\n this.defaultThreadRateLimitPerUser =\n data.default_thread_rate_limit_per_user ?? 0;\n this.defaultAutoArchiveDuration =\n data.default_auto_archive_duration ?? null;\n }\n}\n\n/** A guild media channel. */\nexport class MediaChannel extends ForumChannel {}\n\n/**\n * Builds the most specific channel class for a payload's `type`, falling back\n * to {@link Channel} for types without a dedicated class.\n */\nexport function createChannel(\n data: APIChannel,\n context?: ResourceContext,\n): Channel {\n switch (data.type) {\n case 0:\n return new TextChannel(data, context);\n case 1:\n case 3:\n return new DMChannel(data, context);\n case 2:\n return new VoiceChannel(data, context);\n case 4:\n return new CategoryChannel(data, context);\n case 5:\n return new NewsChannel(data, context);\n case 10:\n case 11:\n case 12:\n return new ThreadChannel(data, context);\n case 13:\n return new StageChannel(data, context);\n case 15:\n return new ForumChannel(data, context);\n case 16:\n return new MediaChannel(data, context);\n default:\n return new Channel(data, context);\n }\n}\n\n/** The class of each channel kind, so `channel.is(\"voice\")` can narrow to `VoiceChannel`. */\nexport interface ChannelsByKind {\n text: TextChannel;\n announcement: NewsChannel;\n voice: VoiceChannel;\n stage: StageChannel;\n category: CategoryChannel;\n thread: ThreadChannel;\n forum: ForumChannel;\n media: MediaChannel;\n dm: DMChannel;\n \"group-dm\": DMChannel;\n directory: Channel;\n unknown: Channel;\n}\n\n/** The channel class for a kind (or a union of them). */\nexport type ChannelOfKind<K extends keyof ChannelsByKind> = ChannelsByKind[K];\n",
|
|
9
|
+
"import type { UserData } from \"@lunibee/types\";\n\n// ─── Raw option type from Discord ────────────────────────────────────────────\n\n/** Raw Discord application command interaction data option. */\nexport interface APIInteractionDataOption {\n name: string;\n type: number;\n value?: string | number | boolean;\n options?: APIInteractionDataOption[];\n focused?: boolean;\n}\n\n// ─── CommandOptions resolver ──────────────────────────────────────────────────\n\n/** Application command option types mirroring Discord's enum. */\nconst OptionType = {\n SubCommand: 1,\n SubCommandGroup: 2,\n String: 3,\n Integer: 4,\n Boolean: 5,\n User: 6,\n Channel: 7,\n Role: 8,\n Mentionable: 9,\n Number: 10,\n Attachment: 11,\n} as const;\n\n/**\n * Typed resolver for application command options.\n * Attached as `CommandInteraction.options`.\n */\nexport class CommandOptions {\n readonly #options: APIInteractionDataOption[];\n readonly #resolved: Record<string, unknown>;\n /** `resolved[kind][id]` from Discord's interaction data, if present. */\n #lookup(kind: string, id: string): Record<string, unknown> | undefined {\n const group = this.#resolved?.[kind];\n if (typeof group !== \"object\" || group === null) return undefined;\n const entry = (group as Record<string, unknown>)[id];\n return typeof entry === \"object\" && entry !== null\n ? (entry as Record<string, unknown>)\n : undefined;\n }\n\n /** @internal */\n public constructor(\n options: APIInteractionDataOption[],\n resolved: Record<string, unknown> = {},\n ) {\n let currentOptions = options;\n let group: string | null = null;\n let sub: string | null = null;\n\n // Drill down to the deepest options level for nested subcommands\n while (currentOptions.length === 1) {\n const opt = currentOptions[0]!;\n if (opt.type === OptionType.SubCommandGroup) {\n group = opt.name;\n currentOptions = opt.options ?? [];\n } else if (opt.type === OptionType.SubCommand) {\n sub = opt.name;\n currentOptions = opt.options ?? [];\n } else {\n break;\n }\n }\n\n this.#options = currentOptions;\n this.#resolved = resolved;\n this.#subcommandGroup = group;\n this.#subcommand = sub;\n }\n\n readonly #subcommandGroup: string | null;\n readonly #subcommand: string | null;\n\n /** Finds a raw option by name (case-insensitive). */\n #get(name: string): APIInteractionDataOption | undefined {\n return this.#options.find(\n (o) => o.name.toLowerCase() === name.toLowerCase(),\n );\n }\n\n // ── Subcommand resolution ──────────────────────────────────────────────────\n\n /** Returns the invoked subcommand name, or null if none. */\n public getSubcommand(required?: false): string | null;\n public getSubcommand(required: true): string;\n public getSubcommand(required = false): string | null {\n if (!this.#subcommand && required) {\n throw new TypeError(\"No subcommand was provided.\");\n }\n return this.#subcommand;\n }\n\n /** Returns the invoked subcommand group name, or null if none. */\n public getSubcommandGroup(required?: false): string | null;\n public getSubcommandGroup(required: true): string;\n public getSubcommandGroup(required = false): string | null {\n if (!this.#subcommandGroup && required) {\n throw new TypeError(\"No subcommand group was provided.\");\n }\n return this.#subcommandGroup;\n }\n\n // ── Autocomplete ───────────────────────────────────────────────────────────\n\n /** Returns the focused option's value (autocomplete), or the full option when `full` is true. @throws {TypeError} If no option is focused. */\n public getFocused(full: true): APIInteractionDataOption;\n public getFocused(full?: false): string | number | boolean;\n public getFocused(\n full = false,\n ): APIInteractionDataOption | string | number | boolean {\n const focused = this.#options.find((o) => o.focused);\n if (!focused) throw new TypeError(\"No focused option was provided.\");\n return full ? focused : (focused.value ?? \"\");\n }\n\n // ── Primitive value options ────────────────────────────────────────────────\n\n /** Gets a string option. @param name Option name. @param required If true, throws when missing. */\n public getString(name: string, required?: false): string | null;\n public getString(name: string, required: true): string;\n public getString(name: string, required = false): string | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.String) {\n if (required)\n throw new TypeError(\n `Required option \"${name}\" (string) is missing.`,\n );\n return null;\n }\n return typeof opt.value === \"string\" ? opt.value : null;\n }\n\n /** Gets an integer option. @param name Option name. @param required If true, throws when missing. */\n public getInteger(name: string, required?: false): number | null;\n public getInteger(name: string, required: true): number;\n public getInteger(name: string, required = false): number | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.Integer) {\n if (required)\n throw new TypeError(\n `Required option \"${name}\" (integer) is missing.`,\n );\n return null;\n }\n return typeof opt.value === \"number\" ? Math.trunc(opt.value) : null;\n }\n\n /** Gets a number (float) option. @param name Option name. @param required If true, throws when missing. */\n public getNumber(name: string, required?: false): number | null;\n public getNumber(name: string, required: true): number;\n public getNumber(name: string, required = false): number | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.Number) {\n if (required)\n throw new TypeError(\n `Required option \"${name}\" (number) is missing.`,\n );\n return null;\n }\n return typeof opt.value === \"number\" ? opt.value : null;\n }\n\n /** Gets a boolean option. @param name Option name. @param required If true, throws when missing. */\n public getBoolean(name: string, required?: false): boolean | null;\n public getBoolean(name: string, required: true): boolean;\n public getBoolean(name: string, required = false): boolean | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.Boolean) {\n if (required)\n throw new TypeError(\n `Required option \"${name}\" (boolean) is missing.`,\n );\n return null;\n }\n return typeof opt.value === \"boolean\" ? opt.value : null;\n }\n\n // ── Resolved entity options ────────────────────────────────────────────────\n\n /** Gets the raw resolved user data for a user option. @param name Option name. @param required If true, throws when missing. */\n public getUser(\n name: string,\n required?: false,\n ): (UserData & Record<string, unknown>) | null;\n public getUser(\n name: string,\n required: true,\n ): UserData & Record<string, unknown>;\n public getUser(\n name: string,\n required = false,\n ): (UserData & Record<string, unknown>) | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.User) {\n if (required)\n throw new TypeError(\n `Required option \"${name}\" (user) is missing.`,\n );\n return null;\n }\n const userId = String(opt.value);\n const resolved = this.#lookup(\"users\", userId) ?? null;\n if (!resolved && required)\n throw new TypeError(\n `Resolved user for option \"${name}\" is missing.`,\n );\n return resolved as (UserData & Record<string, unknown>) | null;\n }\n\n /** Gets the raw resolved channel data for a channel option. @param name Option name. @param required If true, throws when missing. */\n public getChannel(\n name: string,\n required?: false,\n ): Record<string, unknown> | null;\n public getChannel(name: string, required: true): Record<string, unknown>;\n public getChannel(\n name: string,\n required = false,\n ): Record<string, unknown> | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.Channel) {\n if (required)\n throw new TypeError(\n `Required option \"${name}\" (channel) is missing.`,\n );\n return null;\n }\n const channelId = String(opt.value);\n const resolved = this.#lookup(\"channels\", channelId) ?? null;\n if (!resolved && required)\n throw new TypeError(\n `Resolved channel for option \"${name}\" is missing.`,\n );\n return resolved;\n }\n\n /** Gets the raw resolved role data for a role option. @param name Option name. @param required If true, throws when missing. */\n public getRole(\n name: string,\n required?: false,\n ): Record<string, unknown> | null;\n public getRole(name: string, required: true): Record<string, unknown>;\n public getRole(\n name: string,\n required = false,\n ): Record<string, unknown> | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.Role) {\n if (required)\n throw new TypeError(\n `Required option \"${name}\" (role) is missing.`,\n );\n return null;\n }\n const roleId = String(opt.value);\n const resolved = this.#lookup(\"roles\", roleId) ?? null;\n if (!resolved && required)\n throw new TypeError(\n `Resolved role for option \"${name}\" is missing.`,\n );\n return resolved;\n }\n\n /** Gets the raw resolved user or role data for a mentionable option. @param name Option name. @param required If true, throws when missing. */\n public getMentionable(\n name: string,\n required?: false,\n ): Record<string, unknown> | null;\n public getMentionable(\n name: string,\n required: true,\n ): Record<string, unknown>;\n public getMentionable(\n name: string,\n required = false,\n ): Record<string, unknown> | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.Mentionable) {\n if (required)\n throw new TypeError(\n `Required option \"${name}\" (mentionable) is missing.`,\n );\n return null;\n }\n const id = String(opt.value);\n const resolved =\n this.#lookup(\"users\", id) ?? this.#lookup(\"roles\", id) ?? null;\n if (!resolved && required)\n throw new TypeError(\n `Resolved mentionable for option \"${name}\" is missing.`,\n );\n return resolved;\n }\n\n /** Whether a mentionable option picked a user or a role; null when the option is missing. @param name Option name. */\n public getMentionableType(name: string): \"user\" | \"role\" | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.Mentionable) return null;\n const id = String(opt.value);\n if (this.#lookup(\"users\", id)) return \"user\";\n if (this.#lookup(\"roles\", id)) return \"role\";\n return null;\n }\n\n /** Gets the raw resolved attachment data for an attachment option. @param name Option name. @param required If true, throws when missing. */\n public getAttachment(\n name: string,\n required?: false,\n ): Record<string, unknown> | null;\n public getAttachment(name: string, required: true): Record<string, unknown>;\n public getAttachment(\n name: string,\n required = false,\n ): Record<string, unknown> | null {\n const opt = this.#get(name);\n if (!opt || opt.type !== OptionType.Attachment) {\n if (required)\n throw new TypeError(\n `Required option \"${name}\" (attachment) is missing.`,\n );\n return null;\n }\n const attachmentId = String(opt.value);\n const resolved = this.#lookup(\"attachments\", attachmentId) ?? null;\n if (!resolved && required)\n throw new TypeError(\n `Resolved attachment for option \"${name}\" is missing.`,\n );\n return resolved;\n }\n\n /** Returns the raw option list for advanced use cases. */\n public get raw(): readonly APIInteractionDataOption[] {\n return this.#options;\n }\n}\n",
|
|
10
|
+
"import {\n InteractionResponseEnum,\n type APIEntitlement,\n type InteractionReplyOptions,\n} from \"@lunibee/types\";\nimport { User, type ResourceContext } from \"./base.js\";\nimport { GuildMember } from \"./resources.js\";\n// A cycle with index.ts: Message is only used lazily (in a getter), after both modules loaded.\nimport { Message } from \"./index.js\";\n\n/** Discord interaction type constants. */\nexport const InteractionEnum = {\n Ping: 1,\n ApplicationCommand: 2,\n MessageComponent: 3,\n ApplicationCommandAutocomplete: 4,\n ModalSubmit: 5,\n} as const;\n/** One {@link InteractionEnum} value, usable as a type. */\nexport type InteractionEnum =\n (typeof InteractionEnum)[keyof typeof InteractionEnum];\n// Re-export for consumers who import from structures directly\nexport { InteractionResponseEnum } from \"@lunibee/types\";\n/** Data shared by Discord interactions. */\nexport interface InteractionData {\n /** Interaction identifier. */\n id: string;\n /** Application identifier. */\n application_id: string;\n /** Interaction type. */\n type: number;\n /** Interaction token. */\n token: string;\n /** Gateway/API version. */\n version?: number;\n /** Guild identifier. */\n guild_id?: string;\n /** Channel identifier. */\n channel_id?: string;\n /** Interaction-specific data. */\n data?: Record<string, unknown>;\n [key: string]: unknown;\n}\nexport type { InteractionReplyOptions };\n/** Transport required by an interaction structure. */\nexport interface InteractionClient {\n /** Sends the initial interaction callback. @param id Interaction identifier. @param token Interaction token. @param response Callback payload. @returns Discord response. @throws {Error} When REST fails. */\n postInteractionResponse(\n id: string,\n token: string,\n response: InteractionResponse,\n ): Promise<unknown>;\n /** Edits the original interaction response. @param token Interaction token. @param data Message payload. @param applicationId The interaction's `application_id`, which the webhook route needs. @returns Discord response. @throws {Error} When REST fails. */\n editInteractionReply(\n token: string,\n data: InteractionReplyOptions,\n applicationId?: string,\n ): Promise<unknown>;\n /** Deletes the original interaction response. @param token Interaction token. @param applicationId The interaction's `application_id`. @returns Promise fulfilled after deletion. @throws {Error} When REST fails. */\n deleteInteractionReply(\n token: string,\n applicationId?: string,\n ): Promise<void>;\n /** Sends a follow-up interaction webhook message. @param token Interaction token. @param data Message payload. @param applicationId The interaction's `application_id`. @returns Discord response. @throws {Error} When REST fails. */\n followUpInteraction(\n token: string,\n data: InteractionReplyOptions,\n applicationId?: string,\n ): Promise<unknown>;\n /** Reads, edits or deletes an interaction webhook message (`@original` or a follow-up ID). Optional; required for {@link Interaction.fetchReply}, {@link Interaction.editFollowUp} and {@link Interaction.deleteFollowUp}. */\n interactionWebhookMessage?(\n method: \"GET\" | \"PATCH\" | \"DELETE\",\n applicationId: string,\n token: string,\n messageId: string,\n data?: InteractionReplyOptions,\n ): Promise<unknown>;\n /** Lets structures built from an interaction (such as {@link Interaction.member}) act through the client. Optional. */\n readonly resourceContext?: ResourceContext;\n}\n\n/** Discord's ephemeral message flag. */\nconst EPHEMERAL = 64;\n/** Application command types (`data.type`): slash, user context menu, message context menu. */\nconst COMMAND_CHAT_INPUT = 1;\nconst COMMAND_USER = 2;\nconst COMMAND_MESSAGE = 3;\n/** Interaction tokens stay valid for 15 minutes. */\nconst TOKEN_LIFETIME_MS = 15 * 60_000;\nconst DISCORD_EPOCH = 1_420_070_400_000n;\n\n/** Takes the local-only `withResponse` key off reply options. */\nfunction splitWithResponse(options: InteractionReplyOptions | string): {\n withResponse: boolean;\n rest: InteractionReplyOptions | string;\n} {\n if (typeof options === \"string\")\n return { withResponse: false, rest: options };\n const { withResponse, ...rest } = options;\n return { withResponse: withResponse === true, rest };\n}\n\n/** Turns `{ ephemeral: true }` into Discord's flag and drops the local-only key. */\nfunction toMessageData(\n options: InteractionReplyOptions | string,\n): InteractionReplyOptions {\n if (typeof options === \"string\") return { content: options };\n const { ephemeral, ...data } = options;\n if (ephemeral)\n data.flags =\n (typeof data.flags === \"number\" ? data.flags : 0) | EPHEMERAL;\n return data;\n}\n\nexport { CommandOptions, type APIInteractionDataOption } from \"./options.js\";\nimport { CommandOptions, type APIInteractionDataOption } from \"./options.js\";\n\n// ─── Response class ───────────────────────────────────────────────────────────\n\n/** A Discord interaction callback payload. */\nexport class InteractionResponse {\n readonly type: number;\n readonly data?: InteractionReplyOptions;\n /** Ask Discord to return the created message (`?with_response=true`); not part of the body. */\n public withResponse = false;\n /** Creates a response payload. @param type Discord callback type. @param data Optional callback data. @throws {TypeError} If type is not finite. */\n public constructor(type: number, data?: InteractionReplyOptions) {\n if (!Number.isFinite(type))\n throw new TypeError(\"Interaction response type must be finite.\");\n this.type = type;\n this.data = data;\n }\n /** Serializes the response for Discord. @returns Discord callback payload. */\n public toJSON(): {\n type: number;\n data?: InteractionReplyOptions;\n } {\n return this.data === undefined\n ? { type: this.type }\n : { type: this.type, data: this.data };\n }\n /** Creates an immediate message response. @param options Response message options. @returns Callback payload. */\n public static message(\n options: InteractionReplyOptions,\n ): InteractionResponse {\n return new InteractionResponse(\n InteractionResponseEnum.ChannelMessage,\n toMessageData(options),\n );\n }\n /** Creates a deferred channel response. @param ephemeral Whether the eventual response is ephemeral. @returns Callback payload. */\n public static defer(ephemeral = false): InteractionResponse {\n return new InteractionResponse(\n InteractionResponseEnum.DeferredChannelMessage,\n ephemeral ? { flags: EPHEMERAL } : undefined,\n );\n }\n /** Creates a Pong response. @returns Callback payload. */\n public static pong(): InteractionResponse {\n return new InteractionResponse(InteractionResponseEnum.Pong);\n }\n}\n\n// ─── Base Interaction ─────────────────────────────────────────────────────────\n\n/** Base interaction structure. */\nexport class Interaction<TData extends InteractionData = InteractionData> {\n /** Interaction identifier. */\n public readonly id: string;\n /** Application identifier. */\n public readonly applicationId: string;\n /** Interaction token. */\n public readonly token: string;\n /** Guild identifier. */\n public readonly guildId?: string;\n /** Channel identifier. */\n public readonly channelId?: string;\n /** Interaction type. */\n public readonly type: number;\n /** Raw interaction data. */\n public readonly data: TData;\n /** Whether the initial response was sent. */\n public replied = false;\n /** Whether the initial response was deferred. */\n public deferred = false;\n readonly #client: InteractionClient;\n /** An initial response is in flight; a second one must not be sent. */\n #acknowledging = false;\n /** Callback type of the initial response, once sent. */\n #responseType?: number;\n /** Creates an interaction from a Gateway payload. @param client Interaction transport. @param data Gateway interaction payload. @throws {TypeError} If required identifiers are missing. */\n public constructor(client: InteractionClient, data: TData) {\n if (!data.id || !data.token)\n throw new TypeError(\"Interaction ID and token are required.\");\n this.#client = client;\n this.id = data.id;\n this.applicationId = data.application_id;\n this.token = data.token;\n this.guildId = data.guild_id;\n this.channelId = data.channel_id;\n this.type = data.type;\n this.data = data;\n }\n /** The entitlements of the person (and guild) that ran this interaction: what they own from your SKUs. */\n public get entitlements(): readonly APIEntitlement[] {\n const entitlements = this.data.entitlements;\n return Array.isArray(entitlements)\n ? (entitlements as APIEntitlement[])\n : [];\n }\n /** Whether the interaction carries an active entitlement for a SKU. */\n public hasEntitlement(skuId: string): boolean {\n const now = Date.now();\n return this.entitlements.some(\n (entitlement) =>\n entitlement.sku_id === skuId &&\n !entitlement.deleted &&\n (!entitlement.ends_at || Date.parse(entitlement.ends_at) > now),\n );\n }\n /** The application command's own type (1 chat input, 2 user, 3 message); 0 when this is not a command. */\n #commandType(): number {\n if (this.type !== InteractionEnum.ApplicationCommand) return 0;\n const type = this.data.data?.type;\n return typeof type === \"number\" ? type : COMMAND_CHAT_INPUT;\n }\n /** Whether this interaction is any application command: slash or context menu. */\n public isCommand(): this is CommandInteraction {\n return this.type === InteractionEnum.ApplicationCommand;\n }\n /**\n * Whether this interaction is a slash (chat input) command. Since 0.2.2 this\n * is false for context-menu commands; use {@link isCommand} for both.\n */\n public isChatInputCommand(): this is CommandInteraction {\n return this.#commandType() === COMMAND_CHAT_INPUT;\n }\n /** Whether this interaction is a user or message context-menu command. */\n public isContextMenuCommand(): this is ContextMenuCommandInteraction {\n const type = this.#commandType();\n return type === COMMAND_USER || type === COMMAND_MESSAGE;\n }\n /** Whether this interaction is a user context-menu command (right-click a user). */\n public isUserContextMenuCommand(): this is ContextMenuCommandInteraction {\n return this.#commandType() === COMMAND_USER;\n }\n /** Whether this interaction is a message context-menu command (right-click a message). */\n public isMessageContextMenuCommand(): this is ContextMenuCommandInteraction {\n return this.#commandType() === COMMAND_MESSAGE;\n }\n /** The client context structures built from this interaction act through. */\n protected get resourceContext(): ResourceContext | undefined {\n return this.#client.resourceContext;\n }\n /**\n * Waits for this user to submit a modal, typically one this interaction\n * just opened with {@link showModal}.\n * @param options `time` (required, ms); optional `customId` and `filter`.\n * @returns The submission. @throws {Error} When time runs out first or no client is attached.\n * @example const submitted = await interaction.awaitModalSubmit({ time: 60_000, customId: \"feedback\" });\n */\n public awaitModalSubmit(options: {\n time: number;\n customId?: string;\n filter?: (\n interaction: ModalSubmitInteraction,\n ) => boolean | Promise<boolean>;\n }): Promise<ModalSubmitInteraction> {\n const collect = this.#client.resourceContext?.collectInteractions;\n if (!collect)\n return Promise.reject(\n new Error(\"This interaction is not attached to a client.\"),\n );\n if (!(options.time > 0))\n return Promise.reject(\n new RangeError(\"awaitModalSubmit needs a positive time.\"),\n );\n const userId = this.user?.id;\n const collector = collect({\n time: options.time,\n max: 1,\n filter: async (interaction) =>\n interaction.isModalSubmit() &&\n interaction.user?.id === userId &&\n (options.customId === undefined ||\n interaction.customId === options.customId) &&\n (options.filter ? await options.filter(interaction) : true),\n });\n return collector.next() as Promise<ModalSubmitInteraction>;\n }\n /** Whether this interaction is a message component. @returns True for component interactions. */\n public isMessageComponent(): this is ComponentInteraction {\n return this.type === InteractionEnum.MessageComponent;\n }\n /** Whether this interaction is a modal submission. @returns True for modal submissions. */\n public isModalSubmit(): this is ModalSubmitInteraction {\n return this.type === InteractionEnum.ModalSubmit;\n }\n /** Whether this interaction is autocomplete. @returns True for autocomplete interactions. */\n public isAutocomplete(): this is AutocompleteInteraction {\n return this.type === InteractionEnum.ApplicationCommandAutocomplete;\n }\n /** Message component type of this interaction, or 0 when it is not a component. */\n #componentType(): number {\n return this.isMessageComponent()\n ? ((this.data.data?.component_type as number | undefined) ?? 0)\n : 0;\n }\n /** Whether this is a button interaction. */\n public isButton(): this is ComponentInteraction {\n return this.#componentType() === 2;\n }\n /** Whether this is a string select menu interaction. */\n public isStringSelectMenu(): this is ComponentInteraction {\n return this.#componentType() === 3;\n }\n /** Whether this is a user select menu interaction. */\n public isUserSelectMenu(): this is ComponentInteraction {\n return this.#componentType() === 5;\n }\n /** Whether this is a role select menu interaction. */\n public isRoleSelectMenu(): this is ComponentInteraction {\n return this.#componentType() === 6;\n }\n /** Whether this is a mentionable select menu interaction. */\n public isMentionableSelectMenu(): this is ComponentInteraction {\n return this.#componentType() === 7;\n }\n /** Whether this is a channel select menu interaction. */\n public isChannelSelectMenu(): this is ComponentInteraction {\n return this.#componentType() === 8;\n }\n /** Whether this is any select menu interaction. */\n public isAnySelectMenu(): this is ComponentInteraction {\n return [3, 5, 6, 7, 8].includes(this.#componentType());\n }\n /** Ensures the interaction has not already been acknowledged. @returns Nothing. @throws {Error} When already acknowledged. */\n protected assertUnacknowledged(): void {\n if (this.replied || this.deferred || this.#acknowledging)\n throw new Error(\"Interaction has already been acknowledged.\");\n }\n /**\n * Sends the initial response exactly once. The in-flight flag is set\n * before the request, so two concurrent calls cannot both send; it is\n * cleared if the request fails so the caller may try again.\n */\n protected async acknowledge(\n response: InteractionResponse,\n state: \"replied\" | \"deferred\",\n ): Promise<unknown> {\n this.assertUnacknowledged();\n this.#acknowledging = true;\n try {\n const result = await this.postResponse(response);\n this[state] = true;\n this.#responseType = response.type;\n return result;\n } catch (error) {\n // 40060: Discord already holds a response (one sent before a\n // timeout, or by another handler). Record that, so editReply()\n // and followUp() can still reach it.\n if ((error as { code?: unknown } | null)?.code === 40060) {\n this[state] = true;\n this.#responseType = response.type;\n }\n throw error;\n } finally {\n this.#acknowledging = false;\n }\n }\n /** The invoking user (from `member.user` in guilds, `user` in DMs). */\n public get user(): User | null {\n const raw =\n (this.data.member as { user?: unknown } | undefined)?.user ??\n this.data.user;\n return raw\n ? new User(raw as ConstructorParameters<typeof User>[0])\n : null;\n }\n /** The invoking guild member, or null outside a guild. */\n public get member(): GuildMember | null {\n const raw = this.data.member;\n if (!raw || !this.guildId) return null;\n return new GuildMember(\n {\n ...(raw as Omit<\n ConstructorParameters<typeof GuildMember>[0],\n \"guild_id\"\n >),\n guild_id: this.guildId,\n },\n this.#client.resourceContext,\n );\n }\n /** Unix timestamp (ms) at which the interaction was created, from its snowflake. */\n public get createdTimestamp(): number {\n return Number((BigInt(this.id) >> 22n) + DISCORD_EPOCH);\n }\n /** When the interaction token stops working (15 minutes after creation). */\n public get expiresAt(): Date {\n return new Date(this.createdTimestamp + TOKEN_LIFETIME_MS);\n }\n /** Whether the token has expired; no response, edit or follow-up can succeed after that. */\n public get isExpired(): boolean {\n return Date.now() >= this.createdTimestamp + TOKEN_LIFETIME_MS;\n }\n #webhookMessage(\n method: \"GET\" | \"PATCH\" | \"DELETE\",\n messageId: string,\n data?: InteractionReplyOptions,\n ): Promise<unknown> {\n if (!this.#client.interactionWebhookMessage)\n return Promise.reject(\n new Error(\n \"This interaction client does not support webhook message access.\",\n ),\n );\n return this.#client.interactionWebhookMessage(\n method,\n this.applicationId,\n this.token,\n messageId,\n data,\n );\n }\n /** Fetches the original response message. */\n public fetchReply(): Promise<unknown> {\n this.assertHasReply();\n return this.#webhookMessage(\"GET\", \"@original\");\n }\n /** Edits a follow-up message. @param messageId Follow-up message ID. */\n public editFollowUp(\n messageId: string,\n options: InteractionReplyOptions | string,\n ): Promise<unknown> {\n return this.#webhookMessage(\"PATCH\", messageId, toMessageData(options));\n }\n /** Deletes a follow-up message. @param messageId Follow-up message ID. */\n public async deleteFollowUp(messageId: string): Promise<void> {\n await this.#webhookMessage(\"DELETE\", messageId);\n }\n /** Ensures the interaction has been acknowledged. @returns Nothing. @throws {Error} When not acknowledged. */\n protected assertAcknowledged(): void {\n if (!this.replied && !this.deferred)\n throw new Error(\"Interaction has not been acknowledged.\");\n }\n /** Ensures there is an original response message: a modal or autocomplete answer has none. @throws {Error} When not acknowledged, or answered without a message. */\n protected assertHasReply(): void {\n this.assertAcknowledged();\n if (\n this.#responseType === InteractionResponseEnum.Modal ||\n this.#responseType === InteractionResponseEnum.Autocomplete\n )\n throw new Error(\n \"Interaction was answered with a modal or autocomplete choices and has no reply message.\",\n );\n }\n /** Posts a raw interaction response callback. */\n protected postResponse(response: InteractionResponse): Promise<unknown> {\n return this.#client.postInteractionResponse(\n this.id,\n this.token,\n response,\n );\n }\n /**\n * Sends a response and, when `withResponse` is set, turns the callback\n * resource Discord returns into the created message.\n */\n protected async acknowledgeWith(\n response: InteractionResponse,\n state: \"replied\" | \"deferred\",\n withResponse: boolean,\n ): Promise<unknown> {\n response.withResponse = withResponse;\n const result = await this.acknowledge(response, state);\n if (!withResponse) return result;\n const message = (result as { resource?: { message?: unknown } } | null)\n ?.resource?.message;\n return message\n ? new Message(\n message as ConstructorParameters<typeof Message>[0],\n this.#client.resourceContext,\n )\n : null;\n }\n /**\n * Sends the initial interaction response. With `withResponse: true` it\n * returns the created {@link Message} in the same request (no `fetchReply()`).\n * @throws {Error} When already acknowledged or REST fails.\n */\n public async reply(\n options: InteractionReplyOptions & { withResponse: true },\n ): Promise<Message | null>;\n public async reply(\n options: InteractionReplyOptions | string,\n ): Promise<unknown>;\n public async reply(\n options: InteractionReplyOptions | string,\n ): Promise<unknown> {\n const { withResponse, rest } = splitWithResponse(options);\n return this.acknowledgeWith(\n InteractionResponse.message(toMessageData(rest)),\n \"replied\",\n withResponse,\n );\n }\n /**\n * Defers the initial interaction response. `true` or `{ ephemeral: true }`\n * makes the eventual response private; `withResponse: true` returns the\n * placeholder message. @throws {Error} When already acknowledged or REST fails.\n */\n public async deferReply(options: {\n ephemeral?: boolean;\n withResponse: true;\n }): Promise<Message | null>;\n public async deferReply(\n options?: boolean | { ephemeral?: boolean; withResponse?: boolean },\n ): Promise<void>;\n public async deferReply(\n options:\n boolean | { ephemeral?: boolean; withResponse?: boolean } = false,\n ): Promise<Message | null | void> {\n const ephemeral =\n typeof options === \"boolean\" ? options : options.ephemeral === true;\n const withResponse =\n typeof options === \"object\" && options.withResponse === true;\n const result = await this.acknowledgeWith(\n InteractionResponse.defer(ephemeral),\n \"deferred\",\n withResponse,\n );\n if (withResponse) return result as Message | null;\n }\n /** Edits the original response. @param options Replacement message options. @returns Discord response. @throws {Error} When not acknowledged or REST fails. */\n public editReply(options: InteractionReplyOptions): Promise<unknown> {\n this.assertHasReply();\n return this.#client.editInteractionReply(\n this.token,\n toMessageData(options),\n this.applicationId,\n );\n }\n /** Deletes the original response. @returns Promise fulfilled after deletion. @throws {Error} When not acknowledged or REST fails. */\n public deleteReply(): Promise<void> {\n this.assertHasReply();\n return this.#client.deleteInteractionReply(\n this.token,\n this.applicationId,\n );\n }\n /** Sends a follow-up message using the interaction webhook. @param options Follow-up message options. @returns Discord response. @throws {Error} When not acknowledged (Discord has no webhook before the initial response) or REST fails. */\n public followUp(\n options: InteractionReplyOptions | string,\n ): Promise<unknown> {\n this.assertAcknowledged();\n return this.#client.followUpInteraction(\n this.token,\n toMessageData(options),\n this.applicationId,\n );\n }\n /**\n * Updates the message a component is on. With `withResponse: true` it\n * returns the updated {@link Message}.\n */\n public async update(\n options: InteractionReplyOptions & { withResponse: true },\n ): Promise<Message | null>;\n public async update(\n options: InteractionReplyOptions | string,\n ): Promise<unknown>;\n public async update(\n options: InteractionReplyOptions | string,\n ): Promise<unknown> {\n this.assertOnMessage(\"update\");\n const { withResponse, rest } = splitWithResponse(options);\n return this.acknowledgeWith(\n new InteractionResponse(\n InteractionResponseEnum.MessageUpdate,\n toMessageData(rest),\n ),\n \"replied\",\n withResponse,\n );\n }\n /** Ensures a message-update response fits: a component, or a modal opened from one. @throws {Error} Otherwise. */\n protected assertOnMessage(method: string): void {\n if (\n this.type === InteractionEnum.MessageComponent ||\n (this.type === InteractionEnum.ModalSubmit && this.data.message)\n )\n return;\n throw new Error(\n `Interaction ${method}() only works on component interactions and modals opened from a component; use reply() instead.`,\n );\n }\n /** Opens a modal dialog in the user's client. @param modal Modal builder output or raw modal callback data. @returns Discord response. @throws {Error} When already acknowledged or REST fails. */\n public async showModal(\n modal:\n | {\n toJSON(): {\n custom_id: string;\n title: string;\n components: unknown[];\n };\n }\n // No index signature: an interface such as the builder's\n // `APIModalComponent` (what `toJSON()` returns) must be assignable.\n | {\n custom_id: string;\n title: string;\n components: readonly unknown[];\n },\n ): Promise<unknown> {\n const data =\n \"toJSON\" in modal && typeof modal.toJSON === \"function\"\n ? modal.toJSON()\n : modal;\n return this.acknowledge(\n new InteractionResponse(\n InteractionResponseEnum.Modal,\n data as InteractionReplyOptions,\n ),\n \"replied\",\n );\n }\n}\n\n// ─── CommandInteraction ───────────────────────────────────────────────────────\n\n/** Application command interaction with fully typed option resolver. */\nexport class CommandInteraction extends Interaction {\n /** Typed option resolver. Access slash command options with full type safety. */\n public readonly options: CommandOptions;\n\n /** Invoked command name. @returns Command name or an empty string. */\n public get commandName(): string {\n return typeof this.data.data?.name === \"string\"\n ? this.data.data.name\n : \"\";\n }\n\n public constructor(client: InteractionClient, data: InteractionData) {\n super(client, data);\n const rawOptions =\n (data.data?.options as APIInteractionDataOption[]) ?? [];\n const resolved = (data.data?.resolved as Record<string, unknown>) ?? {};\n // Hand the resolver the *top-level* options. CommandOptions performs the\n // subcommand/group drill itself and records the names it walks through;\n // pre-drilling here would strip those wrappers before it sees them, so\n // getSubcommand()/getSubcommandGroup() would report null.\n this.options = new CommandOptions(rawOptions, resolved);\n }\n}\n\n// ─── ContextMenuCommandInteraction ───────────────────────────────────────────\n\n/** A user or message context-menu command, with what was right-clicked. */\nexport class ContextMenuCommandInteraction extends CommandInteraction {\n #resolved(): Record<string, Record<string, unknown> | undefined> {\n return (this.data.data?.resolved ?? {}) as Record<\n string,\n Record<string, unknown> | undefined\n >;\n }\n /** ID of the user or message the command was used on. */\n public get targetId(): string | null {\n const id = this.data.data?.target_id;\n return typeof id === \"string\" ? id : null;\n }\n /** The user a user command was used on. */\n public get targetUser(): User | null {\n const id = this.targetId;\n const raw = id ? this.#resolved().users?.[id] : undefined;\n return raw\n ? new User(raw as ConstructorParameters<typeof User>[0])\n : null;\n }\n /** The member a user command was used on (in a guild), with member actions when attached to a client. */\n public get targetMember(): GuildMember | null {\n const id = this.targetId;\n const raw = id ? this.#resolved().members?.[id] : undefined;\n const user = id ? this.#resolved().users?.[id] : undefined;\n if (!raw || !user || !this.guildId) return null;\n return new GuildMember(\n {\n ...(raw as Omit<\n ConstructorParameters<typeof GuildMember>[0],\n \"guild_id\" | \"user\"\n >),\n user: user as ConstructorParameters<\n typeof GuildMember\n >[0][\"user\"],\n guild_id: this.guildId,\n },\n this.resourceContext,\n );\n }\n /** The message a message command was used on. */\n public get targetMessage(): Message | null {\n const id = this.targetId;\n const raw = id ? this.#resolved().messages?.[id] : undefined;\n return raw\n ? new Message(\n raw as unknown as ConstructorParameters<typeof Message>[0],\n this.resourceContext,\n )\n : null;\n }\n}\n\n// ─── ComponentInteraction ─────────────────────────────────────────────────────\n\n/** Message component interaction. */\nexport class ComponentInteraction extends Interaction {\n /** Gets component custom ID. */\n public get customId(): string {\n const id = this.data.data?.custom_id;\n return typeof id === \"string\" ? id : \"\";\n }\n /** ID of the message the component is on. */\n public get messageId(): string | undefined {\n return (this.data.message as { id?: string } | undefined)?.id;\n }\n /** Gets component type. */\n public get componentType(): number {\n const type = this.data.data?.component_type;\n return typeof type === \"number\" ? type : 0;\n }\n /** Gets selected values for select menu component interactions. */\n public get values(): string[] {\n const values = this.data.data?.values;\n return Array.isArray(values) ? (values as string[]) : [];\n }\n /** Defers updating the message to which the component was attached. */\n public async deferUpdate(options: {\n withResponse: true;\n }): Promise<Message | null>;\n public async deferUpdate(options?: {\n withResponse?: boolean;\n }): Promise<void>;\n public async deferUpdate(\n options: { withResponse?: boolean } = {},\n ): Promise<Message | null | void> {\n this.assertOnMessage(\"deferUpdate\");\n const withResponse = options.withResponse === true;\n const result = await this.acknowledgeWith(\n new InteractionResponse(\n InteractionResponseEnum.DeferredMessageUpdate,\n ),\n \"deferred\",\n withResponse,\n );\n if (withResponse) return result as Message | null;\n }\n}\n\n// ─── ModalSubmitInteraction ───────────────────────────────────────────────────\n\n/** Represents a Discord modal submission interaction. */\nexport class ModalSubmitInteraction extends Interaction {\n /** Gets the submitted modal custom ID. */\n public get customId(): string {\n const id = this.data.data?.custom_id;\n return typeof id === \"string\" ? id : \"\";\n }\n\n /** Retrieves the text value for a specific text input custom ID. @param customId The custom_id of the text input component. @returns The submitted text, or undefined if not found. */\n public getInputValue(customId: string): string | undefined {\n const rows =\n (this.data.data?.components as\n | { components?: { custom_id?: string; value?: string }[] }[]\n | undefined) ?? [];\n for (const row of rows) {\n for (const comp of row.components ?? []) {\n if (comp.custom_id === customId) return comp.value;\n }\n }\n return undefined;\n }\n\n /** Retrieves the text value for a text input, throwing if missing. @param customId The custom_id of the text input component. @returns The submitted text. @throws {TypeError} If the field is not found. */\n public getRequiredInputValue(customId: string): string {\n const value = this.getInputValue(customId);\n if (value === undefined)\n throw new TypeError(\n `Modal input \"${customId}\" was not found in the submission.`,\n );\n return value;\n }\n}\n\n// ─── AutocompleteInteraction ──────────────────────────────────────────────────\n\n/** Represents a Discord slash command autocomplete interaction. */\nexport class AutocompleteInteraction extends Interaction {\n /** Option resolver; use `options.getFocused()` for the focused value. */\n public readonly options: CommandOptions;\n\n public constructor(client: InteractionClient, data: InteractionData) {\n super(client, data);\n this.options = new CommandOptions(\n (data.data?.options as APIInteractionDataOption[]) ?? [],\n );\n }\n\n /** Gets the target command name. */\n public get commandName(): string {\n const name = this.data.data?.name;\n return typeof name === \"string\" ? name : \"\";\n }\n\n /** Gets the currently focused autocomplete option. */\n public get focusedOption():\n { name: string; value: unknown; type: number } | undefined {\n const options = this.data.data?.options;\n return findFocused(\n Array.isArray(options) ? (options as FocusableOption[]) : [],\n );\n }\n\n /** Responds to Discord with autocomplete choices. @param choices Array of name/value pairs to show. @throws {TypeError} If choices is not an array. */\n public async respond(\n choices: { name: string; value: string | number }[],\n ): Promise<void> {\n if (!Array.isArray(choices))\n throw new TypeError(\"Autocomplete choices must be an array.\");\n const response = new InteractionResponse(\n InteractionResponseEnum.Autocomplete,\n { choices } as InteractionReplyOptions,\n );\n await this.acknowledge(response, \"replied\");\n }\n}\n\n/** An option as Discord sends it in autocomplete data. */\ninterface FocusableOption {\n name: string;\n value?: unknown;\n type: number;\n focused?: boolean;\n options?: FocusableOption[];\n}\n\n/** Recursively finds the focused option in a nested options tree. */\nfunction findFocused(\n options: FocusableOption[],\n): { name: string; value: unknown; type: number } | undefined {\n for (const opt of options) {\n if (opt.focused)\n return { name: opt.name, value: opt.value, type: opt.type };\n if (Array.isArray(opt.options)) {\n const found = findFocused(opt.options);\n if (found) return found;\n }\n }\n return undefined;\n}\n\n// ─── Factory ──────────────────────────────────────────────────────────────────\n\n/**\n * Creates a specialized interaction structure for a Gateway payload.\n * @param client Interaction transport.\n * @param data Gateway interaction payload.\n * @returns Specialized interaction structure.\n * @throws {TypeError} If required identifiers are missing.\n */\nexport function createInteraction(\n client: InteractionClient,\n data: InteractionData,\n): Interaction {\n switch (data.type) {\n case InteractionEnum.ApplicationCommand: {\n const commandType = data.data?.type;\n return commandType === COMMAND_USER ||\n commandType === COMMAND_MESSAGE\n ? new ContextMenuCommandInteraction(client, data)\n : new CommandInteraction(client, data);\n }\n case InteractionEnum.ApplicationCommandAutocomplete:\n return new AutocompleteInteraction(client, data);\n case InteractionEnum.MessageComponent:\n return new ComponentInteraction(client, data);\n case InteractionEnum.ModalSubmit:\n return new ModalSubmitInteraction(client, data);\n default:\n return new Interaction(client, data);\n }\n}\n",
|
|
11
|
+
"import type {\n APIEmbed,\n APIEmbedAuthor,\n APIEmbedField,\n APIEmbedFooter,\n APIEmbedMedia,\n} from \"@lunibee/types\";\n\n/**\n * A rich Embed structure that wraps a Discord API embed object.\n * Provides typed accessors and a fluent builder interface.\n */\nexport class Embed {\n #data: APIEmbed;\n\n /** Creates an Embed from raw Discord API data, or starts a blank embed. */\n public constructor(data: APIEmbed = {}) {\n this.#data = { ...data };\n if (this.#data.fields) this.#data.fields = [...this.#data.fields];\n }\n\n // ── Read accessors ───────────────────────────────────────────────────────\n\n /** Embed title. */\n public get title(): string | undefined {\n return this.#data.title;\n }\n /** Embed description. */\n public get description(): string | undefined {\n return this.#data.description;\n }\n /** Embed URL. */\n public get url(): string | undefined {\n return this.#data.url;\n }\n /** Embed color as an integer. */\n public get color(): number | undefined {\n return this.#data.color;\n }\n /** Embed timestamp ISO 8601 string. */\n public get timestamp(): string | undefined {\n return this.#data.timestamp;\n }\n /** Embed timestamp as a Date object, or undefined. */\n public get createdAt(): Date | undefined {\n return this.#data.timestamp\n ? new Date(this.#data.timestamp)\n : undefined;\n }\n /** Embed footer. */\n public get footer(): APIEmbedFooter | undefined {\n return this.#data.footer;\n }\n /** Embed image. */\n public get image(): APIEmbedMedia | undefined {\n return this.#data.image;\n }\n /** Embed thumbnail. */\n public get thumbnail(): APIEmbedMedia | undefined {\n return this.#data.thumbnail;\n }\n /** Embed video. */\n public get video(): APIEmbedMedia | undefined {\n return this.#data.video;\n }\n /** Embed author. */\n public get author(): APIEmbedAuthor | undefined {\n return this.#data.author;\n }\n /** Embed fields (read-only copy). */\n public get fields(): readonly APIEmbedField[] {\n return this.#data.fields ?? [];\n }\n\n // ── Fluent builder methods ────────────────────────────────────────────────\n\n /** Sets the embed title. @param title Embed title text (max 256 chars). @throws {TypeError} If title exceeds 256 characters. */\n public setTitle(title: string): this {\n if (title.length > 256)\n throw new TypeError(\"Embed title must not exceed 256 characters.\");\n this.#data.title = title;\n return this;\n }\n\n /** Sets the embed description. @param description Embed description (max 4096 chars). @throws {TypeError} If description exceeds 4096 characters. */\n public setDescription(description: string): this {\n if (description.length > 4096)\n throw new TypeError(\n \"Embed description must not exceed 4096 characters.\",\n );\n this.#data.description = description;\n return this;\n }\n\n /** Sets the embed URL. @param url A valid URL string. */\n public setURL(url: string): this {\n this.#data.url = url;\n return this;\n }\n\n /** Sets the embed color. Accepts a hex number (0xff0000), decimal integer, or hex string (\"#ff0000\"). @param color Color value. */\n public setColor(color: number | string): this {\n if (typeof color === \"string\") {\n const hex = color.replace(/^#/, \"\");\n this.#data.color = parseInt(hex, 16);\n } else {\n this.#data.color = color;\n }\n return this;\n }\n\n /** Sets the embed timestamp. Accepts a Date, ISO string, or number (ms since epoch). Defaults to now. */\n public setTimestamp(timestamp: Date | string | number = Date.now()): this {\n this.#data.timestamp = new Date(timestamp).toISOString();\n return this;\n }\n\n /** Sets the embed footer. @param text Footer text (max 2048 chars). @param iconURL Optional footer icon URL. */\n public setFooter(text: string, iconURL?: string): this {\n if (text.length > 2048)\n throw new TypeError(\n \"Embed footer text must not exceed 2048 characters.\",\n );\n this.#data.footer = iconURL ? { text, icon_url: iconURL } : { text };\n return this;\n }\n\n /** Sets the embed image. @param url Image URL. */\n public setImage(url: string): this {\n this.#data.image = { url };\n return this;\n }\n\n /** Sets the embed thumbnail. @param url Thumbnail URL. */\n public setThumbnail(url: string): this {\n this.#data.thumbnail = { url };\n return this;\n }\n\n /** Sets the embed author. @param name Author name (max 256 chars). @param options Optional URL and icon URL. */\n public setAuthor(\n name: string,\n options: { url?: string; iconURL?: string } = {},\n ): this {\n if (name.length > 256)\n throw new TypeError(\n \"Embed author name must not exceed 256 characters.\",\n );\n this.#data.author = {\n name,\n url: options.url,\n icon_url: options.iconURL,\n };\n return this;\n }\n\n /** Adds one or more fields to the embed. @param fields Fields to add (max 25 total). @throws {TypeError} If adding exceeds 25 fields. */\n public addFields(...fields: APIEmbedField[]): this {\n const existing = this.#data.fields ?? [];\n if (existing.length + fields.length > 25)\n throw new TypeError(\"Embeds cannot have more than 25 fields.\");\n for (const field of fields) {\n if (field.name.length > 256)\n throw new TypeError(\n \"Embed field name must not exceed 256 characters.\",\n );\n if (field.value.length > 1024)\n throw new TypeError(\n \"Embed field value must not exceed 1024 characters.\",\n );\n }\n this.#data.fields = [...existing, ...fields];\n return this;\n }\n\n /** Removes all fields from the embed. */\n public clearFields(): this {\n this.#data.fields = [];\n return this;\n }\n\n /** Splices the fields array, replacing, inserting, or deleting fields. @param index Start index. @param deleteCount Number of fields to remove. @param fields Replacement fields. */\n public spliceFields(\n index: number,\n deleteCount: number,\n ...fields: APIEmbedField[]\n ): this {\n const next = [...(this.#data.fields ?? [])];\n next.splice(index, deleteCount, ...fields);\n if (next.length > 25)\n throw new TypeError(\"Embeds cannot have more than 25 fields.\");\n for (const field of fields) {\n if (field.name.length > 256)\n throw new TypeError(\n \"Embed field name must not exceed 256 characters.\",\n );\n if (field.value.length > 1024)\n throw new TypeError(\n \"Embed field value must not exceed 1024 characters.\",\n );\n }\n this.#data.fields = next;\n return this;\n }\n\n // ── Serialization ─────────────────────────────────────────────────────────\n\n /** Returns the raw Discord API embed payload. */\n public toJSON(): APIEmbed {\n const json = { ...this.#data };\n if (json.fields) json.fields = [...json.fields];\n return json;\n }\n\n /** Creates an Embed from an existing raw API embed object. */\n public static from(data: APIEmbed): Embed {\n return new Embed(data);\n }\n}\n",
|
|
12
|
+
"import { BaseStructure } from \"./base.js\";\nimport type {\n APIAuditLog,\n APIAuditLogEntry,\n APIAuditLogChange,\n APIAuditLogOptions,\n} from \"@lunibee/types\";\n\n/** What `info` holds for each action type that carries extra details (numbers are parsed from Discord's strings). */\nexport interface AuditLogInfoByType {\n /** Overwrite created, updated or deleted: a role (`type` 0) or a member (`type` 1). */\n 13: AuditLogOverwriteInfo;\n 14: AuditLogOverwriteInfo;\n 15: AuditLogOverwriteInfo;\n /** Member prune. */\n 21: { deleteMemberDays: number; membersRemoved: number };\n /** Members moved between voice channels. */\n 26: { channelId: string; count: number };\n /** Members disconnected from voice. */\n 27: { count: number };\n /** Message deleted in a channel. */\n 72: { channelId: string; count: number };\n /** Messages bulk deleted. */\n 73: { count: number };\n /** Message pinned or unpinned. */\n 74: { channelId: string; messageId: string };\n 75: { channelId: string; messageId: string };\n /** Stage instance created, updated or deleted. */\n 83: { channelId: string };\n 84: { channelId: string };\n 85: { channelId: string };\n /** Application command permissions updated. */\n 121: { applicationId: string };\n /** AutoMod blocked a message, flagged it, or timed a member out. */\n 143: AuditLogAutoModInfo;\n 144: AuditLogAutoModInfo;\n 145: AuditLogAutoModInfo;\n}\n\n/** The overwrite an audit entry is about. */\nexport interface AuditLogOverwriteInfo {\n /** The role or user the overwrite is for. */\n id: string;\n /** 0 role, 1 member. */\n type: number;\n roleName?: string;\n}\n\n/** The rule behind an AutoMod audit entry. */\nexport interface AuditLogAutoModInfo {\n ruleName: string;\n ruleTriggerType: number;\n channelId?: string;\n}\n\n/** The details object of an action type, or `undefined` when the type has none. */\nexport type AuditLogInfo<T extends number> = number extends T\n ? AuditLogInfoByType[keyof AuditLogInfoByType] | undefined\n : T extends keyof AuditLogInfoByType\n ? AuditLogInfoByType[T]\n : undefined;\n\nfunction int(value: string | undefined): number {\n return Number(value ?? 0);\n}\n\n/** Reads Discord's string-valued options into the typed `info` of one action type. */\nfunction parseInfo(\n type: number,\n options: APIAuditLogOptions | undefined,\n): AuditLogInfoByType[keyof AuditLogInfoByType] | undefined {\n if (!options) return undefined;\n switch (type) {\n case 13:\n case 14:\n case 15:\n return {\n id: options.id ?? \"\",\n type: int(options.type),\n roleName: options.role_name,\n };\n case 21:\n return {\n deleteMemberDays: int(options.delete_member_days),\n membersRemoved: int(options.members_removed),\n };\n case 26:\n case 72:\n return {\n channelId: options.channel_id ?? \"\",\n count: int(options.count),\n };\n case 27:\n case 73:\n return { count: int(options.count) };\n case 74:\n case 75:\n return {\n channelId: options.channel_id ?? \"\",\n messageId: options.message_id ?? \"\",\n };\n case 83:\n case 84:\n case 85:\n return { channelId: options.channel_id ?? \"\" };\n case 121:\n return { applicationId: options.app_id ?? \"\" };\n case 143:\n case 144:\n case 145:\n return {\n ruleName: options.auto_moderation_rule_name ?? \"\",\n ruleTriggerType: int(options.auto_moderation_rule_trigger_type),\n channelId: options.channel_id,\n };\n default:\n return undefined;\n }\n}\n\n/** Represents a single entry in a Discord audit log. */\nexport class AuditLogEntry<T extends number = number> extends BaseStructure {\n /** The ID of the affected entity. */\n public readonly targetId: string | null;\n /** The ID of the user who made the changes. */\n public readonly userId: string | null;\n /** The action type of this entry. */\n public readonly actionType: T;\n /** The changes made to the target. */\n public readonly changes: APIAuditLogChange[];\n /** Additional info for certain action types. */\n public readonly options: APIAuditLogOptions | null;\n /** The action's details with numbers parsed, typed by action type (`undefined` for types that have none). `options` is Discord's raw object. */\n public readonly info: AuditLogInfo<T>;\n /** The reason for the change, if any. */\n public readonly reason: string | null;\n\n /** Creates an audit log entry. */\n public constructor(data: APIAuditLogEntry) {\n super(data.id);\n this.targetId = data.target_id;\n this.userId = data.user_id;\n this.actionType = data.action_type as T;\n this.info = parseInfo(\n data.action_type,\n data.options,\n ) as AuditLogInfo<T>;\n this.changes = data.changes ?? [];\n this.options = data.options ?? null;\n this.reason = data.reason ?? null;\n }\n\n /** Narrows the entry to one action type, so `info` is typed for it. */\n public is<K extends number>(type: K): this is AuditLogEntry<K> {\n return (this.actionType as number) === type;\n }\n\n /** One change by its key (`\"nick\"`, `\"permissions\"`...), or `undefined`. */\n public change(key: string): { old: unknown; new: unknown } | undefined {\n const found = this.changes.find((change) => change.key === key);\n return found && { old: found.old_value, new: found.new_value };\n }\n}\n\n/** Which entries {@link AuditLog.find} and {@link AuditLog.filter} keep. Every field given must match. */\nexport interface AuditLogQuery<T extends number = number> {\n /** One action type, or any of several. */\n type?: T | readonly T[];\n /** The affected entity. */\n targetId?: string;\n /** Who did it. */\n userId?: string;\n /** Only entries created at or after this time (a Date, an ISO string or milliseconds). */\n since?: Date | string | number;\n}\n\n/** Represents a Discord audit log. */\nexport class AuditLog {\n /** The entries in the audit log. */\n public readonly entries: Map<string, AuditLogEntry>;\n // Depending on what else is needed, we could parse the users, webhooks, etc.\n // However, the typical structure mainly exposes the entries.\n\n /** Creates an audit log. */\n public constructor(data: APIAuditLog) {\n this.entries = new Map();\n for (const entryData of data.audit_log_entries) {\n this.entries.set(entryData.id, new AuditLogEntry(entryData));\n }\n }\n\n /** The entries that match `query`, newest first (the order Discord returns them in). */\n public filter<T extends number = number>(\n query: AuditLogQuery<T>,\n ): AuditLogEntry<T>[] {\n const types =\n query.type === undefined\n ? undefined\n : Array.isArray(query.type)\n ? (query.type as readonly number[])\n : [query.type as number];\n const since =\n query.since === undefined\n ? undefined\n : new Date(query.since).getTime();\n const matches: AuditLogEntry<T>[] = [];\n for (const entry of this.entries.values()) {\n if (types && !types.includes(entry.actionType)) continue;\n if (\n query.targetId !== undefined &&\n entry.targetId !== query.targetId\n )\n continue;\n if (query.userId !== undefined && entry.userId !== query.userId)\n continue;\n if (since !== undefined && entry.createdAt.getTime() < since)\n continue;\n matches.push(entry as unknown as AuditLogEntry<T>);\n }\n return matches;\n }\n\n /** The newest entry that matches `query`, or `undefined`. */\n public find<T extends number = number>(\n query: AuditLogQuery<T>,\n ): AuditLogEntry<T> | undefined {\n return this.filter(query)[0];\n }\n}\n",
|
|
13
|
+
"import {\n StickerFormatEnum,\n type APISticker,\n type APIStickerItem,\n type UserData,\n} from \"@lunibee/types\";\nimport { BaseStructure } from \"./base.js\";\n\n/** Where a sticker's image lives on Discord's CDN, by format. Lottie stickers are JSON, GIFs come from the media host. */\nexport function stickerURL(\n id: string,\n format: number,\n options: { size?: number } = {},\n): string {\n const size = options.size === undefined ? \"\" : `?size=${options.size}`;\n if (format === StickerFormatEnum.Lottie)\n return `https://cdn.discordapp.com/stickers/${id}.json`;\n if (format === StickerFormatEnum.GIF)\n return `https://media.discordapp.net/stickers/${id}.gif${size}`;\n return `https://cdn.discordapp.com/stickers/${id}.png${size}`;\n}\n\n/** A sticker: a guild's own, one from a Nitro pack, or a standard one. */\nexport class Sticker extends BaseStructure {\n public readonly name: string;\n public readonly description: string | null;\n /** Comma-separated autocomplete tags. */\n public readonly tags: string;\n /** 1 standard (from a pack), 2 guild. */\n public readonly type: number;\n /** 1 PNG, 2 APNG, 3 Lottie, 4 GIF. */\n public readonly formatType: number;\n /** Whether the sticker can be used (guild stickers become unavailable when the boost level drops). */\n public readonly available: boolean;\n public readonly guildId: string | null;\n public readonly packId: string | null;\n public readonly sortValue: number | null;\n /** Who uploaded it, for guild stickers. */\n public readonly user: UserData | null;\n\n public constructor(data: APISticker) {\n super(data.id);\n this.name = data.name;\n this.description = data.description ?? null;\n this.tags = data.tags ?? \"\";\n this.type = data.type ?? 2;\n this.formatType = data.format_type;\n this.available = data.available ?? true;\n this.guildId = data.guild_id ?? null;\n this.packId = data.pack_id ?? null;\n this.sortValue = data.sort_value ?? null;\n this.user = data.user ?? null;\n }\n\n /** Whether the sticker moves: APNG, Lottie or GIF. */\n public get animated(): boolean {\n return this.formatType !== StickerFormatEnum.PNG;\n }\n\n /** The sticker's image URL (a `.json` file for Lottie). */\n public url(options: { size?: number } = {}): string {\n return stickerURL(this.id, this.formatType, options);\n }\n\n /** The sticker as a message carries it. */\n public toItem(): APIStickerItem {\n return { id: this.id, name: this.name, format_type: this.formatType };\n }\n}\n",
|
|
14
|
+
"/** Resource structures for Discord messages and related entities. */\nimport type { MessageCreateOptions, MessageEditOptions } from \"@lunibee/types\";\nimport { BaseStructure, Channel, User } from \"./base.js\";\nimport { GuildMember } from \"./resources.js\";\nimport type { ComponentInteraction } from \"./interactions.js\";\nimport type { Collector, CollectorOptions } from \"@lunibee/core\";\n\n/** Interaction tokens last 15 minutes, so a component collector with no limit of its own stops then. */\nconst COMPONENT_COLLECTOR_DEFAULT_TIME = 15 * 60_000;\n\n/** Options for {@link Message.createComponentCollector}. */\nexport interface ComponentCollectorOptions extends CollectorOptions<ComponentInteraction> {\n /** Only this component type (2 button, 3 string select...). */\n componentType?: number;\n}\nimport type { ResourceContext } from \"./base.js\";\n\n/** User-authored (non-system) message types: Default, Reply,\n * ChatInputCommand and ContextMenuCommand. Any other type is a system message. */\nconst NON_SYSTEM_MESSAGE_TYPES = new Set([0, 19, 20, 23]);\n\nexport {\n BaseStructure,\n Channel,\n Guild,\n User,\n CDN_BASE,\n cdnURL,\n} from \"./base.js\";\nexport type { ResourceContext, ImageURLOptions } from \"./base.js\";\n\nexport class Message extends BaseStructure {\n public content: string;\n public author: User;\n public channelId: string;\n public readonly channel: Channel;\n public guildId?: string;\n public flags: number;\n /** Message creation timestamp (from timestamp field or snowflake). */\n public readonly timestamp: Date;\n public readonly attachments: import(\"@lunibee/types\").APIAttachment[];\n public readonly embeds: import(\"@lunibee/types\").APIEmbed[];\n public readonly mentions: User[];\n public readonly mentionRoles: string[];\n public pinned: boolean;\n public mentionEveryone: boolean;\n public type: number;\n public readonly reference?: import(\"@lunibee/types\").APIMessageReference;\n public readonly components: import(\"@lunibee/types\").APIMessageComponent[];\n public readonly referencedMessage?: Message | null;\n /** Stickers sent with the message (`sticker_items`). */\n public readonly stickers: import(\"@lunibee/types\").APIStickerItem[];\n /** The poll, when the message is one. */\n public readonly poll: import(\"@lunibee/types\").APIPoll | null;\n /** For a forwarded message, the snapshot of the original. */\n public readonly messageSnapshots: import(\"@lunibee/types\").APIMessageSnapshot[];\n /**\n * The author as a guild member, on guild messages from the Gateway. Its\n * `permissions` are computed from the cached roles; `member.kick()` and the\n * other member actions work when the message came from a client.\n */\n public member: GuildMember | null;\n readonly #context?: ResourceContext;\n\n /** Creates a message structure from Discord message data. */\n public constructor(\n data: import(\"@lunibee/types\").APIMessage,\n context?: ResourceContext,\n ) {\n super(data.id);\n if (!/^\\d{1,20}$/.test(data.channel_id))\n throw new TypeError(\n \"Message channel_id must be a valid snowflake.\",\n );\n this.content = data.content ?? \"\";\n this.author = new User(data.author);\n this.channelId = data.channel_id;\n this.guildId = data.guild_id;\n this.flags = data.flags ?? 0;\n this.timestamp = new Date(\n data.timestamp ?? Number((BigInt(this.id) >> 22n) + 1420070400000n),\n );\n this.attachments = data.attachments ?? [];\n this.embeds = data.embeds ?? [];\n this.components = data.components ?? [];\n this.mentions = (data.mentions ?? []).map((user) => new User(user));\n this.mentionRoles = data.mention_roles ?? [];\n this.pinned = data.pinned ?? false;\n this.mentionEveryone = data.mention_everyone ?? false;\n this.type = data.type ?? 0;\n this.reference = data.message_reference;\n this.stickers =\n data.sticker_items ??\n (data.stickers ?? []).map(({ id, name, format_type }) => ({\n id,\n name,\n format_type,\n }));\n this.poll = data.poll ?? null;\n this.messageSnapshots = data.message_snapshots ?? [];\n this.referencedMessage = data.referenced_message\n ? new Message(data.referenced_message, context)\n : data.referenced_message === null\n ? null\n : undefined;\n this.#context = context;\n this.member =\n data.member && data.guild_id\n ? new GuildMember(\n {\n ...data.member,\n user: data.member.user ?? data.author,\n guild_id: data.guild_id,\n },\n context,\n )\n : null;\n // The cached channel when the client has it; otherwise a placeholder\n // marked partial, since a message carries only the channel's id.\n this.channel =\n context?.cachedChannel?.(data.channel_id) ??\n new Channel(\n { id: data.channel_id, type: 0, guild_id: data.guild_id },\n context,\n { partial: true },\n );\n }\n\n /** Whether embeds are suppressed on this message. */\n public get embedsSuppressed(): boolean {\n return (this.flags & 4) !== 0;\n }\n\n /** Unix timestamp (ms) at which the message was created.\n * Derived from the message `timestamp`, which itself falls back to the id snowflake. */\n public override get createdTimestamp(): number {\n return this.timestamp.getTime();\n }\n\n /** Date at which the message was created. Overrides the\n * snowflake-only `BaseStructure.createdAt` to honour the message `timestamp`. */\n public override get createdAt(): Date {\n return this.timestamp;\n }\n\n /** Edits this message. @param options Message fields to change. @returns The updated message. @throws {Error} If the message is not attached to a client. */\n public edit(options: MessageEditOptions): Promise<Message> {\n if (!this.#context)\n throw new Error(\"This message is not attached to a client.\");\n return this.#context.editMessage(this.channelId, this.id, options);\n }\n\n /** Updates this message using the same resource operation as edit. @param options Message fields to change. @returns The updated message. @throws {Error} If the message is not attached to a client. */\n public update(options: MessageEditOptions): Promise<Message> {\n return this.edit(options);\n }\n\n /** Deletes this message. @param reason Audit-log reason (shown when deleting someone else's message). @returns A promise fulfilled when Discord confirms deletion. @throws {Error} If the message is not attached to a client. */\n public delete(reason?: string): Promise<void> {\n if (!this.#context)\n throw new Error(\"This message is not attached to a client.\");\n return this.#context.deleteMessage(this.channelId, this.id, reason);\n }\n\n /** Replies to this message. @param options Message content or payload. @returns The created reply message. @throws {Error} If the message is not attached to a client. */\n public reply(options: string | MessageCreateOptions): Promise<Message> {\n if (!this.#context)\n throw new Error(\"This message is not attached to a client.\");\n const payload =\n typeof options === \"string\" ? { content: options } : { ...options };\n payload.message_reference = {\n message_id: this.id,\n channel_id: this.channelId,\n guild_id: this.guildId,\n };\n return this.#context.sendMessage(this.channelId, payload);\n }\n\n /** Crossposts this message. @returns The resulting message. @throws {Error} If the message is not attached to a client. */\n public crosspost(): Promise<Message> {\n if (!this.#context)\n throw new Error(\"This message is not attached to a client.\");\n return this.#context.crosspostMessage(this.channelId, this.id);\n }\n\n /**\n * Collects clicks and picks on this message's components. It always ends:\n * after `time`, or 15 minutes (an interaction token's life) when neither\n * `time` nor `idle` is set.\n * @example\n * const collector = message.createComponentCollector({ filter: (i) => i.user?.id === authorId, time: 60_000 });\n * collector.on(\"collect\", (i) => i.update({ content: `Picked ${i.customId}` }));\n */\n public createComponentCollector(\n options: ComponentCollectorOptions = {},\n ): Collector<string, ComponentInteraction> {\n const collect = this.#context?.collectInteractions;\n if (!collect)\n throw new Error(\"This message is not attached to a client.\");\n const { componentType, filter, ...rest } = options;\n return collect({\n ...rest,\n time:\n rest.time ??\n (rest.idle ? undefined : COMPONENT_COLLECTOR_DEFAULT_TIME),\n filter: async (interaction) =>\n interaction.isMessageComponent() &&\n interaction.messageId === this.id &&\n (componentType === undefined ||\n interaction.componentType === componentType) &&\n (filter ? await filter(interaction) : true),\n }) as unknown as Collector<string, ComponentInteraction>;\n }\n\n /**\n * Waits for the next click or pick on this message's components.\n * @param options `time` (default 15 minutes), `filter`, `componentType`.\n * @returns The interaction. @throws {Error} When time runs out first.\n */\n public awaitComponent(\n options: Omit<ComponentCollectorOptions, \"max\"> = {},\n ): Promise<ComponentInteraction> {\n return this.createComponentCollector({ ...options, max: 1 }).next();\n }\n\n /** Adds a reaction to this message. @param emoji Emoji identifier. @returns A promise fulfilled when the reaction is added. @throws {Error} If reactions are unavailable. */\n public react(emoji: string): Promise<void> {\n if (!this.#context?.addReaction)\n throw new Error(\"This message is not attached to a client.\");\n return this.#context.addReaction(this.channelId, this.id, emoji);\n }\n\n /** Removes a reaction from this message. @param emoji Emoji identifier. @param userId User whose reaction should be removed; omit to remove the current user's reaction. @returns A promise fulfilled when the reaction is removed. @throws {Error} If reaction operations are unavailable. */\n public removeReaction(emoji: string, userId?: string): Promise<void> {\n if (!this.#context)\n throw new Error(\"This message is not attached to a client.\");\n return userId\n ? (this.#context.removeReaction?.(\n this.channelId,\n this.id,\n emoji,\n userId,\n ) ??\n Promise.reject(\n new Error(\"Reaction operations are unavailable.\"),\n ))\n : (this.#context.removeOwnReaction?.(\n this.channelId,\n this.id,\n emoji,\n ) ??\n Promise.reject(\n new Error(\"Reaction operations are unavailable.\"),\n ));\n }\n\n /** Removes all reactions from this message. @returns A promise fulfilled when reactions are removed. @throws {Error} If reaction operations are unavailable. */\n public removeAllReactions(): Promise<void> {\n if (!this.#context?.removeAllReactions)\n throw new Error(\"This message is not attached to a client.\");\n return this.#context.removeAllReactions(this.channelId, this.id);\n }\n\n /** Pins this message. @param reason Audit-log reason. @returns A promise fulfilled when the message is pinned. @throws {Error} If pin operations are unavailable. */\n public pin(reason?: string): Promise<void> {\n if (!this.#context?.pinMessage)\n throw new Error(\"This message is not attached to a client.\");\n return this.#context.pinMessage(this.channelId, this.id, reason);\n }\n\n /** Unpins this message. @param reason Audit-log reason. @returns A promise fulfilled when the message is unpinned. @throws {Error} If pin operations are unavailable. */\n public unpin(reason?: string): Promise<void> {\n if (!this.#context?.unpinMessage)\n throw new Error(\"This message is not attached to a client.\");\n return this.#context.unpinMessage(this.channelId, this.id, reason);\n }\n\n // ─── Flag-based getters ───────────────────────────────────────────────────────\n\n /** Whether this message was sent ephemerally (only visible to the recipient). */\n public get isEphemeral(): boolean {\n return (this.flags & 64) !== 0;\n }\n\n /** Whether this message is currently pinned in its channel. */\n public get isPinned(): boolean {\n return this.pinned;\n }\n\n /** Whether this is a system-generated message (join, boost, etc).\n * A message is \"system\" unless its type is one of the user-authored\n * types — Default (0), Reply (19), ChatInputCommand (20) or ContextMenuCommand (23). */\n public get isSystemMessage(): boolean {\n return !NON_SYSTEM_MESSAGE_TYPES.has(this.type);\n }\n\n /** Whether this message was crossposted from an announcement channel. */\n public get isCrosspost(): boolean {\n return (this.flags & 2) !== 0;\n }\n\n /** Whether this message has file attachments. */\n public get hasAttachments(): boolean {\n return this.attachments.length > 0;\n }\n\n /** Whether this message contains embeds. */\n public get hasEmbeds(): boolean {\n return this.embeds.length > 0;\n }\n\n /** Whether this message contains interactive components. */\n public get hasComponents(): boolean {\n return this.components.length > 0;\n }\n\n /** Edits this message to suppress its embeds. @returns The updated message. */\n public suppressEmbeds(): Promise<Message> {\n return this.edit({ flags: this.flags | 4 });\n }\n\n /** Returns a plain-object snapshot of all message fields. */\n public toJSON(): Record<string, unknown> {\n return {\n id: this.id,\n content: this.content,\n channelId: this.channelId,\n guildId: this.guildId,\n flags: this.flags,\n pinned: this.pinned,\n mentionEveryone: this.mentionEveryone,\n type: this.type,\n timestamp: this.timestamp.toISOString(),\n author: { id: this.author.id, username: this.author.username },\n attachments: [...this.attachments],\n embeds: [...this.embeds],\n components: [...this.components],\n mentions: this.mentions.map((u) => u.id),\n mentionRoles: [...this.mentionRoles],\n reference: this.reference,\n referencedMessage: this.referencedMessage\n ? this.referencedMessage.id\n : this.referencedMessage,\n };\n }\n}\n\nexport {\n GuildMember,\n Role,\n TextChannel,\n Invite,\n Webhook,\n WebhookEnum,\n Emoji,\n AutoModerationRule,\n WelcomeScreenChannel,\n GuildWelcomeScreen,\n OnboardingPromptOption,\n OnboardingPrompt,\n GuildOnboarding,\n} from \"./resources.js\";\nexport {\n NewsChannel,\n DMChannel,\n VoiceChannel,\n StageChannel,\n CategoryChannel,\n ThreadChannel,\n ForumChannel,\n MediaChannel,\n createChannel,\n type ChannelOfKind,\n type ChannelsByKind,\n} from \"./channels.js\";\nexport * from \"./interactions.js\";\nexport { Embed } from \"./embed.js\";\nexport {\n AuditLog,\n AuditLogEntry,\n type AuditLogAutoModInfo,\n type AuditLogInfo,\n type AuditLogInfoByType,\n type AuditLogOverwriteInfo,\n type AuditLogQuery,\n} from \"./audit-log.js\";\nexport { Sticker, stickerURL } from \"./sticker.js\";\nexport {\n Permission,\n Permissions,\n PermissionFlagsBits,\n PermissionSet,\n PermissionsBitField,\n PermissionOverwriteEnum,\n computePermissions,\n type PermissionContext,\n type PermissionOverwrite,\n type PermissionRole,\n type PermissionName,\n type PermissionResolvable,\n} from \"./permissions.js\";\n"
|
|
15
|
+
],
|
|
16
|
+
"mappings": "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",
|
|
17
|
+
"debugId": "9E26DAC6B3AA530F64756E2164756E21",
|
|
18
|
+
"names": []
|
|
19
|
+
}
|