lunibee 0.3.3 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/builders/commands.d.ts +1 -1
- package/dist/builders/components.d.ts +9 -11
- package/dist/builders/embed.d.ts +1 -1
- package/dist/builders/index.d.ts +1 -1
- package/dist/builders/index.js +87 -1298
- package/dist/builders/index.js.map +3 -11
- package/dist/chunks/index-0wn81eng.js +2492 -0
- package/dist/chunks/index-0wn81eng.js.map +17 -0
- package/dist/chunks/index-2en489j6.js +40 -0
- package/dist/chunks/index-2en489j6.js.map +10 -0
- package/dist/chunks/index-3hyps48a.js +203 -0
- package/dist/chunks/index-3hyps48a.js.map +11 -0
- package/dist/chunks/index-57c5n3ms.js +2274 -0
- package/dist/chunks/index-57c5n3ms.js.map +19 -0
- package/dist/chunks/index-5yx92e36.js +1170 -0
- package/dist/chunks/index-5yx92e36.js.map +14 -0
- package/dist/chunks/index-690bp093.js +95 -0
- package/dist/chunks/index-690bp093.js.map +10 -0
- package/dist/chunks/index-7fp2hvmg.js +2155 -0
- package/dist/chunks/index-7fp2hvmg.js.map +24 -0
- package/dist/chunks/index-cnmsajvk.js +1119 -0
- package/dist/chunks/index-cnmsajvk.js.map +12 -0
- package/dist/chunks/index-fdvgk2sw.js +1310 -0
- package/dist/chunks/index-fdvgk2sw.js.map +21 -0
- package/dist/chunks/index-gyvps8b9.js +214 -0
- package/dist/chunks/index-gyvps8b9.js.map +12 -0
- package/dist/chunks/index-jzg4bh99.js +1533 -0
- package/dist/chunks/index-jzg4bh99.js.map +21 -0
- package/dist/chunks/index-mgw2yvrm.js +3547 -0
- package/dist/chunks/index-mgw2yvrm.js.map +25 -0
- package/dist/chunks/index-yh76b55h.js +3449 -0
- package/dist/chunks/index-yh76b55h.js.map +29 -0
- package/dist/collection/index.js +9 -1118
- package/dist/collection/index.js.map +3 -6
- package/dist/core/api.d.ts +3 -3
- package/dist/core/channel-create.d.ts +2 -2
- package/dist/core/commands.d.ts +3 -3
- package/dist/core/events.d.ts +4 -4
- package/dist/core/handles.d.ts +4 -4
- package/dist/core/index.d.ts +25 -20
- package/dist/core/index.js +68 -10130
- package/dist/core/index.js.map +3 -65
- package/dist/core/permissions.d.ts +1 -1
- package/dist/core/redis-cache.d.ts +1 -1
- package/dist/formatters/index.js +41 -110
- package/dist/formatters/index.js.map +3 -4
- package/dist/handlers/index.js +5 -37
- package/dist/handlers/index.js.map +3 -4
- package/dist/index.d.ts +21 -21
- package/dist/index.js +641 -16325
- package/dist/index.js.map +3 -92
- package/dist/managers/advanced.d.ts +3 -3
- package/dist/managers/application.d.ts +2 -2
- package/dist/managers/base.d.ts +1 -1
- package/dist/managers/emoji.d.ts +2 -2
- package/dist/managers/guild-resources.d.ts +6 -6
- package/dist/managers/guild.d.ts +3 -3
- package/dist/managers/index.d.ts +4 -8
- package/dist/managers/index.js +51 -4060
- package/dist/managers/index.js.map +3 -29
- package/dist/managers/member.d.ts +2 -2
- package/dist/managers/message.d.ts +14 -6
- package/dist/managers/role.d.ts +2 -2
- package/dist/managers/thread.d.ts +3 -3
- package/dist/managers/user.d.ts +7 -4
- package/dist/rest/index.d.ts +10 -35
- package/dist/rest/index.js +57 -2184
- package/dist/rest/index.js.map +3 -18
- package/dist/rest/limiter.d.ts +9 -1
- package/dist/rest/webhook.d.ts +2 -8
- package/dist/sharding/bus.d.ts +2 -2
- package/dist/sharding/cluster.d.ts +45 -5
- package/dist/sharding/context.d.ts +45 -3
- package/dist/sharding/gateway-bot.d.ts +2 -1
- package/dist/sharding/health.d.ts +1 -1
- package/dist/sharding/identify.d.ts +12 -0
- package/dist/sharding/index.d.ts +44 -11
- package/dist/sharding/index.js +60 -4620
- package/dist/sharding/index.js.map +3 -33
- package/dist/sharding/supervisor.d.ts +4 -2
- package/dist/structures/audit-log.d.ts +1 -1
- package/dist/structures/base.d.ts +6 -6
- package/dist/structures/channels.d.ts +1 -1
- package/dist/structures/embed.d.ts +1 -1
- package/dist/structures/index.d.ts +14 -14
- package/dist/structures/index.js +109 -2382
- package/dist/structures/index.js.map +3 -16
- package/dist/structures/interactions.d.ts +13 -9
- package/dist/structures/options.d.ts +1 -1
- package/dist/structures/permissions.d.ts +2 -2
- package/dist/structures/resources.d.ts +10 -10
- package/dist/structures/sticker.d.ts +1 -1
- package/dist/types/gateway.d.ts +2 -79
- package/dist/types/index.d.ts +0 -6
- package/dist/types/index.js +41 -272
- package/dist/types/index.js.map +3 -6
- package/dist/utils/index.js +23 -209
- package/dist/utils/index.js.map +3 -5
- package/dist/voice/connection.d.ts +200 -0
- package/dist/voice/crypto.d.ts +50 -0
- package/dist/voice/dave.d.ts +85 -0
- package/dist/voice/effects.d.ts +31 -0
- package/dist/voice/emitter.d.ts +14 -0
- package/dist/voice/gateway.d.ts +59 -0
- package/dist/voice/index.d.ts +25 -228
- package/dist/voice/index.js +111 -442
- package/dist/voice/index.js.map +3 -4
- package/dist/voice/libopus.d.ts +88 -0
- package/dist/voice/networking.d.ts +80 -0
- package/dist/voice/ogg.d.ts +24 -0
- package/dist/voice/opus.d.ts +18 -0
- package/dist/voice/player.d.ts +79 -0
- package/dist/voice/protocol.d.ts +76 -0
- package/dist/voice/receiver.d.ts +59 -0
- package/dist/voice/resource.d.ts +102 -0
- package/dist/voice/udp.d.ts +40 -0
- package/dist/ws/close-codes.d.ts +1 -1
- package/dist/ws/index.d.ts +25 -4
- package/dist/ws/index.js +47 -1336
- package/dist/ws/index.js.map +3 -17
- package/dist/ws/protocol.d.ts +1 -1
- package/dist/ws/send-budget.d.ts +0 -2
- package/dist/ws/state.d.ts +0 -10
- package/package.json +19 -16
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../packages/managers/src/base.ts", "../packages/managers/src/message.ts", "../packages/managers/src/thread.ts", "../packages/managers/src/user.ts", "../packages/managers/src/emoji.ts", "../packages/managers/src/advanced.ts", "../packages/managers/src/member.ts", "../packages/managers/src/role.ts", "../packages/managers/src/guild-resources.ts", "../packages/managers/src/guild.ts", "../packages/managers/src/application.ts", "../packages/managers/src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { Collection } from \"@lunibee/collection\";\n\n/**\n * Copies a structure's own fields onto the cached instance. A key loop: on Bun,\n * Object.assign into an existing object is about twice as slow, on every event.\n * Structures hold no symbol-keyed fields.\n * @internal\n */\nexport function assignFields<T extends object>(into: T, from: T): T {\n const target = into as Record<string, unknown>;\n const source = from as Record<string, unknown>;\n for (const key of Object.keys(source)) target[key] = source[key];\n return into;\n}\n\n/** Splits the audit-log `reason` off an options object, so it becomes a header, not a body field. */\nexport function splitReason<T extends { reason?: string }>(\n options: T,\n): [Omit<T, \"reason\">, string | undefined] {\n const { reason, ...payload } = options;\n return [payload, reason];\n}\n\n/** Generic cache manager. @typeParam K Cache key type. @typeParam V Cached value type. */\nexport class Manager<K, V> {\n /** Authoritative resource state. Entries never expire: see {@link Manager.set}. */\n public readonly cache: Collection<K, V>;\n readonly #bounded: boolean;\n\n /** @param maxSize Most entries kept; the least recently used go first. Default: unbounded. */\n public constructor(maxSize?: number) {\n this.#bounded = maxSize !== undefined;\n this.cache = new Collection<K, V>(null, { maxSize });\n }\n /** Gets a cached value. @param id Cache key. @returns Cached value. */\n public get(id: K): V | undefined {\n return this.cache.get(id);\n }\n /** Checks whether a value is cached. @param id Cache key. @returns True when cached. */\n public has(id: K): boolean {\n return this.cache.has(id);\n }\n /** In-flight fetches; `dirty` is set when the key is written or deleted meanwhile. */\n readonly #inflight = new Map<K, { promise: Promise<V>; dirty: boolean }>();\n\n /**\n * Runs a REST load for one key. Concurrent loads of that key share a\n * single request. If the key is written (e.g. by a Gateway update) or\n * deleted while the request is in flight, the result is returned but not\n * stored, so it cannot overwrite fresher state or resurrect a deleted\n * resource.\n * @param store Stores a fresh result and returns the canonical instance.\n */\n protected fetchOnce(\n id: K,\n load: () => Promise<V>,\n store: (value: V) => V = (value) => {\n this.set(id, value);\n return value;\n },\n ): Promise<V> {\n const pending = this.#inflight.get(id);\n if (pending) return pending.promise;\n const entry = {\n promise: new Promise<V>((resolve) => resolve(load())),\n dirty: false,\n };\n this.#inflight.set(id, entry);\n entry.promise = entry.promise.then(\n (value) => {\n this.#inflight.delete(id);\n return entry.dirty ? (this.get(id) ?? value) : store(value);\n },\n (error: unknown) => {\n this.#inflight.delete(id);\n throw error;\n },\n );\n return entry.promise;\n }\n\n #markDirty(id: K): void {\n const pending = this.#inflight.get(id);\n if (pending) pending.dirty = true;\n }\n\n /** Stores a resource with `setWithoutTTL()`, so it leaves only on an explicit delete (e.g. a Gateway `*_DELETE`), never through TTL. @param id Cache key. @param value Value. @returns This manager. */\n public set(id: K, value: V): this {\n this.#markDirty(id);\n // A bounded manager must count its entries, which `setWithoutTTL` does not.\n if (this.#bounded) this.cache.set(id, value);\n else this.cache.setWithoutTTL(id, value);\n return this;\n }\n /** Deletes a cached value. @param id Cache key. @returns True when deleted. */\n public delete(id: K): boolean {\n this.#markDirty(id);\n return this.cache.delete(id);\n }\n /** Clears the cache. @returns Nothing. */\n public clear(): void {\n this.cache.clear();\n }\n /** Gets cache size. @returns Number of cached values. */\n public get size(): number {\n return this.cache.size;\n }\n /** Gets the first cached value. @returns First value. */\n public first(): V | undefined {\n return this.cache.first();\n }\n /** Returns cached values. @returns Array of values. */\n public values(): V[] {\n return this.cache.array();\n }\n /** Finds a cached value. @param predicate Predicate. @returns Matching value. */\n public find(predicate: (value: V, key: K) => boolean): V | undefined {\n return this.cache.find(predicate);\n }\n /** Iterates cached entries. @returns Cache iterator. */\n public [Symbol.iterator](): IterableIterator<[K, V]> {\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(\n fetcher: (id: K) => Promise<V>,\n key: (value: V) => K,\n maxSize?: number,\n ) {\n super(maxSize);\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 /** Fetches from Discord; a cached instance is updated in place, so references to it stay current. */\n public fetch(id: K): Promise<V> {\n return this.fetchOnce(\n id,\n () => this.#fetcher(id),\n (value) => this.upsert(value),\n );\n }\n\n public async fetchMany(ids: Iterable<K>): Promise<V[]> {\n return Promise.all([...ids].map((id) => this.resolve(id)));\n }\n\n /** Stores a resource, merging into the cached instance when there is one so existing references stay current. @returns The canonical instance. */\n public upsert(resource: V): V {\n const key = this.#key(resource);\n const existing = this.get(key);\n if (\n existing !== undefined &&\n existing !== resource &&\n typeof existing === \"object\" &&\n existing !== null\n ) {\n assignFields(existing, resource as typeof existing);\n this.set(key, existing);\n return existing;\n }\n this.set(key, resource);\n return resource;\n }\n\n public update(resource: V): V {\n return this.upsert(resource);\n }\n}\n",
|
|
6
|
+
"import { Collection } from \"@lunibee/collection\";\nimport { assignFields } from \"./base.js\";\n\n/** Opt-in per-channel message cache. Messages are temporary data, so they\n * use bounded TTL/LRU storage rather than permanent resource storage. */\nexport interface MessageCacheOptions {\n /** Messages kept per channel; least-recently-used are evicted. Default 100. */\n maxSize?: number;\n /** Sliding TTL in ms. Omit for no expiry. */\n ttl?: number;\n}\nimport { REST, Routes, type RESTFileAttachment } from \"@lunibee/rest\";\nimport type {\n AllowedMentions,\n MessageCreateOptions,\n MessageEditOptions,\n MessageFile,\n MessageFileSource,\n} from \"@lunibee/types\";\nimport { Message, type ResourceContext } from \"@lunibee/structures\";\n\nexport type {\n MessageCreateOptions,\n MessageEditOptions,\n MessageFile,\n MessageFileSource,\n};\n\n/**\n * Turns message files into REST uploads, encoding string data as UTF-8. A file\n * with `toBuffer()` (such as a `CreateAttachment`) is read when the request is sent.\n */\nexport function toAttachments(\n files: readonly (MessageFile | MessageFileSource)[],\n): RESTFileAttachment[] {\n return files.map((file) =>\n \"toBuffer\" in file\n ? { name: file.name, data: file.toBuffer() }\n : {\n name: file.name,\n data:\n typeof file.data === \"string\"\n ? new TextEncoder().encode(file.data)\n : file.data,\n contentType: file.contentType,\n },\n );\n}\n\n/**\n * Splits `files` out of a message payload into a REST upload, encoding string\n * data as UTF-8. `allowedMentions` is the client's default, applied only when\n * the payload has no `allowed_mentions` of its own.\n */\n/**\n * Refuses an `allowed_mentions` object Discord would answer with 400: a kind\n * both in `parse` and listed by id, an unknown `parse` value, or non-string ids.\n * @throws {TypeError} If the object is invalid.\n */\nexport function assertAllowedMentions(mentions: AllowedMentions): void {\n const parse = mentions.parse ?? [];\n for (const kind of parse)\n if (![\"roles\", \"users\", \"everyone\"].includes(kind))\n throw new TypeError(\n `allowed_mentions.parse has unknown value \"${String(kind)}\".`,\n );\n for (const [kind, list] of [\n [\"users\", mentions.users],\n [\"roles\", mentions.roles],\n ] as const) {\n if (list === undefined) continue;\n if (!Array.isArray(list) || list.some((id) => typeof id !== \"string\"))\n throw new TypeError(\n `allowed_mentions.${kind} must be an array of ID strings.`,\n );\n if (list.length > 100)\n throw new RangeError(\n `allowed_mentions.${kind} holds at most 100 IDs.`,\n );\n if (list.length > 0 && parse.includes(kind))\n throw new TypeError(\n `allowed_mentions cannot list ${kind} by ID and also parse \"${kind}\".`,\n );\n }\n}\n\nexport function toRequest(\n options: MessageCreateOptions,\n allowedMentions?: AllowedMentions,\n): {\n body: Omit<MessageCreateOptions, \"files\">;\n files?: RESTFileAttachment[];\n} {\n const { files, ...body } = options;\n if (allowedMentions !== undefined && body.allowed_mentions === undefined)\n body.allowed_mentions = allowedMentions;\n if (body.allowed_mentions) assertAllowedMentions(body.allowed_mentions);\n if (!files?.length) return { body };\n // Alt text travels in the payload's `attachments`, matched by index.\n if (body.attachments === undefined && files.some((f) => f.description))\n body.attachments = files.map((file, id) =>\n file.description ? { id, description: file.description } : { id },\n );\n return {\n body,\n files: toAttachments(files),\n };\n}\n\nexport class MessageManager {\n /** Cached messages; always empty unless a message cache is configured. */\n public readonly cache: Collection<string, Message>;\n readonly #caching: boolean;\n readonly #rest: REST;\n readonly #context: ResourceContext;\n readonly #channelId: string;\n\n /** The client's default `allowed_mentions`, for payloads without their own. */\n readonly #allowedMentions?: AllowedMentions;\n\n public constructor(\n rest: REST,\n context: ResourceContext,\n channelId: string,\n cache?: MessageCacheOptions,\n allowedMentions?: AllowedMentions,\n ) {\n if (!channelId) throw new TypeError(\"Channel ID is required.\");\n this.#allowedMentions = allowedMentions;\n this.#rest = rest;\n this.#context = context;\n this.#channelId = channelId;\n this.#caching = cache !== undefined;\n this.cache = new Collection<string, Message>(null, {\n ttl: cache?.ttl,\n maxSize: cache ? (cache.maxSize ?? 100) : undefined,\n });\n }\n public async resolve(messageId: string): Promise<Message> {\n return this.cache.get(messageId) ?? this.fetch(messageId);\n }\n public async send(options: MessageCreateOptions): Promise<Message> {\n const { body, files } = toRequest(options, this.#allowedMentions);\n const data = await this.#rest.post<\n ConstructorParameters<typeof Message>[0]\n >(Routes.channelMessages(this.#channelId), body, { files });\n return this.upsert(data);\n }\n /** In-flight fetches; `dirty` is set when the message is written or deleted meanwhile. */\n readonly #inflight = new Map<\n string,\n { promise: Promise<Message>; dirty: boolean }\n >();\n /**\n * Fetches a message. Concurrent fetches of one message share a request.\n * If the message is stored or deleted (e.g. by a Gateway event) while the\n * request is in flight, the result is returned but not cached, so it\n * cannot overwrite fresher state or bring back a deleted message.\n */\n public fetch(messageId: string): Promise<Message> {\n const pending = this.#inflight.get(messageId);\n if (pending) return pending.promise;\n const entry: { promise: Promise<Message>; dirty: boolean } = {\n promise: Promise.resolve(null as never),\n dirty: false,\n };\n this.#inflight.set(messageId, entry);\n entry.promise = this.#rest\n .get<ConstructorParameters<typeof Message>[0]>(\n Routes.message(this.#channelId, messageId),\n )\n .then(\n (data) => {\n this.#inflight.delete(messageId);\n return entry.dirty\n ? (this.cache.peek(messageId) ??\n new Message(data, this.#context))\n : this.upsert(data);\n },\n (error: unknown) => {\n this.#inflight.delete(messageId);\n throw error;\n },\n );\n return entry.promise;\n }\n #markDirty(messageId: string): void {\n const pending = this.#inflight.get(messageId);\n if (pending) pending.dirty = true;\n }\n /** Stores a message as the cached version (when caching is on), replacing any cached one. @returns This manager. */\n public set(messageId: string, message: Message): this {\n this.#markDirty(messageId);\n if (this.#caching) this.cache.set(messageId, message);\n return this;\n }\n public fetchMany(messageIds: Iterable<string>): Promise<Message[]> {\n return Promise.all(\n Array.from(messageIds, (messageId) => this.fetch(messageId)),\n );\n }\n public upsert(data: ConstructorParameters<typeof Message>[0]): Message {\n this.#markDirty(data.id);\n const existing = this.cache.peek(data.id);\n const message = new Message(data, this.#context);\n if (existing) {\n assignFields(existing, message);\n return existing;\n }\n if (this.#caching) this.cache.set(message.id, message);\n return message;\n }\n public delete(messageId: string): boolean {\n this.#markDirty(messageId);\n return this.cache.delete(messageId);\n }\n}\n",
|
|
7
|
+
"import { REST, Routes } from \"@lunibee/rest\";\nimport {\n Channel,\n createChannel,\n type ResourceContext,\n} from \"@lunibee/structures\";\nimport type {\n AllowedMentions,\n APIChannel,\n APIGuildMember,\n APIThreadMember,\n MessageCreateOptions,\n} from \"@lunibee/types\";\nimport { toRequest } from \"./message.js\";\n\ntype ChannelData = ConstructorParameters<typeof Channel>[0];\n\n/** Options shared by every way of starting a thread. */\nexport interface ThreadCreateOptions {\n name: string;\n /** Minutes of inactivity before it archives: 60, 1440, 4320 or 10080. */\n autoArchiveDuration?: 60 | 1440 | 4320 | 10080;\n /** Seconds a member must wait between messages (0-21600). */\n rateLimitPerUser?: number;\n reason?: string;\n}\n\n/** What a thread member lookup may ask Discord to include. */\nexport interface ThreadMemberQuery {\n /** Include each member's guild member object. */\n withMember?: boolean;\n}\n\n/** Which archived threads to list. */\nexport type ArchivedThreadScope = \"public\" | \"private\" | \"joined-private\";\n\n/** One page of archived threads. */\nexport interface ArchivedThreads {\n threads: Channel[];\n members: APIThreadMember[];\n hasMore: boolean;\n}\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 readonly #allowedMentions?: AllowedMentions;\n /** Creates a thread manager. @param rest REST transport. @param context Structure resource context. @param channelId Parent channel identifier. @param allowedMentions Default `allowed_mentions` for a forum post's first message without its own. @throws {TypeError} If channelId is empty. */\n public constructor(\n rest: REST,\n context: ResourceContext,\n channelId: string,\n allowedMentions?: AllowedMentions,\n ) {\n if (!channelId) throw new TypeError(\"Channel ID is required.\");\n this.#rest = rest;\n this.#context = context;\n this.#channelId = channelId;\n this.#allowedMentions = allowedMentions;\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 createChannel(data, this.#context);\n }\n\n /**\n * Starts a thread that is not attached to a message: a private thread\n * (`type: 12`, the default) or a public one (`type: 11`) in a text or\n * announcement channel.\n */\n public async create(\n options: ThreadCreateOptions & {\n /** 11 public, 12 private (default), 10 announcement. */\n type?: 10 | 11 | 12;\n /** Whether non-moderators can add other members to a private thread. */\n invitable?: boolean;\n },\n ): Promise<Channel> {\n const data = await this.#rest.post<ChannelData>(\n Routes.channelThreads(this.#channelId),\n {\n name: options.name,\n type: options.type ?? 12,\n auto_archive_duration: options.autoArchiveDuration,\n rate_limit_per_user: options.rateLimitPerUser,\n invitable: options.invitable,\n },\n { reason: options.reason },\n );\n return createChannel(data, this.#context);\n }\n\n /**\n * Posts to a forum or media channel: one request creates the thread and its\n * first message. `message` takes everything `send()` does, files included.\n */\n public async createForumPost(\n options: ThreadCreateOptions & {\n message: MessageCreateOptions;\n /** IDs of the channel's tags to apply. */\n appliedTags?: string[];\n },\n ): Promise<Channel> {\n const { message, appliedTags, reason, ...thread } = options;\n // The first message goes through the same path as every other send,\n // so it gets the client's allowed_mentions default and alt text.\n const { body: content, files } = toRequest(\n message,\n this.#allowedMentions,\n );\n const data = await this.#rest.post<ChannelData>(\n Routes.channelThreads(this.#channelId),\n {\n name: thread.name,\n auto_archive_duration: thread.autoArchiveDuration,\n rate_limit_per_user: thread.rateLimitPerUser,\n applied_tags: appliedTags,\n message: content,\n },\n { files, reason },\n );\n return createChannel(data, this.#context);\n }\n\n /**\n * Lists archived threads of this channel, newest first. `joined-private`\n * is the private archived threads the bot is a member of.\n */\n public async fetchArchived(\n scope: ArchivedThreadScope,\n options: { before?: string; limit?: number } = {},\n ): Promise<ArchivedThreads> {\n const route =\n scope === \"public\"\n ? Routes.channelPublicArchivedThreads(this.#channelId)\n : scope === \"private\"\n ? Routes.channelPrivateArchivedThreads(this.#channelId)\n : Routes.channelJoinedPrivateArchivedThreads(this.#channelId);\n const params = new URLSearchParams();\n if (options.before) params.set(\"before\", options.before);\n if (options.limit !== undefined)\n params.set(\n \"limit\",\n String(Math.min(100, Math.max(1, options.limit))),\n );\n const query = params.toString();\n const page = await this.#rest.get<{\n threads: APIChannel[];\n members: APIThreadMember[];\n has_more: boolean;\n }>(`${route}${query ? `?${query}` : \"\"}`);\n return {\n threads: page.threads.map((thread) =>\n createChannel(thread as ChannelData, this.#context),\n ),\n members: page.members,\n hasMore: page.has_more,\n };\n }\n\n /** Joins a thread as the bot. */\n public async join(threadId: string): Promise<void> {\n await this.#rest.put(Routes.threadMember(threadId, \"@me\"));\n }\n\n /** Leaves a thread as the bot. */\n public async leave(threadId: string): Promise<void> {\n await this.#rest.delete(Routes.threadMember(threadId, \"@me\"));\n }\n\n /** Adds a member to a thread. */\n public async addMember(threadId: string, userId: string): Promise<void> {\n await this.#rest.put(Routes.threadMember(threadId, userId));\n }\n\n /** Removes a member from a thread. */\n public async removeMember(threadId: string, userId: string): Promise<void> {\n await this.#rest.delete(Routes.threadMember(threadId, userId));\n }\n\n /** Fetches one thread member; rejects with a 404 when they have not joined. */\n public async fetchMember(\n threadId: string,\n userId: string,\n query: ThreadMemberQuery = {},\n ): Promise<APIThreadMember & { member?: APIGuildMember }> {\n const suffix = query.withMember ? \"?with_member=true\" : \"\";\n return this.#rest.get(\n `${Routes.threadMember(threadId, userId)}${suffix}`,\n );\n }\n\n /** Lists thread members (needs the Guild Members intent), one page at a time (`limit` 1-100). */\n public async fetchMembers(\n threadId: string,\n options: ThreadMemberQuery & { after?: string; limit?: number } = {},\n ): Promise<APIThreadMember[]> {\n const params = new URLSearchParams();\n if (options.withMember) params.set(\"with_member\", \"true\");\n if (options.after) params.set(\"after\", options.after);\n if (options.limit !== undefined)\n params.set(\n \"limit\",\n String(Math.min(100, Math.max(1, options.limit))),\n );\n const query = params.toString();\n return this.#rest.get(\n `${Routes.threadMembers(threadId)}${query ? `?${query}` : \"\"}`,\n );\n }\n}\n",
|
|
8
|
+
"import { ResourceManager } from \"./base.js\";\nimport { User } from \"@lunibee/structures\";\nimport { type REST, Routes } from \"@lunibee/rest\";\nimport type { APIChannel } from \"@lunibee/types\";\n\n/** A guild as `GET /users/@me/guilds` lists it. */\nexport interface APIPartialGuild {\n id: string;\n name: string;\n icon: string | null;\n owner: boolean;\n permissions: string;\n features: string[];\n approximate_member_count?: number;\n approximate_presence_count?: number;\n}\n\ntype UserData = ConstructorParameters<typeof User>[0];\n\nexport interface UserEditOptions {\n username?: string;\n avatar?: string | null;\n}\n\nexport class UserManager extends ResourceManager<string, User> {\n readonly #rest: REST;\n /** @param options.maxSize Most users kept; the least recently used go first. Default: unbounded. */\n public constructor(rest: REST, options: { maxSize?: number } = {}) {\n super(\n async (id) =>\n new User(await rest.get<UserData>(Routes.userById(id))),\n (user) => user.id,\n options.maxSize,\n );\n this.#rest = rest;\n }\n\n /** Gets the currently logged-in bot user. */\n public async fetchMe(): Promise<User> {\n const data = await this.#rest.get<UserData>(\"/users/@me\");\n return this.upsert(new User(data));\n }\n\n /** Modifies the currently logged-in bot user. */\n public async editMe(options: UserEditOptions): Promise<User> {\n const data = await this.#rest.patch<UserData>(\"/users/@me\", options);\n return this.upsert(new User(data));\n }\n\n /** Lists the guilds the bot is in, one page at a time (`limit` 1-200, `before` / `after` guild-ID cursors). */\n public async fetchGuilds(\n options: {\n limit?: number;\n before?: string;\n after?: string;\n withCounts?: boolean;\n } = {},\n ): Promise<APIPartialGuild[]> {\n const params = new URLSearchParams();\n if (options.limit !== undefined)\n params.set(\n \"limit\",\n String(Math.min(200, Math.max(1, options.limit))),\n );\n if (options.before) params.set(\"before\", options.before);\n if (options.after) params.set(\"after\", options.after);\n if (options.withCounts) params.set(\"with_counts\", \"true\");\n const query = params.toString();\n return this.#rest.get<APIPartialGuild[]>(\n `${Routes.userGuilds()}${query ? `?${query}` : \"\"}`,\n );\n }\n\n /** Leaves a guild. */\n public async leaveGuild(guildId: string): Promise<void> {\n await this.#rest.delete(Routes.currentUserGuild(guildId));\n }\n\n /** Creates a DM channel with a user. */\n public async createDM(userId: string): Promise<APIChannel> {\n return this.#rest.post<APIChannel>(\"/users/@me/channels\", {\n recipient_id: userId,\n });\n }\n}\n",
|
|
9
|
+
"import { Manager, assignFields, splitReason } from \"./base.js\";\nimport { Emoji } from \"@lunibee/structures\";\nimport { Routes, type REST } from \"@lunibee/rest\";\n\n/** Strict payload for creating a custom guild emoji. */\nexport interface EmojiCreateOptions {\n /** Audit-log reason. */\n reason?: string;\n /** Emoji name (1-32 chars, alphanumeric + underscores). */\n name: string;\n /** Base64-encoded 128x128 image data URI. */\n image: string;\n /** Role IDs allowed to use the emoji. */\n roles?: string[];\n}\n\n/** Strict payload for editing a custom guild emoji. */\nexport interface EmojiEditOptions {\n /** Audit-log reason. */\n reason?: string;\n /** New emoji name. */\n name?: string;\n /** Role IDs allowed to use the emoji. */\n roles?: string[];\n}\n\n/** Manages custom emojis for a guild. */\nexport class EmojiManager extends Manager<string, Emoji> {\n readonly #rest: REST;\n readonly #guildId: string;\n\n public constructor(rest: REST, guildId: string) {\n super();\n this.#rest = rest;\n this.#guildId = guildId;\n }\n\n /** Fetches an emoji by ID; concurrent fetches share a request and a stale result never overwrites newer state. */\n public fetch(emojiId: string): Promise<Emoji> {\n return this.fetchOnce(\n emojiId,\n async () =>\n new Emoji(\n await this.#rest.get<\n ConstructorParameters<typeof Emoji>[0]\n >(Routes.guildEmoji(this.#guildId, emojiId)),\n ),\n (emoji) => this.#merge(emojiId, emoji),\n );\n }\n\n /** Fetches all emojis for this guild. */\n public async fetchAll(): Promise<Emoji[]> {\n const data = await this.#rest.get<\n ConstructorParameters<typeof Emoji>[0][]\n >(Routes.guildEmoji(this.#guildId));\n return data.map((item) => this.upsert(item));\n }\n\n /** Creates a new custom emoji. */\n public async create(options: EmojiCreateOptions): Promise<Emoji> {\n const [payload, reason] = splitReason(options);\n return this.upsert(\n await this.#rest.post<ConstructorParameters<typeof Emoji>[0]>(\n Routes.guildEmoji(this.#guildId),\n payload,\n { reason },\n ),\n );\n }\n\n /** Edits an existing custom emoji. */\n public async edit(\n emojiId: string,\n options: EmojiEditOptions,\n ): Promise<Emoji> {\n const [payload, reason] = splitReason(options);\n return this.upsert(\n await this.#rest.patch<ConstructorParameters<typeof Emoji>[0]>(\n Routes.guildEmoji(this.#guildId, emojiId),\n payload,\n { reason },\n ),\n );\n }\n\n /** Deletes a custom emoji. @param reason Audit-log reason. */\n public async remove(emojiId: string, reason?: string): Promise<void> {\n await this.#rest.delete(Routes.guildEmoji(this.#guildId, emojiId), {\n reason,\n });\n this.delete(emojiId);\n }\n\n /** Upserts an emoji into the manager cache. Custom emojis are keyed by their\n * snowflake ID; unicode emojis (no ID) are keyed by `unicode:${name}` so repeated\n * upserts reuse the same cached instance instead of allocating a new one each call. */\n public upsert(data: ConstructorParameters<typeof Emoji>[0]): Emoji {\n const key = data.id != null ? data.id : `unicode:${data.name ?? \"\"}`;\n return this.#merge(key, new Emoji(data));\n }\n\n #merge(key: string, emoji: Emoji): Emoji {\n const existing = this.get(key);\n if (existing) {\n assignFields(existing, emoji);\n return existing;\n }\n this.set(key, emoji);\n return emoji;\n }\n}\n",
|
|
10
|
+
"import { Manager } from \"./base.js\";\nimport { Routes, type REST } from \"@lunibee/rest\";\nimport type {\n APIEmoji,\n APIEntitlement,\n APISKU,\n APISoundboardSound,\n APISticker,\n APISubscription,\n} from \"@lunibee/types\";\n\nexport type {\n APIEntitlement,\n APISKU,\n APISoundboardSound,\n APISubscription,\n} from \"@lunibee/types\";\n\n/** Appends encoded query parameters, skipping undefined values. */\nfunction withQuery(\n path: string,\n query: Record<string, string | number | boolean | undefined>,\n): string {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query))\n if (value !== undefined) params.set(key, String(value));\n const suffix = params.toString();\n return suffix ? `${path}?${suffix}` : path;\n}\n\n// ─── Stickers ────────────────────────────────────────────────────────────────\n\n/** Fields for {@link GuildStickerManager.create}. */\nexport interface GuildStickerCreateOptions {\n name: string;\n description: string;\n /** Autocomplete/suggestion tags (e.g. an emoji name). */\n tags: string;\n /** PNG, APNG, GIF or Lottie JSON file, max 512 KiB. */\n file: Blob;\n reason?: string;\n}\n\n/** Manages a guild's custom stickers, cached by sticker ID. */\nexport class GuildStickerManager extends Manager<string, APISticker> {\n readonly #rest: REST;\n public readonly guildId: string;\n\n public constructor(rest: REST, guildId: string) {\n super();\n this.#rest = rest;\n this.guildId = guildId;\n }\n\n #store(sticker: APISticker): APISticker {\n this.set(sticker.id, sticker);\n return sticker;\n }\n\n /** Fetches every sticker in the guild, replacing the cache. */\n public async fetchAll(): Promise<APISticker[]> {\n const stickers = await this.#rest.get<APISticker[]>(\n Routes.guildSticker(this.guildId),\n );\n this.clear();\n return stickers.map((sticker) => this.#store(sticker));\n }\n\n /** Fetches one sticker. */\n public async fetch(stickerId: string): Promise<APISticker> {\n return this.#store(\n await this.#rest.get<APISticker>(\n Routes.guildSticker(this.guildId, stickerId),\n ),\n );\n }\n\n /** Uploads a sticker (multipart form, as Discord requires). */\n public async create(\n options: GuildStickerCreateOptions,\n ): Promise<APISticker> {\n const form = new FormData();\n form.set(\"name\", options.name);\n form.set(\"description\", options.description);\n form.set(\"tags\", options.tags);\n form.set(\"file\", options.file);\n return this.#store(\n await this.#rest.post<APISticker>(\n Routes.guildSticker(this.guildId),\n form,\n { reason: options.reason },\n ),\n );\n }\n\n /** Edits a sticker's name, description or tags. */\n public async edit(\n stickerId: string,\n options: {\n name?: string;\n description?: string | null;\n tags?: string;\n reason?: string;\n },\n ): Promise<APISticker> {\n const { reason, ...body } = options;\n return this.#store(\n await this.#rest.patch<APISticker>(\n Routes.guildSticker(this.guildId, stickerId),\n body,\n { reason },\n ),\n );\n }\n\n /** Deletes a sticker. */\n public async remove(stickerId: string, reason?: string): Promise<void> {\n await this.#rest.delete(Routes.guildSticker(this.guildId, stickerId), {\n reason,\n });\n this.delete(stickerId);\n }\n\n /** Replaces the cache with the full list from a `GUILD_STICKERS_UPDATE` event. */\n public sync(stickers: readonly APISticker[]): void {\n this.clear();\n for (const sticker of stickers) this.#store(sticker);\n }\n}\n\n// ─── Soundboard ──────────────────────────────────────────────────────────────\n\n/** Fields for {@link GuildSoundboardManager.create}. */\nexport interface SoundboardSoundCreateOptions {\n name: string;\n /** Data URI of an MP3 or OGG file (max 512 KiB, 5.2 s). */\n sound: string;\n /** 0 to 1; defaults to 1. */\n volume?: number;\n emojiId?: string;\n emojiName?: string;\n reason?: string;\n}\n\n/** Manages a guild's soundboard sounds, cached by sound ID. */\nexport class GuildSoundboardManager extends Manager<\n string,\n APISoundboardSound\n> {\n readonly #rest: REST;\n public readonly guildId: string;\n\n public constructor(rest: REST, guildId: string) {\n super();\n this.#rest = rest;\n this.guildId = guildId;\n }\n\n #store(sound: APISoundboardSound): APISoundboardSound {\n this.set(sound.sound_id, sound);\n return sound;\n }\n\n /** Fetches every soundboard sound in the guild, replacing the cache. */\n public async fetchAll(): Promise<APISoundboardSound[]> {\n const { items } = await this.#rest.get<{\n items: APISoundboardSound[];\n }>(Routes.guildSoundboardSound(this.guildId));\n this.clear();\n return items.map((sound) => this.#store(sound));\n }\n\n /** Fetches one sound. */\n public async fetch(soundId: string): Promise<APISoundboardSound> {\n return this.#store(\n await this.#rest.get<APISoundboardSound>(\n Routes.guildSoundboardSound(this.guildId, soundId),\n ),\n );\n }\n\n /** Creates a sound. */\n public async create(\n options: SoundboardSoundCreateOptions,\n ): Promise<APISoundboardSound> {\n if (\n options.volume !== undefined &&\n (options.volume < 0 || options.volume > 1)\n )\n throw new RangeError(\"Soundboard volume must be between 0 and 1.\");\n return this.#store(\n await this.#rest.post<APISoundboardSound>(\n Routes.guildSoundboardSound(this.guildId),\n {\n name: options.name,\n sound: options.sound,\n volume: options.volume,\n emoji_id: options.emojiId,\n emoji_name: options.emojiName,\n },\n { reason: options.reason },\n ),\n );\n }\n\n /** Edits a sound's name, volume or emoji. */\n public async edit(\n soundId: string,\n options: {\n name?: string;\n volume?: number | null;\n emojiId?: string | null;\n emojiName?: string | null;\n reason?: string;\n },\n ): Promise<APISoundboardSound> {\n return this.#store(\n await this.#rest.patch<APISoundboardSound>(\n Routes.guildSoundboardSound(this.guildId, soundId),\n {\n name: options.name,\n volume: options.volume,\n emoji_id: options.emojiId,\n emoji_name: options.emojiName,\n },\n { reason: options.reason },\n ),\n );\n }\n\n /** Deletes a sound. */\n public async remove(soundId: string, reason?: string): Promise<void> {\n await this.#rest.delete(\n Routes.guildSoundboardSound(this.guildId, soundId),\n { reason },\n );\n this.delete(soundId);\n }\n}\n\n// ─── Monetization ────────────────────────────────────────────────────────────\n\n/** Filters for {@link MonetizationManager.fetchEntitlements}. */\nexport interface EntitlementQuery {\n userId?: string;\n skuIds?: string[];\n guildId?: string;\n before?: string;\n after?: string;\n /** 1-100, default 100. */\n limit?: number;\n excludeEnded?: boolean;\n excludeDeleted?: boolean;\n}\n\n/**\n * SKUs, entitlements and subscriptions for one application. Entitlements are\n * cached by ID and kept current by the client's `ENTITLEMENT_*` events.\n */\nexport class MonetizationManager extends Manager<string, APIEntitlement> {\n readonly #rest: REST;\n public readonly applicationId: string;\n\n public constructor(rest: REST, applicationId: string) {\n super();\n this.#rest = rest;\n this.applicationId = applicationId;\n }\n\n /** Fetches the application's SKUs. */\n public fetchSkus(): Promise<APISKU[]> {\n return this.#rest.get<APISKU[]>(\n Routes.applicationSkus(this.applicationId),\n );\n }\n\n /** Fetches entitlements matching the filters and caches them. */\n public async fetchEntitlements(\n query: EntitlementQuery = {},\n ): Promise<APIEntitlement[]> {\n if (\n query.limit !== undefined &&\n (!Number.isInteger(query.limit) ||\n query.limit < 1 ||\n query.limit > 100)\n )\n throw new RangeError(\"Entitlement limit must be 1-100.\");\n const entitlements = await this.#rest.get<APIEntitlement[]>(\n withQuery(Routes.applicationEntitlement(this.applicationId), {\n user_id: query.userId,\n sku_ids: query.skuIds?.join(\",\"),\n guild_id: query.guildId,\n before: query.before,\n after: query.after,\n limit: query.limit,\n exclude_ended: query.excludeEnded,\n exclude_deleted: query.excludeDeleted,\n }),\n );\n for (const entitlement of entitlements)\n this.set(entitlement.id, entitlement);\n return entitlements;\n }\n\n /** Fetches one entitlement. */\n public async fetch(entitlementId: string): Promise<APIEntitlement> {\n const entitlement = await this.#rest.get<APIEntitlement>(\n Routes.applicationEntitlement(this.applicationId, entitlementId),\n );\n this.set(entitlement.id, entitlement);\n return entitlement;\n }\n\n /** Marks a one-time-purchase entitlement as consumed. */\n public async consume(entitlementId: string): Promise<void> {\n await this.#rest.post(\n Routes.consumeEntitlement(this.applicationId, entitlementId),\n );\n const cached = this.get(entitlementId);\n if (cached) cached.consumed = true;\n }\n\n /** Creates a test entitlement for a user or guild (owner type 1 = guild, 2 = user). */\n public async createTestEntitlement(options: {\n skuId: string;\n ownerId: string;\n ownerType: 1 | 2;\n }): Promise<APIEntitlement> {\n const entitlement = await this.#rest.post<APIEntitlement>(\n Routes.applicationEntitlement(this.applicationId),\n {\n sku_id: options.skuId,\n owner_id: options.ownerId,\n owner_type: options.ownerType,\n },\n );\n this.set(entitlement.id, entitlement);\n return entitlement;\n }\n\n /** Deletes a test entitlement. */\n public async deleteTestEntitlement(entitlementId: string): Promise<void> {\n await this.#rest.delete(\n Routes.applicationEntitlement(this.applicationId, entitlementId),\n );\n this.delete(entitlementId);\n }\n\n /** Fetches a SKU's subscriptions for a user, or one subscription. */\n public fetchSubscriptions(\n skuId: string,\n query: {\n userId?: string;\n before?: string;\n after?: string;\n limit?: number;\n } = {},\n ): Promise<APISubscription[]> {\n return this.#rest.get<APISubscription[]>(\n withQuery(Routes.skuSubscription(skuId), {\n user_id: query.userId,\n before: query.before,\n after: query.after,\n limit: query.limit,\n }),\n );\n }\n\n /** Fetches one subscription. */\n public fetchSubscription(\n skuId: string,\n subscriptionId: string,\n ): Promise<APISubscription> {\n return this.#rest.get<APISubscription>(\n Routes.skuSubscription(skuId, subscriptionId),\n );\n }\n}\n\n// ─── Application emojis ──────────────────────────────────────────────────────\n\n/** Fields for {@link ApplicationEmojiManager.create}. */\nexport interface ApplicationEmojiCreateOptions {\n /** 2-32 characters: letters, digits and underscores. */\n name: string;\n /** The image as a data URI (PNG, JPEG, GIF or WebP, up to 256 KB). */\n image: string;\n}\n\n/**\n * The application's own emojis: they belong to the bot, not to a guild, so any\n * server can show them. Cached by emoji ID.\n */\nexport class ApplicationEmojiManager extends Manager<string, APIEmoji> {\n readonly #rest: REST;\n public readonly applicationId: string;\n\n public constructor(rest: REST, applicationId: string) {\n super();\n this.#rest = rest;\n this.applicationId = applicationId;\n }\n\n #store(emoji: APIEmoji): APIEmoji {\n if (emoji.id) this.set(emoji.id, emoji);\n return emoji;\n }\n\n /** Fetches every application emoji, replacing the cache. */\n public async fetchAll(): Promise<APIEmoji[]> {\n const { items } = await this.#rest.get<{ items: APIEmoji[] }>(\n Routes.applicationEmoji(this.applicationId),\n );\n this.clear();\n return items.map((emoji) => this.#store(emoji));\n }\n\n /** Fetches one application emoji. */\n public async fetch(emojiId: string): Promise<APIEmoji> {\n return this.#store(\n await this.#rest.get<APIEmoji>(\n Routes.applicationEmoji(this.applicationId, emojiId),\n ),\n );\n }\n\n /** Uploads a new application emoji. */\n public async create(\n options: ApplicationEmojiCreateOptions,\n ): Promise<APIEmoji> {\n return this.#store(\n await this.#rest.post<APIEmoji>(\n Routes.applicationEmoji(this.applicationId),\n options,\n ),\n );\n }\n\n /** Renames an application emoji. */\n public async edit(\n emojiId: string,\n options: { name: string },\n ): Promise<APIEmoji> {\n return this.#store(\n await this.#rest.patch<APIEmoji>(\n Routes.applicationEmoji(this.applicationId, emojiId),\n options,\n ),\n );\n }\n\n /** Deletes an application emoji. */\n public async remove(emojiId: string): Promise<void> {\n await this.#rest.delete(\n Routes.applicationEmoji(this.applicationId, emojiId),\n );\n this.delete(emojiId);\n }\n}\n",
|
|
11
|
+
"import { REST, Routes } from \"@lunibee/rest\";\nimport { GuildMember, type ResourceContext } from \"@lunibee/structures\";\nimport { ResourceManager, splitReason } from \"./base.js\";\nimport type { APIGuildMember } from \"@lunibee/types\";\n\n/** Fields that can change when editing a guild member (nickname, roles, voice state, timeout). */\nexport interface MemberEditOptions {\n /** Audit-log reason. */\n reason?: string;\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\n/** Options for banning a member: audit-log `reason` and how many seconds of their messages to delete. */\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 readonly #context: () => ResourceContext | undefined;\n public readonly guildId: string;\n\n /** @param context Gives fetched members their actions (`member.kick()`...). */\n public constructor(\n guildId: string,\n rest: REST,\n context: () => ResourceContext | undefined = () => undefined,\n maxSize?: number,\n ) {\n super(\n (id: string) =>\n rest\n .get<APIGuildMember>(Routes.guildMember(guildId, id))\n .then(\n (data) =>\n new GuildMember(\n { ...data, guild_id: guildId },\n context(),\n ),\n ),\n (member: GuildMember) => member.user.id,\n maxSize,\n );\n this.guildId = guildId;\n this.#rest = rest;\n this.#context = context;\n }\n\n /** Finds members whose username or nickname starts with `query` (up to `limit`, 1-1000, default 1). */\n public async search(query: string, limit = 1): Promise<GuildMember[]> {\n if (!query.trim()) throw new TypeError(\"A search query is required.\");\n const params = new URLSearchParams({\n query,\n limit: String(Math.min(1000, Math.max(1, limit))),\n });\n const found = await this.#rest.get<APIGuildMember[]>(\n `${Routes.guildMembersSearch(this.guildId)}?${params}`,\n );\n return found.map((data) => {\n // Merged into the cached instance, so references to it stay current.\n return this.upsert(\n new GuildMember(\n { ...data, guild_id: this.guildId },\n this.#context(),\n ),\n );\n });\n }\n\n /** Changes the bot's own nickname in this guild (`null` clears it). */\n public async editMe(options: {\n nick?: string | null;\n reason?: string;\n }): Promise<GuildMember> {\n const [payload, reason] = splitReason(options);\n const data = await this.#rest.patch<APIGuildMember>(\n Routes.guildMemberMe(this.guildId),\n payload,\n { reason },\n );\n return this.upsert(\n new GuildMember(\n { ...data, guild_id: this.guildId },\n this.#context(),\n ),\n );\n }\n\n /** Kicks a member from the guild. @param reason Audit-log reason. */\n public async kick(userId: string, reason?: string): Promise<void> {\n await this.#rest.delete(Routes.guildMember(this.guildId, userId), {\n reason,\n });\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(\n Routes.guildBan(this.guildId, userId),\n { delete_message_seconds: options.deleteMessageSeconds },\n { reason: options.reason },\n );\n this.delete(userId);\n }\n\n /** Unbans a user from the guild. @param reason Audit-log reason. */\n public async unban(userId: string, reason?: string): Promise<void> {\n await this.#rest.delete(Routes.guildBan(this.guildId, userId), {\n reason,\n });\n }\n\n /** Edits a guild member (nickname, roles, timeout, mute, deaf). Put the audit-log reason in `options.reason`.*/\n public async edit(\n userId: string,\n options: MemberEditOptions,\n ): Promise<GuildMember> {\n const [payload, optionsReason] = splitReason(options);\n const data = await this.#rest.patch<\n import(\"@lunibee/types\").APIGuildMember\n >(Routes.guildMember(this.guildId, userId), payload, {\n reason: optionsReason,\n });\n return this.upsert(\n new GuildMember(\n { ...data, guild_id: this.guildId },\n this.#context(),\n ),\n );\n }\n\n /** Adds a role to a member. @param reason Audit-log reason. */\n public async addRole(\n userId: string,\n roleId: string,\n reason?: string,\n ): Promise<void> {\n await this.#rest.put(\n Routes.guildMemberRole(this.guildId, userId, roleId),\n undefined,\n { reason },\n );\n }\n\n /** Removes a role from a member. @param reason Audit-log reason. */\n public async removeRole(\n userId: string,\n roleId: string,\n reason?: string,\n ): Promise<void> {\n await this.#rest.delete(\n Routes.guildMemberRole(this.guildId, userId, roleId),\n { reason },\n );\n }\n\n /** Times out a member for a given duration in milliseconds (or clears timeout if null). @param reason Audit-log reason. */\n public async timeout(\n userId: string,\n milliseconds: number | null,\n reason?: string,\n ): Promise<GuildMember> {\n const timeoutDate =\n milliseconds === null\n ? null\n : new Date(Date.now() + milliseconds).toISOString();\n return this.edit(userId, {\n communication_disabled_until: timeoutDate,\n reason,\n });\n }\n}\n",
|
|
12
|
+
"import { REST, Routes } from \"@lunibee/rest\";\nimport { Role } from \"@lunibee/structures\";\nimport type { APIRole } from \"@lunibee/types\";\nimport { ResourceManager } from \"./base.js\";\n\n/** Role fields shared by create and edit. */\ninterface RoleStyleOptions {\n permissions?: bigint | number | string;\n /** A solid colour as a 24-bit integer. Use `colors` for a gradient. */\n color?: number;\n /** Primary, secondary and tertiary colours: two make a gradient, three the holographic style. */\n colors?: {\n primary: number;\n secondary?: number | null;\n tertiary?: number | null;\n };\n hoist?: boolean;\n mentionable?: boolean;\n /** The role's icon as a data URI (needs the guild's role-icons boost level), or `null` to remove it. */\n icon?: string | null;\n /** A unicode emoji as the role icon, or `null` to remove it. */\n unicodeEmoji?: string | null;\n reason?: string;\n}\n\nexport interface RoleCreateOptions extends RoleStyleOptions {\n name: string;\n}\n\nexport interface RoleEditOptions extends RoleStyleOptions {\n name?: string;\n position?: number;\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<APIRole>(Routes.guildRole(guildId, id))\n .then((data) => 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<APIRole[]>(\n Routes.guildRoles(this.guildId),\n );\n return data.map((item) => this.upsert(new Role(item)));\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<APIRole>(\n Routes.guildRoles(this.guildId),\n rolePayload(payload),\n { reason },\n );\n return this.#store(data);\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<APIRole>(\n Routes.guildRole(this.guildId, roleId),\n rolePayload(payload),\n { reason },\n );\n return this.#store(data);\n }\n\n /** Merges into the cached instance, so references to it stay current. */\n #store(data: APIRole): Role {\n return this.upsert(new Role(data));\n }\n\n /** Deletes a role. @param reason Audit-log reason. */\n public async remove(roleId: string, reason?: string): Promise<void> {\n await this.#rest.delete(Routes.guildRole(this.guildId, roleId), {\n reason,\n });\n this.delete(roleId);\n }\n /**\n * Moves roles in the hierarchy. Discord shifts the other roles around them.\n * @param positions Each role's ID and its new position.\n * @param reason Audit-log reason.\n * @returns Every role in the guild, in their new order.\n */\n public async setPositions(\n positions: readonly { id: string; position: number }[],\n reason?: string,\n ): Promise<Role[]> {\n const data = await this.#rest.patch<\n ConstructorParameters<typeof Role>[0][]\n >(\n Routes.guildRoles(this.guildId),\n positions.map(({ id, position }) => ({ id, position })),\n { reason },\n );\n return data.map((item) => this.upsert(new Role(item)));\n }\n}\n\n/** Role options as Discord expects them: `permissions` as a decimal string. */\nfunction rolePayload(options: Omit<RoleEditOptions, \"reason\">) {\n const { permissions, colors, unicodeEmoji, ...rest } = options;\n return {\n ...rest,\n permissions:\n permissions !== undefined ? String(permissions) : undefined,\n colors: colors && {\n primary_color: colors.primary,\n secondary_color: colors.secondary ?? null,\n tertiary_color: colors.tertiary ?? null,\n },\n unicode_emoji: unicodeEmoji,\n };\n}\n",
|
|
13
|
+
"import { Manager, splitReason } from \"./base.js\";\nimport { Routes, type REST } from \"@lunibee/rest\";\nimport type {\n APIChannel,\n APIOverwrite,\n APIGuildScheduledEvent,\n APIStageInstance,\n UserData,\n} from \"@lunibee/types\";\n\n/** Raw Discord ban object. */\nexport interface APIBan {\n user: UserData;\n reason: string | null;\n}\n\n/** Options for {@link GuildBanManager.create}. */\nexport interface GuildBanCreateOptions {\n /** Seconds of message history to delete (0-604800). */\n deleteMessageSeconds?: number;\n /** Audit-log reason. */\n reason?: string;\n}\n\n/** Appends encoded query parameters to a route. */\nfunction withQuery(path: string, params: Record<string, unknown>): string {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(params))\n if (value !== undefined) query.set(key, String(value));\n const suffix = query.toString();\n return suffix ? `${path}?${suffix}` : path;\n}\n\n/** Manages a guild's bans, cached by user ID. */\nexport class GuildBanManager extends Manager<string, APIBan> {\n readonly #rest: REST;\n public readonly guildId: string;\n\n public constructor(rest: REST, guildId: string) {\n super();\n this.#rest = rest;\n this.guildId = guildId;\n }\n\n /** Fetches one ban. */\n public async fetch(userId: string): Promise<APIBan> {\n const ban = await this.#rest.get<APIBan>(\n Routes.guildBan(this.guildId, userId),\n );\n this.set(ban.user.id, ban);\n return ban;\n }\n\n /** Fetches a page of bans (`limit` 1-1000, `before`/`after` user-ID cursors). */\n public async fetchAll(\n options: { limit?: number; before?: string; after?: string } = {},\n ): Promise<APIBan[]> {\n const limit =\n options.limit === undefined\n ? undefined\n : Math.min(1000, Math.max(1, options.limit));\n const bans = await this.#rest.get<APIBan[]>(\n withQuery(Routes.guildBans(this.guildId), {\n limit,\n before: options.before,\n after: options.after,\n }),\n );\n for (const ban of bans) this.set(ban.user.id, ban);\n return bans;\n }\n\n /** Bans a user. */\n public async create(\n userId: string,\n options: GuildBanCreateOptions = {},\n ): Promise<void> {\n await this.#rest.put(\n Routes.guildBan(this.guildId, userId),\n { delete_message_seconds: options.deleteMessageSeconds },\n { reason: options.reason },\n );\n }\n\n /**\n * Bans up to 200 users at once. Users that cannot be banned (already\n * banned, higher role, owner) come back in `failed`, not as an error.\n */\n public async bulk(\n userIds: readonly string[],\n options: GuildBanCreateOptions = {},\n ): Promise<{ banned: string[]; failed: string[] }> {\n if (userIds.length < 1 || userIds.length > 200)\n throw new RangeError(\"Bulk ban takes 1 to 200 user IDs.\");\n const result = await this.#rest.post<{\n banned_users: string[] | null;\n failed_users: string[] | null;\n }>(\n Routes.guildBulkBan(this.guildId),\n {\n user_ids: userIds,\n delete_message_seconds: options.deleteMessageSeconds,\n },\n { reason: options.reason },\n );\n return {\n banned: result.banned_users ?? [],\n failed: result.failed_users ?? [],\n };\n }\n\n /** Lifts a ban. */\n public async remove(userId: string, reason?: string): Promise<void> {\n await this.#rest.delete(Routes.guildBan(this.guildId, userId), {\n reason,\n });\n this.delete(userId);\n }\n}\n\n/** Fields accepted when creating or editing a scheduled event. */\nexport type GuildScheduledEventOptions = Partial<\n Omit<APIGuildScheduledEvent, \"id\" | \"guild_id\" | \"creator\" | \"user_count\">\n> &\n Record<string, unknown> & {\n /** Audit-log reason. */\n reason?: string;\n };\n\n/** Manages a guild's scheduled events, cached by event ID. */\nexport class GuildScheduledEventManager extends Manager<\n string,\n APIGuildScheduledEvent\n> {\n readonly #rest: REST;\n public readonly guildId: string;\n\n public constructor(rest: REST, guildId: string) {\n super();\n this.#rest = rest;\n this.guildId = guildId;\n }\n\n #store(event: APIGuildScheduledEvent): APIGuildScheduledEvent {\n this.set(event.id, event);\n return event;\n }\n\n /** Fetches one event. */\n public async fetch(\n eventId: string,\n options: { withUserCount?: boolean } = {},\n ): Promise<APIGuildScheduledEvent> {\n return this.#store(\n await this.#rest.get(\n withQuery(Routes.guildScheduledEvent(this.guildId, eventId), {\n with_user_count: options.withUserCount,\n }),\n ),\n );\n }\n\n /** Fetches every event in the guild. */\n public async fetchAll(\n options: { withUserCount?: boolean } = {},\n ): Promise<APIGuildScheduledEvent[]> {\n const events = await this.#rest.get<APIGuildScheduledEvent[]>(\n withQuery(Routes.guildScheduledEvents(this.guildId), {\n with_user_count: options.withUserCount,\n }),\n );\n return events.map((event) => this.#store(event));\n }\n\n /** Creates an event. */\n public async create(\n options: GuildScheduledEventOptions,\n ): Promise<APIGuildScheduledEvent> {\n const [payload, optionsReason] = splitReason(options);\n return this.#store(\n await this.#rest.post(\n Routes.guildScheduledEvents(this.guildId),\n payload,\n { reason: optionsReason },\n ),\n );\n }\n\n /** Edits an event. */\n public async edit(\n eventId: string,\n options: GuildScheduledEventOptions,\n ): Promise<APIGuildScheduledEvent> {\n const [payload, optionsReason] = splitReason(options);\n return this.#store(\n await this.#rest.patch(\n Routes.guildScheduledEvent(this.guildId, eventId),\n payload,\n { reason: optionsReason },\n ),\n );\n }\n\n /** Deletes an event. @param reason Audit-log reason. */\n public async remove(eventId: string, reason?: string): Promise<void> {\n await this.#rest.delete(\n Routes.guildScheduledEvent(this.guildId, eventId),\n { reason },\n );\n this.delete(eventId);\n }\n\n /** Fetches users subscribed to an event (`limit` 1-100). */\n public async fetchSubscribers(\n eventId: string,\n options: {\n limit?: number;\n withMember?: boolean;\n before?: string;\n after?: string;\n } = {},\n ): Promise<{ guild_scheduled_event_id: string; user: UserData }[]> {\n const limit =\n options.limit === undefined\n ? undefined\n : Math.min(100, Math.max(1, options.limit));\n return this.#rest.get(\n withQuery(Routes.guildScheduledEventUsers(this.guildId, eventId), {\n limit,\n with_member: options.withMember,\n before: options.before,\n after: options.after,\n }),\n );\n }\n}\n\n/** Options for creating a stage instance. */\nexport interface StageInstanceCreateOptions {\n /** Audit-log reason. */\n reason?: string;\n topic: string;\n privacyLevel?: number;\n sendStartNotification?: boolean;\n guildScheduledEventId?: string;\n}\n\n/** Manages stage instances, cached by stage channel ID. */\nexport class StageInstanceManager extends Manager<string, APIStageInstance> {\n readonly #rest: REST;\n\n public constructor(rest: REST) {\n super();\n this.#rest = rest;\n }\n\n #store(stage: APIStageInstance): APIStageInstance {\n this.set(stage.channel_id, stage);\n return stage;\n }\n\n /** Starts a stage instance in a stage channel. */\n public async create(\n channelId: string,\n options: StageInstanceCreateOptions,\n ): Promise<APIStageInstance> {\n return this.#store(\n await this.#rest.post(\n Routes.stageInstances(),\n {\n channel_id: channelId,\n topic: options.topic,\n privacy_level: options.privacyLevel,\n send_start_notification: options.sendStartNotification,\n guild_scheduled_event_id: options.guildScheduledEventId,\n },\n { reason: options.reason },\n ),\n );\n }\n\n /** Fetches the stage instance of a stage channel. */\n public async fetch(channelId: string): Promise<APIStageInstance> {\n return this.#store(\n await this.#rest.get(Routes.stageInstanceByChannel(channelId)),\n );\n }\n\n /** Edits a stage instance's topic or privacy level. */\n public async edit(\n channelId: string,\n options: { topic?: string; privacyLevel?: number; reason?: string },\n ): Promise<APIStageInstance> {\n return this.#store(\n await this.#rest.patch(\n Routes.stageInstanceByChannel(channelId),\n { topic: options.topic, privacy_level: options.privacyLevel },\n { reason: options.reason },\n ),\n );\n }\n\n /** Ends a stage instance. */\n public async remove(channelId: string, reason?: string): Promise<void> {\n await this.#rest.delete(Routes.stageInstanceByChannel(channelId), {\n reason,\n });\n this.delete(channelId);\n }\n}\n\n/** Overwrite target type: 0 = role, 1 = member. */\nexport type PermissionOverwriteTargetType = 0 | 1;\n\n/** Permission values accepted by {@link PermissionOverwriteManager.edit}. */\nexport interface PermissionOverwriteOptions {\n /** Audit-log reason. */\n reason?: string;\n /** Target type: 0 = role, 1 = member. */\n type: PermissionOverwriteTargetType;\n /** Allowed permission bits. */\n allow?: bigint | number | string;\n /** Denied permission bits. */\n deny?: bigint | number | string;\n}\n\n/** Bits to change on one overwrite by {@link PermissionOverwriteManager.update}; bits in none of them keep their state. */\nexport interface PermissionOverwriteUpdate {\n /** Bits to allow. */\n allow?: bigint;\n /** Bits to deny. */\n deny?: bigint;\n /** Bits to reset to inherited (neither allowed nor denied). */\n inherit?: bigint;\n}\n\n/** Manages a channel's permission overwrites. */\nexport class PermissionOverwriteManager {\n readonly #rest: REST;\n readonly #current: () => readonly APIOverwrite[] | undefined;\n public readonly channelId: string;\n\n /** @param current The channel's cached overwrites, read by {@link update}; the channel is fetched when they are unknown. */\n public constructor(\n rest: REST,\n channelId: string,\n current: () => readonly APIOverwrite[] | undefined = () => undefined,\n ) {\n this.#rest = rest;\n this.channelId = channelId;\n this.#current = current;\n }\n\n /**\n * Changes some bits of one overwrite and keeps the rest -- unlike\n * {@link edit}, which replaces the whole overwrite. Creates the overwrite\n * when there is none (then `options.type` is required).\n * @throws {TypeError} When the overwrite does not exist and no type is given.\n */\n public async update(\n overwriteId: string,\n changes: PermissionOverwriteUpdate,\n options: { type?: PermissionOverwriteTargetType; reason?: string } = {},\n ): Promise<void> {\n const overwrites =\n this.#current() ??\n (await this.#rest.get<APIChannel>(Routes.channel(this.channelId)))\n .permission_overwrites ??\n [];\n const existing = overwrites.find((entry) => entry.id === overwriteId);\n const type = existing?.type ?? options.type;\n if (type !== 0 && type !== 1)\n throw new TypeError(\n \"A new permission overwrite needs a type: 0 for a role, 1 for a member.\",\n );\n const touched =\n (changes.allow ?? 0n) |\n (changes.deny ?? 0n) |\n (changes.inherit ?? 0n);\n const allow =\n (BigInt(existing?.allow ?? 0) & ~touched) | (changes.allow ?? 0n);\n const deny =\n (BigInt(existing?.deny ?? 0) & ~touched) | (changes.deny ?? 0n);\n await this.edit(overwriteId, {\n type,\n allow,\n deny,\n reason: options.reason,\n });\n }\n\n /** Creates or replaces the overwrite for a role or member. */\n public async edit(\n overwriteId: string,\n options: PermissionOverwriteOptions,\n ): Promise<void> {\n await this.#rest.put(\n Routes.channelPermission(this.channelId, overwriteId),\n {\n type: options.type,\n allow: BigInt(options.allow ?? 0).toString(),\n deny: BigInt(options.deny ?? 0).toString(),\n },\n { reason: options.reason },\n );\n }\n\n /** Deletes the overwrite for a role or member. */\n public async remove(overwriteId: string, reason?: string): Promise<void> {\n await this.#rest.delete(\n Routes.channelPermission(this.channelId, overwriteId),\n { reason },\n );\n }\n}\n",
|
|
14
|
+
"import { Manager, ResourceManager, splitReason } from \"./base.js\";\nimport { EmojiManager } from \"./emoji.js\";\nimport { GuildSoundboardManager, GuildStickerManager } from \"./advanced.js\";\nimport { GuildMemberManager } from \"./member.js\";\nimport { RoleManager } from \"./role.js\";\nimport {\n GuildBanManager,\n GuildScheduledEventManager,\n} from \"./guild-resources.js\";\nimport {\n AuditLog,\n Guild,\n AutoModerationRule,\n type ResourceContext,\n} from \"@lunibee/structures\";\nimport { type REST, Routes } from \"@lunibee/rest\";\nimport {\n type APIAuditLog,\n type APIChannel,\n type APIGuildPreview,\n type APIInvite,\n type APIWebhook,\n type APIAutoModerationRule,\n type APIInviteCreate,\n type APIVoiceState,\n type APIPresenceUpdate,\n type APIWelcomeScreen,\n type APIWelcomeScreenChannel,\n type APIGuildOnboarding,\n type APIOnboardingPrompt,\n} from \"@lunibee/types\";\n\ntype GuildData = ConstructorParameters<typeof Guild>[0];\n\n/** Appends encoded query parameters to a `Routes`-generated path so query building\n * stays centralized and URL-encoded rather than hand-concatenated at each call site.\n * @param path Base path from a `Routes.*` helper. @param params Query parameters (empty → path unchanged). */\nfunction withQuery(path: string, params: URLSearchParams): string {\n const suffix = params.toString();\n return suffix ? `${path}?${suffix}` : path;\n}\n\nexport interface GuildCreateOptions extends Record<string, unknown> {\n name: string;\n}\nexport interface GuildEditOptions extends Record<string, unknown> {\n /** Audit-log reason. */\n reason?: string;\n}\n\nexport class GuildManager extends ResourceManager<string, Guild> {\n readonly #rest: REST;\n readonly #bans = new Map<string, GuildBanManager>();\n readonly #scheduledEvents = new Map<string, GuildScheduledEventManager>();\n readonly #members = new Map<string, GuildMemberManager>();\n readonly #roles = new Map<string, RoleManager>();\n readonly #emojis = new Map<string, EmojiManager>();\n readonly #stickers = new Map<string, GuildStickerManager>();\n readonly #soundboard = new Map<string, GuildSoundboardManager>();\n readonly #voiceStates = new Map<string, Manager<string, APIVoiceState>>();\n readonly #autoModerationRules = new Map<\n string,\n Manager<string, APIAutoModerationRule>\n >();\n readonly #presences = new Map<string, Manager<string, APIPresenceUpdate>>();\n readonly #invites = new Map<string, Manager<string, APIInviteCreate>>();\n #context?: ResourceContext;\n\n /** Lets members from this manager act through a client (`member.kick()`...). Called by the client. */\n public attachContext(context: ResourceContext): void {\n this.#context = context;\n }\n\n /** Returns the per-guild entry of `map`, creating it on first use. */\n #perGuild<M>(map: Map<string, M>, guildId: string, create: () => M): M {\n let manager = map.get(guildId);\n if (!manager) map.set(guildId, (manager = create()));\n return manager;\n }\n readonly #maxMembers?: number;\n public constructor(rest: REST, options: { maxMembers?: number } = {}) {\n super(\n async (id) =>\n new Guild(await rest.get<GuildData>(Routes.guild(id))),\n (guild) => guild.id,\n );\n this.#rest = rest;\n this.#maxMembers = options.maxMembers;\n }\n\n /** Ban manager for a guild (one instance per guild). */\n public bans(guildId: string): GuildBanManager {\n let manager = this.#bans.get(guildId);\n if (!manager)\n this.#bans.set(\n guildId,\n (manager = new GuildBanManager(this.#rest, guildId)),\n );\n return manager;\n }\n\n /** Scheduled-event manager for a guild (one instance per guild). */\n public scheduledEvents(guildId: string): GuildScheduledEventManager {\n let manager = this.#scheduledEvents.get(guildId);\n if (!manager)\n this.#scheduledEvents.set(\n guildId,\n (manager = new GuildScheduledEventManager(this.#rest, guildId)),\n );\n return manager;\n }\n\n /** Member manager for a guild (one instance per guild, kept in sync by the Gateway). */\n public members(guildId: string): GuildMemberManager {\n let manager = this.#members.get(guildId);\n if (!manager)\n this.#members.set(\n guildId,\n (manager = new GuildMemberManager(\n guildId,\n this.#rest,\n () => this.#context,\n this.#maxMembers,\n )),\n );\n return manager;\n }\n\n /** Role manager for a guild (one instance per guild, kept in sync by the Gateway). */\n public roles(guildId: string): RoleManager {\n let manager = this.#roles.get(guildId);\n if (!manager)\n this.#roles.set(\n guildId,\n (manager = new RoleManager(guildId, this.#rest)),\n );\n return manager;\n }\n\n /** Emoji manager for a guild (one instance per guild, kept in sync by the Gateway). */\n public emojis(guildId: string): EmojiManager {\n let manager = this.#emojis.get(guildId);\n if (!manager)\n this.#emojis.set(\n guildId,\n (manager = new EmojiManager(this.#rest, guildId)),\n );\n return manager;\n }\n\n /** Sticker manager for a guild (one instance per guild, kept in sync by the Gateway). */\n public stickers(guildId: string): GuildStickerManager {\n let manager = this.#stickers.get(guildId);\n if (!manager)\n this.#stickers.set(\n guildId,\n (manager = new GuildStickerManager(this.#rest, guildId)),\n );\n return manager;\n }\n\n /** Soundboard manager for a guild (one instance per guild, kept in sync by the Gateway). */\n public soundboard(guildId: string): GuildSoundboardManager {\n let manager = this.#soundboard.get(guildId);\n if (!manager)\n this.#soundboard.set(\n guildId,\n (manager = new GuildSoundboardManager(this.#rest, guildId)),\n );\n return manager;\n }\n\n /** Voice states by user ID for a guild, kept in sync by `GUILD_CREATE` and `VOICE_STATE_UPDATE`. */\n public voiceStates(guildId: string): Manager<string, APIVoiceState> {\n return this.#perGuild(this.#voiceStates, guildId, () => new Manager());\n }\n\n /** Latest presence by user ID for a guild; filled only when `cache.presences` is on. */\n public presences(guildId: string): Manager<string, APIPresenceUpdate> {\n return this.#perGuild(this.#presences, guildId, () => new Manager());\n }\n\n /** Auto-moderation rules by ID for a guild, kept in sync by `AUTO_MODERATION_RULE_*` events. */\n public autoModerationRules(\n guildId: string,\n ): Manager<string, APIAutoModerationRule> {\n return this.#perGuild(\n this.#autoModerationRules,\n guildId,\n () => new Manager(),\n );\n }\n\n /** Invites by code for a guild, kept in sync by `INVITE_CREATE` / `INVITE_DELETE`. */\n public invites(guildId: string): Manager<string, APIInviteCreate> {\n return this.#perGuild(this.#invites, guildId, () => new Manager());\n }\n\n /** Merges a guild payload into the cached instance, keeping object identity. */\n public patch(data: GuildData): Guild {\n const guild = new Guild(data);\n const existing = this.get(guild.id);\n if (!existing) return this.upsert(guild);\n // Partial payloads (e.g. GUILD_UPDATE has no member_count) leave\n // optional fields undefined; those must not erase known values.\n // A key loop: Object.entries allocates a pair per field, on every update.\n const from = guild as unknown as Record<string, unknown>;\n const into = existing as unknown as Record<string, unknown>;\n for (const key of Object.keys(from)) {\n const value = from[key];\n if (value !== undefined) into[key] = value;\n }\n // Marks a fetch in flight as stale, so it cannot undo this update.\n this.set(existing.id, existing);\n return existing;\n }\n\n /** Removes a guild and every per-guild manager that belongs to it. */\n public override delete(id: string): boolean {\n this.#bans.delete(id);\n this.#scheduledEvents.delete(id);\n this.#members.delete(id);\n this.#roles.delete(id);\n this.#emojis.delete(id);\n this.#stickers.delete(id);\n this.#soundboard.delete(id);\n this.#voiceStates.delete(id);\n this.#presences.delete(id);\n this.#autoModerationRules.delete(id);\n this.#invites.delete(id);\n return super.delete(id);\n }\n\n /** Creates a new guild. (Bot must be in fewer than 10 guilds). */\n public async create(options: GuildCreateOptions): Promise<Guild> {\n const data = await this.#rest.post<GuildData>(\"/guilds\", options);\n return this.upsert(new Guild(data));\n }\n\n /** Modifies a guild's settings. */\n public async edit(id: string, options: GuildEditOptions): Promise<Guild> {\n const [payload, reason] = splitReason(options);\n const data = await this.#rest.patch<GuildData>(\n Routes.guild(id),\n payload,\n { reason },\n );\n return this.upsert(new Guild(data));\n }\n\n /** Deletes a guild permanently. The bot must own it. */\n public async remove(id: string): Promise<void> {\n await this.#rest.delete(Routes.guild(id));\n }\n\n /** Fetches a guild's preview (even if the bot is not in the guild). */\n public async fetchPreview(id: string): Promise<APIGuildPreview> {\n return this.#rest.get<APIGuildPreview>(Routes.guildPreview(id));\n }\n\n /** Fetches the welcome screen of a community guild. */\n public async fetchWelcomeScreen(id: string): Promise<APIWelcomeScreen> {\n return this.#rest.get<APIWelcomeScreen>(Routes.guildWelcomeScreen(id));\n }\n\n /** Edits the welcome screen (needs Manage Guild and the Community feature). */\n public async editWelcomeScreen(\n id: string,\n options: {\n enabled?: boolean;\n description?: string | null;\n welcomeChannels?: APIWelcomeScreenChannel[] | null;\n reason?: string;\n },\n ): Promise<APIWelcomeScreen> {\n const { reason, welcomeChannels, ...rest } = options;\n return this.#rest.patch<APIWelcomeScreen>(\n Routes.guildWelcomeScreen(id),\n { ...rest, welcome_channels: welcomeChannels },\n { reason },\n );\n }\n\n /** Fetches a guild's onboarding: prompts, default channels and mode. */\n public async fetchOnboarding(id: string): Promise<APIGuildOnboarding> {\n return this.#rest.get<APIGuildOnboarding>(Routes.guildOnboarding(id));\n }\n\n /** Replaces parts of a guild's onboarding (needs Manage Guild and Manage Roles). */\n public async editOnboarding(\n id: string,\n options: {\n prompts?: APIOnboardingPrompt[];\n defaultChannelIds?: string[];\n enabled?: boolean;\n mode?: number;\n reason?: string;\n },\n ): Promise<APIGuildOnboarding> {\n const { reason, defaultChannelIds, ...rest } = options;\n return this.#rest.put<APIGuildOnboarding>(\n Routes.guildOnboarding(id),\n { ...rest, default_channel_ids: defaultChannelIds },\n { reason },\n );\n }\n\n /**\n * Edits a voice state in a stage channel: unsuppress the bot to speak, or\n * move a speaker back to the audience. `userId` may be `\"@me\"`.\n */\n public async editVoiceState(\n id: string,\n userId: string,\n options: {\n channelId: string;\n suppress?: boolean;\n requestToSpeakTimestamp?: string | null;\n },\n ): Promise<void> {\n await this.#rest.patch(Routes.guildVoiceState(id, userId), {\n channel_id: options.channelId,\n suppress: options.suppress,\n request_to_speak_timestamp: options.requestToSpeakTimestamp,\n });\n }\n\n /** Removes an integration (and the bot or role it created) from a guild. */\n public async removeIntegration(\n id: string,\n integrationId: string,\n reason?: string,\n ): Promise<void> {\n await this.#rest.delete(Routes.guildIntegration(id, integrationId), {\n reason,\n });\n }\n\n /** Fetches all active threads in the guild. */\n public async fetchActiveThreads(\n id: string,\n ): Promise<{ threads: APIChannel[]; members: unknown[] }> {\n return this.#rest.get<{ threads: APIChannel[]; members: unknown[] }>(\n Routes.guildActiveThreads(id),\n );\n }\n\n /** Fetches all webhooks in the guild. */\n public async fetchWebhooks(id: string): Promise<APIWebhook[]> {\n return this.#rest.get<APIWebhook[]>(Routes.guildWebhooks(id));\n }\n\n /** Fetches all invites in the guild. */\n public async fetchInvites(id: string): Promise<APIInvite[]> {\n return this.#rest.get<APIInvite[]>(Routes.guildInvites(id));\n }\n\n /**\n * Fetches audit log entries for a guild.\n * @param guildId Guild identifier.\n * @param options Filter options: userId (filter by actor), actionType (AuditLogEvent number), before (entry ID cursor), limit (1–100, default 50).\n * @returns Typed audit log response with `audit_log_entries` and related resources.\n */\n public async fetchAuditLog(\n guildId: string,\n options: {\n userId?: string;\n actionType?: number;\n before?: string;\n after?: string;\n limit?: number;\n } = {},\n ): Promise<AuditLogResponse> {\n const params = new URLSearchParams();\n if (options.userId) params.set(\"user_id\", options.userId);\n if (options.actionType !== undefined)\n params.set(\"action_type\", String(options.actionType));\n if (options.before) params.set(\"before\", options.before);\n if (options.after) params.set(\"after\", options.after);\n if (options.limit !== undefined)\n params.set(\n \"limit\",\n String(Math.min(100, Math.max(1, options.limit))),\n );\n return this.#rest.get<AuditLogResponse>(\n withQuery(Routes.guildAuditLog(guildId), params),\n );\n }\n\n /**\n * Fetches the audit log as an {@link AuditLog}: typed `info` per action\n * type, and `find()` / `filter()` by type, target, user and time.\n * @example const kick = (await guilds.fetchAuditLogEntries(id, { actionType: AuditLogEvent.MemberKick })).find({ targetId: userId, since: Date.now() - 60_000 });\n */\n public async fetchAuditLogEntries(\n guildId: string,\n options: Parameters<GuildManager[\"fetchAuditLog\"]>[1] = {},\n ): Promise<AuditLog> {\n return new AuditLog(\n (await this.fetchAuditLog(\n guildId,\n options,\n )) as unknown as APIAuditLog,\n );\n }\n\n /**\n * Fetches members from a guild (paginated).\n * @param guildId Guild identifier.\n * @param options Fetch options: limit (1–1000, default 100), after (member ID cursor).\n * @returns Array of raw member data payloads.\n */\n public async fetchMembers(\n guildId: string,\n options: { limit?: number; after?: string } = {},\n ): Promise<Record<string, unknown>[]> {\n const params = new URLSearchParams();\n if (options.limit !== undefined)\n params.set(\n \"limit\",\n String(Math.min(1000, Math.max(1, options.limit))),\n );\n if (options.after) params.set(\"after\", options.after);\n return this.#rest.get<Record<string, unknown>[]>(\n withQuery(Routes.guildMembers(guildId), params),\n );\n }\n\n /** Fetches a list of all auto moderation rules currently configured for guild. */\n public async fetchAutoModerationRules(\n guildId: string,\n ): Promise<AutoModerationRule[]> {\n const rules = await this.#rest.get<APIAutoModerationRule[]>(\n Routes.guildAutoModerationRules(guildId),\n );\n return rules.map((r) => new AutoModerationRule(r));\n }\n\n /** Fetches a single auto moderation rule. */\n public async fetchAutoModerationRule(\n guildId: string,\n ruleId: string,\n ): Promise<AutoModerationRule> {\n const rule = await this.#rest.get<APIAutoModerationRule>(\n Routes.guildAutoModerationRule(guildId, ruleId),\n );\n return new AutoModerationRule(rule);\n }\n\n /** Creates a new auto moderation rule. */\n public async createAutoModerationRule(\n guildId: string,\n options: Record<string, unknown> & { reason?: string },\n ): Promise<AutoModerationRule> {\n const [payload, reason] = splitReason(options);\n const rule = await this.#rest.post<APIAutoModerationRule>(\n Routes.guildAutoModerationRules(guildId),\n payload,\n { reason },\n );\n return new AutoModerationRule(rule);\n }\n\n /** Modifies an existing auto moderation rule. */\n public async editAutoModerationRule(\n guildId: string,\n ruleId: string,\n options: Record<string, unknown> & { reason?: string },\n ): Promise<AutoModerationRule> {\n const [payload, reason] = splitReason(options);\n const rule = await this.#rest.patch<APIAutoModerationRule>(\n Routes.guildAutoModerationRule(guildId, ruleId),\n payload,\n { reason },\n );\n return new AutoModerationRule(rule);\n }\n\n /** Deletes an auto moderation rule. @param reason Audit-log reason. */\n public async deleteAutoModerationRule(\n guildId: string,\n ruleId: string,\n reason?: string,\n ): Promise<void> {\n await this.#rest.delete(\n Routes.guildAutoModerationRule(guildId, ruleId),\n { reason },\n );\n }\n}\n\n// ─── Audit Log Types ──────────────────────────────────────────────────────────\n\n/** A single audit log entry as returned by the Discord API. */\nexport interface AuditLogEntry {\n id: string;\n action_type: number;\n user_id: string | null;\n target_id: string | null;\n reason?: string;\n changes?: Array<{ key: string; old_value?: unknown; new_value?: unknown }>;\n options?: Record<string, unknown>;\n}\n\n/** Discord API audit log response payload. */\nexport interface AuditLogResponse {\n audit_log_entries: AuditLogEntry[];\n users: Record<string, unknown>[];\n integrations: Record<string, unknown>[];\n webhooks: Record<string, unknown>[];\n guild_scheduled_events: Record<string, unknown>[];\n threads: Record<string, unknown>[];\n application_commands: Record<string, unknown>[];\n}\n\n/** Known Discord audit log event type numbers. */\nexport const AuditLogEvent = {\n GuildUpdate: 1,\n ChannelCreate: 10,\n ChannelUpdate: 11,\n ChannelDelete: 12,\n ChannelOverwriteCreate: 13,\n ChannelOverwriteUpdate: 14,\n ChannelOverwriteDelete: 15,\n MemberKick: 20,\n MemberPrune: 21,\n MemberBanAdd: 22,\n MemberBanRemove: 23,\n MemberUpdate: 24,\n MemberRoleUpdate: 25,\n MemberMove: 26,\n MemberDisconnect: 27,\n BotAdd: 28,\n RoleCreate: 30,\n RoleUpdate: 31,\n RoleDelete: 32,\n InviteCreate: 40,\n InviteUpdate: 41,\n InviteDelete: 42,\n WebhookCreate: 50,\n WebhookUpdate: 51,\n WebhookDelete: 52,\n EmojiCreate: 60,\n EmojiUpdate: 61,\n EmojiDelete: 62,\n MessageDelete: 72,\n MessageBulkDelete: 73,\n MessagePin: 74,\n MessageUnpin: 75,\n IntegrationCreate: 80,\n IntegrationUpdate: 81,\n IntegrationDelete: 82,\n StageInstanceCreate: 83,\n StageInstanceUpdate: 84,\n StageInstanceDelete: 85,\n StickerCreate: 90,\n StickerUpdate: 91,\n StickerDelete: 92,\n ScheduledEventCreate: 100,\n ScheduledEventUpdate: 101,\n ScheduledEventDelete: 102,\n ThreadCreate: 110,\n ThreadUpdate: 111,\n ThreadDelete: 112,\n AutoModerationRuleCreate: 140,\n AutoModerationRuleUpdate: 141,\n AutoModerationRuleDelete: 142,\n AutoModerationBlockMessage: 143,\n} as const;\n",
|
|
15
|
+
"import { REST, Routes } from \"@lunibee/rest\";\nimport type {\n APIApplicationCommand,\n ApplicationCommandData,\n} from \"@lunibee/types\";\n\n/** Command data, or a builder such as `CreateSlashCommand` (its `toJSON()` is sent). */\nexport type ApplicationCommandInput =\n ApplicationCommandData | { toJSON(): Record<string, unknown> };\n\n/** The payload for one command input. */\nfunction commandPayload(\n command: ApplicationCommandInput | Partial<ApplicationCommandData>,\n): unknown {\n return \"toJSON\" in command && typeof command.toJSON === \"function\"\n ? command.toJSON()\n : command;\n}\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(\n data: ApplicationCommandInput,\n ): Promise<APIApplicationCommand> {\n return this.#rest.post<APIApplicationCommand>(\n Routes.applicationCommands(this.#applicationId),\n commandPayload(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: readonly ApplicationCommandInput[],\n ): Promise<APIApplicationCommand[]> {\n return this.#rest.put<APIApplicationCommand[]>(\n Routes.applicationCommands(this.#applicationId),\n commands.map(commandPayload),\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> | ApplicationCommandInput,\n ): Promise<APIApplicationCommand> {\n return this.#rest.patch<APIApplicationCommand>(\n Routes.applicationCommand(this.#applicationId, commandId),\n commandPayload(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: ApplicationCommandInput,\n ): Promise<APIApplicationCommand> {\n return this.#rest.post<APIApplicationCommand>(\n Routes.guildApplicationCommands(this.#applicationId, guildId),\n commandPayload(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: readonly ApplicationCommandInput[],\n ): Promise<APIApplicationCommand[]> {\n return this.#rest.put<APIApplicationCommand[]>(\n Routes.guildApplicationCommands(this.#applicationId, guildId),\n commands.map(commandPayload),\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> | ApplicationCommandInput,\n ): Promise<APIApplicationCommand> {\n return this.#rest.patch<APIApplicationCommand>(\n Routes.guildApplicationCommand(\n this.#applicationId,\n guildId,\n commandId,\n ),\n commandPayload(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(\n guildId: string,\n commandId: string,\n ): Promise<void> {\n await this.#rest.delete(\n Routes.guildApplicationCommand(\n this.#applicationId,\n guildId,\n commandId,\n ),\n );\n }\n}\n",
|
|
16
|
+
"import { Manager, assignFields, splitReason } from \"./base.js\";\nexport { Manager, ResourceManager } from \"./base.js\";\nimport { REST, Routes } from \"@lunibee/rest\";\nimport type {\n AllowedMentions,\n APIForumTag,\n ForumTagInput,\n MessageCreateOptions,\n MessageEditOptions,\n} from \"@lunibee/types\";\nimport {\n Channel,\n createChannel,\n Message,\n User,\n type ResourceContext,\n} from \"@lunibee/structures\";\nimport {\n MessageManager,\n toRequest,\n type MessageCacheOptions,\n} from \"./message.js\";\nimport { ThreadManager } from \"./thread.js\";\n\nexport { UserManager } from \"./user.js\";\nexport { GuildManager } from \"./guild.js\";\nexport type { AuditLogEntry, AuditLogResponse } from \"./guild.js\";\nexport { AuditLogEvent } from \"./guild.js\";\n\nexport type { MessageCreateOptions, MessageEditOptions } from \"./message.js\";\n/** Discord only bulk-deletes messages younger than two weeks. */\nconst BULK_DELETE_MAX_AGE_MS = 14 * 24 * 60 * 60_000;\n/** Creation time (ms) encoded in a snowflake. */\nfunction snowflakeTime(id: string): number {\n return Number((BigInt(id) >> 22n) + 1_420_070_400_000n);\n}\n/** Options for fetching one message; `cache: false` skips storing it. */\nexport interface MessageFetchOptions {\n cache?: boolean;\n}\n/** Pagination for fetching a channel's messages: `before`, `after` or `around` an ID, and a `limit`. */\nexport interface MessageQueryOptions {\n before?: string;\n after?: string;\n around?: string;\n limit?: number;\n}\n/** Options for starting a thread from a message. */\nexport interface MessageThreadOptions {\n name: string;\n autoArchiveDuration?: 60 | 1440 | 4320 | 10080;\n rateLimitPerUser?: number;\n}\n/** Pagination for listing the users who reacted with an emoji. */\nexport interface ReactionFetchOptions {\n limit?: number;\n after?: string;\n}\n\nexport interface ChannelCreateOptions extends Record<string, unknown> {\n /** Audit-log reason. */\n reason?: string;\n name: string;\n type: number;\n guild_id?: string;\n parent_id?: string | null;\n}\nexport type ChannelEditOptions = Record<string, unknown> & {\n /** Audit-log reason. */\n reason?: string;\n};\n\nimport { PermissionOverwriteManager } from \"./guild-resources.js\";\n\nexport class ChannelManager extends Manager<string, Channel> {\n readonly #rest: REST;\n readonly #context: ResourceContext;\n readonly #messageManagers = new Map<string, MessageManager>();\n readonly #messageCache?: MessageCacheOptions;\n readonly #allowedMentions?: AllowedMentions;\n /**\n * @param options.messageCache Enables a bounded per-channel message cache; messages are not cached by default.\n * @param options.allowedMentions Default `allowed_mentions` for sends and edits without their own.\n */\n public constructor(\n rest: REST,\n options: {\n messageCache?: MessageCacheOptions;\n allowedMentions?: AllowedMentions;\n } = {},\n ) {\n super();\n this.#rest = rest;\n this.#messageCache = options.messageCache;\n this.#allowedMentions = options.allowedMentions;\n this.#context = {\n sendMessage: (channelId, options) => this.send(channelId, options),\n editMessage: (channelId, messageId, options) =>\n this.editMessage(channelId, messageId, options),\n deleteMessage: (channelId, messageId, reason) =>\n this.deleteMessage(channelId, messageId, reason),\n crosspostMessage: (channelId, messageId) =>\n this.crosspostMessage(channelId, messageId),\n editChannel: (channelId, options) => this.edit(channelId, options),\n deleteChannel: (channelId, reason) =>\n this.remove(channelId, reason),\n addReaction: (channelId, messageId, emoji) =>\n this.addReaction(channelId, messageId, emoji),\n removeOwnReaction: (channelId, messageId, emoji) =>\n this.removeOwnReaction(channelId, messageId, emoji),\n removeReaction: (channelId, messageId, emoji, userId) =>\n this.removeReaction(channelId, messageId, emoji, userId),\n removeAllReactions: (channelId, messageId) =>\n this.removeAllReactions(channelId, messageId),\n pinMessage: (channelId, messageId, reason) =>\n this.pinMessage(channelId, messageId, reason),\n unpinMessage: (channelId, messageId, reason) =>\n this.unpinMessage(channelId, messageId, reason),\n };\n }\n public messages(channelId: string): MessageManager {\n let manager = this.#messageManagers.get(channelId);\n if (!manager) {\n manager = new MessageManager(\n this.#rest,\n this.#context,\n channelId,\n this.#messageCache,\n this.#allowedMentions,\n );\n this.#messageManagers.set(channelId, manager);\n }\n return manager;\n }\n /** Permission overwrite manager for a channel. */\n public permissionOverwrites(channelId: string): PermissionOverwriteManager {\n return new PermissionOverwriteManager(\n this.#rest,\n channelId,\n // A partial channel's overwrites are unknown, not empty: fetch.\n () => {\n const channel = this.get(channelId);\n return channel && !channel.partial\n ? channel.permissionOverwrites\n : undefined;\n },\n );\n }\n public threads(channelId: string): ThreadManager {\n return new ThreadManager(\n this.#rest,\n this.#context,\n channelId,\n this.#allowedMentions,\n );\n }\n /** Fetches a channel; concurrent fetches share a request and a stale result never overwrites newer state. */\n public fetch(channelId: string): Promise<Channel> {\n return this.fetchOnce(\n channelId,\n async () =>\n createChannel(\n await this.#rest.get<\n ConstructorParameters<typeof Channel>[0]\n >(Routes.channel(channelId)),\n this.#context,\n ),\n (channel) => this.#merge(channel),\n );\n }\n public async resolve(channelId: string): Promise<Channel> {\n return this.get(channelId) ?? this.fetch(channelId);\n }\n public upsert(data: ConstructorParameters<typeof Channel>[0]): Channel {\n return this.#merge(createChannel(data, this.#context));\n }\n /** Merges into the cached instance; a type change (e.g. text -> announcement) needs the new subclass. */\n #merge(channel: Channel): Channel {\n const existing = this.get(channel.id);\n if (existing && existing.type === channel.type) {\n assignFields(existing, channel);\n // Marks a fetch in flight as stale, so it cannot undo this update.\n this.set(existing.id, existing);\n return existing;\n }\n this.set(channel.id, channel);\n return channel;\n }\n public update(channel: Channel): this {\n return this.set(channel.id, channel);\n }\n /** Removes every cached channel that belongs to a guild. @returns Number removed. */\n public deleteGuildChannels(guildId: string): number {\n // Walks the cache once without copying it into an array first.\n const ids: string[] = [];\n this.cache.forEach((channel, id) => {\n if (channel.guildId === guildId) ids.push(id);\n });\n let removed = 0;\n for (const id of ids) if (this.delete(id)) removed++;\n return removed;\n }\n /** Ends a poll now; returns the updated message. */\n public async endPoll(\n channelId: string,\n messageId: string,\n ): Promise<Message> {\n return this.messages(channelId).upsert(\n await this.#rest.post<ConstructorParameters<typeof Message>[0]>(\n Routes.pollExpire(channelId, messageId),\n ),\n );\n }\n /** Fetches users who voted for one poll answer. @param options.limit 1-100 (default 25). */\n public async fetchPollVoters(\n channelId: string,\n messageId: string,\n answerId: number,\n options: { after?: string; limit?: number } = {},\n ): Promise<User[]> {\n if (\n options.limit !== undefined &&\n (!Number.isInteger(options.limit) ||\n options.limit < 1 ||\n options.limit > 100)\n )\n throw new RangeError(\"Poll voter limit must be 1-100.\");\n const params = new URLSearchParams();\n if (options.after) params.set(\"after\", options.after);\n if (options.limit !== undefined)\n params.set(\"limit\", String(options.limit));\n const suffix = params.toString();\n const { users } = await this.#rest.get<{\n users: ConstructorParameters<typeof User>[0][];\n }>(\n `${Routes.pollAnswerVoters(channelId, messageId, answerId)}${suffix ? `?${suffix}` : \"\"}`,\n );\n return users.map((user) => new User(user));\n }\n /** Plays a soundboard sound in a voice channel the bot is connected to. */\n public async sendSoundboardSound(\n channelId: string,\n options: { soundId: string; sourceGuildId?: string },\n ): Promise<void> {\n await this.#rest.post(Routes.sendSoundboardSound(channelId), {\n sound_id: options.soundId,\n source_guild_id: options.sourceGuildId,\n });\n }\n /** Returns the message manager for a channel only if one already exists. */\n public cachedMessages(channelId: string): MessageManager | undefined {\n return this.#messageManagers.get(channelId);\n }\n public async create(\n guildId: string,\n options: ChannelCreateOptions,\n ): Promise<Channel> {\n const [payload, reason] = splitReason(options);\n return this.upsert(\n await this.#rest.post<ConstructorParameters<typeof Channel>[0]>(\n Routes.guildChannels(guildId),\n payload,\n { reason },\n ),\n );\n }\n public async edit(\n channelId: string,\n options: ChannelEditOptions,\n ): Promise<Channel> {\n const [payload, reason] = splitReason(options);\n return this.upsert(\n await this.#rest.patch<ConstructorParameters<typeof Channel>[0]>(\n Routes.channel(channelId),\n payload,\n { reason },\n ),\n );\n }\n\n /** Deletes a channel (or closes a DM). @param reason Audit-log reason. */\n public async remove(channelId: string, reason?: string): Promise<void> {\n await this.#rest.delete(Routes.channel(channelId), { reason });\n this.delete(channelId);\n }\n /** Evicts a channel, dropping its per-channel message manager with it.\n * Overrides {@link Manager.delete} so cache eviction driven by a Gateway\n * `CHANNEL_DELETE`/`THREAD_DELETE` — which calls `delete` rather than\n * {@link remove} — releases the message manager and its cached\n * messages too, instead of retaining them for the client's lifetime. */\n public override delete(channelId: string): boolean {\n this.#messageManagers.delete(channelId);\n return super.delete(channelId);\n }\n public send(\n channelId: string,\n options: MessageCreateOptions,\n ): Promise<Message> {\n return this.messages(channelId).send(options);\n }\n public async fetchMessage(\n channelId: string,\n messageId: string,\n options: MessageFetchOptions = {},\n ): Promise<Message> {\n void options;\n return this.messages(channelId).fetch(messageId);\n }\n public fetchMessages(\n channelId: string,\n query: MessageQueryOptions | Iterable<string>,\n ): Promise<Message[]> {\n if (isMessageQuery(query)) {\n const params = new URLSearchParams();\n if (query.before) params.set(\"before\", query.before);\n if (query.after) params.set(\"after\", query.after);\n if (query.around) params.set(\"around\", query.around);\n if (query.limit !== undefined)\n params.set(\"limit\", String(query.limit));\n const suffix = params.toString();\n return this.#rest\n .get<ConstructorParameters<typeof Message>[0][]>(\n `${Routes.channelMessages(channelId)}${suffix ? `?${suffix}` : \"\"}`,\n )\n .then((data) =>\n data.map((item) => this.messages(channelId).upsert(item)),\n );\n }\n return this.messages(channelId).fetchMany(query);\n }\n public upsertMessage(\n data: ConstructorParameters<typeof Message>[0],\n ): Message {\n return this.messages(data.channel_id).upsert(data);\n }\n public async editMessage(\n channelId: string,\n messageId: string,\n options: MessageEditOptions,\n ): Promise<Message> {\n const { body, files } = toRequest(options, this.#allowedMentions);\n return this.messages(channelId).upsert(\n await this.#rest.patch<ConstructorParameters<typeof Message>[0]>(\n Routes.message(channelId, messageId),\n body,\n { files },\n ),\n );\n }\n /** Deletes a message. @param reason Audit-log reason (shown when deleting someone else's message). */\n public async deleteMessage(\n channelId: string,\n messageId: string,\n reason?: string,\n ): Promise<void> {\n await this.#rest.delete(Routes.message(channelId, messageId), {\n reason,\n });\n this.messages(channelId).delete(messageId);\n }\n public deleteCachedMessage(channelId: string, messageId: string): boolean {\n return this.messages(channelId).delete(messageId);\n }\n public async crosspostMessage(\n channelId: string,\n messageId: string,\n ): Promise<Message> {\n return this.messages(channelId).upsert(\n await this.#rest.post<ConstructorParameters<typeof Message>[0]>(\n Routes.crosspostMessage(channelId, messageId),\n ),\n );\n }\n /** Bulk-deletes messages in a channel. Duplicate IDs are ignored and a\n * single ID falls back to a normal delete.\n * @throws {RangeError} If no IDs or more than 100 are provided, or any\n * message is older than 14 days (Discord refuses to bulk-delete those). */\n public async bulkDeleteMessages(\n channelId: string,\n messageIds: Iterable<string>,\n reason?: string,\n ): Promise<void> {\n const ids = [...new Set(messageIds)];\n if (ids.length < 1 || ids.length > 100)\n throw new RangeError(\n \"bulkDelete requires between 1 and 100 message IDs.\",\n );\n if (ids.length === 1)\n return this.deleteMessage(channelId, ids[0]!, reason);\n const cutoff = Date.now() - BULK_DELETE_MAX_AGE_MS;\n const tooOld = ids.filter((id) => snowflakeTime(id) < cutoff);\n if (tooOld.length)\n throw new RangeError(\n `bulkDelete cannot delete messages older than 14 days: ${tooOld.join(\", \")}`,\n );\n await this.#rest.post(\n Routes.channelBulkDelete(channelId),\n { messages: ids },\n { reason },\n );\n for (const id of ids) this.messages(channelId).delete(id);\n }\n /**\n * Iterates a channel's history newest-first, 100 messages per request,\n * starting before `before` (or the latest message) and stopping after\n * `limit` messages or at the start of the channel.\n */\n public async *iterateMessages(\n channelId: string,\n options: { before?: string; limit?: number } = {},\n ): AsyncGenerator<Message, void, undefined> {\n let before = options.before;\n let remaining = options.limit ?? Infinity;\n while (remaining > 0) {\n const page = await this.fetchMessages(channelId, {\n before,\n limit: Math.min(100, remaining),\n });\n for (const message of page) yield message;\n remaining -= page.length;\n if (page.length < 100) return;\n before = page.at(-1)!.id;\n }\n }\n public async addReaction(\n channelId: string,\n messageId: string,\n emoji: string,\n ): Promise<void> {\n // Discord's create-reaction endpoint is\n // PUT .../reactions/{emoji}/@me — the bare .../reactions/{emoji} path\n // is not a valid target for PUT.\n await this.#rest.put(\n Routes.messageReactionMe(channelId, messageId, emoji),\n );\n }\n public async fetchReactions(\n channelId: string,\n messageId: string,\n emoji: string,\n options: ReactionFetchOptions = {},\n ): Promise<User[]> {\n const params = new URLSearchParams();\n if (options.limit !== undefined)\n params.set(\"limit\", String(options.limit));\n if (options.after) params.set(\"after\", options.after);\n const suffix = params.toString();\n const data = await this.#rest.get<\n ConstructorParameters<typeof User>[0][]\n >(\n `${Routes.messageReactions(channelId, messageId, emoji)}${suffix ? `?${suffix}` : \"\"}`,\n );\n return data.map((user) => new User(user));\n }\n public async removeOwnReaction(\n channelId: string,\n messageId: string,\n emoji: string,\n ): Promise<void> {\n await this.#rest.delete(\n Routes.messageReactionMe(channelId, messageId, emoji),\n );\n }\n public async removeReaction(\n channelId: string,\n messageId: string,\n emoji: string,\n userId: string,\n ): Promise<void> {\n await this.#rest.delete(\n Routes.messageReactionUser(channelId, messageId, emoji, userId),\n );\n }\n public async removeAllReactions(\n channelId: string,\n messageId: string,\n ): Promise<void> {\n await this.#rest.delete(\n Routes.messageReactionsAll(channelId, messageId),\n );\n }\n /** Fetches the newest pinned messages (one page, up to 50, like the endpoint it replaces). */\n public async fetchPinnedMessages(channelId: string): Promise<Message[]> {\n const data = await this.#rest.get<{\n items: { message: ConstructorParameters<typeof Message>[0] }[];\n }>(Routes.channelMessagesPins(channelId));\n return data.items.map((item) =>\n this.messages(channelId).upsert(item.message),\n );\n }\n /** Fetches pinned messages a page at a time, newest first (`limit` 1-50, `before` an ISO timestamp from the previous page). */\n public async fetchPins(\n channelId: string,\n options: { before?: string; limit?: number } = {},\n ): Promise<{ messages: Message[]; hasMore: boolean }> {\n const params = new URLSearchParams();\n if (options.before) params.set(\"before\", options.before);\n if (options.limit !== undefined)\n params.set(\n \"limit\",\n String(Math.min(50, Math.max(1, options.limit))),\n );\n const query = params.toString();\n const data = await this.#rest.get<{\n items: {\n pinned_at: string;\n message: ConstructorParameters<typeof Message>[0];\n }[];\n has_more: boolean;\n }>(\n `${Routes.channelMessagesPins(channelId)}${query ? `?${query}` : \"\"}`,\n );\n return {\n messages: data.items.map((item) =>\n this.messages(channelId).upsert(item.message),\n ),\n hasMore: data.has_more,\n };\n }\n /** Shows \"the bot is typing…\" for about ten seconds, or until it sends a message. */\n public async triggerTyping(channelId: string): Promise<void> {\n await this.#rest.post(Routes.channelTyping(channelId));\n }\n /** Adds a tag to a forum or media channel and returns the channel's tags. @param reason Audit-log reason. */\n public async createForumTag(\n channelId: string,\n tag: ForumTagInput,\n reason?: string,\n ): Promise<APIForumTag[]> {\n const tags = await this.#forumTags(channelId);\n return this.#saveForumTags(channelId, [...tags, tag], reason);\n }\n /** Changes a forum tag and returns the channel's tags. */\n public async editForumTag(\n channelId: string,\n tagId: string,\n changes: Partial<ForumTagInput>,\n reason?: string,\n ): Promise<APIForumTag[]> {\n const tags = await this.#forumTags(channelId);\n if (!tags.some((tag) => tag.id === tagId))\n throw new Error(`Channel ${channelId} has no tag ${tagId}.`);\n return this.#saveForumTags(\n channelId,\n tags.map((tag) =>\n tag.id === tagId ? { ...tag, ...changes } : tag,\n ),\n reason,\n );\n }\n /** Removes a forum tag and returns the channel's remaining tags. */\n public async removeForumTag(\n channelId: string,\n tagId: string,\n reason?: string,\n ): Promise<APIForumTag[]> {\n const tags = await this.#forumTags(channelId);\n if (!tags.some((tag) => tag.id === tagId))\n throw new Error(`Channel ${channelId} has no tag ${tagId}.`);\n return this.#saveForumTags(\n channelId,\n tags.filter((tag) => tag.id !== tagId),\n reason,\n );\n }\n /** The channel's current tags, read fresh so edits never clobber newer ones. */\n async #forumTags(channelId: string): Promise<APIForumTag[]> {\n const channel = await this.#rest.get<{\n available_tags?: APIForumTag[];\n }>(Routes.channel(channelId));\n return channel.available_tags ?? [];\n }\n /** Discord replaces the whole list; tags that keep their `id` are kept. */\n async #saveForumTags(\n channelId: string,\n tags: Array<ForumTagInput & { id?: string }>,\n reason?: string,\n ): Promise<APIForumTag[]> {\n const updated = await this.#rest.patch<{\n available_tags?: APIForumTag[];\n }>(Routes.channel(channelId), { available_tags: tags }, { reason });\n return updated.available_tags ?? [];\n }\n /** Pins a message. @param reason Audit-log reason. */\n public async pinMessage(\n channelId: string,\n messageId: string,\n reason?: string,\n ): Promise<void> {\n await this.#rest.put(\n Routes.channelMessagesPin(channelId, messageId),\n undefined,\n { reason },\n );\n }\n /** Unpins a message. @param reason Audit-log reason. */\n public async unpinMessage(\n channelId: string,\n messageId: string,\n reason?: string,\n ): Promise<void> {\n await this.#rest.delete(\n Routes.channelMessagesPin(channelId, messageId),\n { reason },\n );\n }\n /** Creates a webhook in a channel. @param options Name, optional avatar data URI, and audit-log `reason`. */\n public async createWebhook(\n channelId: string,\n options: { name: string; avatar?: string | null; reason?: string },\n ): Promise<import(\"@lunibee/types\").APIWebhook> {\n const [payload, reason] = splitReason(options);\n return this.#rest.post(Routes.channelWebhooks(channelId), payload, {\n reason,\n });\n }\n public createThreadFromMessage(\n channelId: string,\n messageId: string,\n options: MessageThreadOptions,\n ): Promise<Channel> {\n return this.threads(channelId).createFromMessage(messageId, options);\n }\n /**\n * Fetches a page of messages with cursor metadata.\n * @param channelId Channel to fetch from.\n * @param options Page options — `before`, `after`, `around`, and `limit` (max 100).\n * @returns `{ messages, before, after, hasMore }` — use `before` or `after` as cursors for the next page.\n */\n public async fetchPage(\n channelId: string,\n options: MessageQueryOptions = {},\n ): Promise<{\n messages: Message[];\n before?: string;\n after?: string;\n hasMore: boolean;\n }> {\n const limit = Math.min(100, Math.max(1, options.limit ?? 50));\n const messages = await this.fetchMessages(channelId, {\n ...options,\n limit,\n });\n return {\n messages,\n before: messages[0]?.id,\n after: messages[messages.length - 1]?.id,\n hasMore: messages.length === limit,\n };\n }\n public override clear(): void {\n this.#messageManagers.clear();\n super.clear();\n }\n}\n\nfunction isMessageQuery(\n value: MessageQueryOptions | Iterable<string>,\n): value is MessageQueryOptions {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !(Symbol.iterator in value)\n );\n}\nexport {\n MessageManager,\n toRequest,\n type MessageCacheOptions,\n type MessageFile,\n} from \"./message.js\";\nexport { ThreadManager } from \"./thread.js\";\nexport {\n RoleManager,\n type RoleCreateOptions,\n type RoleEditOptions,\n} from \"./role.js\";\nexport {\n GuildMemberManager,\n type MemberEditOptions,\n type BanOptions,\n} from \"./member.js\";\nexport {\n ApplicationCommandManager,\n type ApplicationCommandInput,\n} from \"./application.js\";\nexport {\n GuildBanManager,\n GuildScheduledEventManager,\n StageInstanceManager,\n PermissionOverwriteManager,\n type APIBan,\n type GuildBanCreateOptions,\n type GuildScheduledEventOptions,\n type StageInstanceCreateOptions,\n type PermissionOverwriteOptions,\n type PermissionOverwriteTargetType,\n type PermissionOverwriteUpdate,\n} from \"./guild-resources.js\";\nexport {\n EmojiManager,\n type EmojiCreateOptions,\n type EmojiEditOptions,\n} from \"./emoji.js\";\nexport {\n GuildStickerManager,\n GuildSoundboardManager,\n MonetizationManager,\n ApplicationEmojiManager,\n type APIEntitlement,\n type APISKU,\n type APISoundboardSound,\n type APISubscription,\n type EntitlementQuery,\n type GuildStickerCreateOptions,\n type SoundboardSoundCreateOptions,\n} from \"./advanced.js\";\n"
|
|
17
|
+
],
|
|
18
|
+
"mappings": "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",
|
|
19
|
+
"debugId": "594E37102F1B43CE64756E2164756E21",
|
|
20
|
+
"names": []
|
|
21
|
+
}
|