lunibee 0.1.4 → 0.1.6
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 +12 -23
- package/dist/builders/components.d.ts +108 -0
- package/dist/builders/index.d.ts +1 -1
- package/dist/builders/index.js +178 -2
- package/dist/builders/index.js.map +3 -3
- package/dist/collection/index.d.ts +6 -0
- package/dist/collection/index.js +33 -2
- package/dist/collection/index.js.map +4 -4
- package/dist/core/events.d.ts +67 -3
- package/dist/core/index.d.ts +120 -90
- package/dist/core/index.js +816 -1021
- package/dist/core/index.js.map +20 -21
- package/dist/formatters/index.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.js +2215 -1392
- package/dist/index.js.map +29 -26
- package/dist/managers/guild.d.ts +30 -0
- package/dist/managers/index.d.ts +56 -75
- package/dist/managers/index.js +339 -48
- package/dist/managers/index.js.map +16 -12
- package/dist/managers/message.d.ts +7 -12
- package/dist/managers/user.d.ts +20 -0
- package/dist/rest/index.d.ts +83 -1
- package/dist/rest/index.js +48 -8
- package/dist/rest/index.js.map +4 -4
- package/dist/rest/routes.d.ts +4 -1
- package/dist/sharding/index.js +4 -1
- package/dist/sharding/index.js.map +4 -4
- package/dist/structures/base.d.ts +99 -48
- package/dist/structures/embed.d.ts +65 -0
- package/dist/structures/index.d.ts +45 -25
- package/dist/structures/index.js +569 -36
- package/dist/structures/index.js.map +10 -8
- package/dist/structures/interactions.d.ts +72 -17
- package/dist/structures/resources.d.ts +9 -5
- package/dist/types/index.d.ts +530 -85
- package/dist/types/index.js +71 -1
- package/dist/types/index.js.map +3 -3
- package/dist/voice/index.js.map +1 -1
- package/dist/ws/index.js +4 -1
- package/dist/ws/index.js.map +4 -4
- package/package.json +15 -15
|
@@ -1,22 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../packages/collection/src/index.ts", "../../packages/managers/src/base.ts", "../../packages/rest/src/routes.ts", "../../packages/structures/src/base.ts", "../../packages/structures/src/permissions.ts", "../../packages/structures/src/resources.ts", "../../packages/structures/src/index.ts", "../../packages/managers/src/message.ts", "../../packages/managers/src/thread.ts", "../../packages/managers/src/role.ts", "../../packages/managers/src/member.ts", "../../packages/managers/src/application.ts", "../../packages/managers/src/index.ts"],
|
|
3
|
+
"sources": ["../../packages/collection/src/index.ts", "../../packages/managers/src/base.ts", "../../packages/rest/src/routes.ts", "../../packages/rest/src/index.ts", "../../packages/structures/src/base.ts", "../../packages/structures/src/permissions.ts", "../../packages/structures/src/resources.ts", "../../packages/types/src/index.ts", "../../packages/structures/src/index.ts", "../../packages/managers/src/message.ts", "../../packages/managers/src/thread.ts", "../../packages/managers/src/user.ts", "../../packages/managers/src/guild.ts", "../../packages/managers/src/role.ts", "../../packages/managers/src/member.ts", "../../packages/managers/src/application.ts", "../../packages/managers/src/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/** A lightweight keyed collection for Lunibee resource and application state. */\r\nexport class Collection<K, V> extends Map<K, V> {\r\n /** Returns the first stored value. */\r\n public first(): V | undefined {\r\n for (const value of this.values()) return value;\r\n return undefined;\r\n }\r\n /** Returns the first stored key. */\r\n public firstKey(): K | undefined {\r\n for (const key of this.keys()) return key;\r\n return undefined;\r\n }\r\n /** Returns the last stored value. */\r\n public last(): V | undefined {\r\n let value: V | undefined;\r\n for (const item of this.values()) value = item;\r\n return value;\r\n }\r\n /** Returns the last stored key. */\r\n public lastKey(): K | undefined {\r\n let key: K | undefined;\r\n for (const item of this.keys()) key = item;\r\n return key;\r\n }\r\n /** Finds the first value matching a predicate. */\r\n public find(\r\n predicate: (value: V, key: K, collection: this) => boolean,\r\n ): V | undefined {\r\n for (const [key, value] of this) {\r\n if (predicate(value, key, this)) return value;\r\n }\r\n return undefined;\r\n }\r\n /** Returns all values matching a predicate. */\r\n public filter(\r\n predicate: (value: V, key: K, collection: this) => boolean,\r\n ): Collection<K, V> {\r\n const result = new Collection<K, V>();\r\n for (const [key, value] of this) {\r\n if (predicate(value, key, this)) result.set(key, value);\r\n }\r\n return result;\r\n }\r\n /** Transforms every stored value into an array. */\r\n public map<T>(transform: (value: V, key: K, collection: this) => T): T[] {\r\n const result: T[] = [];\r\n for (const [key, value] of this) {\r\n result.push(transform(value, key, this));\r\n }\r\n return result;\r\n }\r\n /** Returns whether at least one stored value satisfies a predicate. */\r\n public some(\r\n predicate: (value: V, key: K, collection: this) => boolean,\r\n ): boolean {\r\n for (const [key, value] of this) {\r\n if (predicate(value, key, this)) return true;\r\n }\r\n return false;\r\n }\r\n /** Returns whether every stored value satisfies a predicate. */\r\n public every(\r\n predicate: (value: V, key: K, collection: this) => boolean,\r\n ): boolean {\r\n for (const [key, value] of this) {\r\n if (!predicate(value, key, this)) return false;\r\n }\r\n return true;\r\n }\r\n /** Runs a callback for each stored value. */\r\n public each(callback: (value: V, key: K, collection: this) => unknown): this {\r\n for (const [key, value] of this) {\r\n callback(value, key, this);\r\n }\r\n return this;\r\n }\r\n /** Returns an array containing all stored values. */\r\n public array(): V[] {\r\n return [...this.values()];\r\n }\r\n /** Returns an array containing all stored keys. */\r\n public keyArray(): K[] {\r\n return [...this.keys()];\r\n }\r\n /** Returns a plain array of entries. */\r\n public entriesArray(): [K, V][] {\r\n return [...this.entries()];\r\n }\r\n /** Returns a new collection with the same entries. */\r\n public clone(): Collection<K, V> {\r\n const copy = new Collection<K, V>();\r\n for (const [key, value] of this) copy.set(key, value);\r\n return copy;\r\n }\r\n /** Returns whether all supplied keys are present. */\r\n public hasAll(...keys: K[]): boolean {\r\n for (let i = 0; i < keys.length; i++) {\r\n if (!this.has(keys[i]!)) return false;\r\n }\r\n return true;\r\n }\r\n /** Returns whether at least one supplied key is present. */\r\n public hasAny(...keys: K[]): boolean {\r\n for (let i = 0; i < keys.length; i++) {\r\n if (this.has(keys[i]!)) return true;\r\n }\r\n return false;\r\n }\r\n /** Returns the first key whose value matches a predicate. */\r\n public findKey(\r\n predicate: (value: V, key: K, collection: this) => boolean,\r\n ): K | undefined {\r\n for (const [key, value] of this) {\r\n if (predicate(value, key, this)) return key;\r\n }\r\n return undefined;\r\n }\r\n /** Returns whether a predicate matches at least one entry. */\r\n public someEntry(\r\n predicate: (value: V, key: K, collection: this) => boolean,\r\n ): boolean {\r\n return this.some(predicate);\r\n }\r\n /** Removes every entry matching a predicate and returns the number removed. */\r\n public sweep(\r\n predicate: (value: V, key: K, collection: this) => boolean,\r\n ): number {\r\n let removed = 0;\r\n for (const [key, value] of this) {\r\n if (predicate(value, key, this) && this.delete(key)) removed++;\r\n }\r\n return removed;\r\n }\r\n /** Returns the collection's first matching entry as a tuple. */\r\n public firstEntry(): [K, V] | undefined {\r\n for (const [key, value] of this) return [key, value];\r\n return undefined;\r\n }\r\n /** Returns the collection's last matching entry as a tuple. */\r\n public lastEntry(): [K, V] | undefined {\r\n let entry: [K, V] | undefined;\r\n for (const item of this) entry = [item[0], item[1]];\r\n return entry;\r\n }\r\n}\r\n\r\nexport { Cache } from \"./cache.js\";\r\nexport type { CacheOptions } from \"./cache.js\";\r\n",
|
|
5
|
+
"/** A lightweight keyed collection for Lunibee resource and application state. */\r\nexport class Collection<K, V> extends Map<K, V> {\r\n /** Returns the first stored value. */\r\n public first(): V | undefined {\r\n for (const value of this.values()) return value;\r\n return undefined;\r\n }\r\n /** Returns the first stored key. */\r\n public firstKey(): K | undefined {\r\n for (const key of this.keys()) return key;\r\n return undefined;\r\n }\r\n /** Returns the last stored value. */\r\n public last(): V | undefined {\r\n let value: V | undefined;\r\n for (const item of this.values()) value = item;\r\n return value;\r\n }\r\n /** Returns the last stored key. */\r\n public lastKey(): K | undefined {\r\n let key: K | undefined;\r\n for (const item of this.keys()) key = item;\r\n return key;\r\n }\r\n /** Finds the first value matching a predicate. */\r\n public find(\r\n predicate: (value: V, key: K, collection: this) => boolean,\r\n ): V | undefined {\r\n for (const [key, value] of this) {\r\n if (predicate(value, key, this)) return value;\r\n }\r\n return undefined;\r\n }\r\n /** Returns all values matching a predicate. */\r\n public filter(\r\n predicate: (value: V, key: K, collection: this) => boolean,\r\n ): Collection<K, V> {\r\n const result = new Collection<K, V>();\r\n for (const [key, value] of this) {\r\n if (predicate(value, key, this)) result.set(key, value);\r\n }\r\n return result;\r\n }\r\n /** Transforms every stored value into an array. */\r\n public map<T>(transform: (value: V, key: K, collection: this) => T): T[] {\r\n const result: T[] = [];\r\n for (const [key, value] of this) {\r\n result.push(transform(value, key, this));\r\n }\r\n return result;\r\n }\r\n /** Returns whether at least one stored value satisfies a predicate. */\r\n public some(\r\n predicate: (value: V, key: K, collection: this) => boolean,\r\n ): boolean {\r\n for (const [key, value] of this) {\r\n if (predicate(value, key, this)) return true;\r\n }\r\n return false;\r\n }\r\n /** Returns whether every stored value satisfies a predicate. */\r\n public every(\r\n predicate: (value: V, key: K, collection: this) => boolean,\r\n ): boolean {\r\n for (const [key, value] of this) {\r\n if (!predicate(value, key, this)) return false;\r\n }\r\n return true;\r\n }\r\n /** Runs a callback for each stored value. */\r\n public each(callback: (value: V, key: K, collection: this) => unknown): this {\r\n for (const [key, value] of this) {\r\n callback(value, key, this);\r\n }\r\n return this;\r\n }\r\n /** Returns an array containing all stored values. */\r\n public array(): V[] {\r\n return [...this.values()];\r\n }\r\n /** Returns an array containing all stored keys. */\r\n public keyArray(): K[] {\r\n return [...this.keys()];\r\n }\r\n /** Returns a plain array of entries. */\r\n public entriesArray(): [K, V][] {\r\n return [...this.entries()];\r\n }\r\n /** Returns a new collection with the same entries. */\r\n public clone(): Collection<K, V> {\r\n const copy = new Collection<K, V>();\r\n for (const [key, value] of this) copy.set(key, value);\r\n return copy;\r\n }\r\n /** Returns whether all supplied keys are present. */\r\n public hasAll(...keys: K[]): boolean {\r\n for (let i = 0; i < keys.length; i++) {\r\n if (!this.has(keys[i]!)) return false;\r\n }\r\n return true;\r\n }\r\n /** Returns whether at least one supplied key is present. */\r\n public hasAny(...keys: K[]): boolean {\r\n for (let i = 0; i < keys.length; i++) {\r\n if (this.has(keys[i]!)) return true;\r\n }\r\n return false;\r\n }\r\n /** Returns the first key whose value matches a predicate. */\r\n public findKey(\r\n predicate: (value: V, key: K, collection: this) => boolean,\r\n ): K | undefined {\r\n for (const [key, value] of this) {\r\n if (predicate(value, key, this)) return key;\r\n }\r\n return undefined;\r\n }\r\n /** Returns whether a predicate matches at least one entry. */\r\n public someEntry(\r\n predicate: (value: V, key: K, collection: this) => boolean,\r\n ): boolean {\r\n return this.some(predicate);\r\n }\r\n /** Removes every entry matching a predicate and returns the number removed. */\r\n public sweep(\r\n predicate: (value: V, key: K, collection: this) => boolean,\r\n ): number {\r\n let removed = 0;\r\n for (const [key, value] of this) {\r\n if (predicate(value, key, this) && this.delete(key)) removed++;\r\n }\r\n return removed;\r\n }\r\n /** Returns the collection's first matching entry as a tuple. */\r\n public firstEntry(): [K, V] | undefined {\r\n for (const [key, value] of this) return [key, value];\r\n return undefined;\r\n }\r\n /** Returns the collection's last matching entry as a tuple. */\r\n public lastEntry(): [K, V] | undefined {\r\n let entry: [K, V] | undefined;\r\n for (const item of this) entry = [item[0], item[1]];\r\n return entry;\r\n }\r\n /** Returns a new Collection containing elements from both collections. */\r\n public union(other: Collection<K, V>): Collection<K, V> {\r\n const result = this.clone();\r\n for (const [key, value] of other) result.set(key, value);\r\n return result;\r\n }\r\n /** Returns a new Collection containing only elements present in both collections. */\r\n public intersection(other: Collection<K, V>): Collection<K, V> {\r\n const result = new Collection<K, V>();\r\n for (const [key, value] of this) {\r\n if (other.has(key)) result.set(key, value);\r\n }\r\n return result;\r\n }\r\n /** Returns a new Collection containing elements present in this collection but not the other. */\r\n public difference(other: Collection<K, V>): Collection<K, V> {\r\n const result = new Collection<K, V>();\r\n for (const [key, value] of this) {\r\n if (!other.has(key)) result.set(key, value);\r\n }\r\n return result;\r\n }\r\n}\r\n\r\nexport { Cache } from \"./cache.js\";\r\nexport type { CacheOptions } from \"./cache.js\";\r\n",
|
|
6
6
|
"import { Collection } from \"@lunibee/collection\";\n\n/** Generic cache manager. @typeParam K Cache key type. @typeParam V Cached value type. */\nexport class Manager<K, V> {\n /** Cached resources. */ public readonly cache = new Collection<K, V>();\n /** Gets a cached value. @param id Cache key. @returns Cached value. */ public get(\n id: K,\n ): V | undefined {\n return this.cache.get(id);\n }\n /** Checks whether a value is cached. @param id Cache key. @returns True when cached. */ public has(\n id: K,\n ): boolean {\n return this.cache.has(id);\n }\n /** Stores a value. @param id Cache key. @param value Value. @returns This manager. */ public set(\n id: K,\n value: V,\n ): this {\n this.cache.set(id, value);\n return this;\n }\n /** Deletes a cached value. @param id Cache key. @returns True when deleted. */ public delete(\n id: K,\n ): boolean {\n return this.cache.delete(id);\n }\n /** Clears the cache. @returns Nothing. */ public clear(): void {\n this.cache.clear();\n }\n /** Gets cache size. @returns Number of cached values. */ public get size(): number {\n return this.cache.size;\n }\n /** Gets the first cached value. @returns First value. */ public first():\n V | undefined {\n return this.cache.first();\n }\n /** Returns cached values. @returns Array of values. */ public values(): V[] {\n return this.cache.array();\n }\n /** Finds a cached value. @param predicate Predicate. @returns Matching value. */ public find(\n predicate: (value: V, key: K) => boolean,\n ): V | undefined {\n return this.cache.find(predicate);\n }\n /** Iterates cached entries. @returns Cache iterator. */ public [Symbol.iterator](): IterableIterator<\n [K, V]\n > {\n return this.cache[Symbol.iterator]();\n }\n}\n\n/** Generic REST-backed resource manager. @typeParam K Resource key type. @typeParam V Resource type. */\nexport class ResourceManager<K, V> extends Manager<K, V> {\n readonly #fetcher: (id: K) => Promise<V>;\n readonly #key: (value: V) => K;\n\n public constructor(fetcher: (id: K) => Promise<V>, key: (value: V) => K) {\n super();\n if (typeof fetcher !== \"function\" || typeof key !== \"function\")\n throw new TypeError(\n \"ResourceManager requires fetcher and key functions.\",\n );\n this.#fetcher = fetcher;\n this.#key = key;\n }\n\n public async resolve(id: K): Promise<V> {\n return this.get(id) ?? this.fetch(id);\n }\n\n public async fetch(id: K): Promise<V> {\n const resource = await this.#fetcher(id);\n this.set(id, resource);\n return resource;\n }\n\n public async fetchMany(ids: Iterable<K>): Promise<V[]> {\n return Promise.all([...ids].map((id) => this.resolve(id)));\n }\n\n public upsert(resource: V): V {\n const key = this.#key(resource);\n this.set(key, resource);\n return resource;\n }\n\n public update(resource: V): V {\n return this.upsert(resource);\n }\n}\n",
|
|
7
|
-
"/** Discord REST API route definitions. */\r\nexport const Routes = {\r\n /** Returns the current bot user. @returns User route. */ user: () =>\r\n \"/users/@me\",\r\n /** Returns one user. @param userId User identifier. @returns User route. */ userById:\r\n (userId: string) => `/users/${snowflake(userId, \"User ID\")}`,\r\n /** Returns a guild. @param guildId Guild identifier. @returns Guild route. */ guild:\r\n (guildId: string) => `/guilds/${snowflake(guildId, \"Guild ID\")}`,\r\n /** Returns channels in a guild. @param guildId Guild identifier. @returns Channel collection route. */ guildChannels:\r\n (guildId: string) => `/guilds/${snowflake(guildId, \"Guild ID\")}/channels`,\r\n /** Returns a guild member. @param guildId Guild identifier. @param userId User identifier. @returns Guild-member route. */ guildMember:\r\n (guildId: string, userId: string) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/members/${snowflake(userId, \"User ID\")}`,\r\n /** Returns all guild roles. @param guildId Guild identifier. @returns Guild-role route. */ guildRoles:\r\n (guildId: string) => `/guilds/${snowflake(guildId, \"Guild ID\")}/roles`,\r\n /** Returns an individual guild role. */ guildRole: (\r\n guildId: string,\r\n roleId: string,\r\n ) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/roles/${snowflake(roleId, \"Role ID\")}`,\r\n /** Returns a member role route. */ guildMemberRole: (\r\n guildId: string,\r\n userId: string,\r\n roleId: string,\r\n ) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/members/${snowflake(userId, \"User ID\")}/roles/${snowflake(roleId, \"Role ID\")}`,\r\n /** Returns guild bans collection. */ guildBans: (guildId: string) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/bans`,\r\n /** Returns an individual guild ban. */ guildBan: (\r\n guildId: string,\r\n userId: string,\r\n ) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/bans/${snowflake(userId, \"User ID\")}`,\r\n /** Returns a channel. @param channelId Channel identifier. @returns Channel route. */ channel:\r\n (channelId: string) => `/channels/${snowflake(channelId, \"Channel ID\")}`,\r\n /** Returns messages in a channel. @param channelId Channel identifier. @returns Message collection route. */ channelMessages:\r\n (channelId: string) =>\r\n `/channels/${snowflake(channelId, \"Channel ID\")}/messages`,\r\n /** Returns a message. @param channelId Channel identifier. @param messageId Message identifier. @returns Message route. */ message:\r\n (channelId: string, messageId: string) =>\r\n `/channels/${snowflake(channelId, \"Channel ID\")}/messages/${snowflake(messageId, \"Message ID\")}`,\r\n /** Crossposts a message. @param channelId Channel identifier. @param messageId Message identifier. @returns Crosspost route. */ crosspostMessage:\r\n (channelId: string, messageId: string) =>\r\n `${Routes.message(channelId, messageId)}/crosspost`,\r\n /** Returns reactions for a message and emoji. @param channelId Channel identifier. @param messageId Message identifier. @param emoji Emoji name or ID. @returns Reaction route. */ messageReactions:\r\n (channelId: string, messageId: string, emoji: string) =>\r\n `${Routes.message(channelId, messageId)}/reactions/${encodeURIComponent(emoji)}`,\r\n /** Removes all reactions from a message. @param channelId Channel identifier. @param messageId Message identifier. @returns Reaction collection route. */ messageReactionsAll:\r\n (channelId: string, messageId: string) =>\r\n `${Routes.message(channelId, messageId)}/reactions`,\r\n /** Returns pinned messages. @param channelId Channel identifier. @returns Pins route. */ channelPins:\r\n (channelId: string) =>\r\n `/channels/${snowflake(channelId, \"Channel ID\")}/pins`,\r\n /** Pins a message. @param channelId Channel identifier. @param messageId Message identifier. @returns Pin route. */ channelPin:\r\n (channelId: string, messageId: string) =>\r\n `/channels/${snowflake(channelId, \"Channel ID\")}/pins/${snowflake(messageId, \"Message ID\")}`,\r\n /** Creates a thread from a message. @param channelId Channel identifier. @param messageId Message identifier. @returns Message-thread route. */ messageThread:\r\n (channelId: string, messageId: string) =>\r\n `${Routes.message(channelId, messageId)}/threads`,\r\n /** Bulk deletes messages. @param channelId Channel identifier. @returns Bulk-delete route. */ channelBulkDelete:\r\n (channelId: string) =>\r\n `/channels/${snowflake(channelId, \"Channel ID\")}/messages/bulk-delete`,\r\n /** Returns channel webhooks. @param channelId Channel identifier. @returns Webhook collection route. */ channelWebhooks:\r\n (channelId: string) =>\r\n `/channels/${snowflake(channelId, \"Channel ID\")}/webhooks`,\r\n /** Returns channel invites. @param channelId Channel identifier. @returns Invite collection route. */ channelInvites:\r\n (channelId: string) =>\r\n `/channels/${snowflake(channelId, \"Channel ID\")}/invites`,\r\n /** Returns a webhook. @param webhookId Webhook identifier. @param token Optional webhook token. @returns Webhook route. */ webhook:\r\n (webhookId: string, token?: string) =>\r\n `/webhooks/${snowflake(webhookId, \"Webhook ID\")}${token ? `/${encodeURIComponent(token)}` : \"\"}`,\r\n /** Returns a webhook message. */ webhookMessage: (\r\n webhookId: string,\r\n token: string,\r\n messageId: string,\r\n ) =>\r\n `/webhooks/${snowflake(webhookId, \"Webhook ID\")}/${encodeURIComponent(token)}/messages/${snowflake(messageId, \"Message ID\")}`,\r\n /** Returns application commands for an application. @param applicationId Application identifier. @returns Global command route. */ applicationCommands:\r\n (applicationId: string) =>\r\n `/applications/${snowflake(applicationId, \"Application ID\")}/commands`,\r\n /** Returns one application command. @param applicationId Application identifier. @param commandId Command identifier. @returns Command route. */ applicationCommand:\r\n (applicationId: string, commandId: string) =>\r\n `/applications/${snowflake(applicationId, \"Application ID\")}/commands/${snowflake(commandId, \"Command ID\")}`,\r\n /** Returns guild application commands. @param applicationId Application identifier. @param guildId Guild identifier. @returns Guild command route. */ guildApplicationCommands:\r\n (applicationId: string, guildId: string) =>\r\n `/applications/${snowflake(applicationId, \"Application ID\")}/guilds/${snowflake(guildId, \"Guild ID\")}/commands`,\r\n /** Returns a single guild application command. @param applicationId Application identifier. @param guildId Guild identifier. @param commandId Command identifier. @returns Guild command route. */ guildApplicationCommand:\r\n (applicationId: string, guildId: string, commandId: string) =>\r\n `/applications/${snowflake(applicationId, \"Application ID\")}/guilds/${snowflake(guildId, \"Guild ID\")}/commands/${snowflake(commandId, \"Command ID\")}`,\r\n /** Returns an interaction callback endpoint. @param interactionId Interaction identifier. @param token Interaction token. @returns Interaction callback route. */ interactionCallback:\r\n (interactionId: string, token: string) =>\r\n `/interactions/${snowflake(interactionId, \"Interaction ID\")}/${encodeURIComponent(token)}/callback`,\r\n /** Returns the original interaction response endpoint. @param applicationId Application identifier. @param token Interaction token. @returns Original-response route. */ interactionOriginalResponse:\r\n (applicationId: string, token: string) =>\r\n `/webhooks/${snowflake(applicationId, \"Application ID\")}/${encodeURIComponent(token)}/messages/@original`,\r\n /** Returns guild threads that are active. @param guildId Guild identifier. @returns Active-thread route. */ guildActiveThreads:\r\n (guildId: string) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/threads/active`,\r\n /** Returns public archived threads for a channel. @param channelId Channel identifier. @returns Public-archive route. */ channelPublicArchivedThreads:\r\n (channelId: string) =>\r\n `/channels/${snowflake(channelId, \"Channel ID\")}/threads/archived/public`,\r\n /** Returns private archived threads for a channel. @param channelId Channel identifier. @returns Private-archive route. */ channelPrivateArchivedThreads:\r\n (channelId: string) =>\r\n `/channels/${snowflake(channelId, \"Channel ID\")}/threads/archived/private`,\r\n /** Returns a thread's members. @param threadId Thread identifier. @returns Thread-member route. */ threadMembers:\r\n (threadId: string) =>\r\n `/channels/${snowflake(threadId, \"Thread ID\")}/thread-members`,\r\n /** Returns guild scheduled events. @param guildId Guild identifier. @returns Scheduled-event collection route. */ guildScheduledEvents:\r\n (guildId: string) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/scheduled-events`,\r\n /** Returns one guild scheduled event. @param guildId Guild identifier. @param eventId Event identifier. @returns Scheduled-event route. */ guildScheduledEvent:\r\n (guildId: string, eventId: string) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/scheduled-events/${snowflake(eventId, \"Event ID\")}`,\r\n /** Returns guild automod rules. @param guildId Guild identifier. @returns Automod-rule collection route. */ guildAutoModerationRules:\r\n (guildId: string) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/auto-moderation/rules`,\r\n /** Returns one automod rule. @param guildId Guild identifier. @param ruleId Rule identifier. @returns Automod-rule route. */ guildAutoModerationRule:\r\n (guildId: string, ruleId: string) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/auto-moderation/rules/${snowflake(ruleId, \"Rule ID\")}`,\r\n /** Returns current voice regions. @returns Voice-region route. */ voiceRegions:\r\n () => \"/voice/regions\",\r\n /** Returns the generic Gateway endpoint. @returns Gateway route. */ gateway:\r\n () => \"/gateway\",\r\n /** Returns the Gateway endpoint and recommended shard count for bots. @returns Gateway bot route. */ gatewayBot:\r\n () => \"/gateway/bot\",\r\n} as const;\r\n\r\n/** Validates a Discord snowflake route parameter. @param value Candidate identifier. @param field Human-readable field name. @returns The validated identifier. @throws {TypeError} If the identifier is not a Discord snowflake. */\r\nfunction snowflake(value: string, field: string): string {\r\n if (!/^\\d{1,20}$/.test(value))\r\n throw new TypeError(`${field} must be a valid Discord snowflake.`);\r\n return value;\r\n}\r\n",
|
|
8
|
-
"/** Common Discord snowflake-backed structure. */\nexport class BaseStructure {\n /** Discord resource ID. */\n public readonly id: string;\n /** Creates a structure from an ID. @param id Discord snowflake identifier. @throws {TypeError} If the ID is invalid. */\n public constructor(id: string) {\n if (!/^\\d{1,20}$/.test(id))\n throw new TypeError(\"A Discord structure requires a valid snowflake ID.\");\n this.id = id;\n }\n /** Returns the resource ID. @returns Discord snowflake identifier. */\n public toString(): string {\n return this.id;\n }\n}\n\n/** Context used by structures to delegate resource operations to the owning client. */\nexport interface ResourceContext {\n /** Sends a message through the owning channel manager. @param channelId Channel identifier. @param options Message payload. @returns The created message. */\n sendMessage(\n channelId: string,\n options: { content?: string },\n ): Promise<import(\"./index.js\").Message>;\n /** Edits a message through the owning channel manager. @param channelId Channel identifier. @param messageId Message identifier. @param options Edit payload. @returns The updated message. */\n editMessage(\n channelId: string,\n messageId: string,\n options: { content?: string },\n ): Promise<import(\"./index.js\").Message>;\n /** Deletes a message through the owning channel manager. @param channelId Channel identifier. @param messageId Message identifier. @returns A promise fulfilled after deletion. */\n deleteMessage(channelId: string, messageId: string): Promise<void>;\n /** Crossposts a message through the owning channel manager. @param channelId Channel identifier. @param messageId Message identifier. @returns The crossposted message. */\n crosspostMessage(\n channelId: string,\n messageId: string,\n ): Promise<import(\"./index.js\").Message>;\n}\n\n/** Represents a Discord user. */\nexport class User extends BaseStructure {\n /** User name. */ public username: string;\n /** Global display name. */ public globalName: string | null;\n /** Avatar hash. */ public avatar: string | null;\n /** Whether the user is a bot. */ public bot: boolean;\n /** Whether the account is a Discord system user. */ public system: boolean;\n /** Public user flags. */ public flags: number;\n /** Creates a user from Discord API data. @param data User payload. @throws {TypeError} If required data is invalid. */\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 }\n /** Gets the effective display name. @returns Global display name or username. */\n public get displayName(): string {\n return this.globalName ?? this.username;\n }\n /** Creates an avatar CDN URL. @param options URL format options. @returns Avatar URL, or null when no custom avatar exists. */\n public avatarURL(\n options: { extension?: \"png\" | \"jpg\" | \"webp\" | \"gif\"; size?: number } = {},\n ): string | null {\n if (!this.avatar) return null;\n const extension =\n options.extension ?? (this.avatar.startsWith(\"a_\") ? \"gif\" : \"png\");\n return `https://cdn.discordapp.com/avatars/${this.id}/${this.avatar}.${extension}${options.size ? `?size=${options.size}` : \"\"}`;\n }\n /** Creates the default avatar URL. @returns Discord default avatar URL. */\n public defaultAvatarURL(): string {\n return `https://cdn.discordapp.com/embed/avatars/${Number(BigInt(this.id) % 5n)}.png`;\n }\n /** Creates an avatar URL with default fallback. @param options URL format options. @returns Avatar or default avatar URL. */\n public displayAvatarURL(\n options: { extension?: \"png\" | \"jpg\" | \"webp\" | \"gif\"; size?: number } = {},\n ): string {\n return this.avatarURL(options) ?? this.defaultAvatarURL();\n }\n}\n\n/** Represents a Discord channel. */\nexport class Channel extends BaseStructure {\n /** Discord channel type. */ public type: number;\n /** Channel name. */ public name?: string | null;\n /** Guild containing the channel. */ public guildId?: string;\n readonly #context?: ResourceContext;\n /** Creates a channel from Discord API data. @param data Channel payload. @param context Optional owning resource context. @throws {TypeError|RangeError} If required channel data is invalid. */\n public constructor(\n data: import(\"@lunibee/types\").APIChannel,\n context?: ResourceContext,\n ) {\n super(data.id);\n if (!Number.isInteger(data.type) || data.type < 0)\n throw new RangeError(\"A Discord channel requires a valid channel type.\");\n this.type = data.type;\n this.name = data.name;\n this.guildId = data.guild_id;\n this.#context = context;\n }\n /** Sends a message through the owning manager. @param options Message payload. @returns The created message. @throws {Error} If this channel is detached from a client. */\n public sendMessage(options: {\n content?: string;\n }): Promise<import(\"./index.js\").Message> {\n if (!this.#context)\n throw new Error(\"This channel is not attached to a client.\");\n return this.#context.sendMessage(this.id, options);\n }\n}\n\n/** Represents a Discord guild. */\nexport class Guild extends BaseStructure {\n /** Guild name. */ public name: string;\n /** Preferred guild locale. */ public preferredLocale?: string;\n /** Guild owner ID. */ public ownerId?: string;\n /** Creates a guild from Discord API data. @param data Guild payload. @throws {TypeError} If required data is invalid. */\n public constructor(data: {\n id: string;\n name: string;\n preferred_locale?: string;\n owner_id?: string;\n }) {\n super(data.id);\n if (!data.name) throw new TypeError(\"A Discord guild requires a name.\");\n this.name = data.name;\n this.preferredLocale = data.preferred_locale;\n this.ownerId = data.owner_id;\n }\n}\n",
|
|
9
|
-
"/** Permission bit values exposed by Discord. */\r\nexport const Permissions = {\r\n /** Create instant invite permission. */ CreateInstantInvite: 1n << 0n,\r\n /** Kick members permission. */ KickMembers: 1n << 1n,\r\n /** Ban members permission. */ BanMembers: 1n << 2n,\r\n /** Administrator permission. */ Administrator: 1n << 3n,\r\n /** Manage channels permission. */ ManageChannels: 1n << 4n,\r\n /** Manage guild permission. */ ManageGuild: 1n << 5n,\r\n /** Add reactions permission. */ AddReactions: 1n << 6n,\r\n /** View audit log permission. */ ViewAuditLog: 1n << 7n,\r\n /** Priority speaker permission. */ PrioritySpeaker: 1n << 8n,\r\n /** Stream permission. */ Stream: 1n << 9n,\r\n /** View channel permission. */ ViewChannel: 1n << 10n,\r\n /** Send messages permission. */ SendMessages: 1n << 11n,\r\n /** Send TTS messages permission. */ SendTTSMessages: 1n << 12n,\r\n /** Manage messages permission. */ ManageMessages: 1n << 13n,\r\n /** Embed links permission. */ EmbedLinks: 1n << 14n,\r\n /** Attach files permission. */ AttachFiles: 1n << 15n,\r\n /** Read message history permission. */ ReadMessageHistory: 1n << 16n,\r\n /** Mention everyone permission. */ MentionEveryone: 1n << 17n,\r\n /** Use external emojis permission. */ UseExternalEmojis: 1n << 18n,\r\n /** View guild insights permission. */ ViewGuildInsights: 1n << 19n,\r\n /** Connect permission. */ Connect: 1n << 20n,\r\n /** Speak permission. */ Speak: 1n << 21n,\r\n /** Mute members permission. */ MuteMembers: 1n << 22n,\r\n /** Deafen members permission. */ DeafenMembers: 1n << 23n,\r\n /** Move members permission. */ MoveMembers: 1n << 24n,\r\n /** Use voice activity detection permission. */ UseVAD: 1n << 25n,\r\n /** Change nickname permission. */ ChangeNickname: 1n << 26n,\r\n /** Manage nicknames permission. */ ManageNicknames: 1n << 27n,\r\n /** Manage roles permission. */ ManageRoles: 1n << 28n,\r\n /** Manage webhooks permission. */ ManageWebhooks: 1n << 29n,\r\n /** Manage guild expressions permission. */ ManageGuildExpressions: 1n << 30n,\r\n /** Use application commands permission. */ UseApplicationCommands: 1n << 31n,\r\n /** Request to speak permission. */ RequestToSpeak: 1n << 32n,\r\n /** Manage events permission. */ ManageEvents: 1n << 33n,\r\n /** Manage threads permission. */ ManageThreads: 1n << 34n,\r\n /** Create public threads permission. */ CreatePublicThreads: 1n << 35n,\r\n /** Create private threads permission. */ CreatePrivateThreads: 1n << 36n,\r\n /** Use external stickers permission. */ UseExternalStickers: 1n << 37n,\r\n /** Send messages in threads permission. */ SendMessagesInThreads: 1n << 38n,\r\n /** Use embedded activities permission. */ UseEmbeddedActivities: 1n << 39n,\r\n /** Moderate members permission. */ ModerateMembers: 1n << 40n,\r\n /** View creator monetization analytics permission. */ ViewCreatorMonetizationAnalytics:\r\n 1n << 41n,\r\n /** Use soundboard permission. */ UseSoundboard: 1n << 42n,\r\n /** Create guild expressions permission. */ CreateGuildExpressions: 1n << 43n,\r\n /** Create events permission. */ CreateEvents: 1n << 44n,\r\n /** Use external sounds permission. */ UseExternalSounds: 1n << 45n,\r\n /** Send voice messages permission. */ SendVoiceMessages: 1n << 46n,\r\n /** Send polls permission. */ SendPolls: 1n << 49n,\r\n /** Use external apps permission. */ UseExternalApps: 1n << 50n,\r\n} as const;\r\n\r\n/** Public permission resolvable. */\r\nexport type PermissionResolvable =\r\n | bigint\r\n | number\r\n | string\r\n | PermissionName\r\n | PermissionSet\r\n | PermissionResolvable[];\r\n\r\n/** Immutable Discord permission bitfield. */\r\nexport class PermissionSet {\r\n /** Permission bitfield. */ public readonly bitfield: bigint;\r\n /** Creates a permission set. @param value Initial permission bitfield. @throws {RangeError} If the value is negative. @throws {TypeError} If the value is not a valid integer. */\r\n public constructor(value: PermissionResolvable = 0n) {\r\n try {\r\n if (Array.isArray(value)) {\r\n let bit = 0n;\r\n for (const item of value) bit |= this.#resolve(item);\r\n this.bitfield = bit;\r\n } else if (value instanceof PermissionSet) {\r\n this.bitfield = value.bitfield;\r\n } else {\r\n const bitfield = this.#resolve(value);\r\n if (bitfield < 0n)\r\n throw new RangeError(\"Permission bitfield cannot be negative.\");\r\n this.bitfield = bitfield;\r\n }\r\n } catch (error) {\r\n if (error instanceof RangeError) throw error;\r\n throw new TypeError(\r\n \"Permission bitfield must be a valid non-negative integer.\",\r\n { cause: error },\r\n );\r\n }\r\n }\r\n /** Checks whether all supplied permissions are present. @param permissions Permission names or raw bits. @returns True when every requested permission is present. */ public has(\r\n ...permissions: PermissionResolvable[]\r\n ): boolean {\r\n return permissions.every(\r\n (permission) =>\r\n (this.bitfield & this.#resolve(permission)) ===\r\n this.#resolve(permission),\r\n );\r\n }\r\n /** Checks whether any supplied permission is present. @param permissions Permission names or raw bits. @returns True when at least one requested permission is present. */ public any(\r\n ...permissions: PermissionResolvable[]\r\n ): boolean {\r\n return permissions.some(\r\n (permission) => (this.bitfield & this.#resolve(permission)) !== 0n,\r\n );\r\n }\r\n /** Returns a new set with permissions added. @param permissions Permission names or raw bits. @returns A new permission set. */ public add(\r\n ...permissions: PermissionResolvable[]\r\n ): PermissionSet {\r\n let bitfield = this.bitfield;\r\n for (const permission of permissions) bitfield |= this.#resolve(permission);\r\n return new PermissionSet(bitfield);\r\n }\r\n /** Returns a new set with permissions removed. @param permissions Permission names or raw bits. @returns A new permission set. */ public remove(\r\n ...permissions: PermissionResolvable[]\r\n ): PermissionSet {\r\n let bitfield = this.bitfield;\r\n for (const permission of permissions)\r\n bitfield &= ~this.#resolve(permission);\r\n return new PermissionSet(bitfield);\r\n }\r\n /** Checks equality with another permission set or raw bitfield. @param other Permission set or raw bitfield. @returns True when both values are equal. */ public equals(\r\n other: PermissionSet | bigint | number | string,\r\n ): boolean {\r\n return (\r\n this.bitfield ===\r\n (other instanceof PermissionSet\r\n ? other.bitfield\r\n : new PermissionSet(other).bitfield)\r\n );\r\n }\r\n /** Returns the decimal permission representation. @returns Decimal permission bitfield. */ public toString(): string {\r\n return this.bitfield.toString();\r\n }\r\n /** Returns known permission names contained in this set. @returns Names of all enabled known permissions. */ public toArray(): PermissionName[] {\r\n return (Object.keys(Permissions) as PermissionName[]).filter((permission) =>\r\n this.has(permission),\r\n );\r\n }\r\n /** Resolves a named permission or raw bit. @param permission Permission name or raw bit. @returns Numeric permission bit. */ #resolve(\r\n permission: PermissionResolvable,\r\n ): bigint {\r\n if (permission instanceof PermissionSet) return permission.bitfield;\r\n if (typeof permission === \"bigint\") return permission;\r\n if (typeof permission === \"number\") return BigInt(permission);\r\n if (Array.isArray(permission)) {\r\n let bit = 0n;\r\n for (const p of permission) bit |= this.#resolve(p);\r\n return bit;\r\n }\r\n if (typeof permission === \"string\") {\r\n if (permission in Permissions)\r\n return (Permissions as Record<string, bigint>)[permission]!;\r\n const matchedKey = Object.keys(Permissions).find(\r\n (k) => k.toLowerCase() === permission.toLowerCase(),\r\n );\r\n if (matchedKey)\r\n return (Permissions as Record<string, bigint>)[matchedKey]!;\r\n return BigInt(permission);\r\n }\r\n return 0n;\r\n }\r\n}\r\n\r\n/** Discord.js-compatible permission bitfield. */\r\nexport class PermissionsBitField extends PermissionSet {\r\n /** Creates a permissions bitfield. @param value Initial permission bitfield. */\r\n public constructor(value: PermissionResolvable = 0n) {\r\n super(value);\r\n }\r\n}\r\n",
|
|
10
|
-
"
|
|
11
|
-
"import { BaseStructure, Channel, User } from \"./base.js\";\nimport
|
|
12
|
-
"import { Collection } from \"@lunibee/collection\";\nimport { REST, Routes } from \"@lunibee/rest\";\nimport { Message, type ResourceContext } from \"@lunibee/structures\";\n\n/** Manages message resources belonging to a single channel with canonical identity. */\nexport class MessageManager {\n /** Canonical message cache for this channel. */\n public readonly cache = new Collection<string, Message>();\n readonly #rest: REST;\n readonly #context: ResourceContext;\n readonly #channelId: string;\n\n /** Creates a message manager. @param rest REST transport. @param context Structure resource context. @param channelId Channel identifier. @throws {TypeError} If channelId is empty. */\n public constructor(rest: REST, context: ResourceContext, channelId: string) {\n if (!channelId) throw new TypeError(\"Channel ID is required.\");\n this.#rest = rest;\n this.#context = context;\n this.#channelId = channelId;\n }\n /** Resolves a message from cache or REST. @param messageId Message identifier. @returns Canonical message. */\n public async resolve(messageId: string): Promise<Message> {\n return this.cache.get(messageId) ?? this.fetch(messageId);\n }\n /** Sends a message and caches it canonically. @param options Message payload. @returns Canonical message. */\n public async send(options: { content?: string }): Promise<Message> {\n const data = await this.#rest.post<\n ConstructorParameters<typeof Message>[0]\n >(Routes.channelMessages(this.#channelId), options);\n return this.upsert(data);\n }\n /** Fetches one message and caches it canonically. @param messageId Message identifier. @returns Canonical message. */\n public async fetch(messageId: string): Promise<Message> {\n const data = await this.#rest.get<\n | ConstructorParameters<typeof Message>[0]\n | ConstructorParameters<typeof Message>[0][]\n >(Routes.message(this.#channelId, messageId));\n const message = Array.isArray(data) ? data[0] : data;\n if (!message) throw new Error(\"Discord returned no message payload.\");\n return this.upsert(message);\n }\n /** Fetches several messages by ID. @param messageIds Message identifiers. @returns Canonical messages. */\n public fetchMany(messageIds: Iterable<string>): Promise<Message[]> {\n return Promise.all(\n Array.from(messageIds, (messageId) => this.fetch(messageId)),\n );\n }\n /** Inserts or updates a message through the shared hydration path. @param data Discord message payload. @returns Canonical message. */\n public upsert(data: ConstructorParameters<typeof Message>[0]): Message {\n const existing = this.cache.get(data.id);\n const message = new Message(data, this.#context);\n if (existing) {\n Object.assign(existing, message);\n return existing;\n }\n this.cache.set(message.id, message);\n return message;\n }\n /** Removes a message from cache. @param messageId Message identifier. @returns Whether a cached message was removed. */\n public delete(messageId: string): boolean {\n return this.cache.delete(messageId);\n }\n}\n",
|
|
7
|
+
"/** Discord REST API route definitions. */\r\nexport const Routes = {\r\n /** Returns the current bot user. @returns User route. */ user: () =>\r\n \"/users/@me\",\r\n /** Returns one user. @param userId User identifier. @returns User route. */ userById:\r\n (userId: string) => `/users/${snowflake(userId, \"User ID\")}`,\r\n /** Returns a guild. @param guildId Guild identifier. @returns Guild route. */ guild:\r\n (guildId: string) => `/guilds/${snowflake(guildId, \"Guild ID\")}`,\r\n /** Returns a guild preview. @param guildId Guild identifier. */ guildPreview:\r\n (guildId: string) => `/guilds/${snowflake(guildId, \"Guild ID\")}/preview`,\r\n /** Returns active threads for a guild. @param guildId Guild identifier. */ guildActiveThreads:\r\n (guildId: string) => `/guilds/${snowflake(guildId, \"Guild ID\")}/threads/active`,\r\n /** Returns webhooks for a guild. @param guildId Guild identifier. */ guildWebhooks:\r\n (guildId: string) => `/guilds/${snowflake(guildId, \"Guild ID\")}/webhooks`,\r\n /** Returns invites for a guild. @param guildId Guild identifier. */ guildInvites:\r\n (guildId: string) => `/guilds/${snowflake(guildId, \"Guild ID\")}/invites`,\r\n /** Returns channels in a guild. @param guildId Guild identifier. @returns Channel collection route. */ guildChannels:\r\n (guildId: string) => `/guilds/${snowflake(guildId, \"Guild ID\")}/channels`,\r\n /** Returns a guild member. @param guildId Guild identifier. @param userId User identifier. @returns Guild-member route. */ guildMember:\r\n (guildId: string, userId: string) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/members/${snowflake(userId, \"User ID\")}`,\r\n /** Returns all guild roles. @param guildId Guild identifier. @returns Guild-role route. */ guildRoles:\r\n (guildId: string) => `/guilds/${snowflake(guildId, \"Guild ID\")}/roles`,\r\n /** Returns an individual guild role. */ guildRole: (\r\n guildId: string,\r\n roleId: string,\r\n ) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/roles/${snowflake(roleId, \"Role ID\")}`,\r\n /** Returns a member role route. */ guildMemberRole: (\r\n guildId: string,\r\n userId: string,\r\n roleId: string,\r\n ) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/members/${snowflake(userId, \"User ID\")}/roles/${snowflake(roleId, \"Role ID\")}`,\r\n /** Returns guild bans collection. */ guildBans: (guildId: string) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/bans`,\r\n /** Returns an individual guild ban. */ guildBan: (\r\n guildId: string,\r\n userId: string,\r\n ) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/bans/${snowflake(userId, \"User ID\")}`,\r\n /** Returns a channel. @param channelId Channel identifier. @returns Channel route. */ channel:\r\n (channelId: string) => `/channels/${snowflake(channelId, \"Channel ID\")}`,\r\n /** Returns messages in a channel. @param channelId Channel identifier. @returns Message collection route. */ channelMessages:\r\n (channelId: string) =>\r\n `/channels/${snowflake(channelId, \"Channel ID\")}/messages`,\r\n /** Returns a message. @param channelId Channel identifier. @param messageId Message identifier. @returns Message route. */ message:\r\n (channelId: string, messageId: string) =>\r\n `/channels/${snowflake(channelId, \"Channel ID\")}/messages/${snowflake(messageId, \"Message ID\")}`,\r\n /** Crossposts a message. @param channelId Channel identifier. @param messageId Message identifier. @returns Crosspost route. */ crosspostMessage:\r\n (channelId: string, messageId: string) =>\r\n `${Routes.message(channelId, messageId)}/crosspost`,\r\n /** Returns reactions for a message and emoji. @param channelId Channel identifier. @param messageId Message identifier. @param emoji Emoji name or ID. @returns Reaction route. */ messageReactions:\r\n (channelId: string, messageId: string, emoji: string) =>\r\n `${Routes.message(channelId, messageId)}/reactions/${encodeURIComponent(emoji)}`,\r\n /** Removes all reactions from a message. @param channelId Channel identifier. @param messageId Message identifier. @returns Reaction collection route. */ messageReactionsAll:\r\n (channelId: string, messageId: string) =>\r\n `${Routes.message(channelId, messageId)}/reactions`,\r\n /** Returns pinned messages. @param channelId Channel identifier. @returns Pins route. */ channelPins:\r\n (channelId: string) =>\r\n `/channels/${snowflake(channelId, \"Channel ID\")}/pins`,\r\n /** Pins a message. @param channelId Channel identifier. @param messageId Message identifier. @returns Pin route. */ channelPin:\r\n (channelId: string, messageId: string) =>\r\n `/channels/${snowflake(channelId, \"Channel ID\")}/pins/${snowflake(messageId, \"Message ID\")}`,\r\n /** Creates a thread from a message. @param channelId Channel identifier. @param messageId Message identifier. @returns Message-thread route. */ messageThread:\r\n (channelId: string, messageId: string) =>\r\n `${Routes.message(channelId, messageId)}/threads`,\r\n /** Bulk deletes messages. @param channelId Channel identifier. @returns Bulk-delete route. */ channelBulkDelete:\r\n (channelId: string) =>\r\n `/channels/${snowflake(channelId, \"Channel ID\")}/messages/bulk-delete`,\r\n /** Returns channel webhooks. @param channelId Channel identifier. @returns Webhook collection route. */ channelWebhooks:\r\n (channelId: string) =>\r\n `/channels/${snowflake(channelId, \"Channel ID\")}/webhooks`,\r\n /** Returns channel invites. @param channelId Channel identifier. @returns Invite collection route. */ channelInvites:\r\n (channelId: string) =>\r\n `/channels/${snowflake(channelId, \"Channel ID\")}/invites`,\r\n /** Returns a webhook. @param webhookId Webhook identifier. @param token Optional webhook token. @returns Webhook route. */ webhook:\r\n (webhookId: string, token?: string) =>\r\n `/webhooks/${snowflake(webhookId, \"Webhook ID\")}${token ? `/${encodeURIComponent(token)}` : \"\"}`,\r\n /** Returns a webhook message. */ webhookMessage: (\r\n webhookId: string,\r\n token: string,\r\n messageId: string,\r\n ) =>\r\n `/webhooks/${snowflake(webhookId, \"Webhook ID\")}/${encodeURIComponent(token)}/messages/${snowflake(messageId, \"Message ID\")}`,\r\n /** Returns application commands for an application. @param applicationId Application identifier. @returns Global command route. */ applicationCommands:\r\n (applicationId: string) =>\r\n `/applications/${snowflake(applicationId, \"Application ID\")}/commands`,\r\n /** Returns one application command. @param applicationId Application identifier. @param commandId Command identifier. @returns Command route. */ applicationCommand:\r\n (applicationId: string, commandId: string) =>\r\n `/applications/${snowflake(applicationId, \"Application ID\")}/commands/${snowflake(commandId, \"Command ID\")}`,\r\n /** Returns guild application commands. @param applicationId Application identifier. @param guildId Guild identifier. @returns Guild command route. */ guildApplicationCommands:\r\n (applicationId: string, guildId: string) =>\r\n `/applications/${snowflake(applicationId, \"Application ID\")}/guilds/${snowflake(guildId, \"Guild ID\")}/commands`,\r\n /** Returns a single guild application command. @param applicationId Application identifier. @param guildId Guild identifier. @param commandId Command identifier. @returns Guild command route. */ guildApplicationCommand:\r\n (applicationId: string, guildId: string, commandId: string) =>\r\n `/applications/${snowflake(applicationId, \"Application ID\")}/guilds/${snowflake(guildId, \"Guild ID\")}/commands/${snowflake(commandId, \"Command ID\")}`,\r\n /** Returns an interaction callback endpoint. @param interactionId Interaction identifier. @param token Interaction token. @returns Interaction callback route. */ interactionCallback:\r\n (interactionId: string, token: string) =>\r\n `/interactions/${snowflake(interactionId, \"Interaction ID\")}/${encodeURIComponent(token)}/callback`,\r\n /** Returns the original interaction response endpoint. @param applicationId Application identifier. @param token Interaction token. @returns Original-response route. */ interactionOriginalResponse:\r\n (applicationId: string, token: string) =>\r\n `/webhooks/${snowflake(applicationId, \"Application ID\")}/${encodeURIComponent(token)}/messages/@original`,\r\n\r\n /** Returns public archived threads for a channel. @param channelId Channel identifier. @returns Public-archive route. */ channelPublicArchivedThreads:\r\n (channelId: string) =>\r\n `/channels/${snowflake(channelId, \"Channel ID\")}/threads/archived/public`,\r\n /** Returns private archived threads for a channel. @param channelId Channel identifier. @returns Private-archive route. */ channelPrivateArchivedThreads:\r\n (channelId: string) =>\r\n `/channels/${snowflake(channelId, \"Channel ID\")}/threads/archived/private`,\r\n /** Returns a thread's members. @param threadId Thread identifier. @returns Thread-member route. */ threadMembers:\r\n (threadId: string) =>\r\n `/channels/${snowflake(threadId, \"Thread ID\")}/thread-members`,\r\n /** Returns guild scheduled events. @param guildId Guild identifier. @returns Scheduled-event collection route. */ guildScheduledEvents:\r\n (guildId: string) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/scheduled-events`,\r\n /** Returns one guild scheduled event. @param guildId Guild identifier. @param eventId Event identifier. @returns Scheduled-event route. */ guildScheduledEvent:\r\n (guildId: string, eventId: string) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/scheduled-events/${snowflake(eventId, \"Event ID\")}`,\r\n /** Returns guild automod rules. @param guildId Guild identifier. @returns Automod-rule collection route. */ guildAutoModerationRules:\r\n (guildId: string) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/auto-moderation/rules`,\r\n /** Returns one automod rule. @param guildId Guild identifier. @param ruleId Rule identifier. @returns Automod-rule route. */ guildAutoModerationRule:\r\n (guildId: string, ruleId: string) =>\r\n `/guilds/${snowflake(guildId, \"Guild ID\")}/auto-moderation/rules/${snowflake(ruleId, \"Rule ID\")}`,\r\n /** Returns current voice regions. @returns Voice-region route. */ voiceRegions:\r\n () => \"/voice/regions\",\r\n /** Returns the generic Gateway endpoint. @returns Gateway route. */ gateway:\r\n () => \"/gateway\",\r\n /** Returns the Gateway endpoint and recommended shard count for bots. @returns Gateway bot route. */ gatewayBot:\r\n () => \"/gateway/bot\",\r\n} as const;\r\n\r\n/** Validates a Discord snowflake route parameter. @param value Candidate identifier. @param field Human-readable field name. @returns The validated identifier. @throws {TypeError} If the identifier is not a Discord snowflake. */\r\nfunction snowflake(value: string, field: string): string {\r\n if (!/^\\d{1,20}$/.test(value))\r\n throw new TypeError(`${field} must be a valid Discord snowflake.`);\r\n return value;\r\n}\r\n",
|
|
8
|
+
"/** Error thrown when Discord rejects a REST request. */\r\nexport class RESTError extends Error {\r\n /** HTTP status returned by Discord. */ public readonly status: number;\r\n /** Discord API error code, when provided. */ public readonly code?: number;\r\n /** Raw Discord validation/error payload. */ public readonly errors?: unknown;\r\n /** HTTP method used for the failed request. */ public readonly method?: string;\r\n /** API path used for the failed request. */ public readonly path?: string;\r\n /** Creates a REST error with request context. @param message Error message. @param status HTTP status. @param code Discord error code. @param errors Raw error payload. @param options Request context and cause. */\r\n public constructor(\r\n message: string,\r\n status: number,\r\n code?: number,\r\n errors?: unknown,\r\n options: { method?: string; path?: string; cause?: unknown } = {},\r\n ) {\r\n super(\r\n message,\r\n options.cause === undefined ? undefined : { cause: options.cause },\r\n );\r\n this.name = \"RESTError\";\r\n this.status = status;\r\n this.code = code;\r\n this.errors = errors;\r\n this.method = options.method;\r\n this.path = options.path;\r\n }\r\n}\r\n\r\n/** Library version and source URL used for the Discord-compliant User-Agent. */\r\nimport packageJson from \"../package.json\" with { type: \"json\" };\r\nconst LIBRARY_VERSION = packageJson.version;\r\nconst LIBRARY_URL = \"https://github.com/Ekretos/lunibee\";\r\nconst USER_AGENT = `DiscordBot (${LIBRARY_URL}, ${packageJson.version})`;\r\n\r\n/** Internal state shared by requests mapped to one Discord rate-limit bucket. */\r\ntype Bucket = { remaining: number; resetAt: number; queue: Promise<void> };\r\n/** Options controlling an individual REST request. */\r\nexport interface RESTRequestOptions {\r\n /** Abort signal used to cancel the request and any queued wait. */ signal?: AbortSignal;\r\n}\r\n\r\nexport interface RESTFileAttachment {\r\n name: string;\r\n data: Blob | Uint8Array | ArrayBuffer;\r\n contentType?: string;\r\n}\r\n\r\n/** Configures which REST failures may be retried. */\r\nexport interface RetryPolicy {\r\n /** Maximum retry attempts. */ maxRetries: number;\r\n /** Determines whether a request may be retried. @param method HTTP method. @param status HTTP status, or zero for transport errors. @returns True when retrying is safe under the policy. */ shouldRetry(\r\n method: string,\r\n status: number,\r\n ): boolean;\r\n /** Calculates delay before the next attempt. @param attempt Zero-based retry number. @param retryAfter Server-provided delay, when available. @returns Delay in milliseconds. */ getDelay(\r\n attempt: number,\r\n retryAfter?: number,\r\n ): number;\r\n}\r\n/** Creates the default conservative REST retry policy. @param maxRetries Maximum retries. @returns Retry policy that retries rate limits and idempotent transient failures. @throws {TypeError} If maxRetries is negative or not finite. */\r\nexport function createRetryPolicy(maxRetries = 2): RetryPolicy {\r\n if (!Number.isFinite(maxRetries) || maxRetries < 0)\r\n throw new TypeError(\"maxRetries must be a non-negative finite number.\");\r\n return {\r\n maxRetries: Math.floor(maxRetries),\r\n shouldRetry(method, status) {\r\n const normalized = method.toUpperCase();\r\n return (\r\n status === 429 ||\r\n (status >= 500 &&\r\n status <= 599 &&\r\n [\"GET\", \"HEAD\", \"PUT\", \"DELETE\"].includes(normalized))\r\n );\r\n },\r\n getDelay(attempt, retryAfter) {\r\n if (retryAfter !== undefined) return Math.max(0, retryAfter * 1000);\r\n return Math.min(10_000, 500 * 2 ** attempt) + Math.random() * 250;\r\n },\r\n };\r\n}\r\n\r\n/** Bun-native REST transport with Discord bucket-aware rate limiting, retries, and cancellation. */\r\nexport class REST {\r\n readonly #baseURL: string;\r\n readonly #timeout: number;\r\n readonly #retryPolicy: RetryPolicy;\r\n #token?: string;\r\n #globalResetAt = 0;\r\n readonly #buckets = new Map<string, Bucket>();\r\n readonly #routeBuckets = new Map<string, string>();\r\n /** Creates a REST transport. @param options Transport configuration. @throws {TypeError} If retry configuration is invalid. */\r\n public constructor(\r\n options: {\r\n token?: string;\r\n timeout?: number;\r\n retries?: number;\r\n retryPolicy?: RetryPolicy;\r\n baseURL?: string;\r\n } = {},\r\n ) {\r\n this.#token = options.token;\r\n this.#timeout = Math.max(1, options.timeout ?? 15_000);\r\n this.#retryPolicy =\r\n options.retryPolicy ?? createRetryPolicy(options.retries ?? 2);\r\n this.#baseURL = (options.baseURL ?? \"https://discord.com/api/v10\").replace(\r\n /\\/$/,\r\n \"\",\r\n );\r\n }\r\n /** Sets the authentication token. @param token Discord bot token. @returns Nothing. @throws {TypeError} If token is empty. */\r\n public setToken(token: string): void {\r\n if (!token.trim()) throw new TypeError(\"A Discord bot token is required.\");\r\n this.#token = token;\r\n }\r\n /** Executes an HTTP request with Discord bucket/global rate limits, retry handling, and AbortSignal support.\r\n * Accepts a JSON body, a FormData body (for file uploads), or undefined.\r\n * @param method HTTP method.\r\n * @param path API path.\r\n * @param body Optional JSON body, FormData for file uploads, or undefined.\r\n * @param options Cancellation options.\r\n * @returns Decoded response body.\r\n * @throws {RESTError} If Discord or transport rejects the request.\r\n */\r\n public async request<T>(\r\n method: string,\r\n path: string,\r\n body?: unknown,\r\n options: RESTRequestOptions = {},\r\n ): Promise<T> {\r\n const normalizedMethod = method.toUpperCase();\r\n if (!normalizedMethod) throw new TypeError(\"REST method is required.\");\r\n if (!path.startsWith(\"/\"))\r\n throw new TypeError(\"REST paths must start with '/'.\");\r\n const route = `${normalizedMethod}:${this.#normalizeRoute(path)}`;\r\n let bucketKey = this.#routeBuckets.get(route) ?? route;\r\n let bucket = this.#buckets.get(bucketKey) ?? {\r\n remaining: 1,\r\n resetAt: 0,\r\n queue: Promise.resolve(),\r\n };\r\n this.#buckets.set(bucketKey, bucket);\r\n const previous = bucket.queue;\r\n let release!: () => void;\r\n bucket.queue = new Promise((resolve) => {\r\n release = resolve;\r\n });\r\n await this.#abortable(previous, options.signal, path);\r\n try {\r\n for (\r\n let attempt = 0;\r\n attempt <= this.#retryPolicy.maxRetries;\r\n attempt++\r\n ) {\r\n await this.#wait(bucket, options.signal, path);\r\n await this.#waitGlobal(options.signal, path);\r\n const controller = new AbortController();\r\n const onAbort = () => controller.abort(options.signal?.reason);\r\n if (options.signal?.aborted)\r\n throw this.#abortError(path, options.signal.reason);\r\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\r\n const timer = setTimeout(\r\n () =>\r\n controller.abort(\r\n new DOMException(\"REST request timeout\", \"TimeoutError\"),\r\n ),\r\n this.#timeout,\r\n );\r\n // Build headers and body based on whether this is a multipart request\r\n const isFormData =\r\n typeof FormData !== \"undefined\" && body instanceof FormData;\r\n const headers: Record<string, string> = {\r\n ...(this.#token ? { Authorization: `Bot ${this.#token}` } : {}),\r\n \"User-Agent\": USER_AGENT,\r\n };\r\n if (!isFormData) headers[\"Content-Type\"] = \"application/json\";\r\n const fetchBody = isFormData\r\n ? (body as FormData)\r\n : body === undefined\r\n ? undefined\r\n : JSON.stringify(body);\r\n try {\r\n const response = await fetch(`${this.#baseURL}${path}`, {\r\n method: normalizedMethod,\r\n headers,\r\n body: fetchBody,\r\n signal: controller.signal,\r\n });\r\n bucket = this.#update(response, bucket, route, bucketKey);\r\n bucketKey = this.#routeBuckets.get(route) ?? bucketKey;\r\n const payload = await this.#readPayload(response);\r\n if (response.ok)\r\n return (response.status === 204 ? undefined : payload) as T;\r\n const data = this.#errorData(payload);\r\n const retryAfter =\r\n response.status === 429\r\n ? this.#retryAfter(response, data)\r\n : undefined;\r\n if (data.global && retryAfter !== undefined)\r\n this.#globalResetAt = Date.now() + retryAfter * 1000;\r\n if (\r\n attempt < this.#retryPolicy.maxRetries &&\r\n this.#retryPolicy.shouldRetry(normalizedMethod, response.status)\r\n ) {\r\n await this.#sleep(\r\n this.#retryPolicy.getDelay(attempt, retryAfter),\r\n options.signal,\r\n path,\r\n );\r\n continue;\r\n }\r\n throw new RESTError(\r\n data.message ??\r\n response.statusText ??\r\n `Discord REST request failed with status ${response.status}`,\r\n response.status,\r\n data.code,\r\n payload,\r\n { method: normalizedMethod, path },\r\n );\r\n } catch (error) {\r\n if (error instanceof RESTError) throw error;\r\n if (options.signal?.aborted)\r\n throw this.#abortError(path, options.signal.reason);\r\n const isTimeout =\r\n error instanceof DOMException &&\r\n (error.name === \"TimeoutError\" || error.name === \"AbortError\");\r\n if (\r\n !isTimeout &&\r\n attempt < this.#retryPolicy.maxRetries &&\r\n this.#retryPolicy.shouldRetry(normalizedMethod, 0)\r\n ) {\r\n await this.#sleep(\r\n this.#retryPolicy.getDelay(attempt),\r\n options.signal,\r\n path,\r\n );\r\n continue;\r\n }\r\n throw new RESTError(\r\n isTimeout\r\n ? `Discord REST request timed out after ${this.#timeout}ms`\r\n : \"Discord REST request failed\",\r\n 0,\r\n undefined,\r\n undefined,\r\n { method: normalizedMethod, path, cause: error },\r\n );\r\n } finally {\r\n clearTimeout(timer);\r\n options.signal?.removeEventListener(\"abort\", onAbort);\r\n }\r\n }\r\n throw new RESTError(\r\n \"Discord REST request exhausted its retry attempts\",\r\n 0,\r\n undefined,\r\n undefined,\r\n { method: normalizedMethod, path },\r\n );\r\n } finally {\r\n release();\r\n }\r\n }\r\n /** Sends a GET request. @param path API path. @param options Cancellation options. @returns Decoded response. @throws {RESTError} When the request fails. */ public get<\r\n T,\r\n >(path: string, options?: RESTRequestOptions): Promise<T> {\r\n return this.request<T>(\"GET\", path, undefined, options);\r\n }\r\n /** Sends a POST request. @param path API path. @param body Optional JSON body. @param options Cancellation options. @returns Decoded response. @throws {RESTError} When the request fails. */ public post<\r\n T,\r\n >(path: string, body?: unknown, options?: RESTRequestOptions): Promise<T> {\r\n return this.request<T>(\"POST\", path, body, options);\r\n }\r\n /** Sends a PATCH request. @param path API path. @param body Optional JSON body. @param options Cancellation options. @returns Decoded response. @throws {RESTError} When the request fails. */ public patch<\r\n T,\r\n >(path: string, body?: unknown, options?: RESTRequestOptions): Promise<T> {\r\n return this.request<T>(\"PATCH\", path, body, options);\r\n }\r\n /** Sends a PUT request. @param path API path. @param body Optional JSON body. @param options Cancellation options. @returns Decoded response. @throws {RESTError} When the request fails. */ public put<\r\n T,\r\n >(path: string, body?: unknown, options?: RESTRequestOptions): Promise<T> {\r\n return this.request<T>(\"PUT\", path, body, options);\r\n }\r\n /** Sends a DELETE request. @param path API path. @param options Cancellation options. @returns Decoded response. @throws {RESTError} When the request fails. */ public delete<\r\n T,\r\n >(path: string, options?: RESTRequestOptions): Promise<T> {\r\n return this.request<T>(\"DELETE\", path, undefined, options);\r\n }\r\n /**\r\n * Builds a multipart form with a JSON payload and file attachments.\r\n */\r\n #fileForm(payload: unknown, files: RESTFileAttachment[]): FormData {\r\n const form = new FormData();\r\n form.append(\"payload_json\", JSON.stringify(payload));\r\n for (let i = 0; i < files.length; i++) {\r\n const file = files[i]!;\r\n const blob =\r\n file.data instanceof Blob\r\n ? file.data\r\n : new Blob([file.data as ArrayBuffer], {\r\n type: file.contentType ?? \"application/octet-stream\",\r\n });\r\n form.append(`files[${i}]`, blob, file.name);\r\n }\r\n return form;\r\n }\r\n\r\n /**\r\n * Sends a multipart/form-data POST request for file uploads.\r\n * Attaches a JSON payload as `payload_json` and files as additional fields.\r\n * @param path API path.\r\n * @param payload JSON payload (e.g. message content, embeds).\r\n * @param files Array of file attachments.\r\n * @param options Cancellation options.\r\n * @returns Decoded response.\r\n * @throws {RESTError} When the request fails.\r\n */\r\n public postWithFiles<T>(\r\n path: string,\r\n payload: unknown,\r\n files: RESTFileAttachment[],\r\n options?: RESTRequestOptions,\r\n ): Promise<T> {\r\n return this.request<T>(\"POST\", path, this.#fileForm(payload, files), options);\r\n }\r\n\r\n /**\r\n * Sends a multipart/form-data PATCH request for editing messages with files.\r\n * @param path API path.\r\n * @param payload JSON payload.\r\n * @param files Array of file attachments.\r\n * @param options Cancellation options.\r\n * @returns Decoded response.\r\n * @throws {RESTError} When the request fails.\r\n */\r\n public patchWithFiles<T>(\r\n path: string,\r\n payload: unknown,\r\n files: RESTFileAttachment[],\r\n options?: RESTRequestOptions,\r\n ): Promise<T> {\r\n return this.request<T>(\"PATCH\", path, this.#fileForm(payload, files), options);\r\n }\r\n /** Waits for a route bucket while respecting cancellation. @param bucket Bucket state. @param signal Optional cancellation signal. @param path Request path for error context. @returns Promise fulfilled when sending is permitted. @throws {RESTError} If the request is aborted. */\r\n async #wait(\r\n bucket: Bucket,\r\n signal: AbortSignal | undefined,\r\n path: string,\r\n ): Promise<void> {\r\n const delay = bucket.resetAt - Date.now();\r\n if (bucket.remaining <= 0 && delay > 0)\r\n await this.#sleep(delay, signal, path);\r\n }\r\n /** Waits for the global Discord rate limit while respecting cancellation. @param signal Optional cancellation signal. @param path Request path for error context. @returns Promise fulfilled when the global limit expires. @throws {RESTError} If the request is aborted. */\r\n async #waitGlobal(\r\n signal: AbortSignal | undefined,\r\n path: string,\r\n ): Promise<void> {\r\n const delay = this.#globalResetAt - Date.now();\r\n if (delay > 0) await this.#sleep(delay, signal, path);\r\n }\r\n /** Waits for a delay or aborts immediately. @param delay Delay in milliseconds. @param signal Optional cancellation signal. @param path Request path. @returns Promise fulfilled after delay. @throws {RESTError} If aborted. */\r\n async #sleep(\r\n delay: number,\r\n signal: AbortSignal | undefined,\r\n path: string,\r\n ): Promise<void> {\r\n if (delay <= 0) return;\r\n await new Promise<void>((resolve, reject) => {\r\n const timer = setTimeout(resolve, delay);\r\n const abort = () => {\r\n clearTimeout(timer);\r\n reject(this.#abortError(path, signal?.reason));\r\n };\r\n if (signal?.aborted) return abort();\r\n signal?.addEventListener(\"abort\", abort, { once: true });\r\n });\r\n }\r\n /** Waits for a queued request or aborts. @param promise Queue predecessor. @param signal Optional cancellation signal. @param path Request path. @returns Promise fulfilled when predecessor releases. @throws {RESTError} If aborted. */\r\n async #abortable(\r\n promise: Promise<void>,\r\n signal: AbortSignal | undefined,\r\n path: string,\r\n ): Promise<void> {\r\n if (!signal) return promise;\r\n if (signal.aborted) throw this.#abortError(path, signal.reason);\r\n return Promise.race([\r\n promise,\r\n new Promise<void>((_, reject) =>\r\n signal.addEventListener(\r\n \"abort\",\r\n () => reject(this.#abortError(path, signal.reason)),\r\n { once: true },\r\n ),\r\n ),\r\n ]);\r\n }\r\n /** Creates a consistent cancellation error. @param path Request path. @param reason Abort reason. @returns REST cancellation error. */\r\n #abortError(path: string, reason: unknown): RESTError {\r\n return new RESTError(\r\n reason instanceof Error\r\n ? reason.message\r\n : \"Discord REST request was aborted\",\r\n 0,\r\n undefined,\r\n undefined,\r\n { path, cause: reason },\r\n );\r\n }\r\n /** Reads a Discord response payload. @param response HTTP response. @returns JSON or text payload. */\r\n async #readPayload(response: Response): Promise<unknown> {\r\n if (response.status === 204) return undefined;\r\n const contentType = response.headers.get(\"content-type\") ?? \"\";\r\n if (contentType.includes(\"application/json\"))\r\n return response.json().catch(() => undefined);\r\n return response.text().catch(() => undefined);\r\n }\r\n /** Extracts retry metadata from a Discord payload. @param payload Response payload. @returns Normalized error metadata. */\r\n #errorData(payload: unknown): {\r\n message?: string;\r\n code?: number;\r\n retry_after?: number;\r\n global?: boolean;\r\n } {\r\n if (!payload || typeof payload !== \"object\") return {};\r\n const data = payload as Record<string, unknown>;\r\n return {\r\n message: typeof data.message === \"string\" ? data.message : undefined,\r\n code: typeof data.code === \"number\" ? data.code : undefined,\r\n retry_after:\r\n typeof data.retry_after === \"number\" ? data.retry_after : undefined,\r\n global: data.global === true,\r\n };\r\n }\r\n /** Resolves Retry-After from headers or JSON. @param response HTTP response. @param data Parsed response metadata. @returns Retry delay in seconds. */\r\n #retryAfter(response: Response, data: { retry_after?: number }): number {\r\n const header = Number(response.headers.get(\"Retry-After\"));\r\n const retryAfter =\r\n data.retry_after ?? (Number.isFinite(header) ? header : 1);\r\n return Math.max(0, retryAfter);\r\n }\r\n /** Normalizes Discord routes for stable bucket discovery. @param path API path. @returns Normalized route. */\r\n #normalizeRoute(path: string): string {\r\n const queryIndex = path.indexOf(\"?\");\r\n const routePath = queryIndex === -1 ? path : path.slice(0, queryIndex);\r\n return routePath.replace(/\\/\\d+(?=\\/|$)/g, \"/:id\");\r\n }\r\n /** Updates bucket state from Discord's rate-limit headers and records the server bucket hash. @param response HTTP response. @param bucket Current bucket. @param route Normalized local route key. @param bucketKey Current bucket identifier. @returns Bucket state used for subsequent attempts. */\r\n #update(\r\n response: Response,\r\n bucket: Bucket,\r\n route: string,\r\n bucketKey: string,\r\n ): Bucket {\r\n const serverBucket = response.headers.get(\"X-RateLimit-Bucket\");\r\n if (serverBucket) {\r\n this.#routeBuckets.set(route, serverBucket);\r\n if (serverBucket !== bucketKey) {\r\n const shared = this.#buckets.get(serverBucket) ?? bucket;\r\n this.#buckets.set(serverBucket, shared);\r\n bucket = shared;\r\n }\r\n }\r\n const remaining = Number(response.headers.get(\"X-RateLimit-Remaining\"));\r\n const resetAfter = Number(response.headers.get(\"X-RateLimit-Reset-After\"));\r\n const reset = Number(response.headers.get(\"X-RateLimit-Reset\"));\r\n if (Number.isFinite(remaining)) bucket.remaining = Math.max(0, remaining);\r\n if (Number.isFinite(resetAfter))\r\n bucket.resetAt = Date.now() + Math.max(0, resetAfter) * 1000;\r\n else if (Number.isFinite(reset)) bucket.resetAt = reset * 1000;\r\n if (response.status === 429) {\r\n const retryAfter = Number(response.headers.get(\"Retry-After\"));\r\n if (Number.isFinite(retryAfter))\r\n bucket.resetAt = Math.max(\r\n bucket.resetAt,\r\n Date.now() + retryAfter * 1000,\r\n );\r\n }\r\n if (response.headers.get(\"X-RateLimit-Global\") === \"true\") {\r\n const retryAfter = Number(response.headers.get(\"Retry-After\"));\r\n if (Number.isFinite(retryAfter))\r\n this.#globalResetAt = Math.max(\r\n this.#globalResetAt,\r\n Date.now() + retryAfter * 1000,\r\n );\r\n }\r\n return bucket;\r\n }\r\n}\r\n\r\nexport { Routes } from \"./routes.js\";\r\n\r\nexport {\r\n WebhookClient,\r\n type WebhookClientOptions,\r\n type WebhookMessageOptions,\r\n} from \"./webhook.js\";\r\n",
|
|
9
|
+
"/** Common Discord snowflake-backed structure. */\r\nexport class BaseStructure {\r\n public readonly id: string;\r\n public constructor(id: string) {\r\n if (!/^\\d{1,20}$/.test(id))\r\n throw new TypeError(\"A Discord structure requires a valid snowflake ID.\");\r\n this.id = id;\r\n }\r\n /** Returns the snowflake ID as a string. */\r\n public toString(): string {\r\n return this.id;\r\n }\r\n /** Returns the timestamp this snowflake was created at. */\r\n public get createdAt(): Date {\r\n return new Date(Number((BigInt(this.id) >> 22n) + 1420070400000n));\r\n }\r\n}\r\n\r\nexport interface ResourceContext {\r\n sendMessage(\r\n channelId: string,\r\n options: Record<string, unknown> & { content?: string },\r\n ): Promise<import(\"./index.js\").Message>;\r\n editMessage(\r\n channelId: string,\r\n messageId: string,\r\n options: Record<string, unknown> & { content?: string },\r\n ): Promise<import(\"./index.js\").Message>;\r\n deleteMessage(channelId: string, messageId: string): Promise<void>;\r\n crosspostMessage(\r\n channelId: string,\r\n messageId: string,\r\n ): Promise<import(\"./index.js\").Message>;\r\n editChannel?(\r\n channelId: string,\r\n options: Record<string, unknown>,\r\n ): Promise<import(\"./base.js\").Channel>;\r\n deleteChannel?(channelId: string): Promise<void>;\r\n addReaction?(\r\n channelId: string,\r\n messageId: string,\r\n emoji: string,\r\n ): Promise<void>;\r\n removeOwnReaction?(\r\n channelId: string,\r\n messageId: string,\r\n emoji: string,\r\n ): Promise<void>;\r\n removeReaction?(\r\n channelId: string,\r\n messageId: string,\r\n emoji: string,\r\n userId: string,\r\n ): Promise<void>;\r\n removeAllReactions?(channelId: string, messageId: string): Promise<void>;\r\n pinMessage?(channelId: string, messageId: string): Promise<void>;\r\n unpinMessage?(channelId: string, messageId: string): Promise<void>;\r\n}\r\n\r\n// ─── CDN helpers ──────────────────────────────────────────────────────────────\r\n\r\nconst CDN_BASE = \"https://cdn.discordapp.com\";\r\n\r\n/** Options for CDN image URLs. */\r\nexport interface ImageURLOptions {\r\n extension?: \"png\" | \"jpg\" | \"webp\" | \"gif\" | \"jpeg\";\r\n size?: 16 | 32 | 64 | 128 | 256 | 512 | 1024 | 2048 | 4096;\r\n forceStatic?: boolean;\r\n}\r\n\r\nfunction cdnURL(\r\n path: string,\r\n hash: string,\r\n options: ImageURLOptions = {},\r\n): string {\r\n const isAnimated = hash.startsWith(\"a_\") && !options.forceStatic;\r\n const ext = options.extension ?? (isAnimated ? \"gif\" : \"png\");\r\n const size = options.size ? `?size=${options.size}` : \"\";\r\n return `${CDN_BASE}${path}/${hash}.${ext}${size}`;\r\n}\r\n\r\n// ─── User ─────────────────────────────────────────────────────────────────────\r\n\r\nexport class User extends BaseStructure {\r\n public username: string;\r\n public globalName: string | null;\r\n public avatar: string | null;\r\n public bot: boolean;\r\n public system: boolean;\r\n public flags: number;\r\n public discriminator: string | null;\r\n public constructor(data: import(\"@lunibee/types\").UserData) {\r\n super(data.id);\r\n if (!data.username)\r\n throw new TypeError(\"A Discord user requires a username.\");\r\n this.username = data.username;\r\n this.globalName = data.global_name ?? null;\r\n this.avatar = data.avatar ?? null;\r\n this.bot = data.bot ?? false;\r\n this.system = data.system ?? false;\r\n this.flags = data.public_flags ?? 0;\r\n this.discriminator = data.discriminator && data.discriminator !== \"0\" ? data.discriminator : null;\r\n }\r\n /** Effective display name — global name, falling back to username. */\r\n public get displayName(): string {\r\n return this.globalName ?? this.username;\r\n }\r\n /** Returns the user's avatar URL, or null if they have no avatar. */\r\n public avatarURL(options: ImageURLOptions = {}): string | null {\r\n if (!this.avatar) return null;\r\n return cdnURL(`/avatars/${this.id}`, this.avatar, options);\r\n }\r\n /** Returns the default avatar URL based on the user's discriminator/snowflake. */\r\n public defaultAvatarURL(): string {\r\n const index = this.discriminator\r\n ? Number(this.discriminator) % 5\r\n : Number((BigInt(this.id) >> 22n) % 6n);\r\n return `${CDN_BASE}/embed/avatars/${index}.png`;\r\n }\r\n /** Returns the avatar URL if available, falling back to the default avatar URL. */\r\n public displayAvatarURL(options: ImageURLOptions = {}): string {\r\n return this.avatarURL(options) ?? this.defaultAvatarURL();\r\n }\r\n /** Returns the Discord mention string. Used automatically in template literals. */\r\n public override toString(): string {\r\n return `<@${this.id}>`;\r\n }\r\n}\r\n\r\n// ─── Channel ──────────────────────────────────────────────────────────────────\r\n\r\nexport class Channel extends BaseStructure {\r\n public type: number;\r\n public name?: string | null;\r\n public guildId?: string;\r\n public topic?: string | null;\r\n public parentId?: string | null;\r\n public nsfw?: boolean;\r\n public rateLimitPerUser?: number;\r\n public position?: number;\r\n readonly #context?: ResourceContext;\r\n\r\n /** Creates a channel structure from Discord channel data. */\r\n public constructor(\r\n data: import(\"@lunibee/types\").APIChannel,\r\n context?: ResourceContext,\r\n ) {\r\n super(data.id);\r\n if (!Number.isInteger(data.type) || data.type < 0)\r\n throw new RangeError(\"A Discord channel requires a valid channel type.\");\r\n this.type = data.type;\r\n this.name = data.name;\r\n this.guildId = data.guild_id;\r\n this.topic = data.topic;\r\n this.parentId = data.parent_id;\r\n this.nsfw = data.nsfw;\r\n this.rateLimitPerUser = data.rate_limit_per_user;\r\n this.position = data.position;\r\n this.#context = context;\r\n }\r\n\r\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. */\r\n public sendMessage(\r\n options: Record<string, unknown> & { content?: string },\r\n ): Promise<import(\"./index.js\").Message> {\r\n if (!this.#context)\r\n throw new Error(\"This channel is not attached to a client.\");\r\n return this.#context.sendMessage(this.id, options);\r\n }\r\n\r\n /** Sends a message using Lunibee's concise channel API. @param options Message payload. @returns The created message. @throws {Error} If the channel is not attached to a client. */\r\n public send(\r\n options: Record<string, unknown> & { content?: string },\r\n ): Promise<import(\"./index.js\").Message> {\r\n return this.sendMessage(options);\r\n }\r\n\r\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. */\r\n public edit(options: Record<string, unknown>): Promise<Channel> {\r\n if (!this.#context?.editChannel)\r\n throw new Error(\"This channel is not attached to a client.\");\r\n return this.#context.editChannel(this.id, options);\r\n }\r\n\r\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. */\r\n public editName(name: string): Promise<Channel> {\r\n if (!name.trim()) throw new TypeError(\"Channel name cannot be empty.\");\r\n return this.edit({ name });\r\n }\r\n\r\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. */\r\n public editTopic(topic: string | null): Promise<Channel> {\r\n return this.edit({ topic });\r\n }\r\n\r\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. */\r\n public editParent(parentId: string | null): Promise<Channel> {\r\n return this.edit({ parent_id: parentId });\r\n }\r\n\r\n /** Deletes this channel. @returns A promise fulfilled when Discord confirms deletion. @throws {Error} If the channel is not attached to a client. */\r\n public delete(): Promise<void> {\r\n if (!this.#context?.deleteChannel)\r\n throw new Error(\"This channel is not attached to a client.\");\r\n return this.#context.deleteChannel(this.id);\r\n }\r\n\r\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. */\r\n public update(options: Record<string, unknown>): Promise<Channel> {\r\n return this.edit(options);\r\n }\r\n\r\n /** Returns the Discord channel mention string. Used automatically in template literals. */\r\n public override toString(): string {\r\n return `<#${this.id}>`;\r\n }\r\n}\r\n\r\n// ─── Guild ────────────────────────────────────────────────────────────────────\r\n\r\nexport class Guild extends BaseStructure {\r\n public name: string;\r\n public icon: string | null;\r\n public splash: string | null;\r\n public banner: string | null;\r\n public description: string | null;\r\n public preferredLocale: string;\r\n public ownerId?: string;\r\n public features: string[];\r\n public verificationLevel: number;\r\n public premiumTier: number;\r\n public premiumSubscriptionCount: number;\r\n public memberCount?: number;\r\n public approximateMemberCount?: number;\r\n public approximatePresenceCount?: number;\r\n public vanityUrlCode: string | null;\r\n public nsfwLevel: number;\r\n public discoverySplash: string | null;\r\n\r\n public constructor(data: import(\"@lunibee/types\").APIGuild) {\r\n super(data.id);\r\n if (!data.name) throw new TypeError(\"A Discord guild requires a name.\");\r\n this.name = data.name;\r\n this.icon = data.icon ?? null;\r\n this.splash = data.splash ?? null;\r\n this.banner = data.banner ?? null;\r\n this.description = data.description ?? null;\r\n this.preferredLocale = data.preferred_locale ?? \"en-US\";\r\n this.ownerId = data.owner_id;\r\n this.features = data.features ?? [];\r\n this.verificationLevel = data.verification_level ?? 0;\r\n this.premiumTier = data.premium_tier ?? 0;\r\n this.premiumSubscriptionCount = data.premium_subscription_count ?? 0;\r\n this.memberCount = data.member_count ?? data.approximate_member_count;\r\n this.approximateMemberCount = data.approximate_member_count;\r\n this.approximatePresenceCount = data.approximate_presence_count;\r\n this.vanityUrlCode = data.vanity_url_code ?? null;\r\n this.nsfwLevel = data.nsfw_level ?? 0;\r\n this.discoverySplash = data.discovery_splash ?? null;\r\n }\r\n\r\n /** Returns the guild icon URL, or null if no icon is set. */\r\n public iconURL(options: ImageURLOptions = {}): string | null {\r\n if (!this.icon) return null;\r\n return cdnURL(`/icons/${this.id}`, this.icon, options);\r\n }\r\n\r\n /** Returns the guild splash URL, or null if none. */\r\n public splashURL(options: ImageURLOptions = {}): string | null {\r\n if (!this.splash) return null;\r\n return cdnURL(`/splashes/${this.id}`, this.splash, options);\r\n }\r\n\r\n /** Returns the guild banner URL, or null if none. */\r\n public bannerURL(options: ImageURLOptions = {}): string | null {\r\n if (!this.banner) return null;\r\n return cdnURL(`/banners/${this.id}`, this.banner, options);\r\n }\r\n\r\n /** Returns the guild discovery splash URL, or null if none. */\r\n public discoverySplashURL(\r\n options: ImageURLOptions = {},\r\n ): string | null {\r\n if (!this.discoverySplash) return null;\r\n return cdnURL(`/discovery-splashes/${this.id}`, this.discoverySplash, options);\r\n }\r\n\r\n /** Whether the guild has a given feature flag. @param feature Feature string, e.g. \"COMMUNITY\". */\r\n public hasFeature(feature: string): boolean {\r\n return this.features.includes(feature);\r\n }\r\n\r\n /** Whether the guild is a Community server. */\r\n public get isCommunity(): boolean {\r\n return this.hasFeature(\"COMMUNITY\");\r\n }\r\n\r\n /** Whether the guild has a vanity URL. */\r\n public get hasVanityUrl(): boolean {\r\n return this.vanityUrlCode !== null;\r\n }\r\n\r\n /** Returns the guild's vanity invite URL, or null if none. */\r\n public get vanityURL(): string | null {\r\n return this.vanityUrlCode\r\n ? `https://discord.gg/${this.vanityUrlCode}`\r\n : null;\r\n }\r\n\r\n /** Returns a human-readable string representation. */\r\n public override toString(): string {\r\n return this.name;\r\n }\r\n}\r\n",
|
|
10
|
+
"/** Permission bit values exposed by Discord. */\nexport const Permissions = {\n /** Create instant invite permission. */ CreateInstantInvite: 1n << 0n,\n /** Kick members permission. */ KickMembers: 1n << 1n,\n /** Ban members permission. */ BanMembers: 1n << 2n,\n /** Administrator permission. */ Administrator: 1n << 3n,\n /** Manage channels permission. */ ManageChannels: 1n << 4n,\n /** Manage guild permission. */ ManageGuild: 1n << 5n,\n /** Add reactions permission. */ AddReactions: 1n << 6n,\n /** View audit log permission. */ ViewAuditLog: 1n << 7n,\n /** Priority speaker permission. */ PrioritySpeaker: 1n << 8n,\n /** Stream permission. */ Stream: 1n << 9n,\n /** View channel permission. */ ViewChannel: 1n << 10n,\n /** Send messages permission. */ SendMessages: 1n << 11n,\n /** Send TTS messages permission. */ SendTTSMessages: 1n << 12n,\n /** Manage messages permission. */ ManageMessages: 1n << 13n,\n /** Embed links permission. */ EmbedLinks: 1n << 14n,\n /** Attach files permission. */ AttachFiles: 1n << 15n,\n /** Read message history permission. */ ReadMessageHistory: 1n << 16n,\n /** Mention everyone permission. */ MentionEveryone: 1n << 17n,\n /** Use external emojis permission. */ UseExternalEmojis: 1n << 18n,\n /** View guild insights permission. */ ViewGuildInsights: 1n << 19n,\n /** Connect permission. */ Connect: 1n << 20n,\n /** Speak permission. */ Speak: 1n << 21n,\n /** Mute members permission. */ MuteMembers: 1n << 22n,\n /** Deafen members permission. */ DeafenMembers: 1n << 23n,\n /** Move members permission. */ MoveMembers: 1n << 24n,\n /** Use voice activity detection permission. */ UseVAD: 1n << 25n,\n /** Change nickname permission. */ ChangeNickname: 1n << 26n,\n /** Manage nicknames permission. */ ManageNicknames: 1n << 27n,\n /** Manage roles permission. */ ManageRoles: 1n << 28n,\n /** Manage webhooks permission. */ ManageWebhooks: 1n << 29n,\n /** Manage guild expressions permission. */ ManageGuildExpressions: 1n << 30n,\n /** Use application commands permission. */ UseApplicationCommands: 1n << 31n,\n /** Request to speak permission. */ RequestToSpeak: 1n << 32n,\n /** Manage events permission. */ ManageEvents: 1n << 33n,\n /** Manage threads permission. */ ManageThreads: 1n << 34n,\n /** Create public threads permission. */ CreatePublicThreads: 1n << 35n,\n /** Create private threads permission. */ CreatePrivateThreads: 1n << 36n,\n /** Use external stickers permission. */ UseExternalStickers: 1n << 37n,\n /** Send messages in threads permission. */ SendMessagesInThreads: 1n << 38n,\n /** Use embedded activities permission. */ UseEmbeddedActivities: 1n << 39n,\n /** Moderate members permission. */ ModerateMembers: 1n << 40n,\n /** View creator monetization analytics permission. */ ViewCreatorMonetizationAnalytics:\n 1n << 41n,\n /** Use soundboard permission. */ UseSoundboard: 1n << 42n,\n /** Create guild expressions permission. */ CreateGuildExpressions: 1n << 43n,\n /** Create events permission. */ CreateEvents: 1n << 44n,\n /** Use external sounds permission. */ UseExternalSounds: 1n << 45n,\n /** Send voice messages permission. */ SendVoiceMessages: 1n << 46n,\n /** Send polls permission. */ SendPolls: 1n << 49n,\n /** Use external apps permission. */ UseExternalApps: 1n << 50n,\n} as const;\n\n/** Public permission resolvable. */\nexport type PermissionResolvable =\n | bigint\n | number\n | string\n | PermissionName\n | PermissionSet\n | PermissionResolvable[];\n\n/** Immutable Discord permission bitfield. */\nexport class PermissionSet {\n /** Permission bitfield. */ public readonly bitfield: bigint;\n /** Creates a permission set. @param value Initial permission bitfield. @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) bit |= this.#resolve(item);\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(\"Permission bitfield cannot be negative.\");\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 /** Checks whether all supplied permissions are present. @param permissions Permission names or raw bits. @returns True when every requested permission is present. */ public has(\n ...permissions: PermissionResolvable[]\n ): boolean {\n return permissions.every(\n (permission) =>\n (this.bitfield & this.#resolve(permission)) ===\n this.#resolve(permission),\n );\n }\n /** Checks whether any supplied permission is present. @param permissions Permission names or raw bits. @returns True when at least one requested permission is present. */ public any(\n ...permissions: PermissionResolvable[]\n ): boolean {\n return permissions.some(\n (permission) => (this.bitfield & this.#resolve(permission)) !== 0n,\n );\n }\n /** Returns a new set with permissions added. @param permissions Permission names or raw bits. @returns A new permission set. */ public add(\n ...permissions: PermissionResolvable[]\n ): PermissionSet {\n let bitfield = this.bitfield;\n for (const permission of permissions) bitfield |= this.#resolve(permission);\n return new PermissionSet(bitfield);\n }\n /** Returns a new set with permissions removed. @param permissions Permission names or raw bits. @returns A new permission set. */ public remove(\n ...permissions: PermissionResolvable[]\n ): PermissionSet {\n let bitfield = this.bitfield;\n for (const permission of permissions)\n bitfield &= ~this.#resolve(permission);\n return new PermissionSet(bitfield);\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. */ public equals(\n other: PermissionSet | bigint | number | string,\n ): boolean {\n return (\n this.bitfield ===\n (other instanceof PermissionSet\n ? other.bitfield\n : new PermissionSet(other).bitfield)\n );\n }\n /** Returns the decimal permission representation. @returns Decimal permission bitfield. */ public toString(): string {\n return this.bitfield.toString();\n }\n /** Returns known permission names contained in this set. @returns Names of all enabled known permissions. */ public toArray(): PermissionName[] {\n return (Object.keys(Permissions) as PermissionName[]).filter((permission) =>\n this.has(permission),\n );\n }\n /** Resolves a named permission or raw bit. @param permission Permission name or raw bit. @returns Numeric permission bit. */ #resolve(\n permission: PermissionResolvable,\n ): bigint {\n if (permission instanceof PermissionSet) return permission.bitfield;\n if (typeof permission === \"bigint\") return permission;\n if (typeof permission === \"number\") return BigInt(permission);\n if (Array.isArray(permission)) {\n let bit = 0n;\n for (const p of permission) bit |= this.#resolve(p);\n return bit;\n }\n if (typeof permission === \"string\") {\n if (permission in Permissions)\n return (Permissions as Record<string, bigint>)[permission]!;\n const matchedKey = Object.keys(Permissions).find(\n (k) => k.toLowerCase() === permission.toLowerCase(),\n );\n if (matchedKey)\n return (Permissions as Record<string, bigint>)[matchedKey]!;\n return BigInt(permission);\n }\n return 0n;\n }\n}\n\n/** Discord.js-compatible permission bitfield. */\nexport class PermissionsBitField extends PermissionSet {\n /** Creates a permissions bitfield. @param value Initial permission bitfield. */\n public constructor(value: PermissionResolvable = 0n) {\n super(value);\n }\n}\n",
|
|
11
|
+
"import { BaseStructure, Channel, User } from \"./base.js\";\r\nimport { PermissionsBitField } from \"./permissions.js\";\r\n\r\n/** A Discord guild member. */\r\nexport class GuildMember {\r\n /** User represented by the member. */ public readonly user: User;\r\n /** Guild containing the member. */ public readonly guildId: string;\r\n /** Nickname, if configured. */ public nickname: string | null;\r\n /** Role IDs assigned to the member. */ public readonly roleIds: string[];\r\n /** Whether the member is pending membership screening. */ public pending: boolean;\r\n /** Member join timestamp. */ public joinedAt?: Date;\r\n /** Raw effective permission bitfield supplied by Discord. */ public readonly permissions: PermissionsBitField;\r\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. */\r\n public constructor(data: {\r\n user: {\r\n id: string;\r\n username: string;\r\n global_name?: string | null;\r\n avatar?: string | null;\r\n bot?: boolean;\r\n system?: boolean;\r\n public_flags?: number;\r\n };\r\n guild_id: string;\r\n nick?: string | null;\r\n roles?: string[];\r\n pending?: boolean;\r\n joined_at?: string;\r\n permissions?: string;\r\n }) {\r\n this.user = new User(data.user);\r\n if (!/^\\d{1,20}$/.test(data.guild_id))\r\n throw new TypeError(\"Member guild_id must be a valid snowflake.\");\r\n this.guildId = data.guild_id;\r\n this.nickname = data.nick ?? null;\r\n this.roleIds = [...(data.roles ?? [])];\r\n this.pending = data.pending ?? false;\r\n this.joinedAt = data.joined_at ? new Date(data.joined_at) : undefined;\r\n if (this.joinedAt?.toString() === \"Invalid Date\")\r\n throw new RangeError(\"Member joined_at must be a valid date.\");\r\n this.permissions = new PermissionsBitField(data.permissions ?? 0n);\r\n }\r\n /** Effective member display name. @returns Nickname or user display name. */\r\n public get displayName(): string {\r\n return this.nickname ?? this.user.displayName;\r\n }\r\n /** Returns the Discord user mention for this member. */\r\n public toString(): string {\r\n return this.user.toString();\r\n }\r\n}\r\n\r\n/** A Discord guild role. */\r\nexport class Role extends BaseStructure {\r\n /** Role name. */ public name: string;\r\n /** Role color. */ public color: number;\r\n /** Whether the role is hoisted. */ public hoist: boolean;\r\n /** Permission bitfield. */ public permissions: PermissionsBitField;\r\n /** Whether the role is managed. */ public managed: boolean;\r\n /** Whether the role is mentionable. */ public mentionable: boolean;\r\n /** Creates a role from Discord data. @param data Discord role payload. */\r\n public constructor(data: {\r\n id: string;\r\n name: string;\r\n color?: number;\r\n hoist?: boolean;\r\n permissions?: string;\r\n managed?: boolean;\r\n mentionable?: boolean;\r\n }) {\r\n super(data.id);\r\n if (!data.name) throw new TypeError(\"Role name cannot be empty.\");\r\n this.name = data.name;\r\n this.color = data.color ?? 0;\r\n this.hoist = data.hoist ?? false;\r\n this.permissions = new PermissionsBitField(data.permissions ?? 0n);\r\n this.managed = data.managed ?? false;\r\n this.mentionable = data.mentionable ?? false;\r\n }\r\n /** Discord role mention string. Used automatically in template literals. */\r\n public override toString(): string {\r\n return `<@&${this.id}>`;\r\n }\r\n}\r\n\r\n/** A Discord text-capable channel. */\r\nexport class TextChannel extends Channel {\r\n /** Creates a text channel from Discord data. @param data Discord channel payload. */\r\n public constructor(\r\n data: {\r\n id: string;\r\n type: number;\r\n name?: string;\r\n parent_id?: string | null;\r\n guild_id?: string;\r\n },\r\n context?: import(\"./base.js\").ResourceContext,\r\n ) {\r\n super(data, context);\r\n }\r\n /** Discord channel mention string. Used automatically in template literals. */\r\n public override toString(): string {\r\n return `<#${this.id}>`;\r\n }\r\n}\r\n",
|
|
12
|
+
"/** Discord API snowflake identifier. */\r\nexport type Snowflake = string;\r\n\r\n// ─── Gateway Intents ─────────────────────────────────────────────────────────\r\n\r\n/** Gateway intent bit flags supported by Discord (PascalCase). */\r\nexport const GatewayIntentBits = {\r\n Guilds: 1 << 0,\r\n GuildMembers: 1 << 1,\r\n GuildModeration: 1 << 2,\r\n GuildExpressions: 1 << 3,\r\n GuildIntegrations: 1 << 4,\r\n GuildWebhooks: 1 << 5,\r\n GuildInvites: 1 << 6,\r\n GuildVoiceStates: 1 << 7,\r\n GuildPresences: 1 << 8,\r\n GuildMessages: 1 << 9,\r\n GuildMessageReactions: 1 << 10,\r\n GuildMessageTyping: 1 << 11,\r\n DirectMessages: 1 << 12,\r\n DirectMessageReactions: 1 << 13,\r\n DirectMessageTyping: 1 << 14,\r\n MessageContent: 1 << 15,\r\n GuildScheduledEvents: 1 << 16,\r\n AutoModerationConfiguration: 1 << 20,\r\n AutoModerationExecution: 1 << 21,\r\n GuildMessagePolls: 1 << 24,\r\n DirectMessagePolls: 1 << 25,\r\n} as const;\r\n\r\n/** Idiomatic camelCase Gateway intent bit flags supported by Discord. */\r\nexport const IntentBits = {\r\n guild: 1 << 0,\r\n guilds: 1 << 0,\r\n guildMembers: 1 << 1,\r\n guildModeration: 1 << 2,\r\n guildBans: 1 << 2,\r\n guildExpressions: 1 << 3,\r\n guildEmojis: 1 << 3,\r\n guildEmojisAndStickers: 1 << 3,\r\n guildIntegrations: 1 << 4,\r\n guildWebhooks: 1 << 5,\r\n guildInvites: 1 << 6,\r\n guildVoiceStates: 1 << 7,\r\n guildPresences: 1 << 8,\r\n guildMessages: 1 << 9,\r\n guildMessage: 1 << 9,\r\n guildMessageReactions: 1 << 10,\r\n guildMessageTyping: 1 << 11,\r\n directMessages: 1 << 12,\r\n directMessageReactions: 1 << 13,\r\n directMessageTyping: 1 << 14,\r\n messageContent: 1 << 15,\r\n guildScheduledEvents: 1 << 16,\r\n autoModerationConfiguration: 1 << 20,\r\n autoModerationExecution: 1 << 21,\r\n guildMessagePolls: 1 << 24,\r\n directMessagePolls: 1 << 25,\r\n} as const;\r\n\r\n/** Alias for IntentBits. */\r\nexport const Intents = IntentBits;\r\n\r\n/** Gateway intent resolvable value (single bitfield, enum key, or array of bitfields/strings). */\r\nexport type GatewayIntentResolvable =\r\n | number\r\n | keyof typeof GatewayIntentBits\r\n | keyof typeof IntentBits\r\n | (\r\n number | keyof typeof GatewayIntentBits | keyof typeof IntentBits | string\r\n )[];\r\n\r\n/** Resolves any GatewayIntentResolvable into a raw bitfield integer. */\r\nexport function resolveGatewayIntents(\r\n intents: GatewayIntentResolvable,\r\n): number {\r\n if (typeof intents === \"number\") return intents;\r\n if (Array.isArray(intents)) {\r\n return intents.reduce<number>((acc, intent) => {\r\n return acc | resolveGatewayIntents(intent as any);\r\n }, 0);\r\n }\r\n if (typeof intents === \"string\") {\r\n if (intents in GatewayIntentBits)\r\n return (GatewayIntentBits as Record<string, number>)[intents]!;\r\n if (intents in IntentBits)\r\n return (IntentBits as Record<string, number>)[intents]!;\r\n const lower = intents.charAt(0).toLowerCase() + intents.slice(1);\r\n if (lower in IntentBits)\r\n return (IntentBits as Record<string, number>)[lower]!;\r\n const num = Number(intents);\r\n if (!Number.isNaN(num)) return num;\r\n }\r\n return 0;\r\n}\r\n\r\n// ─── Gateway Config ───────────────────────────────────────────────────────────\r\n\r\n/** Gateway connection properties (OS, browser, device). */\r\nexport interface GatewayProperties {\r\n os?: string;\r\n browser?: string;\r\n device?: string;\r\n [key: string]: unknown;\r\n}\r\n/** Gateway presence activity. */\r\nexport interface GatewayPresenceActivity {\r\n name: string;\r\n type?: number;\r\n url?: string;\r\n state?: string;\r\n}\r\n/** Gateway presence data. */\r\nexport interface GatewayPresence {\r\n status?: \"online\" | \"dnd\" | \"idle\" | \"invisible\" | \"offline\";\r\n activities?: GatewayPresenceActivity[];\r\n afk?: boolean;\r\n since?: number | null;\r\n}\r\n/** Client configuration. */\r\nexport interface ClientOptions {\r\n token: string;\r\n intents: GatewayIntentResolvable;\r\n gateway?: GatewayOptions;\r\n rest?: RESTOptions;\r\n}\r\n/** Gateway connection configuration. */\r\nexport interface GatewayOptions {\r\n intents?: GatewayIntentResolvable;\r\n reconnect?: boolean;\r\n maxReconnectAttempts?: number;\r\n reconnectBaseDelay?: number;\r\n reconnectMaxDelay?: number;\r\n shardId?: number;\r\n shardCount?: number;\r\n properties?: GatewayProperties;\r\n presence?: GatewayPresence;\r\n}\r\n\r\n/** REST request configuration. */\r\nexport interface RESTOptions {\r\n timeout?: number;\r\n retries?: number;\r\n baseURL?: string;\r\n}\r\n\r\n// ─── Core Discord Objects ─────────────────────────────────────────────────────\r\n\r\n/** Discord user object. */\r\nexport interface UserData {\r\n id: Snowflake;\r\n username: string;\r\n discriminator?: string;\r\n global_name?: string | null;\r\n avatar?: string | null;\r\n bot?: boolean;\r\n system?: boolean;\r\n public_flags?: number;\r\n}\r\n/** Current authenticated bot user. */\r\nexport type ClientUser = UserData;\r\n/** Discord Gateway payload envelope. */\r\nexport interface GatewayPayload<T = unknown> {\r\n op: number;\r\n d: T | null;\r\n s: number | null;\r\n t: string | null;\r\n}\r\n/** Generic Discord API error payload. */\r\nexport interface APIError {\r\n code?: number;\r\n message?: string;\r\n errors?: Record<string, unknown>;\r\n}\r\n\r\n// ─── Discord Flags & Enums ────────────────────────────────────────────────────\r\n\r\n/** Discord message flags. */\r\nexport const MessageFlags = {\r\n Crossposted: 1,\r\n IsCrosspost: 2,\r\n SuppressEmbeds: 4,\r\n SourceMessageDeleted: 8,\r\n Urgent: 16,\r\n HasThread: 32,\r\n Ephemeral: 64,\r\n Loading: 128,\r\n IsComponentsV2: 32768,\r\n} as const;\r\n\r\n/** Discord channel types. */\r\nexport const ChannelType = {\r\n GuildText: 0,\r\n DM: 1,\r\n GuildVoice: 2,\r\n GroupDM: 3,\r\n GuildCategory: 4,\r\n GuildAnnouncement: 5,\r\n AnnouncementThread: 10,\r\n PublicThread: 11,\r\n PrivateThread: 12,\r\n GuildStageVoice: 13,\r\n GuildDirectory: 14,\r\n GuildForum: 15,\r\n GuildMedia: 16,\r\n} as const;\r\n\r\n/** Discord component types. */\r\nexport const ComponentType = {\r\n ActionRow: 1,\r\n Button: 2,\r\n StringSelect: 3,\r\n TextInput: 4,\r\n UserSelect: 5,\r\n RoleSelect: 6,\r\n MentionableSelect: 7,\r\n ChannelSelect: 8,\r\n Section: 9,\r\n TextDisplay: 10,\r\n Thumbnail: 11,\r\n MediaGallery: 12,\r\n File: 13,\r\n Separator: 14,\r\n ContentInventoryEntry: 16,\r\n Container: 17,\r\n} as const;\r\n\r\n/** Discord button style types. */\r\nexport const ButtonStyle = {\r\n Primary: 1,\r\n Secondary: 2,\r\n Success: 3,\r\n Danger: 4,\r\n Link: 5,\r\n Premium: 6,\r\n} as const;\r\n\r\n/** Discord text input style types. */\r\nexport const TextInputStyle = {\r\n Short: 1,\r\n Paragraph: 2,\r\n} as const;\r\n\r\n/** Discord interaction response types. */\r\nexport const InteractionResponseType = {\r\n Pong: 1,\r\n ChannelMessage: 4,\r\n DeferredChannelMessage: 5,\r\n DeferredMessageUpdate: 6,\r\n MessageUpdate: 7,\r\n Autocomplete: 8,\r\n Modal: 9,\r\n} as const;\r\n\r\n/** Discord sticker format types. */\r\nexport const StickerFormatType = {\r\n PNG: 1,\r\n APNG: 2,\r\n Lottie: 3,\r\n GIF: 4,\r\n} as const;\r\n\r\n/** Discord sticker types. */\r\nexport const StickerType = {\r\n Standard: 1,\r\n Guild: 2,\r\n} as const;\r\n\r\n/** Discord verification levels. */\r\nexport const VerificationLevel = {\r\n None: 0,\r\n Low: 1,\r\n Medium: 2,\r\n High: 3,\r\n VeryHigh: 4,\r\n} as const;\r\n\r\n/** Discord premium tiers. */\r\nexport const PremiumTier = {\r\n None: 0,\r\n Tier1: 1,\r\n Tier2: 2,\r\n Tier3: 3,\r\n} as const;\r\n\r\n// ─── Embeds ───────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord embed footer object. */\r\nexport interface APIEmbedFooter {\r\n text: string;\r\n icon_url?: string;\r\n proxy_icon_url?: string;\r\n}\r\n/** Raw Discord embed image/thumbnail/video object. */\r\nexport interface APIEmbedMedia {\r\n url: string;\r\n proxy_url?: string;\r\n height?: number;\r\n width?: number;\r\n}\r\n/** Raw Discord embed provider object. */\r\nexport interface APIEmbedProvider {\r\n name?: string;\r\n url?: string;\r\n}\r\n/** Raw Discord embed author object. */\r\nexport interface APIEmbedAuthor {\r\n name: string;\r\n url?: string;\r\n icon_url?: string;\r\n proxy_icon_url?: string;\r\n}\r\n/** Raw Discord embed field object. */\r\nexport interface APIEmbedField {\r\n name: string;\r\n value: string;\r\n inline?: boolean;\r\n}\r\n/** Raw Discord embed object. */\r\nexport interface APIEmbed {\r\n title?: string;\r\n type?: string;\r\n description?: string;\r\n url?: string;\r\n timestamp?: string;\r\n color?: number;\r\n footer?: APIEmbedFooter;\r\n image?: APIEmbedMedia;\r\n thumbnail?: APIEmbedMedia;\r\n video?: APIEmbedMedia;\r\n provider?: APIEmbedProvider;\r\n author?: APIEmbedAuthor;\r\n fields?: APIEmbedField[];\r\n}\r\n\r\n// ─── Message Components ───────────────────────────────────────────────────────\r\n\r\n/** Raw Discord select menu option. */\r\nexport interface APISelectMenuOption {\r\n label: string;\r\n value: string;\r\n description?: string;\r\n emoji?: APIPartialEmoji;\r\n default?: boolean;\r\n}\r\n/** Raw Discord emoji (partial, as used in components). */\r\nexport interface APIPartialEmoji {\r\n id?: Snowflake | null;\r\n name?: string | null;\r\n animated?: boolean;\r\n}\r\n/** Raw Discord button component. */\r\nexport interface APIButtonComponent {\r\n type: 2;\r\n style: number;\r\n label?: string;\r\n emoji?: APIPartialEmoji;\r\n custom_id?: string;\r\n url?: string;\r\n sku_id?: string;\r\n disabled?: boolean;\r\n}\r\n/** Raw Discord select menu component. */\r\nexport interface APISelectMenuComponent {\r\n type: 3 | 5 | 6 | 7 | 8;\r\n custom_id: string;\r\n options?: APISelectMenuOption[];\r\n channel_types?: number[];\r\n placeholder?: string;\r\n min_values?: number;\r\n max_values?: number;\r\n disabled?: boolean;\r\n}\r\n/** Raw Discord text input component. */\r\nexport interface APITextInputComponent {\r\n type: 4;\r\n custom_id: string;\r\n style: number;\r\n label: string;\r\n min_length?: number;\r\n max_length?: number;\r\n required?: boolean;\r\n value?: string;\r\n placeholder?: string;\r\n}\r\n/** Union of all raw message component types. */\r\nexport type APIMessageActionRowComponent =\r\n APIButtonComponent | APISelectMenuComponent | APITextInputComponent;\r\n/** Raw Discord action row component. */\r\nexport interface APIActionRowComponent {\r\n type: 1;\r\n id?: number;\r\n components: APIMessageActionRowComponent[];\r\n}\r\n/** Union including action rows and V2 components. */\r\nexport type APIMessageComponent = APIActionRowComponent | { type: Exclude<number, 1>; [key: string]: any };\r\n\r\n// ─── Attachments ─────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord attachment object. */\r\nexport interface APIAttachment {\r\n id: Snowflake;\r\n filename: string;\r\n description?: string | null;\r\n content_type?: string;\r\n size: number;\r\n url: string;\r\n proxy_url: string;\r\n height?: number | null;\r\n width?: number | null;\r\n ephemeral?: boolean;\r\n duration_secs?: number;\r\n waveform?: string;\r\n flags?: number;\r\n}\r\n\r\n// ─── Stickers ────────────────────────────────────────────────────────────────\r\n\r\n/** Compact sticker item as included in messages. */\r\nexport interface APIStickerItem {\r\n id: Snowflake;\r\n name: string;\r\n format_type: number;\r\n}\r\n/** Full Discord sticker object. */\r\nexport interface APISticker {\r\n id: Snowflake;\r\n pack_id?: Snowflake;\r\n name: string;\r\n description?: string | null;\r\n tags?: string;\r\n type: number;\r\n format_type: number;\r\n available?: boolean;\r\n guild_id?: Snowflake;\r\n user?: UserData;\r\n sort_value?: number;\r\n}\r\n\r\n// ─── Messages ────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord message reference. */\r\nexport interface APIMessageReference {\r\n type?: number;\r\n message_id?: Snowflake;\r\n channel_id?: Snowflake;\r\n guild_id?: Snowflake;\r\n fail_if_not_exists?: boolean;\r\n}\r\n/** Raw Discord message reaction. */\r\nexport interface APIMessageReaction {\r\n count: number;\r\n count_details?: Record<string, number>;\r\n me?: boolean;\r\n me_burst?: boolean;\r\n emoji: APIPartialEmoji;\r\n burst_colors?: string[];\r\n}\r\n/** Raw Discord message object. */\r\nexport interface APIMessage {\r\n id: Snowflake;\r\n channel_id: Snowflake;\r\n author: UserData;\r\n content: string;\r\n timestamp?: string;\r\n edited_timestamp?: string | null;\r\n tts?: boolean;\r\n mention_everyone?: boolean;\r\n mentions?: UserData[];\r\n mention_roles?: Snowflake[];\r\n mention_channels?: Array<Record<string, unknown>>;\r\n attachments?: APIAttachment[];\r\n embeds?: APIEmbed[];\r\n reactions?: APIMessageReaction[];\r\n nonce?: string | number | null;\r\n pinned?: boolean;\r\n webhook_id?: Snowflake;\r\n type?: number;\r\n activity?: Record<string, unknown>;\r\n application?: Record<string, unknown>;\r\n application_id?: Snowflake;\r\n message_reference?: APIMessageReference;\r\n flags?: number;\r\n referenced_message?: APIMessage | null;\r\n interaction_metadata?: Record<string, unknown>;\r\n thread?: Record<string, unknown>;\r\n components?: APIMessageComponent[];\r\n sticker_items?: APIStickerItem[];\r\n stickers?: APISticker[];\r\n position?: number;\r\n role_subscription_data?: Record<string, unknown>;\r\n purchase_notification?: Record<string, unknown>;\r\n poll?: Record<string, unknown>;\r\n guild_id?: Snowflake;\r\n}\r\n\r\n// ─── Channels ────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord channel object. */\r\nexport interface APIChannel {\r\n id: Snowflake;\r\n type: number;\r\n guild_id?: Snowflake;\r\n position?: number;\r\n permission_overwrites?: Array<Record<string, unknown>>;\r\n name?: string | null;\r\n topic?: string | null;\r\n nsfw?: boolean;\r\n last_message_id?: Snowflake | null;\r\n bitrate?: number;\r\n user_limit?: number;\r\n rate_limit_per_user?: number;\r\n recipients?: UserData[];\r\n icon?: string | null;\r\n owner_id?: Snowflake;\r\n application_id?: Snowflake;\r\n parent_id?: Snowflake | null;\r\n last_pin_timestamp?: string | null;\r\n rtc_region?: string | null;\r\n video_quality_mode?: number;\r\n message_count?: number;\r\n member_count?: number;\r\n thread_metadata?: APIThreadMetadata;\r\n default_auto_archive_duration?: number;\r\n flags?: number;\r\n total_message_sent?: number;\r\n available_tags?: APIForumTag[];\r\n default_reaction_emoji?: APIPartialEmoji | null;\r\n default_thread_rate_limit_per_user?: number;\r\n default_sort_order?: number | null;\r\n default_forum_layout?: number;\r\n}\r\n\r\n/** Raw Discord thread metadata. */\r\nexport interface APIThreadMetadata {\r\n archived: boolean;\r\n auto_archive_duration: number;\r\n archive_timestamp: string;\r\n locked: boolean;\r\n invitable?: boolean;\r\n create_timestamp?: string | null;\r\n}\r\n\r\n/** Raw Discord forum tag. */\r\nexport interface APIForumTag {\r\n id: Snowflake;\r\n name: string;\r\n moderated: boolean;\r\n emoji_id?: Snowflake | null;\r\n emoji_name?: string | null;\r\n}\r\n\r\n/** Raw Discord thread member. */\r\nexport interface APIThreadMember {\r\n id?: Snowflake;\r\n user_id?: Snowflake;\r\n join_timestamp: string;\r\n flags: number;\r\n member?: APIGuildMember;\r\n}\r\n\r\n// ─── Roles ────────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord role object. */\r\nexport interface APIRole {\r\n id: Snowflake;\r\n name: string;\r\n color: number;\r\n hoist: boolean;\r\n icon?: string | null;\r\n unicode_emoji?: string | null;\r\n position: number;\r\n permissions: string;\r\n managed: boolean;\r\n mentionable: boolean;\r\n tags?: Record<string, unknown>;\r\n flags?: number;\r\n}\r\n\r\n// ─── Emoji ────────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord emoji object. */\r\nexport interface APIEmoji {\r\n id: Snowflake | null;\r\n name: string | null;\r\n roles?: Snowflake[];\r\n user?: UserData;\r\n require_colons?: boolean;\r\n managed?: boolean;\r\n animated?: boolean;\r\n available?: boolean;\r\n}\r\n\r\n// ─── Guilds ───────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord guild object. */\r\nexport interface APIGuild {\r\n id: Snowflake;\r\n name: string;\r\n icon?: string | null;\r\n icon_hash?: string | null;\r\n splash?: string | null;\r\n discovery_splash?: string | null;\r\n owner?: boolean;\r\n owner_id?: Snowflake;\r\n permissions?: string;\r\n afk_channel_id?: Snowflake | null;\r\n afk_timeout?: number;\r\n widget_enabled?: boolean;\r\n widget_channel_id?: Snowflake | null;\r\n verification_level?: number;\r\n default_message_notifications?: number;\r\n explicit_content_filter?: number;\r\n roles?: APIRole[];\r\n emojis?: APIEmoji[];\r\n stickers?: APISticker[];\r\n features?: string[];\r\n mfa_level?: number;\r\n application_id?: Snowflake | null;\r\n system_channel_id?: Snowflake | null;\r\n system_channel_flags?: number;\r\n rules_channel_id?: Snowflake | null;\r\n max_presences?: number | null;\r\n max_members?: number;\r\n vanity_url_code?: string | null;\r\n description?: string | null;\r\n banner?: string | null;\r\n premium_tier?: number;\r\n premium_subscription_count?: number;\r\n preferred_locale?: string;\r\n public_updates_channel_id?: Snowflake | null;\r\n max_video_channel_users?: number;\r\n approximate_member_count?: number;\r\n approximate_presence_count?: number;\r\n nsfw_level?: number;\r\n safety_alerts_channel_id?: Snowflake | null;\r\n member_count?: number;\r\n}\r\n\r\n/** Raw Discord guild member object. */\r\nexport interface APIGuildMember {\r\n user: UserData;\r\n nick?: string | null;\r\n avatar?: string | null;\r\n roles: Snowflake[];\r\n joined_at: string;\r\n premium_since?: string | null;\r\n deaf?: boolean;\r\n mute?: boolean;\r\n flags?: number;\r\n pending?: boolean;\r\n permissions?: string;\r\n communication_disabled_until?: string | null;\r\n guild_id?: Snowflake;\r\n}\r\n\r\n// ─── Voice ────────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord voice state object. */\r\nexport interface APIVoiceState {\r\n guild_id?: Snowflake;\r\n channel_id?: Snowflake | null;\r\n user_id: Snowflake;\r\n member?: APIGuildMember;\r\n session_id: string;\r\n deaf: boolean;\r\n mute: boolean;\r\n self_deaf: boolean;\r\n self_mute: boolean;\r\n self_stream?: boolean;\r\n self_video: boolean;\r\n suppress: boolean;\r\n request_to_speak_timestamp?: string | null;\r\n}\r\n\r\n/** Raw Discord voice server update event. */\r\nexport interface APIVoiceServerUpdate {\r\n token: string;\r\n guild_id: Snowflake;\r\n endpoint?: string | null;\r\n}\r\n\r\n// ─── Presence ────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord activity object. */\r\nexport interface APIActivity {\r\n name: string;\r\n type: number;\r\n url?: string | null;\r\n created_at: number;\r\n state?: string | null;\r\n details?: string | null;\r\n emoji?: APIPartialEmoji | null;\r\n}\r\n\r\n/** Raw Discord presence update event. */\r\nexport interface APIPresenceUpdate {\r\n user: { id: Snowflake } & Partial<UserData>;\r\n guild_id: Snowflake;\r\n status: string;\r\n activities: APIActivity[];\r\n client_status: { desktop?: string; mobile?: string; web?: string };\r\n}\r\n\r\n// ─── Typing ───────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord typing start event. */\r\nexport interface APITypingStart {\r\n channel_id: Snowflake;\r\n guild_id?: Snowflake;\r\n user_id: Snowflake;\r\n timestamp: number;\r\n member?: APIGuildMember;\r\n}\r\n\r\n// ─── Guilds ──────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord guild preview. */\r\nexport interface APIGuildPreview {\r\n id: Snowflake;\r\n name: string;\r\n icon: string | null;\r\n splash: string | null;\r\n discovery_splash: string | null;\r\n emojis: unknown[];\r\n features: string[];\r\n approximate_member_count: number;\r\n approximate_presence_count: number;\r\n description: string | null;\r\n stickers: unknown[];\r\n}\r\n\r\n// ─── Invites ─────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord invite. */\r\nexport interface APIInvite {\r\n code: string;\r\n guild?: Partial<APIGuild>;\r\n channel: Partial<APIChannel>;\r\n inviter?: UserData;\r\n target_type?: number;\r\n target_user?: UserData;\r\n approximate_presence_count?: number;\r\n approximate_member_count?: number;\r\n}\r\n\r\n/** Raw Discord invite create event. */\r\nexport interface APIInviteCreate {\r\n channel_id: Snowflake;\r\n code: string;\r\n created_at: string;\r\n guild_id?: Snowflake;\r\n inviter?: UserData;\r\n max_age: number;\r\n max_uses: number;\r\n target_type?: number;\r\n target_user?: UserData;\r\n temporary: boolean;\r\n uses: number;\r\n}\r\n\r\n/** Raw Discord invite delete event. */\r\nexport interface APIInviteDelete {\r\n channel_id: Snowflake;\r\n guild_id?: Snowflake;\r\n code: string;\r\n}\r\n\r\n// ─── Webhooks ────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord webhooks update event. */\r\nexport interface APIWebhooksUpdate {\r\n guild_id: Snowflake;\r\n channel_id: Snowflake;\r\n}\r\n\r\n/** Raw Discord webhook object. */\r\nexport interface APIWebhook {\r\n id: Snowflake;\r\n type: number;\r\n guild_id?: Snowflake | null;\r\n channel_id?: Snowflake | null;\r\n user?: UserData;\r\n name?: string | null;\r\n avatar?: string | null;\r\n token?: string;\r\n application_id?: Snowflake | null;\r\n url?: string;\r\n}\r\n\r\n// ─── AutoMod ─────────────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord AutoMod action. */\r\nexport interface APIAutoModerationAction {\r\n type: number;\r\n metadata?: {\r\n channel_id?: Snowflake;\r\n duration_seconds?: number;\r\n custom_message?: string;\r\n };\r\n}\r\n\r\n/** Raw Discord AutoMod rule object. */\r\nexport interface APIAutoModerationRule {\r\n id: Snowflake;\r\n guild_id: Snowflake;\r\n name: string;\r\n creator_id: Snowflake;\r\n event_type: number;\r\n trigger_type: number;\r\n trigger_metadata: Record<string, unknown>;\r\n actions: APIAutoModerationAction[];\r\n enabled: boolean;\r\n exempt_roles: Snowflake[];\r\n exempt_channels: Snowflake[];\r\n}\r\n\r\n/** Raw Discord AutoMod action execution event. */\r\nexport interface APIAutoModerationActionExecution {\r\n guild_id: Snowflake;\r\n action: APIAutoModerationAction;\r\n rule_id: Snowflake;\r\n rule_trigger_type: number;\r\n user_id: Snowflake;\r\n channel_id?: Snowflake;\r\n message_id?: Snowflake;\r\n alert_system_message_id?: Snowflake;\r\n content: string;\r\n matched_keyword?: string | null;\r\n matched_content?: string | null;\r\n}\r\n\r\n// ─── Scheduled Events ─────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord guild scheduled event entity metadata. */\r\nexport interface APIGuildScheduledEventEntityMetadata {\r\n location?: string;\r\n}\r\n\r\n/** Raw Discord guild scheduled event object. */\r\nexport interface APIGuildScheduledEvent {\r\n id: Snowflake;\r\n guild_id: Snowflake;\r\n channel_id?: Snowflake | null;\r\n creator_id?: Snowflake | null;\r\n name: string;\r\n description?: string | null;\r\n scheduled_start_time: string;\r\n scheduled_end_time?: string | null;\r\n privacy_level: number;\r\n status: number;\r\n entity_type: number;\r\n entity_id?: Snowflake | null;\r\n entity_metadata?: APIGuildScheduledEventEntityMetadata | null;\r\n creator?: UserData;\r\n user_count?: number;\r\n image?: string | null;\r\n}\r\n\r\n// ─── Stage Instances ─────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord stage instance object. */\r\nexport interface APIStageInstance {\r\n id: Snowflake;\r\n guild_id: Snowflake;\r\n channel_id: Snowflake;\r\n topic: string;\r\n privacy_level: number;\r\n discoverable_disabled?: boolean;\r\n guild_scheduled_event_id?: Snowflake | null;\r\n}\r\n\r\n// ─── Application Commands ─────────────────────────────────────────────────────\r\n\r\n/** Discord application command option types. */\r\nexport const ApplicationCommandOptionType = {\r\n SubCommand: 1,\r\n SubCommandGroup: 2,\r\n String: 3,\r\n Integer: 4,\r\n Boolean: 5,\r\n User: 6,\r\n Channel: 7,\r\n Role: 8,\r\n Mentionable: 9,\r\n Number: 10,\r\n Attachment: 11,\r\n} as const;\r\n\r\n/** Discord application command types. */\r\nexport const ApplicationCommandType = {\r\n ChatInput: 1,\r\n User: 2,\r\n Message: 3,\r\n} as const;\r\n\r\n/** Raw Discord application command option. */\r\nexport interface APIApplicationCommandOption {\r\n type: number;\r\n name: string;\r\n description: string;\r\n required?: boolean;\r\n choices?: Array<{ name: string; value: string | number }>;\r\n options?: APIApplicationCommandOption[];\r\n min_value?: number;\r\n max_value?: number;\r\n min_length?: number;\r\n max_length?: number;\r\n autocomplete?: boolean;\r\n channel_types?: number[];\r\n}\r\n\r\n/** Raw Discord application command object (from API). */\r\nexport interface APIApplicationCommand {\r\n id: Snowflake;\r\n type?: number;\r\n application_id: Snowflake;\r\n guild_id?: Snowflake;\r\n name: string;\r\n description: string;\r\n options?: APIApplicationCommandOption[];\r\n default_member_permissions?: string | null;\r\n dm_permission?: boolean;\r\n nsfw?: boolean;\r\n version: Snowflake;\r\n}\r\n\r\n/** Data for creating/overwriting an application command. */\r\nexport interface ApplicationCommandData {\r\n name: string;\r\n description: string;\r\n type?: number;\r\n options?: APIApplicationCommandOption[];\r\n default_member_permissions?: string | null;\r\n dm_permission?: boolean;\r\n nsfw?: boolean;\r\n}\r\n\r\n// ─── Gateway Events ───────────────────────────────────────────────────────────\r\n\r\n/** Raw Discord READY event payload. */\r\nexport interface APIReadyEvent {\r\n v: number;\r\n user: UserData;\r\n guilds: Array<{ id: Snowflake; unavailable?: boolean }>;\r\n session_id: string;\r\n resume_gateway_url: string;\r\n shard?: [number, number];\r\n application?: { id: Snowflake; flags: number; [key: string]: unknown };\r\n}\r\n\r\n/** Raw Discord reaction event payload. */\r\nexport interface APIMessageReactionEvent {\r\n user_id: Snowflake;\r\n channel_id: Snowflake;\r\n message_id: Snowflake;\r\n guild_id?: Snowflake;\r\n member?: APIGuildMember;\r\n emoji: APIPartialEmoji;\r\n message_author_id?: Snowflake;\r\n burst?: boolean;\r\n type?: number;\r\n}\r\n\r\n/** Raw Discord reaction remove emoji event payload. */\r\nexport interface APIMessageReactionRemoveEmojiEvent {\r\n channel_id: Snowflake;\r\n guild_id?: Snowflake;\r\n message_id: Snowflake;\r\n emoji: APIPartialEmoji;\r\n}\r\n\r\n/** Raw Discord message deletion event payload. */\r\nexport interface APIMessageDeleteEvent {\r\n id: Snowflake;\r\n channel_id: Snowflake;\r\n guild_id?: Snowflake;\r\n}\r\n\r\n/** Raw Discord bulk message deletion event payload. */\r\nexport interface APIMessageDeleteBulkEvent {\r\n ids: Snowflake[];\r\n channel_id: Snowflake;\r\n guild_id?: Snowflake;\r\n}\r\n\r\n/** Raw Discord channel deletion event payload. */\r\nexport interface APIChannelDeleteEvent extends APIChannel {}\r\n\r\n/** Raw Discord guild deletion event payload. */\r\nexport interface APIGuildDeleteEvent {\r\n id: Snowflake;\r\n unavailable?: boolean;\r\n}\r\n\r\n/** Raw Discord thread lifecycle payload. */\r\nexport interface APIThreadEvent extends APIChannel {\r\n guild_id: Snowflake;\r\n member?: APIThreadMember;\r\n}\r\n\r\n/** Raw Discord thread list sync event. */\r\nexport interface APIThreadListSync {\r\n guild_id: Snowflake;\r\n channel_ids?: Snowflake[];\r\n threads: APIChannel[];\r\n members: APIThreadMember[];\r\n}\r\n\r\n/** Raw Discord thread members update event. */\r\nexport interface APIThreadMembersUpdate {\r\n id: Snowflake;\r\n guild_id: Snowflake;\r\n member_count: number;\r\n added_members?: APIThreadMember[];\r\n removed_member_ids?: Snowflake[];\r\n}\r\n\r\n/** Raw Discord guild role event payload. */\r\nexport interface APIGuildRoleEvent {\r\n guild_id: Snowflake;\r\n role: APIRole;\r\n}\r\n\r\n/** Raw Discord guild role delete event payload. */\r\nexport interface APIGuildRoleDeleteEvent {\r\n guild_id: Snowflake;\r\n role_id: Snowflake;\r\n}\r\n\r\n/** Raw Discord guild ban event payload. */\r\nexport interface APIGuildBanEvent {\r\n guild_id: Snowflake;\r\n user: UserData;\r\n}\r\n\r\n/** Raw Discord guild emojis update event payload. */\r\nexport interface APIGuildEmojisUpdateEvent {\r\n guild_id: Snowflake;\r\n emojis: APIEmoji[];\r\n}\r\n\r\n/** Raw Discord guild stickers update event payload. */\r\nexport interface APIGuildStickersUpdateEvent {\r\n guild_id: Snowflake;\r\n stickers: APISticker[];\r\n}\r\n\r\n/** Raw Discord channel pins update event. */\r\nexport interface APIChannelPinsUpdate {\r\n guild_id?: Snowflake;\r\n channel_id: Snowflake;\r\n last_pin_timestamp?: string | null;\r\n}\r\n\r\n/** Raw Discord guild members chunk event. */\r\nexport interface APIGuildMembersChunk {\r\n guild_id: Snowflake;\r\n members: APIGuildMember[];\r\n chunk_index: number;\r\n chunk_count: number;\r\n not_found?: Snowflake[];\r\n presences?: APIPresenceUpdate[];\r\n nonce?: string;\r\n}\r\n\r\n/** Raw Discord guild scheduled event user add/remove event. */\r\nexport interface APIGuildScheduledEventUserEvent {\r\n guild_scheduled_event_id: Snowflake;\r\n user_id: Snowflake;\r\n guild_id: Snowflake;\r\n}\r\n\r\n/** Raw Discord message poll vote add/remove event. */\r\nexport interface APIMessagePollVoteEvent {\r\n user_id: Snowflake;\r\n channel_id: Snowflake;\r\n message_id: Snowflake;\r\n guild_id?: Snowflake;\r\n answer_id: number;\r\n}\r\n",
|
|
13
|
+
"/** Resource structures for Discord messages and related entities. */\r\nimport { BaseStructure, Channel, User } from \"./base.js\";\r\nimport type { ResourceContext } from \"./base.js\";\r\n\r\nexport { BaseStructure, Channel, Guild, User } from \"./base.js\";\r\nexport type { ResourceContext } from \"./base.js\";\r\n\r\nexport class Message extends BaseStructure {\r\n public content: string;\r\n public author: User;\r\n public channelId: string;\r\n public readonly channel: Channel;\r\n public guildId?: string;\r\n public flags: number;\r\n /** Message creation timestamp (from timestamp field or snowflake). */\r\n public readonly timestamp: Date;\r\n public readonly attachments: import(\"@lunibee/types\").APIAttachment[];\r\n public readonly embeds: import(\"@lunibee/types\").APIEmbed[];\r\n public readonly mentions: User[];\r\n public readonly mentionRoles: string[];\r\n public pinned: boolean;\r\n public mentionEveryone: boolean;\r\n public type: number;\r\n public readonly reference?: import(\"@lunibee/types\").APIMessageReference;\r\n public readonly components: import(\"@lunibee/types\").APIMessageComponent[];\r\n public readonly referencedMessage?: Message | null;\r\n readonly #context?: ResourceContext;\r\n\r\n /** Creates a message structure from Discord message data. */\r\n public constructor(\r\n data: import(\"@lunibee/types\").APIMessage,\r\n context?: ResourceContext,\r\n ) {\r\n super(data.id);\r\n if (!/^\\d{1,20}$/.test(data.channel_id))\r\n throw new TypeError(\"Message channel_id must be a valid snowflake.\");\r\n this.content = data.content ?? \"\";\r\n this.author = new User(data.author);\r\n this.channelId = data.channel_id;\r\n this.guildId = data.guild_id;\r\n this.flags = data.flags ?? 0;\r\n this.timestamp = new Date(\r\n data.timestamp ?? Number((BigInt(this.id) >> 22n) + 1420070400000n),\r\n );\r\n this.attachments = data.attachments ?? [];\r\n this.embeds = data.embeds ?? [];\r\n this.components = data.components ?? [];\r\n this.mentions = (data.mentions ?? []).map((user) => new User(user));\r\n this.mentionRoles = data.mention_roles ?? [];\r\n this.pinned = data.pinned ?? false;\r\n this.mentionEveryone = data.mention_everyone ?? false;\r\n this.type = data.type ?? 0;\r\n this.reference = data.message_reference;\r\n this.referencedMessage = data.referenced_message\r\n ? new Message(data.referenced_message, context)\r\n : data.referenced_message === null\r\n ? null\r\n : undefined;\r\n this.#context = context;\r\n this.channel = new Channel(\r\n { id: data.channel_id, type: 0, guild_id: data.guild_id },\r\n context,\r\n );\r\n }\r\n\r\n /** Whether embeds are suppressed on this message. */\r\n public get embedsSuppressed(): boolean {\r\n return (this.flags & 4) !== 0;\r\n }\r\n\r\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. */\r\n public edit(\r\n options: Record<string, unknown> & { content?: string },\r\n ): Promise<Message> {\r\n if (!this.#context)\r\n throw new Error(\"This message is not attached to a client.\");\r\n return this.#context.editMessage(this.channelId, this.id, options);\r\n }\r\n\r\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. */\r\n public update(\r\n options: Record<string, unknown> & { content?: string },\r\n ): Promise<Message> {\r\n return this.edit(options);\r\n }\r\n\r\n /** Deletes this message. @returns A promise fulfilled when Discord confirms deletion. @throws {Error} If the message is not attached to a client. */\r\n public delete(): Promise<void> {\r\n if (!this.#context)\r\n throw new Error(\"This message is not attached to a client.\");\r\n return this.#context.deleteMessage(this.channelId, this.id);\r\n }\r\n\r\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. */\r\n public reply(\r\n options: string | (Record<string, unknown> & { content?: string }),\r\n ): Promise<Message> {\r\n if (!this.#context)\r\n throw new Error(\"This message is not attached to a client.\");\r\n const payload =\r\n typeof options === \"string\" ? { content: options } : { ...options };\r\n payload.message_reference = {\r\n message_id: this.id,\r\n channel_id: this.channelId,\r\n guild_id: this.guildId,\r\n };\r\n return this.#context.sendMessage(this.channelId, payload);\r\n }\r\n\r\n /** Crossposts this message. @returns The resulting message. @throws {Error} If the message is not attached to a client. */\r\n public crosspost(): Promise<Message> {\r\n if (!this.#context)\r\n throw new Error(\"This message is not attached to a client.\");\r\n return this.#context.crosspostMessage(this.channelId, this.id);\r\n }\r\n\r\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. */\r\n public react(emoji: string): Promise<void> {\r\n if (!this.#context?.addReaction)\r\n throw new Error(\"This message is not attached to a client.\");\r\n return this.#context.addReaction(this.channelId, this.id, emoji);\r\n }\r\n\r\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. */\r\n public removeReaction(emoji: string, userId?: string): Promise<void> {\r\n if (!this.#context)\r\n throw new Error(\"This message is not attached to a client.\");\r\n return userId\r\n ? (this.#context.removeReaction?.(\r\n this.channelId,\r\n this.id,\r\n emoji,\r\n userId,\r\n ) ?? Promise.reject(new Error(\"Reaction operations are unavailable.\")))\r\n : (this.#context.removeOwnReaction?.(this.channelId, this.id, emoji) ??\r\n Promise.reject(new Error(\"Reaction operations are unavailable.\")));\r\n }\r\n\r\n /** Removes all reactions from this message. @returns A promise fulfilled when reactions are removed. @throws {Error} If reaction operations are unavailable. */\r\n public removeAllReactions(): Promise<void> {\r\n if (!this.#context?.removeAllReactions)\r\n throw new Error(\"This message is not attached to a client.\");\r\n return this.#context.removeAllReactions(this.channelId, this.id);\r\n }\r\n\r\n /** Pins this message. @returns A promise fulfilled when the message is pinned. @throws {Error} If pin operations are unavailable. */\r\n public pin(): Promise<void> {\r\n if (!this.#context?.pinMessage)\r\n throw new Error(\"This message is not attached to a client.\");\r\n return this.#context.pinMessage(this.channelId, this.id);\r\n }\r\n\r\n /** Unpins this message. @returns A promise fulfilled when the message is unpinned. @throws {Error} If pin operations are unavailable. */\r\n public unpin(): Promise<void> {\r\n if (!this.#context?.unpinMessage)\r\n throw new Error(\"This message is not attached to a client.\");\r\n return this.#context.unpinMessage(this.channelId, this.id);\r\n }\r\n}\r\n\r\nexport { GuildMember, Role, TextChannel } from \"./resources.js\";\r\nexport * from \"./interactions.js\";\r\nexport { Embed } from \"./embed.js\";\r\n",
|
|
14
|
+
"import { Collection } from \"@lunibee/collection\";\r\nimport { REST, Routes } from \"@lunibee/rest\";\r\nimport { Message, type ResourceContext } from \"@lunibee/structures\";\r\n\r\nexport type MessageCreateOptions = Record<string, unknown> & {\r\n content?: string;\r\n};\r\nexport type MessageEditOptions = Record<string, unknown> & { content?: string };\r\n\r\nexport class MessageManager {\r\n public readonly cache = new Collection<string, Message>();\r\n readonly #rest: REST;\r\n readonly #context: ResourceContext;\r\n readonly #channelId: string;\r\n\r\n public constructor(rest: REST, context: ResourceContext, channelId: string) {\r\n if (!channelId) throw new TypeError(\"Channel ID is required.\");\r\n this.#rest = rest;\r\n this.#context = context;\r\n this.#channelId = channelId;\r\n }\r\n public async resolve(messageId: string): Promise<Message> {\r\n return this.cache.get(messageId) ?? this.fetch(messageId);\r\n }\r\n public async send(options: MessageCreateOptions): Promise<Message> {\r\n const data = await this.#rest.post<\r\n ConstructorParameters<typeof Message>[0]\r\n >(Routes.channelMessages(this.#channelId), options);\r\n return this.upsert(data);\r\n }\r\n public async fetch(messageId: string): Promise<Message> {\r\n const data = await this.#rest.get<ConstructorParameters<typeof Message>[0]>(\r\n Routes.message(this.#channelId, messageId),\r\n );\r\n return this.upsert(data);\r\n }\r\n public fetchMany(messageIds: Iterable<string>): Promise<Message[]> {\r\n return Promise.all(\r\n Array.from(messageIds, (messageId) => this.fetch(messageId)),\r\n );\r\n }\r\n public upsert(data: ConstructorParameters<typeof Message>[0]): Message {\r\n const existing = this.cache.get(data.id);\r\n const message = new Message(data, this.#context);\r\n if (existing) {\r\n Object.assign(existing, message);\r\n return existing;\r\n }\r\n this.cache.set(message.id, message);\r\n return message;\r\n }\r\n public delete(messageId: string): boolean {\r\n return this.cache.delete(messageId);\r\n }\r\n}\r\n",
|
|
13
15
|
"import { REST, Routes } from \"@lunibee/rest\";\nimport { Channel, type ResourceContext } from \"@lunibee/structures\";\n\n/** Manages thread resources created from a parent channel. */\nexport class ThreadManager {\n readonly #rest: REST;\n readonly #context: ResourceContext;\n readonly #channelId: string;\n /** Creates a thread manager. @param rest REST transport. @param context Structure resource context. @param channelId Parent channel identifier. @throws {TypeError} If channelId is empty. */\n public constructor(rest: REST, context: ResourceContext, channelId: string) {\n if (!channelId) throw new TypeError(\"Channel ID is required.\");\n this.#rest = rest;\n this.#context = context;\n this.#channelId = channelId;\n }\n /** Creates a thread from a message. @param messageId Message identifier. @param options Thread creation options. @returns Created thread channel. @throws {Error} If REST rejects the request. */\n public async createFromMessage(\n messageId: string,\n options: {\n name: string;\n autoArchiveDuration?: 60 | 1440 | 4320 | 10080;\n rateLimitPerUser?: number;\n },\n ): Promise<Channel> {\n const data = await this.#rest.post<\n ConstructorParameters<typeof Channel>[0]\n >(Routes.messageThread(this.#channelId, messageId), {\n name: options.name,\n auto_archive_duration: options.autoArchiveDuration,\n rate_limit_per_user: options.rateLimitPerUser,\n });\n return new Channel(data, this.#context);\n }\n}\n",
|
|
16
|
+
"import { ResourceManager } from \"./base.js\";\r\nimport { User } from \"@lunibee/structures\";\r\nimport { type REST, Routes } from \"@lunibee/rest\";\r\nimport type { APIChannel } from \"@lunibee/types\";\r\n\r\ntype UserData = ConstructorParameters<typeof User>[0];\r\n\r\nexport interface UserEditOptions {\r\n username?: string;\r\n avatar?: string | null;\r\n}\r\n\r\nexport class UserManager extends ResourceManager<string, User> {\r\n readonly #rest: REST;\r\n public constructor(rest: REST) {\r\n super(\r\n async (id) => new User(await rest.get<UserData>(Routes.userById(id))),\r\n (user) => user.id,\r\n );\r\n this.#rest = rest;\r\n }\r\n\r\n /** Gets the currently logged-in bot user. */\r\n public async fetchMe(): Promise<User> {\r\n const data = await this.#rest.get<UserData>(\"/users/@me\");\r\n return this.upsert(new User(data));\r\n }\r\n\r\n /** Modifies the currently logged-in bot user. */\r\n public async editMe(options: UserEditOptions): Promise<User> {\r\n const data = await this.#rest.patch<UserData>(\"/users/@me\", options);\r\n return this.upsert(new User(data));\r\n }\r\n\r\n /** Leaves a guild. */\r\n public async leaveGuild(guildId: string): Promise<void> {\r\n await this.#rest.delete(`/users/@me/guilds/${guildId}`);\r\n }\r\n\r\n /** Creates a DM channel with a user. */\r\n public async createDM(userId: string): Promise<APIChannel> {\r\n return this.#rest.post<APIChannel>(\"/users/@me/channels\", {\r\n recipient_id: userId,\r\n });\r\n }\r\n}\r\n",
|
|
17
|
+
"import { ResourceManager } from \"./base.js\";\r\nimport { Guild } from \"@lunibee/structures\";\r\nimport { type REST, Routes } from \"@lunibee/rest\";\r\nimport {\r\n type APIChannel,\r\n type APIGuildPreview,\r\n type APIInvite,\r\n type APIWebhook,\r\n} from \"@lunibee/types\";\r\n\r\ntype GuildData = ConstructorParameters<typeof Guild>[0];\r\n\r\nexport interface GuildCreateOptions extends Record<string, unknown> {\r\n name: string;\r\n}\r\nexport interface GuildEditOptions extends Record<string, unknown> {}\r\n\r\nexport class GuildManager extends ResourceManager<string, Guild> {\r\n readonly #rest: REST;\r\n public constructor(rest: REST) {\r\n super(\r\n async (id) => new Guild(await rest.get<GuildData>(Routes.guild(id))),\r\n (guild) => guild.id,\r\n );\r\n this.#rest = rest;\r\n }\r\n\r\n /** Creates a new guild. (Bot must be in fewer than 10 guilds). */\r\n public async create(options: GuildCreateOptions): Promise<Guild> {\r\n const data = await this.#rest.post<GuildData>(\"/guilds\", options);\r\n return this.upsert(new Guild(data));\r\n }\r\n\r\n /** Modifies a guild's settings. */\r\n public async edit(id: string, options: GuildEditOptions): Promise<Guild> {\r\n const data = await this.#rest.patch<GuildData>(Routes.guild(id), options);\r\n return this.upsert(new Guild(data));\r\n }\r\n\r\n /** Deletes a guild permanently. User must be the owner. */\r\n public async deleteGuild(id: string): Promise<void> {\r\n await this.#rest.delete(Routes.guild(id));\r\n }\r\n\r\n /** Fetches a guild's preview (even if the bot is not in the guild). */\r\n public async fetchPreview(id: string): Promise<APIGuildPreview> {\r\n return this.#rest.get<APIGuildPreview>(Routes.guildPreview(id));\r\n }\r\n\r\n /** Fetches all active threads in the guild. */\r\n public async fetchActiveThreads(\r\n id: string,\r\n ): Promise<{ threads: APIChannel[]; members: unknown[] }> {\r\n return this.#rest.get<{ threads: APIChannel[]; members: unknown[] }>(\r\n Routes.guildActiveThreads(id),\r\n );\r\n }\r\n\r\n /** Fetches all webhooks in the guild. */\r\n public async fetchWebhooks(id: string): Promise<APIWebhook[]> {\r\n return this.#rest.get<APIWebhook[]>(Routes.guildWebhooks(id));\r\n }\r\n\r\n /** Fetches all invites in the guild. */\r\n public async fetchInvites(id: string): Promise<APIInvite[]> {\r\n return this.#rest.get<APIInvite[]>(Routes.guildInvites(id));\r\n }\r\n}\r\n",
|
|
14
18
|
"import { REST, Routes } from \"@lunibee/rest\";\nimport { Role } from \"@lunibee/structures\";\nimport { ResourceManager } from \"./base.js\";\n\nexport interface RoleCreateOptions {\n name: string;\n permissions?: bigint | number | string;\n color?: number;\n hoist?: boolean;\n mentionable?: boolean;\n reason?: string;\n}\n\nexport interface RoleEditOptions {\n name?: string;\n permissions?: bigint | number | string;\n color?: number;\n hoist?: boolean;\n mentionable?: boolean;\n position?: number;\n reason?: string;\n}\n\n/** Manages Discord guild roles. */\nexport class RoleManager extends ResourceManager<string, Role> {\n readonly #rest: REST;\n public readonly guildId: string;\n\n public constructor(guildId: string, rest: REST) {\n super(\n (id: string) =>\n rest\n .get(Routes.guildRole(guildId, id))\n .then((data: any) => new Role(data)),\n (role: Role) => role.id,\n );\n this.guildId = guildId;\n this.#rest = rest;\n }\n\n /** Fetches all roles in the guild. */\n public async fetchAll(): Promise<Role[]> {\n const data = await this.#rest.get<any[]>(Routes.guildRoles(this.guildId));\n return data.map((item) => {\n const role = new Role(item);\n this.set(role.id, role);\n return role;\n });\n }\n\n /** Creates a new role in the guild. */\n public async create(options: RoleCreateOptions): Promise<Role> {\n const { reason, ...payload } = options;\n const data = await this.#rest.post<any>(Routes.guildRoles(this.guildId), {\n ...payload,\n permissions:\n payload.permissions !== undefined\n ? String(payload.permissions)\n : undefined,\n });\n const role = new Role(data);\n this.set(role.id, role);\n return role;\n }\n\n /** Edits an existing role. */\n public async edit(roleId: string, options: RoleEditOptions): Promise<Role> {\n const { reason, ...payload } = options;\n const data = await this.#rest.patch<any>(\n Routes.guildRole(this.guildId, roleId),\n {\n ...payload,\n permissions:\n payload.permissions !== undefined\n ? String(payload.permissions)\n : undefined,\n },\n );\n const role = new Role(data);\n this.set(role.id, role);\n return role;\n }\n\n /** Deletes a role from the guild. */\n public async deleteRole(roleId: string): Promise<void> {\n await this.#rest.delete(Routes.guildRole(this.guildId, roleId));\n this.delete(roleId);\n }\n}\n",
|
|
15
19
|
"import { REST, Routes } from \"@lunibee/rest\";\nimport { GuildMember } from \"@lunibee/structures\";\nimport { ResourceManager } from \"./base.js\";\n\nexport interface MemberEditOptions {\n nick?: string | null;\n roles?: string[];\n mute?: boolean;\n deaf?: boolean;\n channel_id?: string | null;\n communication_disabled_until?: string | null;\n}\n\nexport interface BanOptions {\n reason?: string;\n deleteMessageSeconds?: number;\n}\n\n/** Manages Discord guild members. */\nexport class GuildMemberManager extends ResourceManager<string, GuildMember> {\n readonly #rest: REST;\n public readonly guildId: string;\n\n public constructor(guildId: string, rest: REST) {\n super(\n (id: string) =>\n rest\n .get(Routes.guildMember(guildId, id))\n .then((data: any) => new GuildMember({ ...data, guild_id: guildId })),\n (member: GuildMember) => member.user.id,\n );\n this.guildId = guildId;\n this.#rest = rest;\n }\n\n /** Kicks a member from the guild. */\n public async kick(userId: string): Promise<void> {\n await this.#rest.delete(Routes.guildMember(this.guildId, userId));\n this.delete(userId);\n }\n\n /** Bans a user from the guild. */\n public async ban(userId: string, options: BanOptions = {}): Promise<void> {\n await this.#rest.put(Routes.guildBan(this.guildId, userId), {\n delete_message_seconds: options.deleteMessageSeconds,\n });\n this.delete(userId);\n }\n\n /** Unbans a user from the guild. */\n public async unban(userId: string): Promise<void> {\n await this.#rest.delete(Routes.guildBan(this.guildId, userId));\n }\n\n /** Edits a guild member (nickname, roles, timeout, mute, deaf). */\n public async edit(\n userId: string,\n options: MemberEditOptions,\n ): Promise<GuildMember> {\n const data = await this.#rest.patch<any>(\n Routes.guildMember(this.guildId, userId),\n options,\n );\n const member = new GuildMember({ ...data, guild_id: this.guildId });\n this.set(member.user.id, member);\n return member;\n }\n\n /** Adds a role to a member. */\n public async addRole(userId: string, roleId: string): Promise<void> {\n await this.#rest.put(Routes.guildMemberRole(this.guildId, userId, roleId));\n }\n\n /** Removes a role from a member. */\n public async removeRole(userId: string, roleId: string): Promise<void> {\n await this.#rest.delete(\n Routes.guildMemberRole(this.guildId, userId, roleId),\n );\n }\n\n /** Times out a member for a given duration in milliseconds (or clears timeout if null). */\n public async timeout(\n userId: string,\n milliseconds: number | null,\n ): Promise<GuildMember> {\n const timeoutDate =\n milliseconds === null\n ? null\n : new Date(Date.now() + milliseconds).toISOString();\n return this.edit(userId, { communication_disabled_until: timeoutDate });\n }\n}\n",
|
|
16
|
-
"import { REST, Routes } from \"@lunibee/rest\";\
|
|
17
|
-
"import { Manager, ResourceManager } from \"./base.js\";\r\nexport { Manager, ResourceManager } from \"./base.js\";\r\n/** Collection-backed generic resource manager. */\r\nimport { Collection } from \"@lunibee/collection\";\r\nimport { REST, Routes } from \"@lunibee/rest\";\r\nimport {\r\n Channel,\r\n Message,\r\n User,\r\n Guild,\r\n type ResourceContext,\r\n} from \"@lunibee/structures\";\r\nimport { MessageManager } from \"./message.js\";\r\nimport { ThreadManager } from \"./thread.js\";\r\n\r\n/** Manages users. */\r\nexport class UserManager extends ResourceManager<string, User> {\r\n /** Creates a user manager. @param rest REST transport. */ public constructor(\r\n rest: REST,\r\n ) {\r\n super(\r\n async (id) =>\r\n new User(\r\n await rest.get<ConstructorParameters<typeof User>[0]>(\r\n Routes.userById(id),\r\n ),\r\n ),\r\n (user) => user.id,\r\n );\r\n }\r\n}\r\n/** Manages guilds. */\r\nexport class GuildManager extends ResourceManager<string, Guild> {\r\n /** Creates a guild manager. @param rest REST transport. */ public constructor(\r\n rest: REST,\r\n ) {\r\n super(\r\n async (id) =>\r\n new Guild(\r\n await rest.get<ConstructorParameters<typeof Guild>[0]>(\r\n Routes.guild(id),\r\n ),\r\n ),\r\n (guild) => guild.id,\r\n );\r\n }\r\n}\r\n/** Message creation options. */\r\nexport interface MessageCreateOptions {\r\n /** Message content. */ content?: string;\r\n}\r\n/** Message edit options. */\r\nexport interface MessageEditOptions {\r\n /** New message content. */ content?: string;\r\n}\r\n/** Message fetch options. */\r\nexport interface MessageFetchOptions {\r\n /** Whether to use cache. */ cache?: boolean;\r\n}\r\n/** Message list query options. */\r\nexport interface MessageQueryOptions {\r\n /** Message before this ID. */ before?: string;\r\n /** Message after this ID. */ after?: string;\r\n /** Message around this ID. */ around?: string;\r\n /** Maximum number of messages. */ limit?: number;\r\n}\r\n/** Message thread creation options. */\r\nexport interface MessageThreadOptions {\r\n /** Thread name. */ name: string;\r\n /** Auto archive duration. */ autoArchiveDuration?: 60 | 1440 | 4320 | 10080;\r\n /** Slowmode duration. */ rateLimitPerUser?: number;\r\n}\r\n/** Reaction list options. */\r\nexport interface ReactionFetchOptions {\r\n /** Maximum reactions. */ limit?: number;\r\n /** Reaction pagination cursor. */ after?: string;\r\n}\r\n/** Runtime compatibility placeholders for legacy value imports. */\r\nexport const MessageCreateOptions = undefined;\r\n/** Runtime compatibility placeholder. */\r\nexport const MessageEditOptions = undefined;\r\n/** Runtime compatibility placeholder. */\r\nexport const MessageFetchOptions = undefined;\r\n/** Runtime compatibility placeholder. */\r\nexport const MessageThreadOptions = undefined;\r\n/** Runtime compatibility placeholder. */\r\nexport const ReactionFetchOptions = undefined;\r\n\r\n/** Manages Discord channels and their message APIs. */\r\nexport class ChannelManager extends Manager<string, Channel> {\r\n readonly #rest: REST;\r\n readonly #context: ResourceContext;\r\n readonly #messageManagers = new Map<string, MessageManager>();\r\n /** Creates a channel manager. @param rest REST transport. */\r\n public constructor(rest: REST) {\r\n super();\r\n this.#rest = rest;\r\n this.#context = {\r\n sendMessage: (channelId, options) => this.send(channelId, options),\r\n editMessage: (channelId, messageId, options) =>\r\n this.editMessage(channelId, messageId, options),\r\n deleteMessage: (channelId, messageId) =>\r\n this.deleteMessage(channelId, messageId),\r\n crosspostMessage: (channelId, messageId) =>\r\n this.crosspostMessage(channelId, messageId),\r\n };\r\n }\r\n /** Gets the canonical message manager for a channel. @param channelId Channel ID. @returns Message manager. */ public messages(\r\n channelId: string,\r\n ): MessageManager {\r\n let manager = this.#messageManagers.get(channelId);\r\n if (!manager) {\r\n manager = new MessageManager(this.#rest, this.#context, channelId);\r\n this.#messageManagers.set(channelId, manager);\r\n }\r\n return manager;\r\n }\r\n /** Creates a thread manager. @param channelId Channel ID. @returns Thread manager. */ public threads(\r\n channelId: string,\r\n ): ThreadManager {\r\n return new ThreadManager(this.#rest, this.#context, channelId);\r\n }\r\n /** Fetches a channel. @param channelId Channel ID. @returns Channel. */ public async fetch(\r\n channelId: string,\r\n ): Promise<Channel> {\r\n const data = await this.#rest.get<ConstructorParameters<typeof Channel>[0]>(\r\n Routes.channel(channelId),\r\n );\r\n return this.upsert(data);\r\n }\r\n /** Resolves a channel. @param channelId Channel ID. @returns Canonical channel. */ public async resolve(\r\n channelId: string,\r\n ): Promise<Channel> {\r\n return this.get(channelId) ?? this.fetch(channelId);\r\n }\r\n /** Inserts or updates a channel. @param data Channel payload. @returns Canonical channel. */ public upsert(\r\n data: ConstructorParameters<typeof Channel>[0],\r\n ): Channel {\r\n const existing = this.get(data.id);\r\n const channel = new Channel(data, this.#context);\r\n if (existing) {\r\n Object.assign(existing, channel);\r\n return existing;\r\n }\r\n this.set(channel.id, channel);\r\n return channel;\r\n }\r\n /** Updates a channel. @param channel Channel. @returns This manager. */ public update(\r\n channel: Channel,\r\n ): this {\r\n return this.set(channel.id, channel);\r\n }\r\n /** Sends a message. @param channelId Channel ID. @param options Message options. @returns Created message. */ public send(\r\n channelId: string,\r\n options: MessageCreateOptions,\r\n ): Promise<Message> {\r\n return this.messages(channelId).send(options);\r\n }\r\n /** Alias for send. @param channelId Channel ID. @param options Message options. @returns Created message. */ public sendMessage(\r\n channelId: string,\r\n options: MessageCreateOptions,\r\n ): Promise<Message> {\r\n return this.send(channelId, options);\r\n }\r\n /** Fetches one message. @param channelId Channel ID. @param messageId Message ID. @param options Fetch options. @returns Message. */ public async fetchMessage(\r\n channelId: string,\r\n messageId: string,\r\n options: MessageFetchOptions = {},\r\n ): Promise<Message> {\r\n void options;\r\n return this.messages(channelId).fetch(messageId);\r\n }\r\n /** Fetches messages by query or by iterable IDs. @param channelId Channel ID. @param query Query options or message IDs. @returns Messages. */ public fetchMessages(\r\n channelId: string,\r\n query: MessageQueryOptions | Iterable<string>,\r\n ): Promise<Message[]> {\r\n if (isMessageQuery(query)) {\r\n const params = new URLSearchParams();\r\n if (query.before) params.set(\"before\", query.before);\r\n if (query.after) params.set(\"after\", query.after);\r\n if (query.around) params.set(\"around\", query.around);\r\n if (query.limit !== undefined) params.set(\"limit\", String(query.limit));\r\n const suffix = params.toString();\r\n return this.#rest\r\n .get<ConstructorParameters<typeof Message>[0][]>(\r\n `${Routes.channelMessages(channelId)}${suffix ? `?${suffix}` : \"\"}`,\r\n )\r\n .then((data) =>\r\n data.map((item) => this.messages(channelId).upsert(item)),\r\n );\r\n }\r\n return this.messages(channelId).fetchMany(query);\r\n }\r\n /** Inserts a message through the canonical cache path. @param data Message payload. @returns Canonical message. */ public upsertMessage(\r\n data: ConstructorParameters<typeof Message>[0],\r\n ): Message {\r\n return this.messages(data.channel_id).upsert(data);\r\n }\r\n /** Edits a message. @param channelId Channel ID. @param messageId Message ID. @param options Edit options. @returns Updated message. */ public async editMessage(\r\n channelId: string,\r\n messageId: string,\r\n options: MessageEditOptions,\r\n ): Promise<Message> {\r\n const data = await this.#rest.patch<\r\n ConstructorParameters<typeof Message>[0]\r\n >(Routes.message(channelId, messageId), options);\r\n return this.messages(channelId).upsert(data);\r\n }\r\n /** Deletes a message. @param channelId Channel ID. @param messageId Message ID. @returns Nothing. */ public async deleteMessage(\r\n channelId: string,\r\n messageId: string,\r\n ): Promise<void> {\r\n await this.#rest.delete(Routes.message(channelId, messageId));\r\n this.messages(channelId).delete(messageId);\r\n }\r\n /** Deletes a cached message. @param channelId Channel ID. @param messageId Message ID. @returns Whether removed. */ public deleteCachedMessage(\r\n channelId: string,\r\n messageId: string,\r\n ): boolean {\r\n return this.messages(channelId).delete(messageId);\r\n }\r\n /** Crossposts a message. @param channelId Channel ID. @param messageId Message ID. @returns Crossposted message. */ public async crosspostMessage(\r\n channelId: string,\r\n messageId: string,\r\n ): Promise<Message> {\r\n const data = await this.#rest.post<\r\n ConstructorParameters<typeof Message>[0]\r\n >(Routes.crosspostMessage(channelId, messageId));\r\n return this.messages(channelId).upsert(data);\r\n }\r\n /** Bulk deletes messages. @param channelId Channel ID. @param messageIds Message IDs. @returns Nothing. */ public async bulkDeleteMessages(\r\n channelId: string,\r\n messageIds: Iterable<string>,\r\n ): Promise<void> {\r\n const ids = [...messageIds];\r\n await this.#rest.post(Routes.channelBulkDelete(channelId), {\r\n messages: ids,\r\n });\r\n for (const id of ids) this.messages(channelId).delete(id);\r\n }\r\n /** Adds a reaction. @param channelId Channel ID. @param messageId Message ID. @param emoji Emoji identifier. @returns Nothing. */ public async addReaction(\r\n channelId: string,\r\n messageId: string,\r\n emoji: string,\r\n ): Promise<void> {\r\n await this.#rest.put(Routes.messageReactions(channelId, messageId, emoji));\r\n }\r\n /** Fetches users who reacted. @param channelId Channel ID. @param messageId Message ID. @param emoji Emoji identifier. @param options Query options. @returns Users. */ public async fetchReactions(\r\n channelId: string,\r\n messageId: string,\r\n emoji: string,\r\n options: ReactionFetchOptions = {},\r\n ): Promise<User[]> {\r\n const params = new URLSearchParams();\r\n if (options.limit !== undefined) params.set(\"limit\", String(options.limit));\r\n if (options.after) params.set(\"after\", options.after);\r\n const suffix = params.toString();\r\n const data = await this.#rest.get<ConstructorParameters<typeof User>[0][]>(\r\n `${Routes.messageReactions(channelId, messageId, emoji)}${suffix ? `?${suffix}` : \"\"}`,\r\n );\r\n return data.map((user) => new User(user));\r\n }\r\n /** Removes the current bot user's reaction. @param channelId Channel ID. @param messageId Message ID. @param emoji Emoji identifier. @returns Nothing. */ public async removeOwnReaction(\r\n channelId: string,\r\n messageId: string,\r\n emoji: string,\r\n ): Promise<void> {\r\n await this.#rest.delete(\r\n Routes.messageReactions(channelId, messageId, emoji) + \"/@me\",\r\n );\r\n }\r\n /** Removes a user's reaction. @param channelId Channel ID. @param messageId Message ID. @param emoji Emoji identifier. @param userId User ID. @returns Nothing. */ public async removeReaction(\r\n channelId: string,\r\n messageId: string,\r\n emoji: string,\r\n userId: string,\r\n ): Promise<void> {\r\n await this.#rest.delete(\r\n `${Routes.messageReactions(channelId, messageId, emoji)}/${userId}`,\r\n );\r\n }\r\n /** Removes all reactions. @param channelId Channel ID. @param messageId Message ID. @returns Nothing. */ public async removeAllReactions(\r\n channelId: string,\r\n messageId: string,\r\n ): Promise<void> {\r\n await this.#rest.delete(Routes.messageReactionsAll(channelId, messageId));\r\n }\r\n /** Fetches pinned messages. @param channelId Channel ID. @returns Pinned messages. */ public async fetchPinnedMessages(\r\n channelId: string,\r\n ): Promise<Message[]> {\r\n const data = await this.#rest.get<\r\n ConstructorParameters<typeof Message>[0][]\r\n >(Routes.channelPins(channelId));\r\n return data.map((item) => this.messages(channelId).upsert(item));\r\n }\r\n /** Pins a message. @param channelId Channel ID. @param messageId Message ID. @returns Nothing. */ public async pinMessage(\r\n channelId: string,\r\n messageId: string,\r\n ): Promise<void> {\r\n await this.#rest.put(Routes.channelPin(channelId, messageId));\r\n }\r\n /** Unpins a message. @param channelId Channel ID. @param messageId Message ID. @returns Nothing. */ public async unpinMessage(\r\n channelId: string,\r\n messageId: string,\r\n ): Promise<void> {\r\n await this.#rest.delete(Routes.channelPin(channelId, messageId));\r\n }\r\n /** Creates a thread from a message. @param channelId Channel ID. @param messageId Message ID. @param options Thread options. @returns Created thread channel. */ public createThreadFromMessage(\r\n channelId: string,\r\n messageId: string,\r\n options: MessageThreadOptions,\r\n ): Promise<Channel> {\r\n return this.threads(channelId).createFromMessage(messageId, options);\r\n }\r\n /** Deletes a channel and its message manager. @param channelId Channel ID. @returns Whether removed. */ public delete(\r\n channelId: string,\r\n ): boolean {\r\n this.#messageManagers.delete(channelId);\r\n return super.delete(channelId);\r\n }\r\n /** Clears all channels and message managers. @returns Nothing. */ public clear(): void {\r\n this.#messageManagers.clear();\r\n super.clear();\r\n }\r\n}\r\n/** Determines whether a message query object was supplied. @param value Candidate query. @returns True when it is a query object. */\r\nfunction isMessageQuery(\r\n value: MessageQueryOptions | Iterable<string>,\r\n): value is MessageQueryOptions {\r\n return (\r\n typeof value === \"object\" && value !== null && !(Symbol.iterator in value)\r\n );\r\n}\r\n/** Backward-compatible message option alias. */\r\nexport type CreateMessageOptions = MessageCreateOptions;\r\n/** Exposes the message manager class. */\r\nexport { MessageManager } from \"./message.js\";\r\n/** Exposes the thread manager class. */\r\nexport { ThreadManager } from \"./thread.js\";\r\n\r\nexport {\r\n RoleManager,\r\n type RoleCreateOptions,\r\n type RoleEditOptions,\r\n} from \"./role.js\";\r\nexport {\r\n GuildMemberManager,\r\n type MemberEditOptions,\r\n type BanOptions,\r\n} from \"./member.js\";\r\nexport { ApplicationCommandManager } from \"./application.js\";\r\n"
|
|
20
|
+
"import { REST, Routes } from \"@lunibee/rest\";\nimport type {\n APIApplicationCommand,\n ApplicationCommandData,\n} from \"@lunibee/types\";\n\n/** Manages global and guild-scoped application commands for a Discord application. */\nexport class ApplicationCommandManager {\n readonly #rest: REST;\n readonly #applicationId: string;\n\n /** Creates an application command manager. @param rest REST transport. @param applicationId Application identifier. */\n public constructor(rest: REST, applicationId: string) {\n this.#rest = rest;\n this.#applicationId = applicationId;\n }\n\n // ──────────────────── Global commands ────────────────────\n\n /** Fetches all global application commands. @returns Array of registered commands. */\n public fetch(): Promise<APIApplicationCommand[]> {\n return this.#rest.get<APIApplicationCommand[]>(\n Routes.applicationCommands(this.#applicationId),\n );\n }\n\n /** Creates a single global application command. @param data Command data. @returns Created command. */\n public create(data: ApplicationCommandData): Promise<APIApplicationCommand> {\n return this.#rest.post<APIApplicationCommand>(\n Routes.applicationCommands(this.#applicationId),\n data,\n );\n }\n\n /** Overwrites all global application commands atomically. @param commands Array of command data. @returns New full command list. */\n public set(\n commands: ApplicationCommandData[],\n ): Promise<APIApplicationCommand[]> {\n return this.#rest.put<APIApplicationCommand[]>(\n Routes.applicationCommands(this.#applicationId),\n commands,\n );\n }\n\n /** Edits a global application command. @param commandId Command identifier. @param data Partial command data. @returns Updated command. */\n public edit(\n commandId: string,\n data: Partial<ApplicationCommandData>,\n ): Promise<APIApplicationCommand> {\n return this.#rest.patch<APIApplicationCommand>(\n Routes.applicationCommand(this.#applicationId, commandId),\n data,\n );\n }\n\n /** Deletes a global application command. @param commandId Command identifier. @returns Nothing. */\n public async delete(commandId: string): Promise<void> {\n await this.#rest.delete(\n Routes.applicationCommand(this.#applicationId, commandId),\n );\n }\n\n // ──────────────────── Guild-scoped commands ────────────────────\n\n /** Fetches all guild-scoped application commands. @param guildId Guild identifier. @returns Array of registered guild commands. */\n public fetchGuild(guildId: string): Promise<APIApplicationCommand[]> {\n return this.#rest.get<APIApplicationCommand[]>(\n Routes.guildApplicationCommands(this.#applicationId, guildId),\n );\n }\n\n /** Creates a single guild-scoped application command. @param guildId Guild identifier. @param data Command data. @returns Created command. */\n public createGuild(\n guildId: string,\n data: ApplicationCommandData,\n ): Promise<APIApplicationCommand> {\n return this.#rest.post<APIApplicationCommand>(\n Routes.guildApplicationCommands(this.#applicationId, guildId),\n data,\n );\n }\n\n /** Overwrites all guild-scoped application commands atomically. @param guildId Guild identifier. @param commands Array of command data. @returns New full command list. */\n public setGuild(\n guildId: string,\n commands: ApplicationCommandData[],\n ): Promise<APIApplicationCommand[]> {\n return this.#rest.put<APIApplicationCommand[]>(\n Routes.guildApplicationCommands(this.#applicationId, guildId),\n commands,\n );\n }\n\n /** Edits a guild-scoped application command. @param guildId Guild identifier. @param commandId Command identifier. @param data Partial command data. @returns Updated command. */\n public editGuild(\n guildId: string,\n commandId: string,\n data: Partial<ApplicationCommandData>,\n ): Promise<APIApplicationCommand> {\n return this.#rest.patch<APIApplicationCommand>(\n Routes.guildApplicationCommand(this.#applicationId, guildId, commandId),\n data,\n );\n }\n\n /** Deletes a guild-scoped application command. @param guildId Guild identifier. @param commandId Command identifier. @returns Nothing. */\n public async deleteGuild(guildId: string, commandId: string): Promise<void> {\n await this.#rest.delete(\n Routes.guildApplicationCommand(this.#applicationId, guildId, commandId),\n );\n }\n}\n",
|
|
21
|
+
"import { Manager, ResourceManager } from \"./base.js\";\r\nexport { Manager, ResourceManager } from \"./base.js\";\r\nimport { Collection } from \"@lunibee/collection\";\r\nimport { REST, Routes } from \"@lunibee/rest\";\r\nimport {\r\n Channel,\r\n Message,\r\n User,\r\n Guild,\r\n type ResourceContext,\r\n} from \"@lunibee/structures\";\r\nimport {\r\n MessageManager,\r\n type MessageCreateOptions as ManagerMessageCreateOptions,\r\n} from \"./message.js\";\r\nimport { ThreadManager } from \"./thread.js\";\r\n\r\nexport { UserManager } from \"./user.js\";\r\nexport { GuildManager } from \"./guild.js\";\r\n\r\nexport type MessageCreateOptions = ManagerMessageCreateOptions;\r\nexport type MessageEditOptions = Record<string, unknown> & { content?: string };\r\nexport interface MessageFetchOptions {\r\n cache?: boolean;\r\n}\r\nexport interface MessageQueryOptions {\r\n before?: string;\r\n after?: string;\r\n around?: string;\r\n limit?: number;\r\n}\r\nexport interface MessageThreadOptions {\r\n name: string;\r\n autoArchiveDuration?: 60 | 1440 | 4320 | 10080;\r\n rateLimitPerUser?: number;\r\n}\r\nexport interface ReactionFetchOptions {\r\n limit?: number;\r\n after?: string;\r\n}\r\n\r\nexport interface ChannelCreateOptions extends Record<string, unknown> {\r\n name: string;\r\n type: number;\r\n guild_id?: string;\r\n parent_id?: string | null;\r\n}\r\nexport type ChannelEditOptions = Record<string, unknown>;\r\n\r\nexport class ChannelManager extends Manager<string, Channel> {\r\n readonly #rest: REST;\r\n readonly #context: ResourceContext;\r\n readonly #messageManagers = new Map<string, MessageManager>();\r\n public constructor(rest: REST) {\r\n super();\r\n this.#rest = rest;\r\n this.#context = {\r\n sendMessage: (channelId, options) => this.send(channelId, options),\r\n editMessage: (channelId, messageId, options) =>\r\n this.editMessage(channelId, messageId, options),\r\n deleteMessage: (channelId, messageId) =>\r\n this.deleteMessage(channelId, messageId),\r\n crosspostMessage: (channelId, messageId) =>\r\n this.crosspostMessage(channelId, messageId),\r\n editChannel: (channelId, options) => this.edit(channelId, options),\r\n deleteChannel: (channelId) => this.deleteChannel(channelId),\r\n addReaction: (channelId, messageId, emoji) =>\r\n this.addReaction(channelId, messageId, emoji),\r\n removeOwnReaction: (channelId, messageId, emoji) =>\r\n this.removeOwnReaction(channelId, messageId, emoji),\r\n removeReaction: (channelId, messageId, emoji, userId) =>\r\n this.removeReaction(channelId, messageId, emoji, userId),\r\n removeAllReactions: (channelId, messageId) =>\r\n this.removeAllReactions(channelId, messageId),\r\n pinMessage: (channelId, messageId) =>\r\n this.pinMessage(channelId, messageId),\r\n unpinMessage: (channelId, messageId) =>\r\n this.unpinMessage(channelId, messageId),\r\n };\r\n }\r\n public messages(channelId: string): MessageManager {\r\n let manager = this.#messageManagers.get(channelId);\r\n if (!manager) {\r\n manager = new MessageManager(this.#rest, this.#context, channelId);\r\n this.#messageManagers.set(channelId, manager);\r\n }\r\n return manager;\r\n }\r\n public threads(channelId: string): ThreadManager {\r\n return new ThreadManager(this.#rest, this.#context, channelId);\r\n }\r\n public async fetch(channelId: string): Promise<Channel> {\r\n return this.upsert(\r\n await this.#rest.get<ConstructorParameters<typeof Channel>[0]>(\r\n Routes.channel(channelId),\r\n ),\r\n );\r\n }\r\n public async resolve(channelId: string): Promise<Channel> {\r\n return this.get(channelId) ?? this.fetch(channelId);\r\n }\r\n public upsert(data: ConstructorParameters<typeof Channel>[0]): Channel {\r\n const existing = this.get(data.id);\r\n const channel = new Channel(data, this.#context);\r\n if (existing) {\r\n Object.assign(existing, channel);\r\n return existing;\r\n }\r\n this.set(channel.id, channel);\r\n return channel;\r\n }\r\n public update(channel: Channel): this {\r\n return this.set(channel.id, channel);\r\n }\r\n public async create(\r\n guildId: string,\r\n options: ChannelCreateOptions,\r\n ): Promise<Channel> {\r\n return this.upsert(\r\n await this.#rest.post<ConstructorParameters<typeof Channel>[0]>(\r\n Routes.guildChannels(guildId),\r\n options,\r\n ),\r\n );\r\n }\r\n public async edit(\r\n channelId: string,\r\n options: ChannelEditOptions,\r\n ): Promise<Channel> {\r\n return this.upsert(\r\n await this.#rest.patch<ConstructorParameters<typeof Channel>[0]>(\r\n Routes.channel(channelId),\r\n options,\r\n ),\r\n );\r\n }\r\n\r\n public async deleteChannel(channelId: string): Promise<void> {\r\n await this.#rest.delete(Routes.channel(channelId));\r\n this.#messageManagers.delete(channelId);\r\n super.delete(channelId);\r\n }\r\n public send(\r\n channelId: string,\r\n options: MessageCreateOptions,\r\n ): Promise<Message> {\r\n return this.messages(channelId).send(options);\r\n }\r\n public sendMessage(\r\n channelId: string,\r\n options: MessageCreateOptions,\r\n ): Promise<Message> {\r\n return this.send(channelId, options);\r\n }\r\n public async fetchMessage(\r\n channelId: string,\r\n messageId: string,\r\n options: MessageFetchOptions = {},\r\n ): Promise<Message> {\r\n void options;\r\n return this.messages(channelId).fetch(messageId);\r\n }\r\n public fetchMessages(\r\n channelId: string,\r\n query: MessageQueryOptions | Iterable<string>,\r\n ): Promise<Message[]> {\r\n if (isMessageQuery(query)) {\r\n const params = new URLSearchParams();\r\n if (query.before) params.set(\"before\", query.before);\r\n if (query.after) params.set(\"after\", query.after);\r\n if (query.around) params.set(\"around\", query.around);\r\n if (query.limit !== undefined) params.set(\"limit\", String(query.limit));\r\n const suffix = params.toString();\r\n return this.#rest\r\n .get<ConstructorParameters<typeof Message>[0][]>(\r\n `${Routes.channelMessages(channelId)}${suffix ? `?${suffix}` : \"\"}`,\r\n )\r\n .then((data) =>\r\n data.map((item) => this.messages(channelId).upsert(item)),\r\n );\r\n }\r\n return this.messages(channelId).fetchMany(query);\r\n }\r\n public upsertMessage(\r\n data: ConstructorParameters<typeof Message>[0],\r\n ): Message {\r\n return this.messages(data.channel_id).upsert(data);\r\n }\r\n public async editMessage(\r\n channelId: string,\r\n messageId: string,\r\n options: MessageEditOptions,\r\n ): Promise<Message> {\r\n return this.messages(channelId).upsert(\r\n await this.#rest.patch<ConstructorParameters<typeof Message>[0]>(\r\n Routes.message(channelId, messageId),\r\n options,\r\n ),\r\n );\r\n }\r\n public async deleteMessage(\r\n channelId: string,\r\n messageId: string,\r\n ): Promise<void> {\r\n await this.#rest.delete(Routes.message(channelId, messageId));\r\n this.messages(channelId).delete(messageId);\r\n }\r\n public deleteCachedMessage(channelId: string, messageId: string): boolean {\r\n return this.messages(channelId).delete(messageId);\r\n }\r\n public async crosspostMessage(\r\n channelId: string,\r\n messageId: string,\r\n ): Promise<Message> {\r\n return this.messages(channelId).upsert(\r\n await this.#rest.post<ConstructorParameters<typeof Message>[0]>(\r\n Routes.crosspostMessage(channelId, messageId),\r\n ),\r\n );\r\n }\r\n public async bulkDeleteMessages(\r\n channelId: string,\r\n messageIds: Iterable<string>,\r\n ): Promise<void> {\r\n const ids = [...messageIds];\r\n await this.#rest.post(Routes.channelBulkDelete(channelId), {\r\n messages: ids,\r\n });\r\n for (const id of ids) this.messages(channelId).delete(id);\r\n }\r\n public async addReaction(\r\n channelId: string,\r\n messageId: string,\r\n emoji: string,\r\n ): Promise<void> {\r\n await this.#rest.put(Routes.messageReactions(channelId, messageId, emoji));\r\n }\r\n public async fetchReactions(\r\n channelId: string,\r\n messageId: string,\r\n emoji: string,\r\n options: ReactionFetchOptions = {},\r\n ): Promise<User[]> {\r\n const params = new URLSearchParams();\r\n if (options.limit !== undefined) params.set(\"limit\", String(options.limit));\r\n if (options.after) params.set(\"after\", options.after);\r\n const suffix = params.toString();\r\n const data = await this.#rest.get<ConstructorParameters<typeof User>[0][]>(\r\n `${Routes.messageReactions(channelId, messageId, emoji)}${suffix ? `?${suffix}` : \"\"}`,\r\n );\r\n return data.map((user) => new User(user));\r\n }\r\n public async removeOwnReaction(\r\n channelId: string,\r\n messageId: string,\r\n emoji: string,\r\n ): Promise<void> {\r\n await this.#rest.delete(\r\n `${Routes.messageReactions(channelId, messageId, emoji)}/@me`,\r\n );\r\n }\r\n public async removeReaction(\r\n channelId: string,\r\n messageId: string,\r\n emoji: string,\r\n userId: string,\r\n ): Promise<void> {\r\n await this.#rest.delete(\r\n `${Routes.messageReactions(channelId, messageId, emoji)}/${userId}`,\r\n );\r\n }\r\n public async removeAllReactions(\r\n channelId: string,\r\n messageId: string,\r\n ): Promise<void> {\r\n await this.#rest.delete(Routes.messageReactionsAll(channelId, messageId));\r\n }\r\n public async fetchPinnedMessages(channelId: string): Promise<Message[]> {\r\n const data = await this.#rest.get<\r\n ConstructorParameters<typeof Message>[0][]\r\n >(Routes.channelPins(channelId));\r\n return data.map((item) => this.messages(channelId).upsert(item));\r\n }\r\n public async pinMessage(channelId: string, messageId: string): Promise<void> {\r\n await this.#rest.put(Routes.channelPin(channelId, messageId));\r\n }\r\n public async unpinMessage(\r\n channelId: string,\r\n messageId: string,\r\n ): Promise<void> {\r\n await this.#rest.delete(Routes.channelPin(channelId, messageId));\r\n }\r\n public createThreadFromMessage(\r\n channelId: string,\r\n messageId: string,\r\n options: MessageThreadOptions,\r\n ): Promise<Channel> {\r\n return this.threads(channelId).createFromMessage(messageId, options);\r\n }\r\n public delete(channelId: string): boolean {\r\n this.#messageManagers.delete(channelId);\r\n return super.delete(channelId);\r\n }\r\n public clear(): void {\r\n this.#messageManagers.clear();\r\n super.clear();\r\n }\r\n}\r\n\r\nfunction isMessageQuery(\r\n value: MessageQueryOptions | Iterable<string>,\r\n): value is MessageQueryOptions {\r\n return (\r\n typeof value === \"object\" && value !== null && !(Symbol.iterator in value)\r\n );\r\n}\r\nexport type CreateMessageOptions = MessageCreateOptions;\r\nexport { MessageManager } from \"./message.js\";\r\nexport { ThreadManager } from \"./thread.js\";\r\nexport {\r\n RoleManager,\r\n type RoleCreateOptions,\r\n type RoleEditOptions,\r\n} from \"./role.js\";\r\nexport {\r\n GuildMemberManager,\r\n type MemberEditOptions,\r\n type BanOptions,\r\n} from \"./member.js\";\r\nexport { ApplicationCommandManager } from \"./application.js\";\r\n"
|
|
18
22
|
],
|
|
19
|
-
"mappings": "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",
|
|
20
|
-
"debugId": "
|
|
23
|
+
"mappings": "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",
|
|
24
|
+
"debugId": "53F2FF9551439B3964756E2164756E21",
|
|
21
25
|
"names": []
|
|
22
26
|
}
|