stoat-selfbot.js 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +101 -0
- package/dist/index.d.mts +3502 -0
- package/dist/index.d.ts +3502 -0
- package/dist/index.js +6971 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +6897 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/managers/baseManager.ts","../src/utils/bitField.ts","../src/struct/base.ts","../src/utils/UUID.ts","../src/utils/constants.ts","../src/utils/permissions.ts","../src/utils/badges.ts","../src/utils/collection.ts","../src/struct/user.ts","../src/struct/message.ts","../src/struct/attachment.ts","../src/struct/presence.ts","../src/struct/server.ts","../src/struct/role.ts","../src/struct/channel.ts","../src/struct/dmChannel.ts","../src/struct/groupChannel.ts","../src/struct/invite.ts","../src/struct/mentions.ts","../src/struct/messageEmbed.ts","../src/struct/notesChannel.ts","../src/struct/serverChannel.ts","../src/struct/serverMember.ts","../src/struct/textChannel.ts","../src/struct/voiceChannels.ts","../src/struct/category.ts","../src/struct/emoji.ts","../src/struct/userProfile.ts","../src/managers/channelManager.ts","../src/managers/serverManager.ts","../src/managers/userManager.ts","../src/managers/messageManager.ts","../src/managers/roleManager.ts","../src/managers/serverChannelManager.ts","../src/managers/serverMemberManager.ts","../src/managers/webhookManager.ts","../src/client/baseClient.ts","../src/rest/restClient.ts","../package.json","../src/rest/restUtils/rateLimitQueue.ts","../src/rest/CDNClient.ts","../src/client/events/event.ts","../src/client/events/bulkMessageDelete.ts","../src/client/events/channelCreate.ts","../src/client/events/channelDelete.ts","../src/client/events/channelGroupJoin.ts","../src/client/events/channelGroupLeave.ts","../src/client/events/channelStarttyping.ts","../src/client/events/channelStopTyping.ts","../src/client/events/channelUpdate.ts","../src/client/events/message.ts","../src/client/events/messageDelete.ts","../src/client/events/messageUpdate.ts","../src/client/events/serverCreate.ts","../src/client/events/serverDelete.ts","../src/client/events/serverMemberJoin.ts","../src/client/events/serverMemberLeave.ts","../src/client/events/serverMemberUpdate.ts","../src/client/events/serverRoleDelete.ts","../src/client/events/serverRoleUpdate.ts","../src/client/events/serverupdate.ts","../src/client/events/userUpdate.ts","../src/client/events/messageReact.ts","../src/client/events/messageUnreact.ts","../src/client/events/webhookCreate.ts","../src/client/events/webhookDelete.ts","../src/client/events/webhookUpdate.ts","../src/client/events/userVoiceStateUpdate.ts","../src/client/events/voiceChannelJoin.ts","../src/client/events/voiceChannelLeave.ts","../src/client/events/index.ts","../src/client/events/eventManager.ts","../src/client/player.ts","../src/client/voiceClient.ts","../src/struct/clientUser.ts","../src/client/webSocket.ts","../src/client/client.ts"],"sourcesContent":["export * from \"./managers/index\";\nexport { Client, client } from \"./client/client\";\nexport { AudioPlayer, type AudioPlayerEvents } from \"./client/player\";\nexport * from \"./struct/index\";\nexport * from \"./utils/index\";\n","import type { Client } from \"../client/client\";\n\nexport abstract class BaseManager<Holds extends { id: string }, R = unknown> {\n /** Shared default max size for all managers (can be changed globally). */\n static defaultMaxSize = -1;\n\n /** Insertion ordered cache of items this manager holds. */\n readonly cache = new Map<string, Holds>();\n\n /** Instance level max size (can be changed per manager instance). */\n protected maxSize: number;\n\n /** @private */\n Holds: any;\n\n constructor(\n protected readonly client: Client,\n maxSize = BaseManager.defaultMaxSize,\n ) {\n this.maxSize = maxSize;\n }\n\n /**\n * Adds a raw object to the cache, constructing the holdable class.\n * Automatically evicts oldest entries if the max size is exceeded.\n * @private\n */\n _add(raw: R): Holds {\n if (!this.holds) throw new Error(\"Holds is not defined\");\n const obj = new this.holds(this.client, raw);\n this.cache.set(obj.id, obj);\n this.enforceMaxSize();\n return obj;\n }\n\n /** Remove an entry by id.\n * @private\n */\n _remove(id: string): void {\n this.cache.delete(id);\n }\n\n /** Adjust the maximum size for this manager at runtime. */\n setMaxSize(size: number): void {\n if (!Number.isFinite(size) || size < -1)\n throw new RangeError(\"maxSize must be a non-negative finite number\");\n this.maxSize = size;\n this.enforceMaxSize();\n }\n\n /** Force eviction until cache size is within the limit. */\n protected enforceMaxSize(): void {\n if (this.maxSize === -1) return;\n if (this.maxSize === 0) {\n // Special case: caching disabled.\n this.cache.clear();\n return;\n }\n while (this.cache.size > this.maxSize) {\n const oldestKey = this.cache.keys().next().value as string | undefined;\n if (oldestKey === undefined) break;\n this.cache.delete(oldestKey);\n }\n }\n\n abstract readonly holds: (new (...args: any[]) => Holds) | null;\n\n resolve(resolvable: Holds): Holds | null;\n resolve(resolvable: string | R): Holds | null;\n resolve(resolvable: string | R | Holds): Holds | null;\n resolve(resolvable: string | R | Holds): Holds | null {\n const id = this.resolveId(resolvable);\n if (id) return this.cache.get(id) ?? null;\n return null;\n }\n\n resolveId(resolvable: string | Holds | R): string | null {\n if (resolvable == null) return null;\n if (typeof resolvable === \"string\") return resolvable;\n if (this.holds && resolvable instanceof this.holds) return resolvable.id;\n const raw = resolvable as unknown as { _id: string };\n if (typeof raw === \"object\" && \"_id\" in raw) raw._id ?? null;\n return null;\n }\n\n valueOf(): this[\"cache\"] {\n return this.cache;\n }\n}\n","const DEFAULT_BIT = 0;\n\n/** A type that can be a BitField, number, string, or an array of these types.\n * @private\n */\nexport type BitFieldResolvable =\n | BitField\n | number\n | string\n | BitFieldResolvable[];\n\n/**\n * Represents a bitfield that can be used to manage flags or permissions.\n */\nexport class BitField {\n static FLAGS: Record<string, number> = {};\n bitfield = DEFAULT_BIT;\n constructor(bits: BitFieldResolvable = DEFAULT_BIT) {\n this.bitfield = this.self.resolve(bits);\n }\n\n /**\n * Resolves a bitfield or an array of bitfields into a single number.\n * @param bit The bitfield or array of bitfields to resolve.\n * @returns The resolved bitfield as a number.\n */\n static resolve(bit: BitFieldResolvable): number {\n if (bit instanceof BitField) return bit.bitfield;\n if (typeof bit === \"number\" && bit >= DEFAULT_BIT) return bit;\n if (Array.isArray(bit)) {\n return bit\n .map((p) => this.resolve(p))\n .reduce((prev, p) => prev | p, DEFAULT_BIT);\n }\n if (typeof this.FLAGS[bit] !== \"undefined\") return this.FLAGS[bit];\n throw new Error(\"BITFIELD_INVALID\");\n }\n /**\n * Returns the class that this instance belongs to.\n * @returns The class of the bitfield.\n */\n get self(): {\n FLAGS: Record<string, number>;\n resolve(bit: BitFieldResolvable): number;\n new (bits?: BitFieldResolvable): BitField;\n } {\n return this.constructor as unknown as {\n FLAGS: Record<string, number>;\n resolve(bit: BitFieldResolvable): number;\n new (bits?: BitFieldResolvable): BitField;\n };\n }\n\n /**\n * Checks if any of the bits in the bitfield are set.\n * @param bit The bitfield or array of bitfields to check.\n * @returns True if any bits are set, false otherwise.\n */\n any(bit: BitFieldResolvable): boolean {\n bit = this.self.resolve(bit);\n return (this.bitfield & bit) !== DEFAULT_BIT;\n }\n\n /**\n * checks if a specific permission is set.\n */\n has(bit: BitFieldResolvable): boolean {\n bit = this.self.resolve(bit);\n return (this.bitfield & bit) === bit;\n }\n\n /**\n * Returns an array of all the Permissions that are set in the bitfield.\n * @returns An array of flag names.\n */\n toArray(): string[] {\n return Object.keys(this.self.FLAGS).filter((bit) => this.has(bit));\n }\n\n add(...bits: BitFieldResolvable[]): this {\n let total = 0;\n\n for (const bit of bits) {\n total |= this.self.resolve(bit);\n }\n\n if (Object.isFrozen(this)) {\n return new this.self(this.bitfield | total) as this;\n }\n\n this.bitfield |= total;\n\n return this;\n }\n\n remove(...bits: BitFieldResolvable[]): this {\n let total = 0;\n\n for (const bit of bits) {\n total |= this.self.resolve(bit);\n }\n\n if (Object.isFrozen(this)) {\n return new this.self(this.bitfield & ~total) as this;\n }\n\n this.bitfield &= ~total;\n\n return this;\n }\n\n freeze(): Readonly<this> {\n return Object.freeze(this);\n }\n\n valueOf(): number {\n return this.bitfield;\n }\n\n /**\n *\n * @returns A record of all flags and their boolean values indicating whether they are set.\n */\n serialize(): Record<string, boolean> {\n const serialized: Record<string, boolean> = {};\n for (const [flag, bit] of Object.entries(this.self.FLAGS)) {\n serialized[flag] = this.has(bit);\n }\n return serialized;\n }\n\n *[Symbol.iterator](): Iterable<string> {\n yield* this.toArray();\n }\n}\n","import type { Client } from \"../client/client\";\nimport { BitField } from \"../utils/bitField\";\n\nexport type PartialObject = Partial<\n { _id: string } | { id: string } | { _id: { user: string } }\n>;\n\n/**\n * Represents the base structure for all objects in the client.\n * Provides common functionality such as equality checks, cloning, and patching data.\n */\nexport abstract class Base {\n /** The unique identifier for the object. */\n id!: string;\n\n /**\n * Creates a new Base instance.\n *\n * @param {client} client - The client instance.\n */\n constructor(public readonly client: Client) {}\n\n /**\n * Compares this object with another to determine if they are equal.\n *\n * @param {this | null} [obj] - The object to compare with.\n * @returns {boolean} `true` if the objects are equal, otherwise `false`.\n */\n equals(obj?: this | null): boolean {\n if (!obj) return false;\n\n for (const key in obj) {\n const a = obj[key],\n b = this[key];\n if (a instanceof Base && !a.equals(b as typeof a)) return false;\n if (\n a instanceof BitField &&\n a.bitfield !== (b as unknown as BitField).bitfield\n )\n return false;\n\n if (typeof a === \"object\" && a !== null) continue;\n if (a !== b) return false;\n }\n\n return true;\n }\n\n /**\n * Updates the object with new data and returns a clone of the object.\n *\n * @param {PartialObject} data - The data to update the object with.\n * @param {string[]} [clear] - Fields to clear in the object.\n * @returns {this} A clone of the updated object.\n */\n _update(data: PartialObject, clear?: string[]): this {\n const clone = this._clone();\n this._patch(data, clear);\n return clone;\n }\n\n /**\n * Patches the object with new data.\n *\n * @param {PartialObject} data - The data to patch the object with.\n * @param {string[]} [_clear] - Fields to clear in the object.\n * @returns {this} The updated object.\n * @protected\n */\n protected _patch(data: PartialObject, _clear?: string[]): this {\n if (\"id\" in data) this.id = data.id!;\n if (\"_id\" in data) {\n if (typeof data._id === \"string\") this.id = data._id;\n if (typeof data._id === \"object\") this.id = data._id.user;\n }\n return this;\n }\n\n /**\n * Creates a deep clone of the object.\n *\n * @returns {this} A clone of the object.\n */\n _clone(): this {\n const clone = Object.assign(Object.create(this), this);\n\n for (const key in clone) {\n const prop = clone[key];\n if (prop instanceof Base) clone[key] = prop._clone();\n }\n\n return clone;\n }\n}\n","import { randomBytes } from \"crypto\";\n\nexport class UUID extends null {\n static readonly ENCODING = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\n static readonly ENCODING_LENGTH = UUID.ENCODING.length;\n static readonly RANDOM_LENGTH = 16;\n static readonly TIME_LENGTH = 10;\n static readonly TIME_MAX = Math.pow(2, 48) - 1;\n static get PROG(): number {\n return randomBytes(1).readUInt8() / 0xff;\n }\n\n private static time(now = Date.now()): string {\n let mod: number,\n result = \"\";\n\n for (let i = this.TIME_LENGTH; i > 0; i--) {\n mod = now % this.ENCODING_LENGTH;\n result = this.ENCODING.charAt(mod) + result;\n now = (now - mod) / this.ENCODING_LENGTH;\n }\n\n return result;\n }\n\n private static hash(): string {\n let result = \"\";\n\n for (let i = this.RANDOM_LENGTH; i > 0; i--) {\n let random = Math.floor(this.PROG * this.ENCODING_LENGTH);\n\n if (random === this.ENCODING_LENGTH) {\n random = this.ENCODING_LENGTH - 1;\n }\n\n result = this.ENCODING.charAt(random) + result;\n }\n\n return result;\n }\n\n static generate(timestamp = Date.now()): string {\n return this.time(timestamp) + this.hash();\n }\n\n static timestampOf(id: string): Date {\n const timestamp = id\n .slice(0, this.TIME_LENGTH)\n .split(\"\")\n .reverse()\n .reduce((carry, char, index) => {\n const encodingIndex = this.ENCODING.indexOf(char);\n\n if (encodingIndex === -1) {\n throw new Error(\"invalid character found: \" + char);\n }\n\n return (carry += encodingIndex * Math.pow(this.ENCODING_LENGTH, index));\n }, 0);\n\n return new Date(timestamp);\n }\n}\n","import { clientOptions } from \"../client/baseClient\";\nimport { UUID } from \"./UUID\";\n\n/**\n * Enum representing the client events that can be emitted (discord.js style naming).\n * @private\n */\nexport enum Events {\n CHANNEL_CREATE = \"channelCreate\",\n CHANNEL_DELETE = \"channelDelete\",\n CHANNEL_UPDATE = \"channelUpdate\",\n DEBUG = \"debug\",\n ERROR = \"error\",\n GROUP_JOIN = \"groupJoin\",\n GROUP_LEAVE = \"groupLeave\",\n MESSAGE_CREATE = \"messageCreate\",\n MESSAGE_DELETE = \"messageDelete\",\n MESSAGE_DELETE_BULK = \"messageDeleteBulk\",\n MESSAGE_UPDATE = \"messageUpdate\",\n MESSAGE_REACTION_ADD = \"messageReactionAdd\",\n MESSAGE_REACTION_REMOVE = \"messageReactionRemove\",\n RAW = \"raw\",\n READY = \"ready\",\n ROLE_CREATE = \"roleCreate\",\n ROLE_DELETE = \"roleDelete\",\n ROLE_UPDATE = \"roleUpdate\",\n SERVER_CREATE = \"serverCreate\",\n SERVER_DELETE = \"serverDelete\",\n SERVER_MEMBER_JOIN = \"guildMemberAdd\",\n SERVER_MEMBER_LEAVE = \"guildMemberRemove\",\n SERVER_MEMBER_UPDATE = \"guildMemberUpdate\",\n SERVER_UPDATE = \"serverUpdate\",\n TYPING_START = \"typingStart\",\n TYPING_STOP = \"typingStop\",\n USER_UPDATE = \"userUpdate\",\n WEBHOOKS_CREATE = \"webhookCreate\",\n WEBHOOKS_DELETE = \"webhookDelete\",\n WEBHOOKS_UPDATE = \"webhookUpdate\",\n USER_VOICE_STATE_UPDATE = \"voiceStateUpdate\",\n VOICE_CHANNEL_JOIN = \"voiceChannelJoin\",\n VOICE_CHANNEL_LEAVE = \"voiceChannelLeave\",\n}\n\n/**\n * Enum representing the WebSocket events used for communication.\n * @private\n */\nexport enum WSEvents {\n AUTHENTICATE = \"Authenticate\",\n AUTHENTICATED = \"Authenticated\",\n BEGIN_TYPING = \"BeginTyping\",\n BULK = \"Bulk\",\n CHANNEL_ACK = \"ChannelAck\",\n CHANNEL_CREATE = \"ChannelCreate\",\n CHANNEL_DELETE = \"ChannelDelete\",\n CHANNEL_GROUP_JOIN = \"ChannelGroupJoin\",\n CHANNEL_GROUP_LEAVE = \"ChannelGroupLeave\",\n CHANNEL_START_TYPING = \"ChannelStartTyping\",\n CHANNEL_STOP_TYPING = \"ChannelStopTyping\",\n CHANNEL_UPDATE = \"ChannelUpdate\",\n END_TYPING = \"EndTyping\",\n ERROR = \"Error\",\n MESSAGE = \"Message\",\n MESSAGE_BULK_DELETE = \"BulkMessageDelete\",\n MESSAGE_DELETE = \"MessageDelete\",\n MESSAGE_UPDATE = \"MessageUpdate\",\n PING = \"Ping\",\n PONG = \"Pong\",\n READY = \"Ready\",\n SERVER_DELETE = \"ServerDelete\",\n SERVER_MEMBER_JOIN = \"ServerMemberJoin\",\n SERVER_MEMBER_LEAVE = \"ServerMemberLeave\",\n SERVER_MEMBER_UPDATE = \"ServerMemberUpdate\",\n SERVER_ROLE_DELETE = \"ServerRoleDelete\",\n SERVER_ROLE_UPDATE = \"ServerRoleUpdate\",\n SERVER_UPDATE = \"ServerUpdate\",\n USER_RELATIONSHIP = \"UserRelationship\",\n USER_UPDATE = \"UserUpdate\",\n WEBHOOKS_CREATE = \"WebhooksCreate\",\n WEBHOOKS_DELETE = \"WebhooksDelete\",\n WEBHOOKS_UPDATE = \"WebhooksUpdate\",\n VOICE_STATE_UPDATE = \"VoiceStateUpdate\",\n VOICE_CHANNEL_JOIN = \"VoiceChannelJoin\",\n VOICE_CHANNEL_LEAVE = \"VoiceChannelLeave\",\n}\n\n/**\n * Enum representing the types of channels supported by the client.\n */\nexport enum ChannelTypes {\n DM = \"DM\",\n GROUP = \"GROUP\",\n TEXT = \"TEXT\",\n VOICE = \"VOICE\",\n NOTES = \"NOTES\",\n}\n\n/**\n * The default options for configuring the selfbot client.\n */\nexport const DEFAULT_CLIENT_OPTIONS: clientOptions = {\n fetchMembers: true,\n rest: {\n timeout: 15000,\n retries: 3,\n instanceURL: \"https://api.stoat.chat\",\n instanceCDNURL: \"https://cdn.stoatusercontent.com\",\n },\n MessageCache: {\n maxSize: 1000,\n },\n ws: {\n heartbeatInterval: 30000,\n reconnect: true,\n },\n};\n\nexport const apiUrl = \"https://api.stoat.chat\";\nexport const cdnUrl = \"https://cdn.stoatusercontent.com\";\n\n/** The system user ID used for identifying system messages. */\nexport const SYSTEM_USER_ID = \"0\".repeat(UUID.TIME_LENGTH + UUID.RANDOM_LENGTH);\n","import { BitField } from \"./bitField\";\n\nexport type ChannelPermissionsString = keyof typeof ChannelPermissions.FLAGS;\nexport type UserPermissionsString = keyof typeof UserPermissions.FLAGS;\nexport type ServerPermissionsString = keyof typeof ServerPermissions.FLAGS;\nexport type ChannelPermissionsResolvable =\n | number\n | ChannelPermissionsString\n | ChannelPermissions\n | ChannelPermissionsResolvable[];\nexport type UserPermissionsResolvable =\n | number\n | UserPermissionsString\n | UserPermissions\n | UserPermissionsResolvable[];\nexport type ServerPermissionsResolvable =\n | number\n | ServerPermissionsString\n | ServerPermissions\n | ServerPermissionsResolvable[];\n\nexport declare interface ServerPermissions {\n serialize(): Record<ServerPermissionsString, boolean>;\n any(bit: ServerPermissionsResolvable): boolean;\n add(...bits: ServerPermissionsResolvable[]): this;\n remove(...bits: ServerPermissionsResolvable[]): this;\n has(bit: ServerPermissionsResolvable): boolean;\n}\n\nexport declare interface ChannelPermissions {\n serialize(): Record<ChannelPermissionsString, boolean>;\n any(bit: ChannelPermissionsResolvable): boolean;\n add(...bits: ChannelPermissionsResolvable[]): this;\n remove(...bits: ChannelPermissionsResolvable[]): this;\n has(bit: ChannelPermissionsResolvable): boolean;\n}\n\nexport declare interface UserPermissions {\n serialize(): Record<UserPermissionsString, boolean>;\n any(bit: UserPermissionsResolvable): boolean;\n add(...bits: UserPermissionsResolvable[]): this;\n remove(...bits: UserPermissionsResolvable[]): this;\n has(bit: UserPermissionsResolvable): boolean;\n}\n\nexport class ChannelPermissions extends BitField {\n static readonly FLAGS = {\n VIEW_CHANNEL: 1 << 0,\n SEND_MESSAGE: 1 << 22,\n MANAGE_MESSAGE: 1 << 2,\n MANAGE_CHANNEL: 1 << 3,\n VOICE_CALL: 1 << 4,\n INVITE_OTHERS: 1 << 5,\n EMBED_LINKS: 1 << 6,\n UPLOAD_FILES: 1 << 7,\n } as const;\n\n constructor(bits?: ChannelPermissionsResolvable) {\n super(bits);\n }\n\n static resolve(bit: ChannelPermissionsResolvable): number {\n return super.resolve(bit);\n }\n}\n\nexport class UserPermissions extends BitField {\n static readonly FLAGS = {\n ACCESS: 1 << 0,\n VIEW_PROFILE: 1 << 1,\n SEND_MESSAGES: 1 << 2,\n INVITE: 1 << 3,\n } as const;\n\n constructor(bits?: UserPermissionsResolvable) {\n super(bits);\n }\n\n static resolve(bit: UserPermissionsResolvable): number {\n return super.resolve(bit);\n }\n}\n\nexport class ServerPermissions extends BitField {\n static readonly FLAGS = {\n VIEW_SERVER: 1 << 0,\n MANAGE_ROLES: 1 << 1,\n MANAGE_CHANNELS: 1 << 2,\n MANAGE_SERVER: 1 << 3,\n KICK_MEMBERS: 1 << 4,\n BAN_MEMBERS: 1 << 5,\n CHANGE_NICKNAME: 1 << 12,\n MANAGE_NICKNAMES: 1 << 13,\n CHANGE_AVATAR: 1 << 14,\n REMOVE_AVATARS: 1 << 15,\n } as const;\n\n constructor(bits?: ServerPermissionsResolvable) {\n super(bits);\n }\n\n static resolve(bit: ServerPermissionsResolvable): number {\n return super.resolve(bit);\n }\n}\n\nexport class FullPermissions extends BitField {\n static readonly FLAGS = {\n // * Generic permissions\n /// Manage the channel or channels on the server\n ManageChannel: 2 ** 0,\n /// Manage the server\n ManageServer: 2 ** 1,\n /// Manage permissions on servers or channels\n ManagePermissions: 2 ** 2,\n /// Manage roles on server\n ManageRole: 2 ** 3,\n /// Manage server customisation (includes emoji)\n ManageCustomisation: 2 ** 4,\n\n // * Member permissions\n /// Kick other members below their ranking\n KickMembers: 2 ** 6,\n /// Ban other members below their ranking\n BanMembers: 2 ** 7,\n /// Timeout other members below their ranking\n TimeoutMembers: 2 ** 8,\n /// Assign roles to members below their ranking\n AssignRoles: 2 ** 9,\n /// Change own nickname\n ChangeNickname: 2 ** 10,\n /// Change or remove other's nicknames below their ranking\n ManageNicknames: 2 ** 11,\n /// Change own avatar\n ChangeAvatar: 2 ** 12,\n /// Remove other's avatars below their ranking\n RemoveAvatars: 2 ** 13,\n\n // * Channel permissions\n /// View a channel\n ViewChannel: 2 ** 20,\n /// Read a channel's past message history\n ReadMessageHistory: 2 ** 21,\n /// Send a message in a channel\n SendMessage: 2 ** 22,\n /// Delete messages in a channel\n ManageMessages: 2 ** 23,\n /// Manage webhook entries on a channel\n ManageWebhooks: 2 ** 24,\n /// Create invites to this channel\n InviteOthers: 2 ** 25,\n /// Send embedded content in this channel\n SendEmbeds: 2 ** 26,\n /// Send attachments and media in this channel\n UploadFiles: 2 ** 27,\n /// Masquerade messages using custom nickname and avatar\n Masquerade: 2 ** 28,\n /// React to messages with emoji\n React: 2 ** 29,\n\n // * Voice permissions\n /// Connect to a voice channel\n Connect: 2 ** 30,\n /// Speak in a voice call\n Speak: 2 ** 31,\n /// Share video in a voice call\n Video: 2 ** 32,\n /// Mute other members with lower ranking in a voice call\n MuteMembers: 2 ** 33,\n /// Deafen other members with lower ranking in a voice call\n DeafenMembers: 2 ** 34,\n /// Move members between voice channels\n MoveMembers: 2 ** 35,\n\n // * Mention permissions\n /// Mention @everyone or @online\n MentionEveryone: 2 ** 37,\n /// Mention a role\n MentionRoles: 2 ** 38,\n\n // * Grant all permissions\n /// Safely grant all permissions\n GrantAll: 0x000f_ffff_ffff_ffff,\n } as const;\n\n constructor(\n bits?:\n | number\n | string\n | FullPermissions\n | Array<number | string | FullPermissions>,\n ) {\n super(bits);\n }\n\n static resolve(bit: number | string | FullPermissions): number {\n return super.resolve(bit);\n }\n}\n\nexport const DEFAULT_PERMISSION_DM = new ChannelPermissions([\n \"VIEW_CHANNEL\",\n \"VIEW_CHANNEL\",\n \"MANAGE_CHANNEL\",\n \"VOICE_CALL\",\n \"EMBED_LINKS\",\n \"UPLOAD_FILES\",\n]).freeze();\n","import { BitField } from \"./bitField\";\n\nexport type BadgeString = keyof typeof Badges.FLAGS;\nexport type BadgesResolvable =\n | number\n | BadgeString\n | Badges\n | BadgesResolvable[];\n\nexport declare interface Badges {\n serialize(): Record<BadgeString, boolean>;\n any(bit: BadgesResolvable): boolean;\n add(...bits: BadgesResolvable[]): this;\n remove(...bits: BadgesResolvable[]): this;\n has(bit: BadgesResolvable): boolean;\n}\n\nexport class Badges extends BitField {\n static readonly FLAGS = {\n DEVELOPER: 1 << 0,\n TRANSLATOR: 1 << 1,\n SUPPORTER: 1 << 2,\n RESPONSIBLE_DISCLOSURE: 1 << 3,\n REVOLT_TEAM: 1 << 4,\n EARLY_ADOPTER: 1 << 8,\n } as const;\n\n constructor(bits?: BadgesResolvable) {\n super(bits);\n }\n\n static resolve(bit: BadgesResolvable): number {\n return super.resolve(bit);\n }\n}\n","export class Collection<K, V> extends Map<K, V> {\n private _array: V[] | null = null;\n private _keyArray: K[] | null = null;\n\n constructor(iterable?: Iterable<readonly [K, V]> | null) {\n super(iterable);\n }\n\n set(key: K, value: V): this {\n this._array = null;\n this._keyArray = null;\n return super.set(key, value);\n }\n\n delete(key: K): boolean {\n this._array = null;\n this._keyArray = null;\n return super.delete(key);\n }\n\n array(): V[] {\n if (!this._array) this._array = [...this.values()];\n return this._array;\n }\n\n keyArray(): K[] {\n if (!this._keyArray) this._keyArray = [...this.keys()];\n return this._keyArray;\n }\n\n first(): V | undefined;\n first(amount: number): V[];\n first(amount?: number): V | V[] | undefined {\n if (amount === undefined) return this.values().next().value;\n if (amount < 0) return this.last(amount * -1);\n amount = Math.min(this.size, amount);\n const iter = this.values();\n return Array.from({ length: amount }, () => iter.next().value as V);\n }\n\n firstKey(): K | undefined;\n firstKey(amount: number): K[];\n firstKey(amount?: number): K | K[] | undefined {\n if (amount === undefined) return this.keys().next().value;\n if (amount < 0) return this.lastKey(amount * -1);\n amount = Math.min(this.size, amount);\n const iter = this.keys();\n return Array.from({ length: amount }, () => iter.next().value as K);\n }\n\n last(): V | undefined;\n last(amount: number): V[];\n last(amount?: number): V | V[] | undefined {\n const arr = this.array();\n if (amount === undefined) return arr[arr.length - 1];\n if (amount < 0) return this.first(amount * -1);\n if (!amount) return [];\n return arr.slice(-amount);\n }\n\n lastKey(): K | undefined;\n lastKey(amount: number): K[];\n lastKey(amount?: number): K | K[] | undefined {\n const arr = this.keyArray();\n if (amount === undefined) return arr[arr.length - 1];\n if (amount < 0) return this.firstKey(amount * -1);\n if (!amount) return [];\n return arr.slice(-amount);\n }\n\n random(): V | undefined;\n random(amount: number): V[];\n random(amount?: number): V | V[] | undefined {\n const arr = this.array();\n if (amount === undefined)\n return arr[Math.floor(Math.random() * arr.length)];\n if (!arr.length) return [];\n if (amount > arr.length) amount = arr.length;\n const result: V[] = [];\n const indices = new Set<number>();\n while (result.length < amount) {\n const index = Math.floor(Math.random() * arr.length);\n if (!indices.has(index)) {\n indices.add(index);\n result.push(arr[index]);\n }\n }\n return result;\n }\n\n randomKey(): K | undefined;\n randomKey(amount: number): K[];\n randomKey(amount?: number): K | K[] | undefined {\n const arr = this.keyArray();\n if (amount === undefined)\n return arr[Math.floor(Math.random() * arr.length)];\n if (!arr.length) return [];\n if (amount > arr.length) amount = arr.length;\n const result: K[] = [];\n const indices = new Set<number>();\n while (result.length < amount) {\n const index = Math.floor(Math.random() * arr.length);\n if (!indices.has(index)) {\n indices.add(index);\n result.push(arr[index]);\n }\n }\n return result;\n }\n\n find(fn: (value: V, key: K, collection: this) => boolean): V | undefined {\n for (const [key, val] of this) {\n if (fn(val, key, this)) return val;\n }\n return undefined;\n }\n\n findKey(fn: (value: V, key: K, collection: this) => boolean): K | undefined {\n for (const [key, val] of this) {\n if (fn(val, key, this)) return key;\n }\n return undefined;\n }\n\n filter(\n fn: (value: V, key: K, collection: this) => boolean,\n ): Collection<K, V> {\n const results = new Collection<K, V>();\n for (const [key, val] of this) {\n if (fn(val, key, this)) results.set(key, val);\n }\n return results;\n }\n\n filterKey(\n fn: (value: V, key: K, collection: this) => boolean,\n ): Collection<K, V> {\n const results = new Collection<K, V>();\n for (const [key, val] of this) {\n if (fn(val, key, this)) results.set(key, val);\n }\n return results;\n }\n\n map<T>(fn: (value: V, key: K, collection: this) => T): T[] {\n const results: T[] = [];\n for (const [key, val] of this) {\n results.push(fn(val, key, this));\n }\n return results;\n }\n\n some(fn: (value: V, key: K, collection: this) => boolean): boolean {\n for (const [key, val] of this) {\n if (fn(val, key, this)) return true;\n }\n return false;\n }\n\n every(fn: (value: V, key: K, collection: this) => boolean): boolean {\n for (const [key, val] of this) {\n if (!fn(val, key, this)) return false;\n }\n return true;\n }\n\n reduce<T>(\n fn: (acc: T, value: V, key: K, collection: this) => T,\n initialValue?: T,\n ): T {\n let acc: T = initialValue as T;\n for (const [key, val] of this) {\n acc = fn(acc as T, val, key, this);\n }\n return acc;\n }\n\n each(fn: (value: V, key: K, collection: this) => void): this {\n for (const [key, val] of this) {\n fn(val, key, this);\n }\n return this;\n }\n\n tap(fn: (collection: this) => void): this {\n fn(this);\n return this;\n }\n\n at(index: number): V | undefined {\n index = Math.floor(index);\n const arr = this.array();\n return arr[index];\n }\n\n keyAt(index: number): K | undefined {\n index = Math.floor(index);\n const arr = this.keyArray();\n return arr[index];\n }\n\n concat(...collections: Collection<K, V>[]): Collection<K, V> {\n const result = new Collection<K, V>(this.entries());\n for (const collection of collections) {\n for (const [key, val] of collection) {\n result.set(key, val);\n }\n }\n return result;\n }\n\n reverse(): this {\n const entries = [...this.entries()].reverse();\n this.clear();\n for (const [key, val] of entries) {\n this.set(key, val);\n }\n return this;\n }\n\n sort(\n compareFn: (a: V, b: V) => number = (a, b): number =>\n Number(a > b) - Number(a < b),\n ): this {\n const entries = [...this.entries()].sort((a, b) => compareFn(a[1], b[1]));\n this.clear();\n for (const [key, val] of entries) {\n this.set(key, val);\n }\n return this;\n }\n\n sweep(fn: (value: V, key: K, collection: this) => boolean): number {\n let count = 0;\n for (const [key, val] of this) {\n if (fn(val, key, this)) {\n this.delete(key);\n count++;\n }\n }\n return count;\n }\n\n partition(\n fn: (value: V, key: K, collection: this) => boolean,\n ): [Collection<K, V>, Collection<K, V>] {\n const [a, b] = [new Collection<K, V>(), new Collection<K, V>()];\n for (const [key, val] of this) {\n if (fn(val, key, this)) {\n a.set(key, val);\n } else {\n b.set(key, val);\n }\n }\n return [a, b];\n }\n\n flatMap<T>(\n fn: (value: V, key: K, collection: this) => Collection<K, T>,\n ): Collection<K, T> {\n const result = new Collection<K, T>();\n for (const [key, val] of this) {\n const mapped = fn(val, key, this);\n for (const [k, v] of mapped) {\n result.set(k, v);\n }\n }\n return result;\n }\n\n mapValues<T>(\n fn: (value: V, key: K, collection: this) => T,\n ): Collection<K, T> {\n const result = new Collection<K, T>();\n for (const [key, val] of this) {\n result.set(key, fn(val, key, this));\n }\n return result;\n }\n\n clone(): Collection<K, V> {\n return new Collection<K, V>(this.entries());\n }\n\n equals(collection: Collection<K, V>): boolean {\n if (this.size !== collection.size) return false;\n for (const [key, val] of this) {\n if (!collection.has(key)) return false;\n if (collection.get(key) !== val) return false;\n }\n return true;\n }\n\n diff(collection: Collection<K, V>): Collection<K, V> {\n const result = new Collection<K, V>();\n for (const [key, val] of this) {\n if (!collection.has(key) || collection.get(key) !== val) {\n result.set(key, val);\n }\n }\n return result;\n }\n\n intersect(collection: Collection<K, V>): Collection<K, V> {\n const result = new Collection<K, V>();\n for (const [key, val] of this) {\n if (collection.has(key) && collection.get(key) === val) {\n result.set(key, val);\n }\n }\n return result;\n }\n\n indexOf(value: V): number {\n return this.array().indexOf(value);\n }\n\n findIndex(fn: (value: V, key: K, collection: this) => boolean): number {\n let index = 0;\n for (const [key, val] of this) {\n if (fn(val, key, this)) return index;\n index++;\n }\n return -1;\n }\n\n remove(value: V): boolean {\n for (const [key, val] of this) {\n if (val === value) {\n this.delete(key);\n return true;\n }\n }\n return false;\n }\n\n toJSON(): { key: K; value: V }[] {\n return this.map((value, key) => ({ key, value }));\n }\n}\n","import {\n Attachment,\n Base,\n DMChannel,\n Presence,\n Status,\n UserProfile,\n} from \"./index\";\nimport type {\n User as APIUser,\n FieldsUser,\n Channel as APIChannel,\n} from \"revolt-api\";\nimport type { Client } from \"../client/client\";\nimport { Badges, UUID } from \"../utils/index\";\nimport { cdnUrl } from \"../utils/constants\";\n\nexport class User extends Base {\n username!: string;\n avatar: Attachment | null = null;\n presence = new Presence(this.client);\n badges!: Badges;\n bot = false;\n\n constructor(client: Client, data: APIUser) {\n super(client);\n this._patch(data);\n }\n\n protected _patch(data: APIUser, clear: FieldsUser[] = []): this {\n super._patch(data);\n\n if (data.username) {\n this.username = data.username;\n }\n\n if (data.bot) {\n this.bot = true;\n }\n\n if (typeof data.badges === \"number\") {\n this.badges = new Badges(data.badges).freeze();\n }\n\n if (data.avatar) {\n this.avatar = new Attachment(this.client, data.avatar);\n }\n\n if (data.status) {\n this.presence.status = data.status.presence\n ? (Status[data.status.presence as keyof typeof Status] ??\n Status.Invisible)\n : Status.Invisible;\n this.presence.text = data.status.text ?? null;\n }\n\n for (const field of clear) {\n if (field === \"Avatar\") this.avatar = null;\n if (field === \"StatusText\") this.presence.text = null;\n if (field === \"StatusPresence\") this.presence.status = Status.Invisible;\n }\n\n return this;\n }\n\n get createdAt(): Date {\n return UUID.timestampOf(this.id);\n }\n\n get isOwner(): boolean {\n return this.id === this.client.user?.owner;\n }\n\n get createdTimestamp(): number {\n return this.createdAt.getTime();\n }\n\n async block(): Promise<void> {\n await this.client.api.put(`/users/${this.id}/block`);\n }\n\n async unblock(): Promise<void> {\n await this.client.api.delete(`/users/${this.id}/block`);\n }\n\n async createDM(): Promise<DMChannel> {\n const data = await this.client.api.get(`/users/${this.id}/dm`);\n return this.client.channels._add(data as APIChannel) as DMChannel;\n }\n\n avatarURL(): string | undefined {\n if (!this.avatar?.id) return undefined;\n const baseUrl = this.client.options.rest?.instanceCDNURL || cdnUrl;\n return `${baseUrl}/avatars/${this.avatar.id}/original`;\n }\n\n bannerURL(): string | undefined {\n return undefined;\n }\n\n defaultAvatarURL(): string {\n const baseUrl = this.client.options.rest?.instanceCDNURL || cdnUrl;\n return `${baseUrl}/users/${this.id}/default_avatar`;\n }\n\n async displayAvatarURL(): Promise<string> {\n return this.avatarURL() ?? this.defaultAvatarURL();\n }\n\n async fetchProfile(): Promise<UserProfile> {\n const data = await this.client.api.get(`/users/${this.id}/profile`);\n return new UserProfile(this.client, { ...(data as any), userId: this.id });\n }\n\n fetch(force: boolean = false): Promise<User> {\n return this.client.users.fetch(this, { force });\n }\n\n toString(): string {\n return `<@${this.id}>`;\n }\n}\n","import type {\n File,\n Message as APIMessage,\n SystemMessage,\n Masquerade,\n} from \"revolt-api\";\nimport type { Client } from \"../client/client\";\nimport type { MessageEditOptions, MessageOptions } from \"../managers/index\";\nimport {\n Base,\n DMChannel,\n Embed,\n GroupChannel,\n Mentions,\n Server,\n ServerMember,\n TextChannel,\n User,\n VoiceChannel,\n} from \"./index\";\nimport { ChannelTypes, UUID } from \"../utils/index\";\n\n/**\n * Represents a message in a channel.\n *\n * @extends Base\n */\nexport class MessageStruct extends Base {\n /** The type of the message (e.g., TEXT, SYSTEM). */\n type: Uppercase<SystemMessage[\"type\"]> = \"TEXT\";\n\n /** The content of the message. */\n content = \"\";\n\n /** The ID of the channel where the message was sent. */\n channelId = \"\";\n\n /** The ID of the user who authored the message. */\n authorId = \"\";\n\n /** An array of embeds included in the message. */\n embeds: Embed[] = [];\n\n /** An array of file attachments included in the message. */\n attachments: File[] = [];\n\n /** Mentions included in the message. */\n mentions = new Mentions(this, []);\n\n /** The timestamp of when the message was last edited, or `null` if not edited. */\n editedTimestamp: number | null = null;\n\n /** the reactions and count on a message */\n reactions: Map<string, string[]> = new Map();\n\n /** Masquerade information for the message, Name and / or avatar override information */\n masquerade?: Masquerade;\n\n /** Webhook information for the message, Name and / or avatar override information */\n webhook?: { name: string; avatar: string | null };\n\n /**\n * Creates a new Message instance.\n *\n * @param {client} client - The client instance.\n * @param {APIMessage} data - The raw data for the message from the API.\n */\n constructor(client: Client, data: APIMessage) {\n super(client);\n this._patch(data);\n }\n\n /**\n * Updates the message instance with new data from the API.\n *\n * @param {APIMessage} data - The raw data for the message from the API.\n * @returns {this} The updated message instance.\n * @protected\n */\n protected _patch(data: APIMessage): this {\n super._patch(data);\n\n if (Array.isArray(data.embeds)) {\n this.embeds = data.embeds;\n }\n\n if (Array.isArray(data.attachments)) {\n this.attachments = data.attachments;\n }\n\n if (Array.isArray(data.mentions)) {\n this.mentions = new Mentions(this, data.mentions);\n }\n\n if (data.author) {\n this.authorId = data.author;\n }\n\n if (data.channel) {\n this.channelId = data.channel;\n }\n\n if (data.webhook) {\n this.webhook = {\n name: data.webhook.name,\n avatar: data.webhook.avatar ?? null,\n };\n }\n\n if (typeof data.content === \"string\") {\n this.content = data.content;\n }\n\n if (data.system) {\n this.type = data.system.type.toUpperCase() as Uppercase<\n SystemMessage[\"type\"]\n >;\n }\n\n if (data.edited) {\n this.editedTimestamp = Date.parse(data.edited);\n }\n\n return this;\n }\n\n /**\n * Gets the creation date of the message.\n *\n * @returns {Date} The date when the message was created.\n */\n get createdAt(): Date {\n return UUID.timestampOf(this.id);\n }\n\n /**\n * Gets the creation timestamp of the message in milliseconds.\n *\n * @returns {number} The timestamp of when the message was created.\n */\n get createdTimestamp(): number {\n return this.createdAt.getTime();\n }\n\n /**\n * Gets the date when the message was last edited.\n *\n * @returns {Date | null} The date of the last edit, or `null` if not edited.\n */\n get editedAt(): Date | null {\n return this.editedTimestamp ? new Date(this.editedTimestamp) : null;\n }\n\n /**\n * Checks if the message is a system message.\n *\n * @returns {boolean} `true` if the message is a system message, otherwise `false`.\n */\n get system(): boolean {\n return this.type !== \"TEXT\";\n }\n\n /**\n * Retrieves the author of the message.\n *\n * @returns {User | ServerMember | null} The user who authored the message, or `null` if not found.\n */\n get author():\n | User\n | ServerMember\n | Partial<User & { isWebhook: boolean }>\n | null {\n if (this.webhook) {\n return {\n bot: true,\n username: this.webhook.name,\n isWebhook: true,\n } as Partial<User & { isWebhook: boolean }>;\n }\n if (this.inServer()) {\n return (\n this.server?.members.cache.get(this.authorId) ??\n this.client.users.cache.get(this.authorId) ??\n null\n );\n }\n return this.client.users.cache.get(this.authorId) ?? null;\n }\n\n /**\n * Retrieves the channel where the message was sent.\n *\n * @returns {TextChannel | DMChannel | GroupChannel | VoiceChannel} The channel instance.\n */\n get channel(): TextChannel | DMChannel | GroupChannel | VoiceChannel {\n const channel = this.client.channels.cache.get(this.channelId);\n\n switch (channel?.type) {\n case ChannelTypes.TEXT:\n return channel as TextChannel;\n case ChannelTypes.DM:\n return channel as DMChannel;\n case ChannelTypes.GROUP:\n return channel as GroupChannel;\n case ChannelTypes.VOICE:\n return channel as VoiceChannel;\n default:\n return channel as TextChannel;\n }\n }\n\n /**\n * Retrieves the server ID associated with the message, if any.\n *\n * @returns {string | null} The server ID, or `null` if the message is not in a server.\n */\n get serverId(): string | null {\n const channel = this.channel;\n return channel.inServer() ? channel.serverId : null;\n }\n\n /**\n * Retrieves the server associated with the message, if any.\n *\n * @returns {Server | null} The server instance, or `null` if not found.\n */\n get server(): Server | null {\n return this.client.servers.cache.get(this.serverId as string) ?? null;\n }\n\n /**\n * Retrieves the server member who authored the message, if any.\n *\n * @returns {ServerMember | null} The server member instance, or `null` if not found.\n */\n get member(): ServerMember | null {\n return this.server?.members.cache.get(this.authorId) ?? null;\n }\n\n /**\n * Gets the URL of the message.\n *\n * @returns {string} The URL of the message.\n */\n get url(): string {\n return `https://app.stoat.chat/${\n this.serverId ? `server/${this.serverId}` : \"\"\n }/channel/${this.channelId}/${this.id}`;\n }\n\n /**\n * Acknowledges the message.\n *\n * @returns {Promise<void>} A promise that resolves when the message is acknowledged.\n */\n ack(): Promise<void> {\n return this.channel.messages.ack(this);\n }\n\n /**\n * Deletes the message.\n *\n * @returns {Promise<void>} A promise that resolves when the message is deleted.\n */\n delete(): Promise<void> {\n return this.channel.messages.delete(this);\n }\n\n /**\n * Replies to the message.\n *\n * @param {string} content - The content of the reply.\n * @param {boolean} [mention=true] - Whether to mention the original message author.\n * @returns {Promise<Message>} A promise that resolves with the sent reply message.\n */\n reply(\n content: MessageOptions | string,\n mention: boolean = true,\n ): Promise<MessageStruct> {\n return this.channel.messages.send({\n ...(typeof content === \"object\" ? content : { content }),\n replies: [{ id: this.id, mention }],\n });\n }\n\n /**\n * Edits the message.\n *\n * @param {MessageEditOptions | string} options - The new content or edit options.\n * @returns {Promise<void>} A promise that resolves when the message is edited.\n */\n edit(options: MessageEditOptions | string): Promise<void> {\n return this.channel.messages.edit(this, options);\n }\n\n /**\n * Fetches the latest data for the message.\n *\n * @returns {Promise<Message>} A promise that resolves with the updated message instance.\n */\n fetch(): Promise<MessageStruct> {\n return this.channel.messages.fetch(this.id);\n }\n\n /**\n * Adds a reaction to the message.\n *\n * @param {string} emoji - The emoji to react with.\n * @returns {Promise<void>} A promise that resolves when the reaction is added.\n */\n addReaction(emoji: string): Promise<void> {\n return this.channel.messages.addReaction(this, emoji);\n }\n\n /**\n * Removes a reaction from the message.\n *\n * @param {string} emoji - The emoji to remove the reaction for.\n * @param {object} [options] - Options for removing the reaction.\n * @param {string} [options.user_id] - The user ID to remove the reaction for. If not provided, removes the reaction for the current user.\n * @param {boolean} [options.remove_all=false] - Whether to remove all of the specified reaction for the message.\n * @returns {Promise<void>} A promise that resolves when the reaction is removed.\n */\n removeReaction(\n emoji: string,\n options?: { user_id?: string; remove_all?: boolean },\n ): Promise<void> {\n return this.channel.messages.removeReaction(\n this,\n emoji,\n options?.user_id ?? undefined,\n options?.remove_all ?? false,\n );\n }\n\n /**\n * Removes all reactions from the message.\n *\n * @returns {Promise<void>} A promise that resolves when all reactions are removed.\n */\n removeAllReactions(): Promise<void> {\n return this.channel.messages.removeAllReactions(this);\n }\n\n async pin(): Promise<void> {\n await this.client.api.put(\n `/channels/${this.channelId}/messages/${this.id}/pin`,\n );\n }\n\n async unpin(): Promise<void> {\n await this.client.api.delete(\n `/channels/${this.channelId}/messages/${this.id}/pin`,\n );\n }\n\n inServer(): this is this & {\n serverId: string;\n server: Server;\n channel: TextChannel;\n } {\n return this.channel.inServer();\n }\n\n /**\n * Converts the message to a string representation.\n *\n * @returns {string} The content of the message.\n */\n toString(): string {\n return this.content;\n }\n}\n","import { Base } from \"./base\";\nimport type { File } from \"revolt-api\";\nimport type { Client } from \"../client/client\";\n\nconst CDN_BASE_URL = \"https://cdn.stoatusercontent.com\";\n\nexport class Attachment extends Base {\n filename!: string;\n type!: string;\n size!: number;\n metadata!: File[\"metadata\"];\n tag?: string;\n\n constructor(client: Client, data: File) {\n super(client);\n this._patch(data);\n }\n\n protected _patch(data: File): this {\n super._patch(data);\n if (data.filename) this.filename = data.filename;\n if (data.content_type) this.type = data.content_type;\n if (typeof data.size === \"number\") this.size = data.size;\n if (data.metadata) this.metadata = data.metadata;\n if (data.tag) this.tag = data.tag;\n return this;\n }\n\n get url(): string {\n if (this.tag) {\n return `${CDN_BASE_URL}/${this.tag}/${this.id}/original`;\n }\n return `${CDN_BASE_URL}/attachments/${this.id}/${this.filename}`;\n }\n}\n","import { Base } from \"./base\";\n\n/**\n * Enum representing the possible presence statuses of a user.\n */\nexport enum Status {\n Online = \"Online\",\n Idle = \"Idle\",\n Focus = \"Focus\",\n Busy = \"Busy\",\n Invisible = \"Invisible\",\n}\n\n/**\n * Represents the presence of a user, including their status and custom text.\n *\n * @extends Base\n */\nexport class Presence extends Base {\n /** The custom status text of the user, or `null` if none is set. */\n text: string | null = null;\n\n /** The current status of the user (e.g., Online, Idle, Busy, Invisible). */\n status = Status.Invisible;\n}\n","import type { Server as APIServer, FieldsServer } from \"revolt-api\";\nimport { Attachment, Base, Category, Emoji, ServerMember, User } from \"./index\";\nimport type { Client } from \"../client/client\";\nimport {\n RoleManager,\n ServerChannelManager,\n ServerMemberManager,\n} from \"../managers/index\";\nimport { FullPermissions, UUID } from \"../utils/index\";\nimport { cdnUrl } from \"../utils/constants\";\nimport { Readable } from \"node:stream\";\nimport FormData from \"form-data\";\nimport axios from \"axios\";\n\nexport class Server extends Base {\n name!: string;\n description: string | null = null;\n ownerId!: string;\n members = new ServerMemberManager(this);\n channels = new ServerChannelManager(this);\n roles = new RoleManager(this);\n icon: Attachment | null = null;\n banner: Attachment | null = null;\n analytics = false;\n discoverable = false;\n nsfw = false;\n permissions!: FullPermissions;\n categories = new Map<string, Category>();\n emojis = new Map<string, Emoji>();\n\n constructor(client: Client, data: APIServer) {\n super(client);\n this._patch(data);\n }\n\n protected _patch(data: APIServer, clear: FieldsServer[] = []): this {\n super._patch(data);\n\n if (Array.isArray(data.categories)) {\n this.categories.clear();\n for (const cat of data.categories) {\n const category = new Category(this, cat);\n this.categories.set(category.id, category);\n }\n }\n\n if (data.icon) {\n this.icon = new Attachment(this.client, data.icon);\n }\n\n if (data.banner) {\n this.banner = new Attachment(this.client, data.banner);\n }\n\n if (data.owner) {\n this.ownerId = data.owner;\n }\n\n if (data.name) {\n this.name = data.name;\n }\n\n if (\"description\" in data) {\n this.description = data.description ?? null;\n }\n\n if (Array.isArray(data.channels)) {\n for (const id of data.channels) {\n const channel = this.client.channels.cache.get(id);\n if (channel?.inServer()) this.channels.cache.set(channel.id, channel);\n }\n }\n\n if (typeof data.roles === \"object\") {\n for (const [id, raw] of Object.entries(data.roles)) {\n this.roles._add(Object.assign(raw, { id }));\n }\n }\n\n if (typeof data.default_permissions === \"number\") {\n this.permissions = new FullPermissions(data.default_permissions).freeze();\n }\n\n if (typeof data.analytics === \"boolean\") this.analytics = data.analytics;\n if (typeof data.discoverable === \"boolean\") {\n this.discoverable = data.discoverable;\n }\n if (typeof data.nsfw === \"boolean\") this.nsfw = data.nsfw;\n\n for (const field of clear) {\n if (field === \"Icon\") this.icon = null;\n if (field === \"Description\") this.description = null;\n if (field === \"Banner\") this.banner = null;\n }\n\n return this;\n }\n\n get me(): ServerMember | null {\n return this.members.cache.get(this.client.user?.id as string) ?? null;\n }\n\n get createdAt(): Date {\n return UUID.timestampOf(this.id);\n }\n\n get createdTimestamp(): number {\n return this.createdAt.getTime();\n }\n\n get owner(): User | null {\n return this.client.users.cache.get(this.ownerId) ?? null;\n }\n\n iconURL(): string | undefined {\n if (!this.icon?.id) return undefined;\n const baseUrl = this.client.options.rest?.instanceCDNURL || cdnUrl;\n return `${baseUrl}/icons/${this.icon.id}/original`;\n }\n\n bannerURL(): string | undefined {\n if (!this.banner?.id) return undefined;\n const baseUrl = this.client.options.rest?.instanceCDNURL || cdnUrl;\n return `${baseUrl}/banners/${this.banner.id}/original`;\n }\n\n async setName(name: string): Promise<void> {\n await this.client.api.patch(`/servers/${this.id}`, { body: { name } });\n }\n\n async setDescription(description: string | null): Promise<void> {\n await this.client.api.patch(`/servers/${this.id}`, {\n body: { description },\n });\n }\n\n async setIcon(icon: Readable | Buffer | string): Promise<void> {\n const formData = new FormData();\n if (typeof icon === \"string\") {\n const response = await axios.get(icon, { responseType: \"stream\" });\n formData.append(\"icon\", response.data);\n } else if (icon instanceof Buffer) {\n formData.append(\"icon\", icon, { filename: \"icon.png\" });\n } else {\n formData.append(\"icon\", icon);\n }\n await this.client.api.put(`/servers/${this.id}/icon`, { body: formData });\n }\n\n async setBanner(banner: Readable | Buffer | string): Promise<void> {\n const formData = new FormData();\n if (typeof banner === \"string\") {\n const response = await axios.get(banner, { responseType: \"stream\" });\n formData.append(\"banner\", response.data);\n } else if (banner instanceof Buffer) {\n formData.append(\"banner\", banner, { filename: \"banner.png\" });\n } else {\n formData.append(\"banner\", banner);\n }\n await this.client.api.put(`/servers/${this.id}/banner`, { body: formData });\n }\n\n async leave(): Promise<void> {\n await this.client.api.delete(`/servers/${this.id}/members/@me`);\n }\n\n async delete(): Promise<void> {\n await this.client.api.delete(`/servers/${this.id}`);\n }\n\n async createInvite(): Promise<string> {\n const defaultChannel = this.channels.cache.values().next().value;\n if (!defaultChannel) {\n throw new Error(\"No channel available to create invite\");\n }\n const data = await this.client.api.post(\n `/channels/${defaultChannel.id}/invites`,\n );\n return (data as any).code;\n }\n\n async fetchInvites(): Promise<any[]> {\n return await this.client.api.get(`/servers/${this.id}/invites`);\n }\n\n async fetchBans(): Promise<any[]> {\n return await this.client.api.get(`/servers/${this.id}/bans`);\n }\n\n toString(): string {\n return this.name;\n }\n}\n","import type { Role as APIRole, FieldsRole } from \"revolt-api\";\nimport { Base, Overwrite, Server } from \"./index\";\nimport { FullPermissions, UUID } from \"../utils/index\";\nimport { editableRole } from \"../utils/types\";\n\nexport class Role extends Base {\n name!: string;\n color: string | null = null;\n hoist = false;\n rank!: number;\n overwrite!: Overwrite;\n\n constructor(\n public server: Server,\n data: APIRole & { id: string },\n ) {\n super(server.client);\n this._patch(data);\n }\n\n protected _patch(\n data: APIRole & { _id?: string },\n clear: FieldsRole[] = [],\n ): this {\n super._patch(data);\n\n if (data.name) this.name = data.name;\n\n if (typeof data.hoist === \"boolean\") this.hoist = data.hoist;\n\n if (typeof data.rank === \"number\") this.rank = data.rank;\n\n if (\"colour\" in data) this.color = data.colour ?? null;\n\n if (data.permissions) {\n const { a, d } = data.permissions;\n this.overwrite = {\n allow: new FullPermissions(a),\n deny: new FullPermissions(d),\n };\n }\n\n for (const field of clear) {\n if (field === \"Colour\") this.color = null;\n }\n\n return this;\n }\n\n get createdAt(): Date {\n return UUID.timestampOf(this.id);\n }\n\n get createdTimestamp(): number {\n return this.createdAt.getTime();\n }\n\n get permissions(): Overwrite {\n return this.overwrite;\n }\n\n delete(): Promise<void> {\n return this.server.roles.delete(this);\n }\n\n edit(data: editableRole): Promise<Role> {\n return this.server.roles.edit(this, data);\n }\n\n setName(name: string): Promise<Role> {\n return this.edit({ name });\n }\n\n setColor(colour: string | null): Promise<Role> {\n return this.edit({ colour: colour as string });\n }\n\n setHoist(hoist: boolean): Promise<Role> {\n return this.edit({ hoist });\n }\n\n setRank(rank: number): Promise<Role> {\n return this.edit({ rank });\n }\n\n setPermissions(\n allow: Array<keyof typeof FullPermissions.FLAGS>,\n deny?: Array<keyof typeof FullPermissions.FLAGS>,\n ): Promise<Role> {\n return this.edit({\n permissions: { a: allow, d: deny || [] },\n });\n }\n\n toString(): string {\n return `<@&${this.id}>`;\n }\n}\n","import { Base } from \"./base\";\nimport type {\n DMChannel,\n GroupChannel,\n ServerChannel,\n TextChannel,\n VoiceChannel,\n voiceParticipant,\n} from \"./index\";\nimport { ChannelTypes, UUID } from \"../utils/index\";\nimport { CreateChannelOptions } from \"../managers/serverChannelManager\";\nimport {\n editablePermissions,\n createWebhookResponse,\n editWebhookOptions,\n} from \"../utils/types\";\nimport { FullPermissions } from \"../utils/permissions\";\nimport { MessageOptions } from \"../managers/messageManager\";\nimport { Message as APIMessage } from \"revolt-api\";\nimport { Readable } from \"stream\";\n\n/**\n * Represents a generic communication channel in the client.\n * This abstract class provides a base structure and common functionality\n * for all types of channels, such as text, voice, group, and server channels.\n *\n * @abstract\n * @extends Base\n *\n * @property {ChannelTypes | \"UNKNOWN\"} type - The type of the channel. Defaults to \"UNKNOWN\".\n * @property {number} createdTimestamp - The timestamp (in milliseconds) when the channel was created.\n * @property {Date} createdAt - The date and time when the channel was created.\n */\nexport abstract class Channel extends Base {\n type: ChannelTypes | \"UNKNOWN\" = \"UNKNOWN\";\n voice?: Map<string, voiceParticipant> = new Map();\n\n /**\n * Gets the timestamp (in milliseconds) when the channel was created.\n *\n * @returns {number} The timestamp of the channel's creation.\n */\n get createdTimestamp(): number {\n return this.createdAt.getTime();\n }\n\n /**\n * Gets the date and time when the channel was created.\n *\n * @returns {Date} The creation date of the channel.\n */\n get createdAt(): Date {\n return UUID.timestampOf(this.id);\n }\n\n /**\n * Deletes the current channel instance from the client's channel collection.\n *\n * This method interacts with the client's channel management system to remove\n * the channel. Once deleted, the channel will no longer be accessible through\n * the client.\n *\n * @returns {Promise<void>} A promise that resolves when the channel has been successfully deleted.\n *\n * @example\n * ```typescript\n * const channel = client.channels.get('1234567890');\n * if (channel) {\n * await channel.delete();\n * console.log('Channel deleted successfully.');\n * }\n * ```\n */\n delete(): Promise<void> {\n return this.client.channels.delete(this);\n }\n\n /**\n * Checks if the channel is a text-based channel.\n *\n * @returns {boolean} True if the channel is a text-based channel, otherwise false.\n */\n isText(): this is TextChannel | GroupChannel | DMChannel {\n return \"messages\" in this;\n }\n\n /**\n * Checks if the channel is a voice channel.\n *\n * @returns {boolean} True if the channel is a voice channel, otherwise false.\n */\n isVoice(): this is VoiceChannel {\n return this.type === ChannelTypes.VOICE;\n }\n\n /**\n * Checks if the channel is a group channel.\n *\n * @returns {boolean} True if the channel is a group channel, otherwise false.\n */\n isGroup(): this is GroupChannel {\n return this.type === ChannelTypes.GROUP;\n }\n\n /**\n * Checks if the channel is part of a server.\n *\n * @returns {boolean} True if the channel is a server channel, otherwise false.\n */\n inServer(): this is ServerChannel {\n return \"serverId\" in this;\n }\n\n /**\n * Converts the channel to a string representation.\n *\n * @returns {string} A string representation of the channel in the format `<#channelId>`.\n */\n toString(): string {\n return `<#${this.id}>`;\n }\n\n /**\n * Fetches the latest data for the channel from the client's channel collection.\n *\n * @param {boolean} [force=true] - Whether to force a fetch even if the channel is cached.\n * @returns {Promise<Channel>} A promise that resolves with the updated channel instance.\n */\n fetch(force = true): Promise<Channel> {\n return this.client.channels.fetch(this, { force });\n }\n\n async edit(\n data: Partial<CreateChannelOptions>,\n ): Promise<{ channel_type: string; _id: string; user: string }> {\n const id = this.id;\n if (!id) {\n throw new TypeError(\"INVALID_ID\");\n }\n\n const response = await this.client.api.patch(`/channels/${id}`, {\n body: data,\n });\n\n return response as { channel_type: string; _id: string; user: string };\n }\n\n /**\n * Sets role permissions for this channel.\n *\n * @param roleId - The ID of the role to set permissions for.\n * @param allow - Array of permissions to allow for the role.\n * @returns A promise that resolves when the permissions have been updated.\n *\n * @throws {TypeError} If the channel ID is invalid.\n *\n * @example\n * ```typescript\n * // Allow specific permissions\n * await channel.setRolePermissions(roleId, [\"ViewChannel\", \"SendMessage\"]);\n * ```\n */\n async setRolePermissions(\n roleId: string,\n allow: editablePermissions[\"a\"],\n ): Promise<void>;\n\n /**\n * Sets role permissions for this channel.\n *\n * @param roleId - The ID of the role to set permissions for.\n * @param allow - Array of permissions to allow for the role.\n * @param deny - Array of permissions to deny for the role.\n * @returns A promise that resolves when the permissions have been updated.\n *\n * @throws {TypeError} If the channel ID is invalid.\n *\n * @example\n * ```typescript\n * // Set both allow and deny permissions\n * await channel.setRolePermissions(roleId, [\"ViewChannel\"], [\"ManageMessages\"]);\n * ```\n */\n async setRolePermissions(\n roleId: string,\n allow: editablePermissions[\"a\"],\n deny: editablePermissions[\"d\"],\n ): Promise<void>;\n\n /**\n * Sets role permissions for this channel.\n *\n * @param roleId - The ID of the role to set permissions for.\n * @param options - Object containing allow and/or deny permissions.\n * @returns A promise that resolves when the permissions have been updated.\n *\n * @throws {TypeError} If the channel ID is invalid or if both allow and deny are undefined.\n *\n * @example\n * ```typescript\n * // Allow specific permissions only\n * await channel.setRolePermissions(roleId, { allow: [\"ViewChannel\", \"SendMessage\"] });\n *\n * // Deny specific permissions only\n * await channel.setRolePermissions(roleId, { deny: [\"ManageMessages\"] });\n *\n * // Set both allow and deny permissions\n * await channel.setRolePermissions(roleId, {\n * allow: [\"ViewChannel\"],\n * deny: [\"ManageMessages\"]\n * });\n * ```\n */\n async setRolePermissions(\n roleId: string,\n options: {\n allow?: editablePermissions[\"a\"];\n deny?: editablePermissions[\"d\"];\n },\n ): Promise<void>;\n\n // Implementation\n async setRolePermissions(\n roleId: string,\n allowOrOptions?:\n | editablePermissions[\"a\"]\n | {\n allow?: editablePermissions[\"a\"];\n deny?: editablePermissions[\"d\"];\n },\n deny?: editablePermissions[\"d\"],\n ): Promise<void> {\n const id = this.id;\n if (!id) {\n throw new TypeError(\"INVALID_ID\");\n }\n\n let allow: editablePermissions[\"a\"] | undefined;\n let denyPermissions: editablePermissions[\"d\"] | undefined;\n\n // Handle different overload patterns\n if (Array.isArray(allowOrOptions)) {\n // First two overloads: setRolePermissions(roleId, allow) or setRolePermissions(roleId, allow, deny)\n allow = allowOrOptions;\n denyPermissions = deny;\n } else if (allowOrOptions && typeof allowOrOptions === \"object\") {\n // Third overload: setRolePermissions(roleId, { allow?, deny? })\n allow = allowOrOptions.allow;\n denyPermissions = allowOrOptions.deny;\n\n if (allow === undefined && denyPermissions === undefined) {\n throw new TypeError(\n \"At least one of 'allow' or 'deny' must be provided in options\",\n );\n }\n } else {\n throw new TypeError(\"Invalid arguments provided\");\n }\n\n const requestBody: {\n allow?: number;\n deny?: number;\n } = {\n allow: 0,\n deny: 0,\n };\n\n if (allow !== undefined) {\n requestBody.allow = new FullPermissions(allow).bitfield;\n }\n if (denyPermissions !== undefined) {\n requestBody.deny = new FullPermissions(denyPermissions).bitfield;\n }\n\n await this.client.api.put(`/channels/${id}/permissions/${roleId}`, {\n body: { permissions: requestBody },\n });\n }\n\n /**\n * Sets default permissions for this channel.\n *\n * @param allow - Array of permissions to allow by default.\n * @returns A promise that resolves when the permissions have been updated.\n *\n * @throws {TypeError} If the channel ID is invalid.\n *\n * @example\n * ```typescript\n * // Allow specific permissions\n * await channel.setDefaultPermissions([\"ViewChannel\", \"SendMessage\"]);\n * ```\n */\n async setDefaultPermissions(allow: editablePermissions[\"a\"]): Promise<void>;\n\n /**\n * Sets default permissions for this channel.\n *\n * @param options - Object containing allow and/or deny permissions.\n * @returns A promise that resolves when the permissions have been updated.\n *\n * @throws {TypeError} If the channel ID is invalid or if both allow and deny are undefined.\n *\n * @example\n * ```typescript\n * // Allow specific permissions only\n * await channel.setDefaultPermissions({ allow: [\"ViewChannel\", \"SendMessage\"] });\n *\n * // Deny specific permissions only\n * await channel.setDefaultPermissions({ deny: [\"ManageMessages\"] });\n *\n * // Set both allow and deny permissions\n * await channel.setDefaultPermissions({\n * allow: [\"ViewChannel\"],\n * deny: [\"ManageMessages\"]\n * });\n * ```\n */\n async setDefaultPermissions(options: {\n allow?: editablePermissions[\"a\"];\n deny?: editablePermissions[\"d\"];\n }): Promise<void>;\n\n /**\n * Sets default permissions for this channel (legacy format).\n *\n * @param permissions - Object containing allow and deny permissions.\n * @returns A promise that resolves when the permissions have been updated.\n *\n * @throws {TypeError} If the channel ID is invalid.\n *\n * @example\n * ```typescript\n * // Legacy format\n * await channel.setDefaultPermissions({\n * a: [\"ViewChannel\"],\n * d: [\"ManageMessages\"]\n * });\n * ```\n */\n async setDefaultPermissions(permissions: editablePermissions): Promise<void>;\n\n // Implementation\n async setDefaultPermissions(\n allowOrOptionsOrPermissions?:\n | editablePermissions[\"a\"]\n | {\n allow?: editablePermissions[\"a\"];\n deny?: editablePermissions[\"d\"];\n }\n | editablePermissions,\n ): Promise<void> {\n const id = this.id;\n if (!id) {\n throw new TypeError(\"INVALID_ID\");\n }\n\n let allow: editablePermissions[\"a\"] | undefined;\n let deny: editablePermissions[\"d\"] | undefined;\n\n // Handle different overload patterns\n if (Array.isArray(allowOrOptionsOrPermissions)) {\n // First overload: setDefaultPermissions(allow)\n allow = allowOrOptionsOrPermissions;\n } else if (\n allowOrOptionsOrPermissions &&\n typeof allowOrOptionsOrPermissions === \"object\"\n ) {\n // Check if it's the legacy format (has 'a' or 'd' properties)\n if (\n \"a\" in allowOrOptionsOrPermissions ||\n \"d\" in allowOrOptionsOrPermissions\n ) {\n // Third overload: setDefaultPermissions({ a, d }) - legacy format\n const legacyPerms = allowOrOptionsOrPermissions as editablePermissions;\n allow = legacyPerms.a;\n deny = legacyPerms.d;\n } else {\n // Second overload: setDefaultPermissions({ allow?, deny? })\n const options = allowOrOptionsOrPermissions as {\n allow?: editablePermissions[\"a\"];\n deny?: editablePermissions[\"d\"];\n };\n allow = options.allow;\n deny = options.deny;\n\n if (allow === undefined && deny === undefined) {\n throw new TypeError(\n \"At least one of 'allow' or 'deny' must be provided in options\",\n );\n }\n }\n } else {\n throw new TypeError(\"Invalid arguments provided\");\n }\n\n const requestBody: {\n allow?: number;\n deny?: number;\n } = {};\n\n if (allow !== undefined) {\n requestBody.allow = new FullPermissions(allow).bitfield;\n }\n if (deny !== undefined) {\n requestBody.deny = new FullPermissions(deny).bitfield;\n }\n\n // Set defaults for undefined permissions\n if (requestBody.allow === undefined) {\n requestBody.allow = 0;\n }\n if (requestBody.deny === undefined) {\n requestBody.deny = 0;\n }\n\n await this.client.api.put(`/channels/${id}/permissions/default`, {\n body: { permissions: requestBody },\n });\n }\n\n /**\n * Creates a new webhook in this channel.\n *\n * @param name - The name of the webhook\n * @param avatar - Optional avatar for the webhook. Can be a URL string, Readable stream, or File object\n * @returns Promise resolving to the created webhook response\n *\n * @example\n * ```typescript\n * const webhook = await channel.createWebhook(\"My Webhook\", \"https://example.com/avatar.png\");\n * ```\n */\n async createWebhook(\n name: string,\n avatar?: Readable | string | File,\n ): Promise<createWebhookResponse> {\n return this.client.webhooks.create(this.id, name, avatar);\n }\n\n /**\n * Retrieves all webhooks for this channel.\n *\n * @returns Promise resolving to an array of webhook responses\n *\n * @example\n * ```typescript\n * const webhooks = await channel.getWebhooks();\n * console.log(`Found ${webhooks.length} webhooks`);\n * ```\n */\n async getWebhooks(): Promise<createWebhookResponse[]> {\n return this.client.webhooks.getAll(this.id);\n }\n\n /**\n * Retrieves a specific webhook by ID and token.\n *\n * @param webhookId - The ID of the webhook to retrieve\n * @param token - The token of the webhook\n * @returns Promise resolving to the webhook response\n *\n * @example\n * ```typescript\n * const webhook = await channel.getWebhook(\"webhookId\", \"webhookToken\");\n * console.log(`Webhook name: ${webhook.name}`);\n * ```\n */\n async getWebhook(\n webhookId: string,\n token: string,\n ): Promise<createWebhookResponse> {\n return this.client.webhooks.get(webhookId, token);\n }\n\n /**\n * Sends a message through a webhook in this channel.\n *\n * @param webhookId - The ID of the webhook to send the message through\n * @param token - The token of the webhook\n * @param content - The message content. Can be a string or MessageOptions object with attachments and embeds\n * @returns Promise resolving to the sent message\n *\n * @example\n * ```typescript\n * // Send a simple text message\n * await channel.sendWebhookMessage(\"webhookId\", \"token\", \"Hello, world!\");\n *\n * // Send a message with embeds and attachments\n * await channel.sendWebhookMessage(\"webhookId\", \"token\", {\n * content: \"Check out this image!\",\n * attachments: [\"https://example.com/image.png\"],\n * embeds: [myEmbed]\n * });\n * ```\n */\n async sendWebhookMessage(\n webhookId: string,\n token: string,\n content: MessageOptions | string,\n ): Promise<APIMessage> {\n return this.client.webhooks.send(webhookId, token, content);\n }\n\n /**\n * Deletes a webhook.\n *\n * @param webhookId - The ID of the webhook to delete\n * @param token - The token of the webhook\n * @returns Promise that resolves when the webhook is deleted\n *\n * @example\n * ```typescript\n * await channel.deleteWebhook(\"webhookId\", \"webhookToken\");\n * console.log(\"Webhook deleted successfully\");\n * ```\n */\n async deleteWebhook(webhookId: string, token: string): Promise<void> {\n return this.client.webhooks.delete(webhookId, token);\n }\n\n /**\n * Edits a webhook's properties.\n *\n * @param webhookId - The ID of the webhook to edit\n * @param token - The token of the webhook\n * @param options - The options to edit on the webhook\n * @returns Promise resolving to the updated webhook response\n *\n * @example\n * ```typescript\n * const updatedWebhook = await channel.editWebhook(\"webhookId\", \"token\", {\n * name: \"New Webhook Name\",\n * avatar: \"https://example.com/new-avatar.png\"\n * });\n * ```\n */\n async editWebhook(\n webhookId: string,\n token: string,\n options: editWebhookOptions,\n ): Promise<createWebhookResponse> {\n return this.client.webhooks.edit(webhookId, token, options);\n }\n\n /**\n * Retrieves partial information about a webhook using only its ID.\n * This method provides limited webhook information without requiring a token.\n *\n * @param webhookId - The ID of the webhook to retrieve partial information for\n * @returns Promise resolving to the webhook response with partial information\n *\n * @example\n * ```typescript\n * const partialWebhook = await channel.getPartialWebhook(\"webhookId\");\n * console.log(`Webhook name: ${partialWebhook.name}`);\n * ```\n */\n async getPartialWebhook(webhookId: string): Promise<createWebhookResponse> {\n return this.client.webhooks.getPartial(webhookId);\n }\n}\n","import type { Channel as APIChannel } from \"revolt-api\";\nimport { Channel, MessageStruct } from \"./index\";\nimport { TextBasedChannel } from \"./interfaces/baseChannel\";\nimport type { Client } from \"../client/client\";\nimport {\n MessageManager,\n MessageOptions,\n MessageResolvable,\n} from \"../index\";\nimport { ChannelTypes, DEFAULT_PERMISSION_DM } from \"../utils/index\";\n\ntype APIDirectChannel = Extract<APIChannel, { channel_type: \"DirectMessage\" }>;\n\n/**\n * Represents a direct message (DM) channel between users.\n *\n * @extends Channel\n */\nexport class DMChannel extends Channel implements TextBasedChannel {\n /** The type of the channel, which is always `DM` for direct message channels. */\n readonly type = ChannelTypes.DM;\n\n /** Whether the DM channel is currently active. */\n active!: boolean;\n\n /** The default permissions for the DM channel. */\n permissions = DEFAULT_PERMISSION_DM;\n\n /** Manages the messages in this DM channel. */\n messages = new MessageManager(this);\n\n /** The ID of the last message sent in this DM channel, if any. */\n lastMessageId: string | null = null;\n\n /**\n * Creates a new DMChannel instance.\n *\n * @param {Client} client - The client instance.\n * @param {APIDirectChannel} data - The raw data for the DM channel from the API.\n */\n constructor(client: Client, data: APIDirectChannel) {\n super(client);\n this._patch(data);\n }\n\n /**\n * Updates the DM channel instance with new data from the API.\n *\n * @param {APIDirectChannel} data - The raw data for the DM channel from the API.\n * @returns {this} The updated DM channel instance.\n * @protected\n */\n protected _patch(data: APIDirectChannel): this {\n super._patch(data);\n\n if (typeof data.active === \"boolean\") this.active = data.active;\n if (data.last_message_id) this.lastMessageId = data.last_message_id;\n\n return this;\n }\n\n /**\n * Retrieves the last message sent in this DM channel.\n *\n * @returns {Message | null} The last message, or `null` if no message exists.\n */\n get lastMessage(): MessageStruct | null {\n if (!this.lastMessageId) return null;\n return this.messages.cache.get(this.lastMessageId) ?? null;\n }\n\n /**\n * Deletes multiple messages from this DM channel.\n *\n * @param {MessageResolvable[] | Map<string, Message> | number} messages - The messages to delete. This can be an array of message resolvables, a map of messages, or a number indicating how many recent messages to delete.\n * @returns {Promise<void>} A promise that resolves when the messages have been successfully deleted.\n *\n * @example\n * ```typescript\n * await dmChannel.bulkDelete(10); // Deletes the last 10 messages.\n * ```\n */\n bulkDelete(\n messages: MessageResolvable[] | Map<string, MessageStruct> | number,\n ): Promise<void> {\n return this.messages.bulkDelete(messages);\n }\n\n /**\n * Sends a message to this DM channel.\n *\n * @param {MessageOptions | string} options - The message content or options for the message.\n * @returns {Promise<Message>} A promise that resolves with the sent message.\n *\n * @example\n * ```typescript\n * await dmChannel.send(\"Hello, world!\");\n * ```\n */\n send(options: MessageOptions | string): Promise<MessageStruct> {\n return this.messages.send(options);\n }\n}\n","import type { Channel as APIChannel } from \"revolt-api\";\nimport { Attachment, Channel, Invite, MessageStruct, User } from \"./index\";\nimport type { TextBasedChannel } from \"./interfaces/baseChannel\";\nimport type { Client } from \"../client/client\";\nimport {\n MessageManager,\n MessageOptions,\n MessageResolvable,\n UserResolvable,\n} from \"../managers/index.js\";\nimport { ChannelPermissions, ChannelTypes } from \"../utils/index\";\nimport { AudioPlayer } from \"../client/player\";\n\ntype APIGroupChannel = Extract<APIChannel, { channel_type: \"Group\" }>;\n\n/**\n * Represents a group channel, which allows multiple users to communicate.\n *\n * @extends Channel\n */\nexport class GroupChannel extends Channel implements TextBasedChannel {\n /** The type of the channel, which is always `GROUP` for group channels. */\n readonly type = ChannelTypes.GROUP;\n\n /** The name of the group channel. */\n name!: string;\n\n /** The description of the group channel, if any. */\n description: string | null = null;\n\n /** The ID of the user who owns the group channel. */\n ownerId!: string;\n\n /** The permissions for the group channel. */\n permissions!: Readonly<ChannelPermissions>;\n\n /** The icon of the group channel, if any. */\n icon: Attachment | null = null;\n\n /** Manages the messages in this group channel. */\n messages = new MessageManager(this);\n\n /** The ID of the last message sent in this group channel, if any. */\n lastMessageId: string | null = null;\n\n /** A map of user IDs to their corresponding `User` instances in the group channel. */\n users = new Map<string, User>();\n\n /** Whether the group channel is marked as NSFW (Not Safe For Work). */\n nsfw = false;\n\n /**\n * Creates a new GroupChannel instance.\n *\n * @param {client} client - The client instance.\n * @param {APIGroupChannel} data - The raw data for the group channel from the API.\n */\n constructor(client: Client, data: APIGroupChannel) {\n super(client);\n this._patch(data);\n }\n\n /**\n * Updates the group channel instance with new data from the API.\n *\n * @param {APIGroupChannel} data - The raw data for the group channel from the API.\n * @returns {this} The updated group channel instance.\n * @protected\n */\n protected _patch(data: APIGroupChannel): this {\n super._patch(data);\n\n if (\"description\" in data) {\n this.description = data.description ?? null;\n }\n\n if (Array.isArray(data.recipients)) {\n this.users.clear();\n for (const userId of data.recipients) {\n const user = this.client.users.cache.get(userId);\n if (user) this.users.set(user.id, user);\n }\n }\n\n if (typeof data.permissions === \"number\") {\n this.permissions = new ChannelPermissions(data.permissions).freeze();\n }\n\n if (data.owner) {\n this.ownerId = data.owner;\n }\n\n if (data.icon) {\n this.icon = new Attachment(this.client, data.icon);\n }\n\n if (data.name) {\n this.name = data.name;\n }\n\n if (data.last_message_id) this.lastMessageId = data.last_message_id;\n\n if (typeof data.nsfw === \"boolean\") this.nsfw = data.nsfw;\n\n return this;\n }\n\n /**\n * Retrieves the last message sent in this group channel.\n *\n * @returns {Message | null} The last message, or `null` if no message exists.\n */\n get lastMessage(): MessageStruct | null {\n if (!this.lastMessageId) return null;\n return this.messages.cache.get(this.lastMessageId) ?? null;\n }\n\n /**\n * Retrieves the owner of the group channel.\n *\n * @returns {User | null} The owner of the group channel, or `null` if not found.\n */\n get owner(): User | null {\n return this.client.users.cache.get(this.ownerId) ?? null;\n }\n\n /**\n * Deletes multiple messages from this group channel.\n *\n * @param {MessageResolvable[] | Map<string, Message> | number} messages - The messages to delete. This can be an array of message resolvables, a map of messages, or a number indicating how many recent messages to delete.\n * @returns {Promise<void>} A promise that resolves when the messages have been successfully deleted.\n *\n * @example\n * ```typescript\n * await groupChannel.bulkDelete(10); // Deletes the last 10 messages.\n * ```\n */\n bulkDelete(\n messages: MessageResolvable[] | Map<string, MessageStruct> | number,\n ): Promise<void> {\n return this.messages.bulkDelete(messages);\n }\n\n /**\n * Creates an invite for the group channel.\n *\n * @returns {Promise<Invite>} A promise that resolves with the created invite.\n *\n * @example\n * ```typescript\n * const invite = await groupChannel.createInvite();\n * console.log(`Invite created: ${invite}`);\n * ```\n */\n async createInvite(): Promise<Invite> {\n const data = await this.client.api.post(`/channels/${this.id}/invites`, {});\n return new Invite(\n this.client,\n data as { type: \"Group\"; _id: string; creator: string; channel: string },\n );\n }\n\n /**\n * Adds a user to the group channel.\n *\n * @param {UserResolvable} user - The user to add to the group channel.\n * @returns {Promise<void>} A promise that resolves when the user has been successfully added.\n *\n * @example\n * ```typescript\n * await groupChannel.add(user);\n * ```\n */\n async add(user: UserResolvable): Promise<void> {\n const id = this.client.users.resolveId(user);\n if (!id) throw new TypeError(\"INVALID_TYPE\");\n await this.client.api.put(`/channels/${this.id}/recipients/${id}`);\n }\n\n /**\n * Removes a user from the group channel.\n *\n * @param {UserResolvable} user - The user to remove from the group channel.\n * @returns {Promise<void>} A promise that resolves when the user has been successfully removed.\n *\n * @example\n * ```typescript\n * await groupChannel.remove(user);\n * ```\n */\n async remove(user: UserResolvable): Promise<void> {\n const id = this.client.users.resolveId(user);\n if (!id) throw new TypeError(\"INVALID_TYPE\");\n await this.client.api.delete(`/channels/${this.id}/recipients/${id}`);\n }\n\n /**\n * Leaves the group channel.\n *\n * @returns {Promise<void>} A promise that resolves when the group channel has been successfully left.\n *\n * @example\n * ```typescript\n * await groupChannel.leave();\n * ```\n */\n leave(): Promise<void> {\n return super.delete();\n }\n\n /**\n * Sends a message to this group channel.\n *\n * @param {MessageOptions | string} options - The message content or options for the message.\n * @returns {Promise<Message>} A promise that resolves with the sent message.\n *\n * @example\n * ```typescript\n * await groupChannel.send(\"Hello, group!\");\n * ```\n */\n send(options: MessageOptions | string): Promise<MessageStruct> {\n return this.messages.send(options);\n }\n\n /**\n * Creates and connects an AudioPlayer to this voice channel in one step.\n * This is a convenience method that combines createPlayer() and connect().\n *\n * @returns {Promise<AudioPlayer>} A promise that resolves to a connected AudioPlayer\n *\n * @example\n * ```typescript\n * const voiceChannel = await client.channels.fetch('voice-channel-id') as VoiceChannel;\n * const player = await voiceChannel.connect();\n *\n * // Already connected, ready to play\n * await player.playFromUrl('https://example.com/music.mp3');\n * ```\n */\n async connect(): Promise<AudioPlayer> {\n return this.client.voice.connectToChannel(this.id, this.id);\n }\n\n /** Disconnects the AudioPlayer from this voice channel's server. */\n async disconnect(): Promise<void> {\n return this.client.voice.disconnectFromChannel(this.id);\n }\n /** Stops the AudioPlayer in this voice channel's server. */\n async stop(): Promise<void> {\n return this.client.voice.stopPlayerInChannel(this.id);\n }\n /** Plays audio through the AudioPlayer connected to this voice channel.\n * @param source - The audio source (URL, file path, or stream)\n */\n async play(source: string): Promise<void> {\n const player = await this.getPlayer();\n if (!player) throw new Error(\"No active player found for this channel\");\n return player.play(source);\n }\n /** Retrieves the AudioPlayer associated with this voice channel, if any.\n * @returns {Promise<AudioPlayer | null>} A promise that resolves to the AudioPlayer or null if not found\n */\n async getPlayer(): Promise<AudioPlayer | null> {\n const player = this.client.voice[\"players\"].get(this.id);\n return player ?? null;\n }\n\n // iconURL(options?: { size: number }): string | null {\n // if (!this.icon) return null;\n // return this.client.api.cdn.icon(this.icon.id, options?.size);\n // }\n}\n","import { Base } from \"./base\";\nimport type { Invite as APIInvite } from \"revolt-api\";\nimport type { Server, User } from \"./index\";\nimport type { Client } from \"../client/client\";\n\n/**\n * Represents an invite to a server or channel.\n *\n * @extends Base\n */\nexport class Invite extends Base {\n /** The ID of the server associated with the invite, if any. */\n serverId: string | null = null;\n\n /** The ID of the user who created the invite. */\n inviterId!: string;\n\n /** The ID of the channel associated with the invite. */\n channelId!: string;\n\n /**\n * Creates a new Invite instance.\n *\n * @param {client} client - The client instance.\n * @param {APIInvite} data - The raw data for the invite from the API.\n */\n constructor(client: Client, data: APIInvite) {\n super(client);\n this._patch(data);\n }\n\n /**\n * Updates the invite instance with new data from the API.\n *\n * @param {APIInvite} data - The raw data for the invite from the API.\n * @returns {this} The updated invite instance.\n * @protected\n */\n protected _patch(data: APIInvite): this {\n super._patch(data);\n\n if (data.channel) this.channelId = data.channel;\n if (data.creator) this.inviterId = data.channel;\n\n return this;\n }\n\n /**\n * Retrieves the server associated with the invite.\n *\n * @returns {Server | null} The server associated with the invite, or `null` if not found.\n */\n get server(): Server | null {\n return this.client.servers.cache.get(this.serverId!) ?? null;\n }\n\n /**\n * Retrieves the channel associated with the invite.\n *\n * @returns {Channel | null} The channel associated with the invite, or `null` if not found.\n */\n get channel() {\n return this.client.channels.cache.get(this.channelId) ?? null;\n }\n\n /**\n * Retrieves the user who created the invite.\n *\n * @returns {User | null} The user who created the invite, or `null` if not found.\n */\n get inviter(): User | null {\n return this.client.users.cache.get(this.inviterId) ?? null;\n }\n\n // toString(): string {\n // return this.client.api.cdn.invite(this.id);\n // }\n}\n","import { MessageStruct, ServerMember, User } from \"./index\";\nimport type { Client } from \"../client/client\";\nimport { UserResolvable } from \"../managers/index\";\n\n/**\n * Represents the mentions in a message, including users and server members.\n */\nexport class Mentions {\n /** The client instance. */\n public readonly client: Client;\n\n /**\n * Creates a new Mentions instance.\n *\n * @param {Message} message - The message associated with the mentions.\n * @param {string[]} _users - An array of user IDs mentioned in the message.\n */\n constructor(\n public readonly message: MessageStruct,\n protected _users: string[],\n ) {\n this.client = message.client;\n }\n\n /**\n * Checks if a specific user is mentioned in the message.\n *\n * @param {UserResolvable} user - The user to check.\n * @returns {boolean} `true` if the user is mentioned, otherwise `false`.\n * @throws {TypeError} Throws an error if the user cannot be resolved.\n *\n * @example\n * ```typescript\n * if (mentions.has(someUser)) {\n * console.log(\"User is mentioned!\");\n * }\n * ```\n */\n has(user: UserResolvable): boolean {\n const id = this.client.users.resolveId(user);\n if (!id) throw new TypeError(\"INVALID_TYPE\");\n return this._users.includes(id);\n }\n\n /**\n * Retrieves the server members mentioned in the message.\n *\n * @returns {Map<string, ServerMember> | null} A map of user IDs to `ServerMember` instances, or `null` if the message is not in a server.\n *\n * @example\n * ```typescript\n * const members = mentions.members;\n * if (members) {\n * members.forEach(member => console.log(member.displayName));\n * }\n * ```\n */\n get members(): Map<string, ServerMember> | null {\n const server = this.message.server;\n\n if (!server) return null;\n\n const members = new Map<string, ServerMember>();\n\n for (const userId of this._users) {\n const member = server.members.cache.get(userId);\n if (member) members.set(member.id, member);\n }\n\n return members;\n }\n\n /**\n * Retrieves the users mentioned in the message.\n *\n * @returns {Map<string, User>} A map of user IDs to `User` instances.\n *\n * @example\n * ```typescript\n * const users = mentions.users;\n * users.forEach(user => console.log(user.username));\n * ```\n */\n get users(): Map<string, User> {\n const users = new Map<string, User>();\n\n for (const userId of this._users) {\n const user = this.client.users.cache.get(userId);\n if (user) users.set(user.id, user);\n }\n\n return users;\n }\n}\n","import type { Embed as APIEmbed, Special, SendableEmbed } from \"revolt-api\";\nimport type { Client } from \"../client/client\";\nimport { Readable } from \"stream\";\nimport axios from \"axios\";\nimport FormData from \"form-data\";\nimport { File } from \"node:buffer\";\nimport { CDNAttachmentResponse } from \"../utils/types\";\n\nexport type Embed = APIEmbed;\nexport type EmbedImage = Extract<Embed, { type: \"Image\" }>;\nexport type EmbedVideo = Extract<Embed, { type: \"Video\" }>;\nexport type EmbedSpecial = Special;\n\n/**\n * Represents a message embed, which can include rich content such as titles, descriptions, URLs, and media.\n */\nexport class MessageEmbed {\n #url?: string;\n #title?: string;\n #description?: string;\n #icon_url?: string;\n #color?: string;\n #media?: Readable | string | File;\n\n /**\n * Sets the title of the embed.\n *\n * @param {string} title - The title to set.\n * @returns {this} The updated `MessageEmbed` instance.\n */\n setTitle(title: string): this {\n this.#title = title;\n return this;\n }\n\n /**\n * Sets the icon URL of the embed.\n *\n * @param {string} iconURL - The URL of the icon to set.\n * @returns {this} The updated `MessageEmbed` instance.\n */\n setIcon(iconURL: string): this {\n this.#icon_url = iconURL;\n return this;\n }\n\n /**\n * Sets the color of the embed.\n *\n * @param {string} color - The color to set (e.g., a hex code).\n * @returns {this} The updated `MessageEmbed` instance.\n */\n setColor(color: string): this {\n this.#color = color;\n return this;\n }\n\n /**\n * Sets the description of the embed.\n *\n * @param {string} description - The description to set.\n * @returns {this} The updated `MessageEmbed` instance.\n */\n setDescription(description: string): this {\n this.#description = description;\n return this;\n }\n\n /**\n * Sets the URL of the embed.\n *\n * @param {string} url - The URL to set.\n * @returns {this} The updated `MessageEmbed` instance.\n */\n setURL(url: string): this {\n this.#url = url;\n return this;\n }\n\n /**\n * Sets the media (e.g., image or video) of the embed.\n *\n * @param {Readable | string | File} media - The media URL, File or Stream to set.\n * @returns {this} The updated `MessageEmbed` instance.\n */\n setMedia(media: Readable | string | File): this {\n this.#media = media;\n return this;\n }\n\n /**\n *\n * @param client The client instance used to send the embed.\n * @returns SendableEmbed\n * Converts the embed to a JSON object that can be sent to the API, including media handling.\n */\n async toJSONWithMedia(client: Client): Promise<SendableEmbed> {\n const embed: SendableEmbed = {\n title: this.#title,\n icon_url: this.#icon_url,\n colour: this.#color,\n description: this.#description,\n url: this.#url,\n };\n\n if (this.#media) {\n let att = this.#media;\n const data = new FormData();\n if (typeof att === \"string\") {\n const readableStream = (await axios.get(att, {\n responseType: \"stream\",\n })) as { data: Readable };\n data.append(\"file\", readableStream.data, {\n filename: att.split(\"/\").pop(),\n });\n }\n\n if (att instanceof Readable) {\n data.append(\"file\", att);\n }\n\n if (att instanceof File) {\n const buffer = Buffer.from(await att.arrayBuffer());\n data.append(\"file\", buffer, { filename: att.name });\n }\n\n await client.cdn.post(\"/attachments\", data).then((attachment: any) => {\n const { id } = attachment as CDNAttachmentResponse;\n embed.media = id;\n });\n }\n\n return embed;\n }\n\n /**\n * Converts the embed to a JSON object that can be sent to the API.\n *\n * @returns {SendableEmbed} The JSON representation of the embed.\n */\n toJSON(): SendableEmbed {\n return {\n title: this.#title,\n icon_url: this.#icon_url,\n colour: this.#color,\n description: this.#description,\n url: this.#url,\n media: this.#media?.toString(),\n };\n }\n}\n","import type { Channel as APIChannel } from \"revolt-api\";\nimport { Channel, MessageStruct, User } from \"./index\";\nimport { TextBasedChannel } from \"./interfaces/baseChannel\";\nimport type { Client } from \"../client/client\";\nimport {\n MessageManager,\n MessageOptions,\n MessageResolvable,\n} from \"../managers/index\";\nimport { ChannelTypes } from \"../utils/index\";\n\ntype APINotesChannel = Extract<APIChannel, { channel_type: \"SavedMessages\" }>;\n\n/**\n * Represents a notes channel, which is used for saving personal messages.\n *\n * @extends Channel\n */\nexport class NotesChannel extends Channel implements TextBasedChannel {\n /** The type of the channel, which is always `NOTES` for notes channels. */\n readonly type = ChannelTypes.NOTES;\n\n /** The ID of the user associated with the notes channel. */\n userId!: string;\n\n /** The ID of the last message sent in this notes channel, if any. */\n lastMessageId: string | null = null;\n\n /** Manages the messages in this notes channel. */\n messages = new MessageManager(this);\n\n /**\n * Creates a new NotesChannel instance.\n *\n * @param {client} client - The client instance.\n * @param {APINotesChannel} data - The raw data for the notes channel from the API.\n */\n constructor(client: Client, data: APINotesChannel) {\n super(client);\n this._patch(data);\n }\n\n /**\n * Updates the notes channel instance with new data from the API.\n *\n * @param {APINotesChannel} data - The raw data for the notes channel from the API.\n * @returns {this} The updated notes channel instance.\n * @protected\n */\n protected _patch(data: APINotesChannel): this {\n super._patch(data);\n\n if (data.user) {\n this.userId = data.user;\n }\n\n return this;\n }\n\n /**\n * Sends a message to this notes channel.\n *\n * @param {MessageOptions | string} options - The message content or options for the message.\n * @returns {Promise<Message>} A promise that resolves with the sent message.\n *\n * @example\n * ```typescript\n * await notesChannel.send(\"This is a saved message.\");\n * ```\n */\n send(options: MessageOptions | string): Promise<MessageStruct> {\n return this.messages.send(options);\n }\n\n /**\n * Deletes multiple messages from this notes channel.\n *\n * @param {MessageResolvable[] | Map<string, Message> | number} messages - The messages to delete. This can be an array of message resolvables, a map of messages, or a number indicating how many recent messages to delete.\n * @returns {Promise<void>} A promise that resolves when the messages have been successfully deleted.\n *\n * @example\n * ```typescript\n * await notesChannel.bulkDelete(5); // Deletes the last 5 messages.\n * ```\n */\n bulkDelete(\n messages: MessageResolvable[] | Map<string, MessageStruct> | number,\n ): Promise<void> {\n return this.messages.bulkDelete(messages);\n }\n\n /**\n * Retrieves the last message sent in this notes channel.\n *\n * @returns {Message | null} The last message, or `null` if no message exists.\n */\n get lastMessage(): MessageStruct | null {\n if (!this.lastMessageId) return null;\n return this.messages.cache.get(this.lastMessageId) ?? null;\n }\n\n /**\n * Retrieves the user associated with this notes channel.\n *\n * @returns {User} The user associated with the notes channel.\n */\n get user(): User {\n return this.client.user!;\n }\n}\n","import type { FieldsChannel } from \"revolt-api\";\nimport {\n Attachment,\n Category,\n Channel,\n Invite,\n MessageStruct,\n Server,\n} from \"./index\";\nimport type { Client } from \"../client/client\";\nimport { FullPermissions } from \"../utils/index\";\nimport { APIServerChannel } from \"../types\";\nimport { MessageManager, MessageOptions } from \"../managers\";\nimport { AudioPlayer } from \"../client/player\";\n\nexport interface Overwrite {\n allow: FullPermissions;\n deny: FullPermissions;\n}\n\n/**\n * Represents a server channel, which can be a text or voice channel.\n *\n * @extends Channel\n */\nexport class ServerChannel extends Channel {\n /** The name of the channel. */\n name!: string;\n\n /** The ID of the server this channel belongs to. */\n serverId!: string;\n\n /** The description of the channel, or `null` if none is set. */\n description: string | null = null;\n\n /** The icon of the channel, or `null` if none is set. */\n icon: Attachment | null = null;\n\n /** Manages the messages in this Server channel. */\n messages = new MessageManager(this);\n\n /** The permission overwrites for the channel. */\n overwrites = new Map<string, Overwrite>();\n\n /** Whether the channel is marked as NSFW (Not Safe For Work). */\n nsfw = false;\n\n /**\n * Creates a new ServerChannel instance.\n *\n * @param {client} client - The client instance.\n * @param {APIServerChannel} data - The raw data for the server channel from the API.\n */\n constructor(client: Client, data: APIServerChannel) {\n super(client);\n this._patch(data);\n }\n\n /**\n * Updates the server channel instance with new data from the API.\n *\n * @param {APIServerChannel} data - The raw data for the server channel from the API.\n * @param {FieldsChannel[]} [clear=[]] - Fields to clear in the channel.\n * @returns {this} The updated server channel instance.\n * @protected\n */\n protected _patch(data: APIServerChannel, clear: FieldsChannel[] = []): this {\n super._patch(data);\n\n if (data.name) this.name = data.name;\n\n if (data.server) this.serverId = data.server;\n\n if (\"description\" in data) this.description = data.description ?? null;\n\n if (data.icon) this.icon = new Attachment(this.client, data.icon);\n\n if (typeof data.nsfw === \"boolean\") this.nsfw = data.nsfw;\n\n if (data.role_permissions) {\n this.overwrites.clear();\n for (const [id, { a, d }] of Object.entries(data.role_permissions)) {\n this.overwrites.set(id, {\n allow: new FullPermissions(a),\n deny: new FullPermissions(d),\n });\n }\n }\n\n for (const field of clear) {\n if (field === \"Icon\") this.icon = null;\n if (field === \"Description\") this.description = null;\n }\n\n return this;\n }\n\n /**\n * Creates an invite for the server channel.\n *\n * @returns {Promise<Invite>} A promise that resolves with the created invite.\n *\n * @example\n * ```typescript\n * const invite = await serverChannel.createInvite();\n * console.log(`Invite created: ${invite}`);\n * ```\n */\n async createInvite(): Promise<Invite> {\n const data = await this.client.api.post(`/channels/${this.id}/invites`, {});\n return new Invite(\n this.client,\n data as\n | {\n type: \"Server\";\n _id: string;\n server: string;\n creator: string;\n channel: string;\n }\n | { type: \"Group\"; _id: string; creator: string; channel: string },\n );\n }\n\n // iconURL(options?: { size: number }): string | null {\n // return this.icon\n // ? this.client.api.cdn.icon(this.icon.id, options?.size)\n // : null;\n // }\n\n /**\n * Retrieves the server this channel belongs to.\n *\n * @returns {Server} The server instance.\n */\n get server(): Server {\n return this.client.servers.cache.get(this.serverId)!;\n }\n\n /**\n * Sends a message to this Server channel.\n *\n * @param {MessageOptions | string} options - The message content or options for the message.\n * @returns {Promise<Message>} A promise that resolves with the sent message.\n *\n * @example\n * ```typescript\n * await serverChannel.send(\"Hello, world!\");\n * ```\n */\n send(options: MessageOptions | string): Promise<MessageStruct> {\n return this.messages.send(options);\n }\n\n /**\n * Retrieves the category this channel belongs to, if any.\n *\n * @returns {Category | null} The category instance, or `null` if the channel is not in a category.\n */\n get category(): Category | null {\n return (\n Array.from(this.server.categories.values()).find((cat) =>\n cat.children.has(this.id),\n ) ?? null\n );\n }\n\n async setName(name: string): Promise<void> {\n await this.edit({ name } as any);\n }\n\n async setDescription(description: string | null): Promise<void> {\n await this.edit({ description } as any);\n }\n\n async setNSFW(nsfw: boolean): Promise<void> {\n await this.edit({ nsfw } as any);\n }\n}\n","import type { Member as APIMember, FieldsMember } from \"revolt-api\";\nimport { Base } from \"./base\";\nimport { Attachment, Server, User, Role, Presence } from \"./index\";\nimport type { Client } from \"../client/client\";\nimport { FullPermissions, Badges } from \"../utils\";\n\n/**\n * Represents a member of a server.\n *\n * @extends Base\n */\nexport class ServerMember extends Base {\n /** The ID of the server this member belongs to. */\n serverId!: string;\n\n /** The nickname of the member, or `null` if none is set. */\n nickname: string | null = null;\n\n /** The avatar of the member, or `null` if none is set. */\n avatar: Attachment | null = null;\n\n /** roles assigned to the member */\n roles: Role[] = [];\n\n /**\n * Creates a new ServerMember instance.\n *\n * @param {client} client - The client instance.\n * @param {APIMember} data - The raw data for the server member from the API.\n */\n constructor(client: Client, data: APIMember) {\n super(client);\n this._patch(data);\n }\n\n /**\n * Updates the server member instance with new data from the API.\n *\n * @param {APIMember} data - The raw data for the server member from the API.\n * @param {FieldsMember[]} [clear=[]] - Fields to clear in the server member.\n * @returns {this} The updated server member instance.\n * @protected\n */\n protected _patch(data: APIMember, clear: FieldsMember[] = []): this {\n super._patch(data);\n\n if (\"nickname\" in data) {\n this.nickname = data.nickname ?? null;\n }\n\n if (data.avatar) {\n this.avatar = new Attachment(this.client, data.avatar);\n }\n\n if (data._id) {\n this.serverId = data._id.server;\n this.id = data._id.user;\n }\n\n if (Array.isArray(data.roles)) {\n if (!data.roles.length) this.roles = [];\n else {\n this.roles = data.roles\n .map((roleId) => {\n const role = this.server.roles.cache.get(roleId);\n if (!role) {\n return null;\n }\n return role;\n })\n .filter((role): role is Role => role !== null);\n }\n }\n\n for (const field of clear) {\n if (field === \"Avatar\") this.avatar = null;\n if (field === \"Nickname\") this.nickname = null;\n }\n\n return this;\n }\n\n /**\n * Sets the nickname of the server member.\n *\n * @param {string} [nickname] - The new nickname to set, or `undefined` to clear the nickname.\n * @returns {Promise<this>} A promise that resolves with the updated server member instance.\n *\n * @example\n * ```typescript\n * await member.setNickname(\"NewNickname\");\n * ```\n */\n async setNickname(nickname?: string): Promise<this> {\n await this.server.members.edit(this, { nickname });\n return this;\n }\n\n /**\n * adds a role to the server member.\n * @param roleId - The ID of the role to add to the member.\n * @returns\n */\n async addRole(roleId: string): Promise<this> {\n const currentRoles = this.roles.map((role) => role.id);\n if (currentRoles.includes(roleId)) {\n return this; // Role already exists, no need to add it again\n }\n await this.server.members.edit(this, {\n roles: [...currentRoles, roleId],\n });\n return this;\n }\n\n /**\n * Removes a role from the server member.\n *\n * @param {string} roleId - The ID of the role to remove from the member.\n * @returns {Promise<this>} A promise that resolves with the updated server member instance.\n *\n * @example\n * ```typescript\n * await member.removeRole(\"roleId\");\n * ```\n */\n async removeRole(roleId: string): Promise<this> {\n const currentRoles = this.roles.map((role) => role.id);\n if (!currentRoles.includes(roleId)) {\n return this; // Role does not exist, no need to remove it\n }\n await this.server.members.edit(this, {\n roles: currentRoles.filter((id) => id !== roleId),\n });\n return this;\n }\n\n /**\n * Bans the server member.\n *\n * @param {string} [reason] - The reason for the ban.\n * @returns {Promise<void>} A promise that resolves when the member is banned.\n *\n * @example\n * ```typescript\n * await member.ban(\"Violation of rules\");\n * ```\n */\n ban(reason?: string): Promise<void> {\n return this.server.members.ban(this, reason);\n }\n\n /**\n * Kicks the server member.\n *\n * @returns {Promise<void>} A promise that resolves when the member is kicked.\n *\n * @example\n * ```typescript\n * await member.kick();\n * ```\n */\n kick(): Promise<void> {\n return this.server.members.kick(this);\n }\n\n /**\n * Leaves the server.\n *\n * @returns {Promise<void>} A promise that resolves when the member leaves the server.\n *\n * @example\n * ```typescript\n * await member.leave();\n * ```\n */\n leave(): Promise<void> {\n return this.client.servers.delete(this.serverId);\n }\n\n /**\n * Gets the effective permissions for this server member based on their roles.\n *\n * The permissions are calculated by:\n * 1. Starting with a base FullPermissions with no permissions\n * 2. For each role the member has, applying the role's allow permissions\n * 3. For each role the member has, removing the role's deny permissions\n *\n * @returns {FullPermissions} The effective permissions for this member\n *\n * @example\n * ```typescript\n * const permissions = member.getPermissions();\n * console.log(permissions.has('MANAGE_MESSAGES')); // true or false\n * ```\n */\n permissions(): FullPermissions {\n // Start with no permissions\n let permissions = new FullPermissions();\n\n // Apply allow permissions from all roles\n for (const role of this.roles) {\n if (role.overwrite?.allow) {\n permissions = permissions.add(role.overwrite.allow);\n }\n }\n\n // Remove deny permissions from all roles\n for (const role of this.roles) {\n if (role.overwrite?.deny) {\n permissions = permissions.remove(role.overwrite.deny);\n }\n }\n\n return permissions;\n }\n\n /**\n * Checks if this server member has a specific permission.\n *\n * @param {string | number | FullPermissions} permission - The permission to check for\n * @returns {boolean} Whether the member has the permission\n *\n * @example\n * ```typescript\n * if (member.hasPermission('MANAGE_MESSAGES')) {\n * // Member can manage messages\n * }\n * ```\n *\n * note this works on the same basis as stoats permissions checking\n */\n hasPermission(permission: string | number | FullPermissions): boolean {\n if (this.client.servers.cache.get(this.serverId)?.ownerId === this.id)\n return true;\n return this.permissions().has(permission);\n }\n\n // async displayAvatarURL(options?: { size: number }): Promise<string> {\n // return await this.user.displayAvatarURL(options);\n // }\n\n /**\n * Retrieves the user associated with this server member.\n *\n * @returns {User} The user instance.\n */\n get user(): User {\n return this.client.users.cache.get(this.id)!;\n }\n\n /**\n * Gets the username of the user.\n *\n * @returns {string} The username of the user.\n */\n get username(): string {\n return this.user.username;\n }\n\n /**\n * Gets whether the user is a bot.\n *\n * @returns {boolean} Whether the user is a bot.\n */\n get bot(): boolean {\n return this.user.bot ?? false;\n }\n\n /**\n * Retrieves the server this member belongs to.\n *\n * @returns {Server} The server instance.\n */\n get server(): Server {\n return this.client.servers.cache.get(this.serverId)!;\n }\n\n /**\n * Converts the server member to a string representation.\n *\n * @returns {string} A string representation of the server member in the format `<@userId>`.\n */\n toString(): string {\n return `<@${this.id}>`;\n }\n\n /**\n * Sets a timeout for the server member.\n * @param duration - The duration of the timeout as a Date object.\n * @returns A promise that resolves when the timeout is set.\n */\n timeout(duration: Date): Promise<void> {\n return this.server.members.edit(this, { timeout: duration });\n }\n}\n","import type { Channel } from \"revolt-api\";\nimport { MessageStruct, ServerChannel } from \"./index\";\nimport { TextBasedChannel } from \"./interfaces/baseChannel\";\nimport type { Client } from \"../client/client\";\nimport {\n MessageManager,\n MessageOptions,\n MessageResolvable,\n} from \"../managers/index\";\nimport { ChannelTypes } from \"../utils/index\";\n\ntype APITextChannel = Extract<Channel, { channel_type: \"TextChannel\" }>;\n\n/**\n * Represents a text channel in a server.\n *\n * @extends ServerChannel\n */\nexport class TextChannel extends ServerChannel implements TextBasedChannel {\n /** The ID of the last message sent in this text channel, if any. */\n lastMessageId: string | null = null;\n\n /** Manages the messages in this text channel. */\n messages = new MessageManager(this);\n\n /** The type of the channel, which is always `TEXT` for text channels. */\n readonly type = ChannelTypes.TEXT;\n\n /**\n * Creates a new TextChannel instance.\n *\n * @param {client} client - The client instance.\n * @param {APITextChannel} data - The raw data for the text channel from the API.\n */\n constructor(client: Client, data: APITextChannel) {\n super(client, data);\n this._patch(data);\n }\n\n /**\n * Updates the text channel instance with new data from the API.\n *\n * @param {APITextChannel} data - The raw data for the text channel from the API.\n * @returns {this} The updated text channel instance.\n * @protected\n */\n protected _patch(data: APITextChannel): this {\n super._patch(data);\n\n if (data.last_message_id) this.lastMessageId = data.last_message_id;\n\n return this;\n }\n\n /**\n * Retrieves the last message sent in this text channel.\n *\n * @returns {Message | null} The last message, or `null` if no message exists.\n */\n get lastMessage(): MessageStruct | null {\n if (!this.lastMessageId) return null;\n return this.messages.cache.get(this.lastMessageId) ?? null;\n }\n\n /**\n * Sends a message to this text channel.\n *\n * @param {MessageOptions | string} options - The message content or options for the message.\n * @returns {Promise<Message>} A promise that resolves with the sent message.\n *\n * @example\n * ```typescript\n * await textChannel.send(\"Hello, world!\");\n * ```\n */\n send(options: MessageOptions | string): Promise<MessageStruct> {\n return this.messages.send(options);\n }\n\n /**\n * Deletes multiple messages from this text channel.\n *\n * @param {MessageResolvable[] | Map<string, Message> | number} messages - The messages to delete. This can be an array of message resolvables, a map of messages, or a number indicating how many recent messages to delete.\n * @returns {Promise<void>} A promise that resolves when the messages have been successfully deleted.\n *\n * @example\n * ```typescript\n * await textChannel.bulkDelete(10); // Deletes the last 10 messages.\n * ```\n */\n bulkDelete(\n messages: MessageResolvable[] | Map<string, MessageStruct> | number,\n ): Promise<void> {\n return this.messages.bulkDelete(messages);\n }\n}\n","import type { Channel } from \"revolt-api\";\nimport { ServerChannel } from \"./index\";\nimport type { Client } from \"../client/client\";\nimport { ChannelTypes } from \"../utils/index\";\nimport { AudioPlayer } from \"../client/player\";\n\ntype APIVoiceChannel = Extract<Channel, { channel_type: \"VoiceChannel\" }>;\n\nexport type Voice = {\n id: string;\n participants: voiceParticipant[];\n};\n\nexport type voiceParticipant = {\n id: string;\n joined_at: string;\n is_receving: boolean;\n is_publishing: boolean;\n screensharing: boolean;\n camera: boolean;\n};\n\n/**\n * Represents a voice channel in a server.\n *\n * @extends ServerChannel\n */\nexport class VoiceChannel extends ServerChannel {\n /** The type of the channel, which is always `VOICE` for voice channels. */\n readonly type = ChannelTypes.VOICE;\n voice?: Map<string, voiceParticipant> = new Map();\n\n /**\n * Creates a new VoiceChannel instance.\n *\n * @param {client} client - The client instance.\n * @param {APIVoiceChannel} data - The raw data for the voice channel from the API.\n */\n constructor(client: Client, data: APIVoiceChannel) {\n super(client, data);\n this._patch(data);\n }\n\n /**\n * Updates the voice channel instance with new data from the API.\n *\n * @param {APIVoiceChannel} data - The raw data for the voice channel from the API.\n * @returns {this} The updated voice channel instance.\n * @protected\n */\n protected _patch(data: APIVoiceChannel): this {\n super._patch(data);\n return this;\n }\n\n /**\n * Acknowledges the voice channel.\n *\n * @throws {TypeError} Throws an error because voice channels cannot be acknowledged.\n *\n * @example\n * ```typescript\n * try {\n * await voiceChannel.ack();\n * } catch (error) {\n * console.error(error.message); // \"Cannot ack voice channel\"\n * }\n * ```\n */\n ack(): Promise<void> {\n throw new TypeError(\"Cannot ack voice channel\");\n }\n /**\n * Creates and connects an AudioPlayer to this voice channel in one step.\n * This is a convenience method that combines createPlayer() and connect().\n *\n * @returns {Promise<AudioPlayer>} A promise that resolves to a connected AudioPlayer\n *\n * @example\n * ```typescript\n * const voiceChannel = await client.channels.fetch('voice-channel-id') as VoiceChannel;\n * const player = await voiceChannel.connect();\n *\n * // Already connected, ready to play\n * await player.playFromUrl('https://example.com/music.mp3');\n * ```\n */\n async connect(): Promise<AudioPlayer> {\n return this.client.voice.connectToChannel(this.id, this.serverId);\n }\n\n /** Disconnects the AudioPlayer from this voice channel's server. */\n async disconnect(): Promise<void> {\n return this.client.voice.disconnectFromChannel(this.serverId);\n }\n /** Stops the AudioPlayer in this voice channel's server. */\n async stop(): Promise<void> {\n return this.client.voice.stopPlayerInChannel(this.serverId);\n }\n /** Plays audio through the AudioPlayer connected to this voice channel.\n * @param source - The audio source (URL, file path, or stream)\n */\n async play(source: string): Promise<void> {\n const player = await this.getPlayer();\n if (!player) throw new Error(\"No active player found for this channel\");\n return player.play(source);\n }\n /** Retrieves the AudioPlayer associated with this voice channel, if any.\n * @returns {Promise<AudioPlayer | null>} A promise that resolves to the AudioPlayer or null if not found\n */\n async getPlayer(): Promise<AudioPlayer | null> {\n const player = this.client.voice[\"players\"].get(this.serverId);\n return player ?? null;\n }\n}\n","import type { Category as APICategory } from \"revolt-api\";\nimport { Base, Server, ServerChannel } from \"./index\";\n\n/**\n * Represents a category in a server, which groups multiple channels together.\n *\n * @extends Base\n */\nexport class Category extends Base {\n /** The name of the category. */\n name!: string;\n\n /** An array of channel IDs that belong to this category. */\n protected _children: string[] = [];\n\n /**\n * Creates a new Category instance.\n *\n * @param {Server} server - The server this category belongs to.\n * @param {APICategory} data - The raw data for the category from the API.\n */\n constructor(\n public readonly server: Server,\n data: APICategory,\n ) {\n super(server.client);\n this._patch(data);\n }\n\n /**\n * Updates the category instance with new data from the API.\n *\n * @param {APICategory} data - The raw data for the category from the API.\n * @returns {this} The updated category instance.\n * @protected\n */\n protected _patch(data: APICategory): this {\n super._patch(data);\n\n if (data.title) {\n this.name = data.title;\n }\n\n if (Array.isArray(data.channels)) {\n this._children = data.channels;\n }\n\n return this;\n }\n\n /**\n * Retrieves the channels that belong to this category.\n *\n * @returns {Map<string, ServerChannel>} A map of channel IDs to their corresponding `ServerChannel` instances.\n */\n get children(): Map<string, ServerChannel> {\n const coll = new Map<string, ServerChannel>();\n\n for (const childId of this._children) {\n const child = this.server.channels.cache.get(childId);\n if (child) coll.set(child.id, child);\n }\n\n return coll;\n }\n\n /**\n * Converts the category to a string representation.\n *\n * @returns {string} The name of the category.\n */\n toString(): string {\n return this.name;\n }\n}\n","import { Base } from \"./base\";\nimport type { Client } from \"../client/client\";\n\n/**\n * Represents an emoji in the client.\n *\n * @extends Base\n */\nexport class Emoji extends Base {\n /** The parent object of the emoji, which can be a server or other entity. */\n parent?: { type: string; id: string } | null = null;\n\n /** The ID of the user who created the emoji, or `null` if not available. */\n creator_id?: string | null = null;\n\n /** The name of the emoji, or `null` if not set. */\n name?: string | null = null;\n\n /**\n * Creates a new Emoji instance.\n *\n * @param {client} client - The client instance.\n * @param {Emoji} data - The raw data for the emoji.\n */\n constructor(client: Client, data: Emoji) {\n super(client);\n this._patch(data);\n }\n\n /**\n * Retrieves the user who created the emoji.\n *\n * @returns {User | null} The creator of the emoji, or `null` if not found.\n */\n get creator() {\n return this.client.users.cache.get(this.creator_id!) ?? null;\n }\n\n /**\n * Retrieves the server associated with the emoji, if any.\n *\n * @returns {Server | null} The server instance, or `null` if the emoji is not associated with a server.\n */\n get server() {\n if (!this.parent) return null;\n return this.client.servers.cache.get(this.parent.id) ?? null;\n }\n}\n","import { Base, Attachment } from \"./index\";\nimport type { User } from \"./user\";\nimport type { Client } from \"../client/client\";\nimport type { UserProfile as APIUserProfile } from \"revolt-api\";\nimport type { PartialObject } from \"./base\";\n\nexport class UserProfile extends Base {\n userId!: string;\n content: string | null = null;\n background: Attachment | null = null;\n\n constructor(client: Client, data: APIUserProfile & { userId: string }) {\n super(client);\n this._patch(data as unknown as PartialObject);\n }\n\n protected override _patch(\n data: PartialObject & {\n userId?: string;\n content?: string | null;\n background?: APIUserProfile[\"background\"];\n },\n ): this {\n super._patch(data);\n\n if (data.userId) this.userId = data.userId;\n\n if (\"content\" in data) {\n this.content = data.content ?? null;\n }\n\n if (data.background) {\n this.background = new Attachment(this.client, data.background);\n }\n\n return this;\n }\n\n get user(): User | null {\n return this.client.users.cache.get(this.userId) ?? null;\n }\n\n async fetch(): Promise<UserProfile> {\n const data = await this.client.api.get(`/users/${this.userId}/profile`);\n return this._patch(\n data as unknown as PartialObject & {\n userId?: string;\n content?: string | null;\n background?: APIUserProfile[\"background\"];\n },\n );\n }\n\n async setContent(content: string | null): Promise<void> {\n await this.client.api.patch(`/users/@me`, {\n body: { profile: { content } },\n });\n this.content = content;\n }\n\n async setBackground(background: Attachment | null): Promise<void> {\n if (background) {\n await this.client.api.put(`/users/@me/background`, {\n body: { banner: background.id },\n });\n } else {\n await this.client.api.delete(`/users/@me/background`);\n }\n this.background = background;\n }\n\n toJSON(): { content: string | null; background: Attachment | null } {\n return {\n content: this.content,\n background: this.background,\n };\n }\n}\n","import type { Channel as APIChannel } from \"revolt-api\";\nimport { BaseManager } from \"./baseManager\";\nimport {\n Channel,\n DMChannel,\n GroupChannel,\n NotesChannel,\n TextChannel,\n VoiceChannel,\n} from \"../struct/index\";\n\nexport type ChannelResolvable = Channel | APIChannel | string;\n\nexport class ChannelManager extends BaseManager<Channel, APIChannel> {\n /** @private */\n holds = null;\n\n /** @private */\n _add(data: APIChannel & { voice?: any }): Channel {\n let channel: Channel;\n\n switch (data.channel_type) {\n case \"TextChannel\":\n if (data.voice !== undefined) {\n channel = new VoiceChannel(this.client, data as any);\n } else {\n channel = new TextChannel(this.client, data);\n }\n break;\n case \"VoiceChannel\":\n channel = new VoiceChannel(this.client, data);\n break;\n case \"DirectMessage\":\n channel = new DMChannel(this.client, data);\n break;\n case \"Group\":\n channel = new GroupChannel(this.client, data);\n break;\n case \"SavedMessages\":\n channel = new NotesChannel(this.client, data);\n if (this.client.user) this.client.user.notes = channel as NotesChannel;\n break;\n default:\n throw new Error(`Unknown Channel Type: ${data}`);\n }\n\n this.cache.set(channel.id, channel);\n\n return channel;\n }\n\n _remove(id: string): void {\n const channel = this.cache.get(id);\n\n if (channel?.inServer()) {\n channel.server?.channels.cache.delete(id);\n }\n\n super._remove(id);\n }\n\n /**\n * used to delete a channel\n *\n * @param channel The channel to delete\n * @returns A promise that resolves when the channel is deleted\n */\n async delete(channel: ChannelResolvable): Promise<void> {\n const id = this.resolveId(channel);\n if (!id) {\n throw new TypeError(\"INVALID_TYPE\");\n }\n await this.client.api.delete(`/channels/${id}`);\n }\n\n /**\n * used to fetch a channel\n *\n * @param channel The channel to fetch\n * @param force Whether to force fetch the channel using the api or return it form cache if able\n * @returns A promise that resolves with the fetched channel\n */\n async fetch(\n channel: ChannelResolvable,\n { force = true } = {},\n ): Promise<Channel> {\n const id = this.resolveId(channel);\n\n if (!id) {\n throw new TypeError(\"INVALID_TYPE\");\n }\n\n if (!force) {\n const channel = this.cache.get(id);\n if (channel) return channel;\n }\n\n const data = (await this.client.api.get(`/channels/${id}`)) as APIChannel;\n\n return this._add(data);\n }\n\n /**\n * resolves a channel from a string or a channel object\n * @param channel The channel to resolve\n * @returns the resolved channel or null if not found\n */\n resolve(channel: ChannelResolvable): Channel | null {\n if (channel instanceof Channel) return channel;\n return super.resolve(channel);\n }\n\n /**\n * resolves a channel id from a string or a channel object\n * @param channel The channel to resolve\n * @returns the resolved channel id or null if not found\n */\n resolveId(channel: ChannelResolvable): string | null {\n if (channel instanceof Channel) return channel.id;\n return super.resolveId(channel);\n }\n}\n","import { BaseManager } from \"./baseManager\";\nimport { Server } from \"../struct/index\";\nimport { Server as APIServer } from \"revolt-api\";\n\nexport type ServerResolvable = Server | APIServer | string;\n\nexport interface EditServerOptions {\n name?: string;\n description?: string;\n}\n\nexport class ServerManager extends BaseManager<Server, APIServer> {\n /** @private */\n readonly holds = Server;\n\n /** @private */\n _remove(id: string): void {\n const server = this.cache.get(id);\n\n for (const id of server?.channels.cache.keys() ?? []) {\n this.client.channels._remove(id);\n }\n\n return super._remove(id);\n }\n\n /**\n * edits a server\n * @param server The server to edit\n * @param options The options to edit the server with\n * @param options.name The name of the server\n * @param options.description The description of the server\n * @returns A promise that resolves when the server is edited\n */\n async edit(\n server: ServerResolvable,\n options: EditServerOptions,\n ): Promise<void> {\n const id = this.resolveId(server);\n if (!id) throw new TypeError(\"INVALID_TYPE\");\n await this.client.api.patch(`/servers/${id}`, { body: options });\n }\n\n /**\n * leaves a server\n * @param server the server to leave\n */\n async delete(server: ServerResolvable): Promise<void> {\n const id = this.resolveId(server);\n if (!id) throw new TypeError(\"INVALID_TYPE\");\n await this.client.api.delete(`/servers/${id}`);\n }\n\n async fetch(\n server: ServerResolvable,\n { force = true } = {},\n ): Promise<Server> {\n const id = this.resolveId(server);\n\n if (!id) throw new TypeError(\"INVALID_TYPE\");\n\n if (!force) {\n const server = this.cache.get(id);\n if (server) return server;\n }\n\n const data = await this.client.api.get(`/servers/${id}`);\n\n return this._add(data as APIServer);\n }\n}\n","import type { User as APIUser } from \"revolt-api\";\nimport { BaseManager } from \"./baseManager\";\nimport { MessageStruct, ServerMember, User } from \"../struct/index\";\n\nexport type UserResolvable = User | APIUser | MessageStruct | string;\n\nexport class UserManager extends BaseManager<User, APIUser> {\n /** @private */\n holds = User;\n\n /**\n *\n * @param user The user to fetch\n * @returns A promise that resolves when the user is fetched\n */\n async fetch(user: UserResolvable, { force = false } = {}): Promise<User> {\n const id = this.resolveId(user);\n\n if (!id) throw new TypeError(\"INVALID_TYPE\");\n\n if (!force) {\n const user = this.cache.get(id);\n if (user) return user;\n }\n\n const data = (await this.client.api.get(`/users/${id}`)) as APIUser;\n\n return this._add(data);\n }\n\n /**\n * get a user form cache\n * @param resolvable The user to resolve\n * @returns The user or null if it cannot be resolved\n */\n resolve(resolvable: MessageStruct | User): User | null;\n resolve(resolvable: string | APIUser): User | null;\n resolve(resolvable: User | APIUser | string | MessageStruct): User | null {\n if (resolvable instanceof MessageStruct)\n return resolvable.author as unknown as User;\n return super.resolve(resolvable) as User | null;\n }\n\n /**\n * get a user id form cache\n * @param resolvable The user to resolve\n * @returns The user id or null if it cannot be resolved\n */\n resolveId(resolvable: UserResolvable): string | null {\n if (resolvable instanceof MessageStruct) return resolvable.authorId;\n return super.resolveId(resolvable);\n }\n}\n","import type {\n Message as APIMessage,\n Masquerade,\n MessageSort,\n SendableEmbed,\n} from \"revolt-api\";\nimport { File } from \"node:buffer\";\nimport { Readable } from \"stream\";\nimport FormData from \"form-data\";\nimport axios from \"axios\";\nimport { BaseManager } from \"./baseManager\";\nimport { Channel, Emoji, MessageStruct, MessageEmbed } from \"../struct/index\";\nimport { UUID } from \"../utils/index\";\nimport { CDNAttachmentResponse } from \"../utils/types\";\n\nexport type MessageResolvable = MessageStruct | APIMessage | string;\n\nexport interface MessageReply {\n id: string;\n mention: boolean;\n}\n\nexport interface MessageOptions {\n content?: string;\n replies?: MessageReply[];\n attachments?: Readable[] | string[] | File[];\n embeds?: MessageEmbed[];\n masquerade?: Masquerade;\n}\n\nexport interface MessageEditOptions {\n content?: string;\n attachments?: string[];\n embeds?: MessageEmbed[];\n}\n\nexport interface MessageSearchOptions {\n query: string;\n limit?: number;\n before?: string;\n after?: string;\n sort?: MessageSort;\n}\n\nexport interface MessageQueryOptions {\n limit?: number;\n before?: string;\n after?: string;\n sort?: MessageSort;\n nearby?: string;\n}\n\nexport class MessageManager extends BaseManager<MessageStruct, APIMessage> {\n /** @private */\n holds = MessageStruct;\n constructor(\n protected readonly channel: Channel,\n maxSize = 1000,\n ) {\n super(channel.client, maxSize);\n }\n\n /**\n *\n * @param content The content to send. Can be a string or an object with the following properties:\n * - content: The content of the message\n * - replies: An array of message IDs to reply to\n * - attachments: An array of attachment URLs, Files, or ReadStreams\n * - embeds: An array of MessageEmbed objects\n * @returns Promise that resolves to the sent message\n */\n async send(content: MessageOptions | string): Promise<MessageStruct> {\n if (typeof content === \"string\") content = { content };\n let attachments: string[] = [];\n let embeds: SendableEmbed[] = [];\n\n if (Array.isArray(content.attachments)) {\n const promises = content.attachments.map(async (att) => {\n const data = new FormData();\n if (typeof att === \"string\") {\n const readableStream = (await axios.get(att, {\n responseType: \"stream\",\n })) as { data: Readable };\n data.append(\"file\", readableStream.data, {\n filename: att.split(\"/\").pop(),\n });\n }\n\n if (att instanceof Readable) {\n data.append(\"file\", att);\n }\n\n if (att instanceof File) {\n const buffer = Buffer.from(await att.arrayBuffer());\n data.append(\"file\", buffer, { filename: att.name });\n }\n\n await this.client.cdn.post(\"/attachments\", data).then((attachment: any) => {\n const { id } = attachment as CDNAttachmentResponse;\n attachments.push(id);\n });\n });\n await Promise.all(promises);\n }\n\n if (Array.isArray(content.embeds)) {\n const promises = content.embeds.map(async (embed) => {\n const json = await embed.toJSONWithMedia(this.client);\n embeds.push(json);\n });\n await Promise.all(promises);\n }\n\n const resp = (await this.client.api.post(\n `/channels/${this.channel.id}/messages`,\n {\n body: { ...content, attachments, embeds, nonce: UUID.generate() },\n },\n )) as APIMessage;\n return this._add(resp);\n }\n\n /**\n * acknowledge a message to mark it as read (not important for bots)\n * @param message The message to acknowledge\n * @returns Promise that resolves when the message is acknowledged\n */\n async ack(message: MessageResolvable): Promise<void> {\n const id = this.resolveId(message);\n if (!id) {\n throw new TypeError(\"INVALID_TYPE\");\n }\n await this.client.api.put(`/channels/${this.channel.id}/ack/${id}`);\n }\n\n /**\n * bulk delete messages from the channel\n * @param messages The messages to delete. Can be an array of message IDs or a Map of message IDs to Message objects.\n * @returns Promise that resolves when the messages are deleted\n */\n async bulkDelete(\n messages: MessageResolvable[] | number | Map<string, MessageStruct>,\n ): Promise<void> {\n let ids: string[] = [];\n\n if (typeof messages === \"number\") {\n messages = await this.fetch(messages);\n ids = messages instanceof Map ? [...messages.keys()] : [];\n } else if (messages instanceof Map) {\n ids = [...messages.keys()];\n } else {\n ids = messages.map((m) => this.resolveId(m)!).filter(Boolean);\n }\n\n await this.client.api.delete(`/channels/${this.channel.id}/messages/bulk`, {\n body: JSON.stringify({ ids }),\n });\n }\n\n /**\n * delete a message from the channel\n * @param message The message to delete. Can be a Message object or a message ID.\n * @returns Promise that resolves when the message is deleted\n */\n async delete(message: MessageResolvable): Promise<void> {\n const id = this.resolveId(message);\n if (!id) {\n throw new TypeError(\"INVALID_TYPE\");\n }\n await this.client.api.delete(`/channels/${this.channel.id}/messages/${id}`);\n }\n\n /**\n * edit a message in the channel\n * @param message The message to edit. Can be a Message object or a message ID.\n * @param options The options to edit the message with. Can be a string or an object with the following properties:\n * - content: The new content of the message\n * - attachments: An array of attachment URLs\n * - embeds: An array of MessageEmbed objects\n * @returns Promise that resolves when the message is edited\n */\n async edit(\n message: MessageResolvable,\n options: MessageEditOptions | string,\n ): Promise<void> {\n const id = this.resolveId(message);\n\n if (!id) {\n throw new TypeError(\"INVALID_TYPE\");\n }\n\n if (typeof options === \"string\") options = { content: options };\n\n await this.client.api.patch(`/channels/${this.channel.id}/messages/${id}`, {\n body: options,\n });\n }\n\n /**\n * search for messages in the channel\n * @param query The query to search for. Can be a string or an object with the following properties:\n * - query: The query to search for\n * - limit: The maximum number of messages to return\n * - before: The message ID to start searching from (exclusive)\n * - after: The message ID to stop searching at (exclusive)\n * - sort: The sort order of the results (asc or desc)\n * @returns Promise that resolves to a Map of message IDs to Message objects\n */\n async search(\n query: MessageSearchOptions | string,\n ): Promise<Map<string, MessageStruct>> {\n if (typeof query === \"string\") query = { query };\n\n const response = (await this.client.api.post(\n `/channels/${this.channel.id}/search`,\n {\n query: query as Required<MessageSearchOptions>,\n },\n )) as APIMessage[];\n\n return response.reduce((coll, cur) => {\n const msg = this._add(cur);\n coll.set(msg.id, msg);\n return coll;\n }, new Map<string, MessageStruct>());\n }\n\n /**\n * fetch a message from the channel\n * @param message The message to fetch. Can be a Message object, a message ID, or an object with the following properties:\n * - limit: The maximum number of messages to return\n * - before: The message ID to start fetching from (exclusive)\n * - after: The message ID to stop fetching at (exclusive)\n * @returns Promise that resolves to a Message object or a Map of message IDs to Message objects\n */\n fetch(message: MessageResolvable): Promise<MessageStruct>;\n fetch(query?: MessageQueryOptions): Promise<Map<string, MessageStruct>>;\n fetch(limit: number): Promise<Map<string, MessageStruct>>;\n async fetch(\n query?: MessageResolvable | MessageQueryOptions | number,\n ): Promise<Map<string, MessageStruct> | MessageStruct> {\n const id = this.resolveId(query as string);\n\n if (id) {\n const data = (await this.client.api.get(\n `/channels/${this.channel.id}/messages/${id}`,\n )) as APIMessage;\n return this._add(data);\n }\n\n if (typeof query === \"number\") query = { limit: query };\n else if (typeof query === \"undefined\") query = { limit: 100 };\n const queryObj = Object.fromEntries(\n Object.entries(query as MessageQueryOptions).filter(\n ([, v]) => v !== undefined,\n ),\n ) as Record<string, string | number>;\n const messages = await this.client.api.get(\n `/channels/${this.channel.id}/messages`,\n queryObj,\n );\n\n return (messages as APIMessage[]).reduce((coll, cur) => {\n const msg = this._add(cur);\n coll.set(msg.id, msg);\n return coll;\n }, new Map<string, MessageStruct>());\n }\n\n /**\n * add a reaction to a message\n * @param message The message to react to. Can be a Message object or a message ID.\n * @param emoji emoji to react with. Can be a string or an Emoji object.\n * @returns Promise that resolves when the reaction is added\n */\n async addReaction(\n message: MessageResolvable | string,\n emoji: string | Emoji,\n ): Promise<void> {\n const id = this.resolveId(message);\n if (!id) {\n throw new TypeError(\"INVALID_TYPE\");\n }\n if (emoji instanceof Emoji) emoji = emoji.id;\n else if (typeof emoji !== \"string\") {\n throw new TypeError(\"INVALID_TYPE\");\n }\n await this.client.api.put(\n `/channels/${this.channel.id}/messages/${id}/reactions/${emoji}`,\n );\n }\n\n /**\n *\n * @param message The message to unreact. Can be a Message object or a message ID.\n * @param emoji the emoji to unreact with. Can be a string or an Emoji object.\n * @param user_id The user ID to remove the reaction for. If not provided, removes the reaction for the current user.\n * @param remove_all Whether to remove all of the specified reaction for the message. Defaults to false.\n * @returns Promise that resolves when the reaction is removed\n */\n async removeReaction(\n message: MessageResolvable | string,\n emoji: string | Emoji,\n user_id?: string,\n remove_all = false,\n ): Promise<void> {\n const id = this.resolveId(message);\n if (!id) {\n throw new TypeError(\"INVALID_TYPE\");\n }\n if (emoji instanceof Emoji) emoji = emoji.id;\n else if (typeof emoji !== \"string\") {\n throw new TypeError(\"INVALID_TYPE\");\n }\n const queryString = user_id\n ? `?user_id=${user_id}&remove_all=${remove_all}`\n : `?remove_all=${remove_all}`;\n await this.client.api.delete(\n `/channels/${this.channel.id}/messages/${id}/reactions/${emoji}${queryString}`,\n );\n }\n\n /**\n * remove all reactions from a message\n * @param message The message to remove reactions from. Can be a Message object or a message ID.\n * @returns Promise that resolves when the reactions are removed\n */\n async removeAllReactions(message: MessageResolvable | string): Promise<void> {\n const id = this.resolveId(message);\n if (!id) {\n throw new TypeError(\"INVALID_TYPE\");\n }\n await this.client.api.delete(\n `/channels/${this.channel.id}/messages/${id}/reactions`,\n );\n }\n}\n","import type { Role as APIRole } from \"revolt-api\";\nimport { BaseManager } from \"./baseManager\";\nimport { Role, Server } from \"../struct/index\";\nimport { FullPermissions } from \"../utils\";\nimport { editableRole } from \"../utils/types\";\n\nexport type RoleResolvable = Role | string;\n\nexport class RoleManager extends BaseManager<Role, APIRole & { id: string }> {\n /** @private */\n holds = Role;\n constructor(protected readonly server: Server) {\n super(server.client);\n }\n\n /** @private */\n _add(data: APIRole & { id: string }): Role {\n const role = new Role(this.server, data);\n this.cache.set(role.id, role);\n return role;\n }\n\n /**\n * creates a new role in the server\n * @param name The name of the role to create\n * @returns\n */\n async create(name: string): Promise<Role> {\n const { id, role } = await this.client.api.post<{\n id: string;\n role: APIRole;\n }>(`/servers/${this.server.id}/roles`, { body: { name } });\n return this._add(Object.assign(role, { id }));\n }\n\n /**\n * deletes a role from the server\n * @param role the role to delete\n * @returns A promise that resolves when the role is deleted\n */\n async delete(role: RoleResolvable): Promise<void> {\n const id = this.resolveId(role);\n if (!id) throw new TypeError(\"INVALID_TYPE\");\n await this.client.api.delete(`/servers/${this.server.id}/roles/${id}`);\n }\n\n /**\n *\n * @param role the role to edit\n * @param data data to edit the role with\n * @param data.permissions The permissions to set for the role, in the format { a: allow, d: deny }\n * @param data.name The name of the role\n * @param data.colour The color of the role, or `null` if no color is set\n * @param data.hoist Whether the role is displayed separately in the member list\n * @param data.rank The rank of the role, used for ordering\n * @param data.remove Fields to remove from the role\n * @returns Role\n * @throws {TypeError} If the role ID is invalid\n */\n async edit(role: RoleResolvable, data: editableRole): Promise<Role> {\n const id = this.resolveId(role);\n if (!id) throw new TypeError(\"INVALID_TYPE\");\n\n if (data.permissions) {\n const permissions = {\n allow: new FullPermissions(data.permissions?.a || []).bitfield,\n deny: new FullPermissions(data.permissions?.d || []).bitfield,\n };\n\n await this.client.api.put(\n `/servers/${this.server.id}/permissions/${id}`,\n { body: { permissions } },\n );\n }\n delete data.permissions;\n const updatedRole = (await this.client.api.patch(\n `/servers/${this.server.id}/roles/${id}`,\n { body: data },\n )) as APIRole;\n\n return this._add(Object.assign(updatedRole, { id }));\n }\n}\n","import type { Channel } from \"revolt-api\";\nimport { BaseManager } from \"./baseManager\";\nimport {\n Server,\n ServerChannel,\n TextChannel,\n VoiceChannel,\n} from \"../struct/index\";\nimport { UUID } from \"../utils/index\";\nimport { APIServerChannel } from \"../types\";\n\nexport type ServerChannelResolvable = ServerChannel | APIServerChannel | string;\n\nexport interface CreateChannelOptions {\n name: string;\n type?: \"Text\" | \"Voice\";\n description?: string;\n nsfw?: boolean;\n voice: {\n max_users?: number;\n };\n}\n\nexport class ServerChannelManager extends BaseManager<ServerChannel> {\n /** @private */\n holds = ServerChannel;\n constructor(protected readonly server: Server) {\n super(server.client);\n }\n\n /** @private */\n _add(data: APIServerChannel): ServerChannel {\n let channel: ServerChannel;\n\n switch (data.channel_type) {\n case \"TextChannel\":\n channel = new TextChannel(this.client, data);\n break;\n case \"VoiceChannel\":\n channel = new VoiceChannel(this.client, data);\n break;\n default:\n throw new Error(\n `Unknown channel type: ${(data as APIServerChannel).channel_type}`,\n );\n }\n\n this.cache.set(channel.id, channel);\n\n return channel;\n }\n\n /**\n * Creates a new channel in the server.\n * @param options - Options for creating the channel.\n * @param options.name - The name of the channel to create.\n * @param [options.type=\"Text\"] - The type of the channel to create. Can be \"Text\" or \"Voice\". Defaults to \"Text\".\n * @param [options.description] - The description of the channel to create. Only used for voice channels.\n * @returns A promise that resolves to the created channel.\n */\n async create({\n name,\n type = \"Text\",\n description,\n }: CreateChannelOptions): Promise<ServerChannel> {\n const data = await this.client.api.post(\n `/servers/${this.server.id}/channels`,\n {\n body: {\n name,\n type,\n description,\n nonce: UUID.generate(),\n },\n },\n );\n return this._add(data as APIServerChannel);\n }\n\n /**\n * fetch a channel from the server\n * @param channel The channel to fetch. Can be a string, a channel object, or an API channel object.\n * @param force Whether to force fetch the channel from the API. Defaults to true.\n * If set to false, the method will return the channel from the cache if it exists.\n * @returns A promise that resolves to the fetched channel\n */\n async fetch(\n channel: ServerChannelResolvable,\n { force = true } = {},\n ): Promise<ServerChannel> {\n const id = this.resolveId(channel);\n\n if (!id) {\n throw new TypeError(\"INVALID_ID\");\n }\n\n if (!force) {\n const channel = this.cache.get(id);\n if (channel) return channel;\n }\n\n const data = await this.client.api.get(\n `/servers/${this.server.id}/channels/${id}`,\n );\n\n return this._add(data as APIServerChannel);\n }\n}\n","import type { Member, User as APIUser } from \"revolt-api\";\nimport { BaseManager } from \"./baseManager\";\nimport { Server, ServerMember, User } from \"../struct/index\";\n\nexport type ServerMemberResolvable = ServerMember | User | Member | string;\n\nexport interface EditServerMemberOptions {\n nickname?: string;\n avatar?: string;\n roles?: string[];\n timeout?: Date | number;\n}\n\nexport class ServerMemberManager extends BaseManager<ServerMember, Member> {\n /** @private */\n holds = ServerMember;\n constructor(protected readonly server: Server) {\n super(server.client);\n }\n\n /**\n * edit selected member in the server\n * @param member The member to edit\n * @param options The options to edit the member with\n * @param options.nickname The nickname of the member to set\n * @param options.avatar The avatar of the member to set\n * @param options.roles The roles of the member to set\n * @returns A promise that resolves when the member is edited\n */\n async edit(\n member: ServerMemberResolvable,\n options: EditServerMemberOptions,\n ): Promise<void> {\n const id = this.resolveId(member);\n if (!id) {\n throw new TypeError(\"INVALID_TYPE\");\n }\n await this.client.api.patch(`/servers/${this.server.id}/members/${id}`, {\n body: { ...options },\n });\n }\n\n /**\n * ban selected member in the server\n * @param member The member to ban\n * @param reason the reason for the ban\n * @returns A promise that resolves when the member is banned\n */\n async ban(member: ServerMemberResolvable, reason?: string): Promise<void> {\n const id = this.resolveId(member);\n if (!id) {\n throw new TypeError(\"INVALID_TYPE\");\n }\n await this.client.api.put(`/servers/${this.server.id}/bans/${id}`, {\n body: { reason },\n });\n }\n\n /**\n * kick selected member in the server\n * @param member The member to kick\n * @returns A promise that resolves when the member is kicked\n */\n async kick(member: ServerMemberResolvable): Promise<void> {\n const id = this.resolveId(member);\n if (!id) {\n throw new TypeError(\"INVALID_TYPE\");\n }\n await this.client.api.delete(`/servers/${this.server.id}/members/${id}`);\n }\n\n /**\n * unban selected member in the server\n * @param member The member to unban\n * @returns A promise that resolves when the member is unbanned\n */\n async unban(member: ServerMemberResolvable): Promise<void> {\n const id = this.resolveId(member);\n if (!id) {\n throw new TypeError(\"INVALID_TYPE\");\n }\n await this.client.api.delete(`/servers/${this.server.id}/bans/${id}`);\n }\n\n /**\n * set timeout for a member in the server\n * @param member The member to set the timeout for\n * @param duration The duration of the timeout as a Date object\n * @returns A promise that resolves when the timeout is set\n */\n async timeout(member: string, duration: Date): Promise<void> {\n await this.client.api.patch(\n `/servers/${this.server.id}/members/${member}`,\n {\n body: { timeout: duration },\n },\n );\n }\n\n /**\n * fetch a member from the server\n * @param member The member to fetch\n * @returns A promise that resolves with the fetched member\n */\n async fetch(member: ServerMemberResolvable): Promise<ServerMember>;\n async fetch(): Promise<Map<string, ServerMember>>;\n async fetch(\n member?: ServerMemberResolvable,\n ): Promise<ServerMember | Map<string, ServerMember>> {\n if (typeof member !== \"undefined\") {\n const id = this.resolveId(member);\n if (!id) {\n throw new TypeError(\"INVALID_TYPE\");\n }\n const data = await this.client.api.get(\n `/servers/${this.server.id}/members/${id}`,\n );\n return this._add(data as Member);\n }\n\n const { users, members } = await this.client.api.get<{\n users: APIUser[];\n members: Member[];\n }>(`/servers/${this.server.id}/members`);\n\n users.reduce((coll: any, cur: any) => {\n const user = this.client.users._add(cur);\n coll.set(user.id, user);\n return coll;\n }, this.client.users.cache);\n\n return members.reduce((coll: any, cur: any) => {\n const member = this._add(cur);\n coll.set(member.id, member);\n return coll;\n }, new Map<string, ServerMember>());\n }\n\n /**\n * resolves a member from a string or a member object\n * @param member The member to resolve\n * @returns The id of the member or null if it cannot be resolved\n */\n resolveId(member: ServerMemberResolvable): string | null {\n if (member == null) return null;\n if (member instanceof ServerMember || member instanceof User) {\n return member.id;\n }\n if (typeof member === \"string\") return member;\n if (\"_id\" in member) return member._id.user;\n return null;\n }\n}\n","import { Readable } from \"stream\";\nimport type { Client } from \"../client/client\";\nimport {\n CDNAttachmentResponse,\n createWebhookResponse,\n editWebhookOptions,\n} from \"../utils/types\";\nimport axios from \"axios\";\nimport FormData from \"form-data\";\nimport { UUID } from \"../utils\";\nimport { SendableEmbed, Message as APIMessage } from \"revolt-api\";\nimport { MessageOptions } from \"./messageManager\";\n\n/**\n * Manages webhooks for the client.\n * Provides methods for creating, managing, and sending messages through webhooks.\n */\nexport class WebhookManager {\n /**\n * Creates a new WebhookManager instance.\n *\n * @param client - The client instance this manager belongs to\n */\n constructor(protected readonly client: Client) {}\n\n /**\n * Creates a new webhook in the specified channel.\n *\n * @param channelId - The ID of the channel where the webhook will be created\n * @param name - The name of the webhook\n * @param avatar - Optional avatar for the webhook. Can be a URL string, Readable stream, or File object\n * @returns Promise resolving to the created webhook response\n *\n * @example\n * ```typescript\n * const webhook = await client.webhooks.create(\"channelId\", \"My Webhook\", \"https://example.com/avatar.png\");\n * ```\n */\n async create(\n channelId: string,\n name: string,\n avatar?: Readable | string | File,\n ): Promise<createWebhookResponse> {\n const data = new FormData();\n let avatarID: string | undefined = undefined;\n if (typeof avatar === \"string\") {\n const readableStream = (await axios.get(avatar, {\n responseType: \"stream\",\n })) as { data: Readable };\n data.append(\"file\", readableStream.data, {\n filename: avatar.split(\"/\").pop(),\n });\n }\n\n if (avatar instanceof Readable) {\n data.append(\"file\", avatar, { filename: \"avatar.png\" });\n }\n\n if (avatar instanceof File) {\n const buffer = Buffer.from(await avatar.arrayBuffer());\n data.append(\"file\", buffer, { filename: avatar.name });\n }\n\n if (avatar) {\n await this.client.cdn.post(\"/avatars\", data).then((attachment: any) => {\n const { id } = attachment as CDNAttachmentResponse;\n avatarID = id;\n });\n }\n\n const response = (await this.client.api.post(\n `/channels/${channelId}/webhooks`,\n {\n body: {\n name,\n avatar: avatarID,\n },\n },\n )) as createWebhookResponse;\n\n return response;\n }\n\n /**\n * Retrieves all webhooks for the specified channel.\n *\n * @param channelId - The ID of the channel to get webhooks from\n * @returns Promise resolving to an array of webhook responses\n *\n * @example\n * ```typescript\n * const webhooks = await client.webhooks.getAll(\"channelId\");\n * console.log(`Found ${webhooks.length} webhooks`);\n * ```\n */\n async getAll(channelId: string): Promise<createWebhookResponse[]> {\n const response = (await this.client.api.get(\n `/channels/${channelId}/webhooks`,\n )) as createWebhookResponse[];\n return response;\n }\n\n /**\n * Retrieves a specific webhook by ID and token.\n *\n * @param webhookId - The ID of the webhook to retrieve\n * @param token - The token of the webhook\n * @returns Promise resolving to the webhook response\n *\n * @example\n * ```typescript\n * const webhook = await client.webhooks.get(\"webhookId\", \"webhookToken\");\n * console.log(`Webhook name: ${webhook.name}`);\n * ```\n */\n async get(webhookId: string, token: string): Promise<createWebhookResponse> {\n const response = (await this.client.api.get(\n `/webhooks/${webhookId}/${token}`,\n )) as createWebhookResponse;\n return response;\n }\n\n /**\n * Sends a message through a webhook.\n *\n * @param webhookId - The ID of the webhook to send the message through\n * @param token - The token of the webhook\n * @param content - The message content. Can be a string or MessageOptions object with attachments and embeds\n * @returns Promise resolving to the sent message\n *\n * @example\n * ```typescript\n * // Send a simple text message\n * await client.webhooks.send(\"webhookId\", \"token\", \"Hello, world!\");\n *\n * // Send a message with embeds and attachments\n * await client.webhooks.send(\"webhookId\", \"token\", {\n * content: \"Check out this image!\",\n * attachments: [\"https://example.com/image.png\"],\n * embeds: [myEmbed]\n * });\n * ```\n */\n async send(\n webhookId: string,\n token: string,\n content: MessageOptions | string,\n ): Promise<APIMessage> {\n if (typeof content === \"string\") content = { content };\n let attachments: string[] = [];\n let embeds: SendableEmbed[] = [];\n\n if (Array.isArray(content.attachments)) {\n const promises = content.attachments.map(async (att) => {\n const data = new FormData();\n if (typeof att === \"string\") {\n const readableStream = (await axios.get(att, {\n responseType: \"stream\",\n })) as { data: Readable };\n data.append(\"file\", readableStream.data, {\n filename: att.split(\"/\").pop(),\n });\n }\n\n if (att instanceof Readable) {\n data.append(\"file\", att);\n }\n\n if (att instanceof File) {\n const buffer = Buffer.from(await att.arrayBuffer());\n data.append(\"file\", buffer, { filename: att.name });\n }\n\n await this.client.cdn.post(\"/attachments\", data).then((attachment: any) => {\n const { id } = attachment as CDNAttachmentResponse;\n attachments.push(id);\n });\n });\n await Promise.all(promises);\n }\n\n if (Array.isArray(content.embeds)) {\n const promises = content.embeds.map(async (embed) => {\n const json = await embed.toJSONWithMedia(this.client);\n embeds.push(json);\n });\n await Promise.all(promises);\n }\n\n const resp = (await this.client.api.post(\n `/webhooks/${webhookId}/${token}`,\n {\n body: { ...content, attachments, embeds, nonce: UUID.generate() },\n },\n )) as APIMessage;\n\n return resp;\n }\n\n /**\n * Deletes a webhook.\n *\n * @param webhookId - The ID of the webhook to delete\n * @param token - The token of the webhook\n * @returns Promise that resolves when the webhook is deleted\n *\n * @example\n * ```typescript\n * await client.webhooks.delete(\"webhookId\", \"webhookToken\");\n * console.log(\"Webhook deleted successfully\");\n * ```\n */\n async delete(webhookId: string, token: string): Promise<void> {\n await this.client.api.delete(`/webhooks/${webhookId}/${token}`);\n }\n\n /**\n * Edits a webhook's properties.\n *\n * @param webhookId - The ID of the webhook to edit\n * @param token - The token of the webhook\n * @param options - The options to edit on the webhook\n * @returns Promise resolving to the updated webhook response\n *\n * @example\n * ```typescript\n * const updatedWebhook = await client.webhooks.edit(\"webhookId\", \"token\", {\n * name: \"New Webhook Name\",\n * avatar: \"https://example.com/new-avatar.png\"\n * });\n * ```\n */\n async edit(\n webhookId: string,\n token: string,\n options: editWebhookOptions,\n ): Promise<createWebhookResponse> {\n const data = new FormData();\n let avatarID: string | undefined = undefined;\n if (typeof options.avatar === \"string\") {\n const readableStream = (await axios.get(options.avatar, {\n responseType: \"stream\",\n })) as { data: Readable };\n data.append(\"file\", readableStream.data, {\n filename: options.avatar.split(\"/\").pop(),\n });\n }\n\n if (options.avatar instanceof Readable) {\n data.append(\"file\", options.avatar, { filename: \"avatar.png\" });\n }\n\n if (options.avatar instanceof File) {\n const buffer = Buffer.from(await options.avatar.arrayBuffer());\n data.append(\"file\", buffer, { filename: options.avatar.name });\n }\n\n if (options.avatar) {\n await this.client.cdn.post(\"/avatars\", data).then((attachment: any) => {\n const { id } = attachment as CDNAttachmentResponse;\n avatarID = id;\n });\n }\n\n const response = (await this.client.api.patch(\n `/webhooks/${webhookId}/${token}`,\n {\n body: {\n ...options,\n avatar: avatarID,\n remove: options.remove ?? [],\n },\n },\n )) as createWebhookResponse;\n return response;\n }\n\n /**\n * Retrieves partial information about a webhook using only its ID.\n * This method provides limited webhook information without requiring a token.\n *\n * @param webhookId - The ID of the webhook to retrieve partial information for\n * @returns Promise resolving to the webhook response with partial information\n *\n * @example\n * ```typescript\n * const partialWebhook = await client.webhooks.getPartial(\"webhookId\");\n * console.log(`Webhook name: ${partialWebhook.name}`);\n * ```\n */\n async getPartial(webhookId: string): Promise<createWebhookResponse> {\n const response = (await this.client.api.get(\n `/webhooks/${webhookId}`,\n )) as createWebhookResponse;\n return response;\n }\n}\n","import type {\n Channel,\n Role,\n Server,\n ServerMember,\n User,\n} from \"../struct/index\";\nimport { EventEmitter } from \"node:events\";\nimport { DEFAULT_CLIENT_OPTIONS, Events } from \"../utils/constants\";\nimport { RestClient } from \"../rest/restClient\";\nimport { MessageStruct } from \"../struct/index\";\nimport { Client } from \"./client\";\nimport { CDNClient } from \"../rest/CDNClient\";\nimport {\n WebhookCreateData,\n WebhookDeleteData,\n WebhookUpdateData,\n} from \"../utils/types\";\nimport {\n UserVoiceStateUpdate,\n UserVoiceStateUpdateData,\n} from \"./events/userVoiceStateUpdate\";\nimport { VoiceChannelJoinData } from \"./events/voiceChannelJoin\";\nimport { VoiceChannelLeaveData } from \"./events/voiceChannelLeave\";\n\n/**\n * Represents the base client that provides core functionality for interacting with the API.\n *\n * @extends EventEmitter\n */\nexport declare interface BaseClient {\n on<K extends keyof ClientEvents>(\n event: K,\n listener: (...args: ClientEvents[K]) => Awaited<void>,\n ): this;\n on<S extends string | symbol>(\n event: Exclude<S, keyof ClientEvents>,\n listener: (...args: any[]) => Awaited<void>,\n ): this;\n once<K extends keyof ClientEvents>(\n event: K,\n listener: (...args: ClientEvents[K]) => Awaited<void>,\n ): this;\n once<S extends string | symbol>(\n event: Exclude<S, keyof ClientEvents>,\n listener: (...args: any[]) => Awaited<void>,\n ): this;\n emit<K extends keyof ClientEvents>(\n event: K,\n ...args: ClientEvents[K]\n ): boolean;\n emit<S extends string | symbol>(\n event: Exclude<S, keyof ClientEvents>,\n ...args: unknown[]\n ): boolean;\n off<K extends keyof ClientEvents>(\n event: K,\n listener: (...args: ClientEvents[K]) => Awaited<void>,\n ): this;\n off<S extends string | symbol>(\n event: Exclude<S, keyof ClientEvents>,\n listener: (...args: any[]) => Awaited<void>,\n ): this;\n removeAllListeners<K extends keyof ClientEvents>(event?: K): this;\n removeAllListeners<S extends string | symbol>(\n event?: Exclude<S, keyof ClientEvents>,\n ): this;\n}\n\n/**\n * Represents the events that the client can emit (discord.js style).\n */\nexport interface ClientEvents {\n /** Emitted when a debug message is logged. */\n [Events.DEBUG]: [unknown];\n /** Emitted when a message is received. */\n [Events.MESSAGE_CREATE]: [MessageStruct];\n /** Emitted when a message is deleted. */\n [Events.MESSAGE_DELETE]: [MessageStruct];\n /** Emitted when a message is updated. */\n [Events.MESSAGE_UPDATE]: [MessageStruct, MessageStruct];\n /** Emitted when a reaction is added to a message. */\n [Events.MESSAGE_REACTION_ADD]: [MessageStruct];\n /** Emitted when a reaction is removed from a message. */\n [Events.MESSAGE_REACTION_REMOVE]: [MessageStruct];\n /** Emitted when a message is bulk deleted. */\n [Events.MESSAGE_DELETE_BULK]: [string[]];\n /** Emitted when a channel is created. */\n [Events.CHANNEL_CREATE]: [Channel];\n /** Emitted when a channel is deleted. */\n [Events.CHANNEL_DELETE]: [Channel];\n /** Emitted when a channel is updated. */\n [Events.CHANNEL_UPDATE]: [Channel, Channel];\n /** Emitted when a server is created. */\n [Events.SERVER_CREATE]: [Server];\n /** Emitted when a server is deleted. */\n [Events.SERVER_DELETE]: [Server];\n /** Emitted when a server is updated. */\n [Events.SERVER_UPDATE]: [Server, Server];\n /** Emitted when a server member joins (discord.js: guildMemberAdd). */\n [Events.SERVER_MEMBER_JOIN]: [ServerMember];\n /** Emitted when a server member leaves (discord.js: guildMemberRemove). */\n [Events.SERVER_MEMBER_LEAVE]: [ServerMember];\n /** Emitted when a server member is updated (discord.js: guildMemberUpdate). */\n [Events.SERVER_MEMBER_UPDATE]: [ServerMember, ServerMember];\n /** Emitted when a user is updated. */\n [Events.USER_UPDATE]: [User, User];\n /** Emitted when a user is typing. */\n [Events.TYPING_START]: [Channel, User];\n /** Emitted when a user stops typing. */\n [Events.TYPING_STOP]: [Channel, User];\n /** Emitted when a group member joins. */\n [Events.GROUP_JOIN]: [Channel, User];\n /** Emitted when a group member leaves. */\n [Events.GROUP_LEAVE]: [Channel, User];\n /** Emitted when the client is ready. */\n [Events.READY]: [Client];\n /** Emitted when an error occurs. */\n [Events.ERROR]: [unknown];\n /** Emitted when a raw event is received. */\n [Events.RAW]: [unknown];\n /** emitted when a role is created */\n [Events.ROLE_CREATE]: [Role];\n /** emitted when a role is deleted */\n [Events.ROLE_DELETE]: [Role];\n /** emitted when a role is updated */\n [Events.ROLE_UPDATE]: [Role, Role];\n /** emitted when a webhook is created */\n [Events.WEBHOOKS_CREATE]: [WebhookCreateData];\n /** emitted when a webhook is deleted */\n [Events.WEBHOOKS_DELETE]: [WebhookDeleteData];\n /** emitted when a webhook is updated */\n [Events.WEBHOOKS_UPDATE]: [WebhookUpdateData];\n /** emitted when a user's voice state is updated (discord.js: voiceStateUpdate) */\n [Events.USER_VOICE_STATE_UPDATE]: [UserVoiceStateUpdateData];\n /** emitted when a user joins a voice channel */\n [Events.VOICE_CHANNEL_JOIN]: [VoiceChannelJoinData];\n /** emitted when a user leaves a voice channel */\n [Events.VOICE_CHANNEL_LEAVE]: [VoiceChannelLeaveData];\n}\n\n/**\n * Represents the options for configuring the selfbot client.\n */\nexport interface clientOptions {\n /** Whether to fetch all members of a server. */\n fetchMembers?: boolean;\n\n /** events for the client to ignore.*/\n ignoreEvents?: string[];\n\n /** Configuration for REST API requests. */\n rest?: {\n /** The timeout for REST requests in milliseconds. */\n timeout?: number;\n /** The number of retries for failed REST requests. */\n retries?: number;\n /** URL for stoat API instance without trailing slash */\n instanceURL?: string;\n /** URL for stoat CDN instance without trailing slash */\n instanceCDNURL?: string;\n };\n\n MessageCache?: {\n /** The maximum size of the cache. */\n maxSize?: number;\n };\n\n /** Configuration for WebSocket connections. */\n ws?: {\n /** The interval for sending heartbeats in milliseconds. */\n heartbeatInterval?: number;\n /** Whether to automatically reconnect on disconnection. */\n reconnect?: boolean;\n /** URL for stoat WebSocket instance without trailing slash */\n instanceURL?: string;\n };\n}\n\nexport interface VoiceClientOptions {\n enabled?: boolean;\n nodes?: VoiceNode[];\n}\n\nexport interface VoiceNode {\n name: string;\n lat: number;\n lon: number;\n public_url: string;\n}\n\n/**\n * Represents the base client that provides core functionality for interacting with the API.\n *\n * @extends EventEmitter\n */\nexport abstract class BaseClient extends EventEmitter {\n /** The REST client for making API requests. */\n readonly api: RestClient;\n\n /** The CDN client for accessing media resources. */\n readonly cdn: CDNClient;\n\n /** The authentication token for the client. */\n #token: string | null = null;\n\n /** The options for configuring the client. */\n options: clientOptions;\n\n voiceOptions: VoiceClientOptions = { enabled: false };\n\n /** Track current voice connection to prevent AlreadyConnected errors */\n currentVoiceConnection: { channelId: string; playerId: string } | null = null;\n\n /** Whether this is a selfbot client (always true for this package). */\n readonly bot = false;\n\n /** Whether to use the default error handler */\n #useDefaultErrorHandler = true;\n\n /**\n * Creates a new BaseClient instance.\n *\n * @param {clientOptions} [options={}] - The options for configuring the client.\n */\n constructor(options: clientOptions = {}) {\n if (options.rest?.instanceURL) {\n if (!options.rest?.instanceURL) {\n console.error(\n 'instance URLs must be provided (REST) see docs at \"https://jade3375.github.io/stoatbot.js/interfaces/clientOptions.html\"',\n );\n process.exit(0);\n } else {\n console.warn(\n \"You are connecting to a custom instance of Revolt. compatibility with StoatBot.js is not guaranteed.\",\n );\n }\n }\n super();\n this.options = {\n ...DEFAULT_CLIENT_OPTIONS,\n ...options,\n };\n this.api = new RestClient(this);\n this.cdn = new CDNClient(this);\n\n // Set up default error handler to prevent unhandled error exceptions\n this.on(\"error\", (error) => {\n // Only use default handler if user hasn't added their own\n if (this.#useDefaultErrorHandler && this.listenerCount(\"error\") === 1) {\n console.error(\n \"[stoatbot.js] Unhandled client error occurred. \" +\n \"Consider adding an error listener to your client:\",\n error,\n );\n console.error(\n \"Example: client.on('error', (error) => { console.error('Bot error:', error); });\",\n );\n }\n });\n\n // Disable default error handler when user adds their own\n this.on(\"newListener\", (event) => {\n if (event === \"error\") {\n this.#useDefaultErrorHandler = false;\n }\n });\n }\n\n /**\n * Emits a debug message.\n *\n * @param {unknown} msg - The debug message to emit.\n */\n debug(msg: unknown): void {\n this.emit(Events.DEBUG, msg);\n }\n\n /**\n * Sets the authentication token for the client.\n *\n * @param {string | null} token - The authentication token.\n */\n set token(token: string | null) {\n this.#token = token;\n }\n\n /**\n * Gets the authentication token for the client.\n *\n * @returns {string | null} The authentication token, or `null` if not set.\n */\n get token(): string | null {\n return this.#token;\n }\n}\n","import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { BaseClient } from \"../client/baseClient\";\nimport { apiUrl, DEFAULT_CLIENT_OPTIONS } from \"../utils\";\nimport { version } from \"../../package.json\";\nimport { RateLimitQueue } from \"./restUtils/rateLimitQueue\";\nimport { ApiDiscoveryResponse } from \"../utils/types\";\n\nexport class RestClient {\n private rateLimitQueue = new RateLimitQueue();\n constructor(private readonly client: BaseClient) {}\n\n /**\n * Helper function to handle API requests.\n * @param method The HTTP method (GET, POST, PATCH, PUT, DELETE).\n * @param url The URL for the request.\n * @param body The request body (if applicable).\n * @param query Query parameters (if applicable).\n * @returns The API response.\n */\n private async request<T>(\n method: \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\",\n url: string,\n body?: any,\n query?: Record<string, string | number>,\n retry?: boolean,\n ): Promise<T> {\n try {\n if (!this.client.token) throw new Error(\"Token is required\");\n\n const authHeader = \"X-Session-Token\";\n const config: AxiosRequestConfig & { url: string } = {\n ...{\n method,\n url: `${this.client.options.rest?.instanceURL ? this.client.options.rest?.instanceURL : apiUrl}${url}`,\n params: query,\n data: body?.body,\n headers: {\n [authHeader]: this.client.token,\n \"User-Agent\": `StoatBot.js/${version}`,\n },\n },\n url: `${this.client.options.rest?.instanceURL ? this.client.options.rest?.instanceURL : apiUrl}${url}`,\n };\n if (process.env.NODE_ENV === \"DEV\") {\n console.info(\"Request Body:\", body);\n console.info(\"Request Query:\", query);\n console.info(\"Request URL:\", config.url);\n }\n // Use the rate limit queue for all requests\n const response: AxiosResponse<T> =\n await this.rateLimitQueue.request<T>(config);\n return response.data;\n } catch (error) {\n if (retry) throw typeof error;\n if (error instanceof AxiosError) {\n if (error.status && (error.status === 429 || error.status >= 500)) {\n return this.retryRequest<T>(0, method, url, body, query);\n }\n if (error.status) {\n if (process.env.NODE_ENV === \"DEV\") {\n console.error(\"Error details:\", error);\n console.error(\"Error response data:\", error.response?.data);\n console.error(\"Error request config:\", error.config);\n console.error(\"Error message:\", error.message);\n console.error(\"Error URL:\", url);\n }\n throw new Error(\n `API call failed with status ${error.status}: ${error.response?.statusText}`,\n );\n }\n }\n throw new Error(\n `API call failed: ${error instanceof Error ? error.message : error}`,\n );\n }\n }\n\n async getConfig(): Promise<void> {\n try {\n const response: AxiosResponse<ApiDiscoveryResponse> = await axios.get(\n `${this.client.options.rest?.instanceURL ? this.client.options.rest?.instanceURL : apiUrl}/`,\n );\n const config = response.data;\n this.client.options.rest = {\n ...this.client.options.rest,\n instanceCDNURL: config.features.autumn.url,\n };\n this.client.options.ws = {\n ...this.client.options.ws,\n instanceURL: config.ws,\n };\n this.client.voiceOptions = {\n ...config.features.livekit,\n };\n } catch (error) {\n console.error(\"Failed to fetch configuration:\", error);\n process.exit(1);\n }\n }\n\n private async retryRequest<T>(\n attempt: number = 0,\n method: \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\",\n url: string,\n body?: any,\n query?: Record<string, string | number>,\n ): Promise<T> {\n if (attempt >= (this.client.options.rest?.retries ?? 3)) {\n throw new Error(\"Max retries reached\");\n }\n\n try {\n return await this.request<T>(method, url, body, query, true);\n } catch (error) {\n console.warn(`Attempt ${attempt + 1} failed:`, error);\n await new Promise((resolve) =>\n setTimeout(\n resolve,\n this.client.options.rest?.timeout ??\n DEFAULT_CLIENT_OPTIONS.rest?.timeout,\n ),\n );\n return this.retryRequest<T>(attempt + 1, method, url, body, query);\n }\n }\n\n /**\n * GET request.\n * @param url The URL for the request.\n * @param query Query parameters (if applicable).\n * @returns The API response.\n */\n async get<T>(\n url: string,\n query?: Record<string, string | number>,\n ): Promise<T> {\n return this.request<T>(\"GET\", url, undefined, query);\n }\n\n /**\n * POST request.\n * @param url The URL for the request.\n * @param body The request body.\n * @param query Query parameters (if applicable).\n * @returns The API response.\n */\n async post<T>(\n url: string,\n body?: any,\n query?: Record<string, string | number>,\n ): Promise<T> {\n return this.request<T>(\"POST\", url, body, query);\n }\n\n /**\n * PATCH request.\n * @param url The URL for the request.\n * @param body The request body.\n * @param query Query parameters (if applicable).\n * @returns The API response.\n */\n async patch<T>(\n url: string,\n body: any,\n query?: Record<string, string | number>,\n ): Promise<T> {\n return this.request<T>(\"PATCH\", url, body, query);\n }\n\n /**\n * PUT request.\n * @param url The URL for the request.\n * @param body The request body.\n * @param query Query parameters (if applicable).\n * @returns The API response.\n */\n async put<T>(\n url: string,\n body?: any,\n query?: Record<string, string | number>,\n ): Promise<T> {\n return this.request<T>(\"PUT\", url, body, query);\n }\n\n /**\n * DELETE request.\n * @param url The URL for the request.\n * @param query Query parameters (if applicable).\n * @returns The API response.\n */\n async delete<T>(\n url: string,\n body?: any,\n query?: Record<string, string | number>,\n ): Promise<T> {\n return this.request<T>(\"DELETE\", url, body, query);\n }\n}\n","{\n \"name\": \"stoat-selfbot.js\",\n \"version\": \"0.1.0\",\n \"description\": \"A Stoat selfbot client for Node.js with discord.js-like API. Uses X-Session-Token for authentication. Written in TypeScript.\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\"\n ],\n \"engines\": {\n \"node\": \">=21.0.0\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/ScarysMonsters/stoat-selfbot.js.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/ScarysMonsters/stoat-selfbot.js/issues\"\n },\n \"homepage\": \"https://github.com/ScarysMonsters/stoat-selfbot.js#readme\",\n \"keywords\": [\n \"revoltjs\",\n \"revolt.js\",\n \"stoatjs\",\n \"stoat.js\",\n \"bot\",\n \"selfbot\",\n \"client\",\n \"stoatbot\",\n \"stoat\",\n \"stoat-selfbot\",\n \"typescript\"\n ],\n \"author\": \"ScarysMonsters\",\n \"license\": \"MIT\",\n \"devDependencies\": {\n \"@types/jest\": \"^30.0.0\",\n \"@types/node\": \"^22.15.2\",\n \"@types/ws\": \"^8.18.1\",\n \"cross-env\": \"^10.1.0\",\n \"eslint\": \"^10.0.0\",\n \"eslint-config-prettier\": \"^10.1.2\",\n \"jest\": \"^30.3.0\",\n \"prettier\": \"^3.5.3\",\n \"rimraf\": \"^6.0.1\",\n \"ts-jest\": \"^29.4.9\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.8.3\"\n },\n \"dependencies\": {\n \"@livekit/rtc-node\": \"^0.13.22\",\n \"axios\": \"^1.12.2\",\n \"form-data\": \"^4.0.2\",\n \"revolt-api\": \"^0.8.9\",\n \"ws\": \"^8.18.1\"\n },\n \"scripts\": {\n \"lint\": \"eslint . --ext .ts --fix\",\n \"build\": \"rimraf dist && tsup ./src/index.ts --format cjs,esm --clean --dts --sourcemap\",\n \"start\": \"pnpm build && node --enable-source-maps dist/index.js\",\n \"testClient\": \"pnpm test:build && node --enable-source-maps dist/test.js\",\n \"testClient:debug\": \"cross-env NODE_ENV=DEV pnpm testClient\",\n \"clean\": \"rimraf dist\",\n \"test:build\": \"rimraf dist && tsc -p tsconfig.json\",\n \"test\": \"jest\",\n \"test:watch\": \"jest --watch\",\n \"test:coverage\": \"jest --coverage\",\n \"prepublishOnly\": \"pnpm build && pnpm test\"\n },\n \"packageManager\": \"pnpm@9.0.0\"\n}\n","import axios, { AxiosRequestConfig, AxiosResponse } from \"axios\";\n\ninterface RateLimitInfo {\n limit: number;\n remaining: number;\n resetAfter: number; // epoch ms\n bucket: string;\n resetIn: number; // ms until reset\n}\n\ninterface BucketState extends RateLimitInfo {\n queue: Array<() => void>;\n resetTimeout?: NodeJS.Timeout;\n lastPath: string;\n}\n\nexport class RateLimitQueue {\n private bucketMap: Map<string, BucketState> = new Map();\n private pathToBucket: Map<string, string> = new Map();\n\n async request<T = any>(\n config: AxiosRequestConfig & { url: string },\n ): Promise<AxiosResponse<T>> {\n const path = config.url!;\n const bucketId = this.pathToBucket.get(path);\n let bucket = bucketId ? this.bucketMap.get(bucketId) : undefined;\n\n if (bucket && bucket.remaining <= 0 && Date.now() < bucket.resetAfter) {\n // Rate limited, queue the request\n return new Promise<AxiosResponse<T>>((resolve, reject) => {\n bucket!.queue.push(async () => {\n try {\n const res = await this._doRequest<T>(config, path);\n resolve(res);\n } catch (e) {\n console.error(e);\n }\n });\n });\n } else {\n // Not rate limited, do the request\n return this._doRequest<T>(config, path);\n }\n }\n\n private async _doRequest<T>(\n config: AxiosRequestConfig,\n path: string,\n ): Promise<AxiosResponse<T>> {\n const response = await axios(config);\n this._updateRateLimit(path, response);\n return response;\n }\n\n private _updateRateLimit(path: string, response: AxiosResponse) {\n const headers = response.headers;\n const limit = parseInt(headers[\"x-ratelimit-limit\"]);\n const remaining = parseInt(headers[\"x-ratelimit-remaining\"]);\n const resetAfter =\n parseFloat(headers[\"x-ratelimit-reset-after\"]) * 1000 + Date.now();\n const bucket = headers[\"x-ratelimit-bucket\"];\n const resetIn = parseInt(headers[\"x-ratelimit-reset-after\"]);\n\n if (!bucket) return;\n this.pathToBucket.set(path, bucket);\n let state = this.bucketMap.get(bucket);\n if (!state) {\n state = {\n limit,\n remaining,\n resetAfter,\n bucket,\n resetIn,\n queue: [],\n lastPath: path,\n };\n this.bucketMap.set(bucket, state);\n } else {\n state.limit = limit;\n state.remaining = remaining;\n state.resetAfter = resetAfter;\n state.lastPath = path;\n }\n\n if (remaining <= 0) {\n if (state.resetTimeout) clearTimeout(state.resetTimeout);\n const delay = resetIn;\n state.resetTimeout = setTimeout(() => {\n state.remaining = state.limit;\n state.resetTimeout = undefined;\n // Process queued requests\n while (state.queue.length > 0 && state.remaining > 0) {\n const fn = state.queue.shift();\n if (fn) {\n state.remaining--;\n fn();\n }\n }\n }, delay);\n }\n }\n}\n","import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { BaseClient } from \"../client/baseClient\";\nimport { DEFAULT_CLIENT_OPTIONS } from \"../utils\";\nimport { version } from \"../../package.json\";\nimport FormData from \"form-data\";\nimport { RateLimitQueue } from \"./restUtils/rateLimitQueue\";\nexport class CDNClient {\n private rateLimitQueue = new RateLimitQueue();\n constructor(private readonly client: BaseClient) {}\n\n /**\n * Helper function to handle API requests.\n * @param method The HTTP method (GET, POST, PATCH, PUT, DELETE).\n * @param url The URL for the request.\n * @param body The request body (if applicable).\n * @param query Query parameters (if applicable).\n * @returns The API response.\n */\n private async request<T>(\n method: \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\",\n url: string,\n data: FormData,\n query?: Record<string, string | number>,\n retry?: boolean,\n ): Promise<T> {\n try {\n if (!this.client.token) throw new Error(\"Token is required\");\n\n const authHeader = \"X-Session-Token\";\n const config: AxiosRequestConfig & { url: string } = {\n ...{\n method,\n url: `${this.client.options.rest?.instanceCDNURL}${url}`,\n params: query,\n data,\n maxBodyLength: Infinity,\n headers: {\n [authHeader]: this.client.token,\n \"Content-Type\": \"multipart/form-data\",\n \"User-Agent\": `StoatBot.js/${version}`,\n ...data.getHeaders(),\n },\n },\n url: `${this.client.options.rest?.instanceCDNURL}${url}`,\n };\n\n if (process.env.NODE_ENV === \"DEV\") {\n console.info(\"Request Data:\", data);\n console.info(\"Request Query:\", query);\n console.info(\"Request URL:\", config.url);\n }\n\n // Use the rate limit queue for all requests\n const response: AxiosResponse<T> =\n await this.rateLimitQueue.request<T>(config);\n return response.data;\n } catch (error) {\n if (retry) throw typeof error;\n if (error instanceof AxiosError) {\n if (error.status && (error.status === 429 || error.status >= 500)) {\n return this.retryRequest<T>(0, method, url, data, query);\n }\n if (error.status) {\n console.error(`API call failed with status ${error.status}:`, error);\n throw new Error(\n `API call failed with status ${error.status}: ${error.message}`,\n );\n }\n }\n throw new Error(\n `API call failed: ${error instanceof Error ? error.message : error}`,\n );\n }\n }\n\n private async retryRequest<T>(\n attempt: number = 0,\n method: \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\",\n url: string,\n body?: any,\n query?: Record<string, string | number>,\n ): Promise<T> {\n if (attempt >= (this.client.options.rest?.retries ?? 3)) {\n throw new Error(\"Max retries reached\");\n }\n\n try {\n return await this.request<T>(method, url, body, query, true);\n } catch (error) {\n console.warn(`Attempt ${attempt + 1} failed:`, error);\n await new Promise((resolve) =>\n setTimeout(\n resolve,\n this.client.options.rest?.timeout ??\n DEFAULT_CLIENT_OPTIONS.rest?.timeout,\n ),\n );\n return this.retryRequest<T>(attempt + 1, method, url, body, query);\n }\n }\n /**\n * POST request.\n * @param url The URL for the request.\n * @param data The request body.\n * @returns The API response.\n */\n async post<T>(url: string, data: FormData): Promise<T> {\n return this.request<T>(\"POST\", url, data);\n }\n}\n","import type { Client } from \"../client\";\n\n/**\n * Represents the base class for all event handlers.\n * All event handlers must extend this class and implement the `handle` method.\n * @private\n */\nexport abstract class Event {\n /**\n * Creates a new Event instance.\n *\n * @param {client} client - The client instance.\n */\n constructor(protected readonly client: Client) {}\n\n /**\n * Handles the event logic.\n * This method must be implemented by subclasses to define the behavior for the specific event.\n *\n * @param {unknown} data - The data associated with the event.\n * @returns {Promise<unknown | void>} A promise that resolves with the result of the event handling or `void`.\n */\n abstract handle(data: unknown): Awaited<unknown | void>;\n}\n\nexport { Events } from \"../../utils/constants\";\nexport type * as API from \"revolt-api\";\n","import { Event, Events } from \"./event\";\n\n/**\n * Represents the event handler for bulk message deletions.\n * @private\n * @extends Event\n */\nexport class BulkMessageDelete extends Event {\n /**\n * Handles the bulk message delete event.\n *\n * @param {{ ids: string[] }} data - The data for the event, containing the IDs of the deleted messages.\n */\n handle(data: { ids: string[] }) {\n // TODO: Get cached messages\n this.client.emit(Events.MESSAGE_DELETE_BULK, data.ids);\n }\n}\n","import { Event, API, Events } from \"./event\";\n\n/**\n * Represents the event handler for channel creation.\n * @private\n * @extends Event\n */\nexport class ChannelCreate extends Event {\n /**\n * Handles the channel creation event.\n *\n * @param {API.Channel} data - The raw data for the created channel from the API.\n * @returns {Promise<{ channel: unknown }>} A promise that resolves with the created channel.\n * @private\n */\n async handle(data: API.Channel): Promise<unknown> {\n const channel = this.client.channels._add(data);\n\n if (channel) {\n if (channel.inServer()) {\n const server =\n channel.server ?? (await this.client.servers.fetch(channel.serverId));\n server.channels.cache.set(channel.id, channel);\n }\n this.client.emit(Events.CHANNEL_CREATE, channel);\n }\n\n return { channel };\n }\n}\n","import { Event, Events } from \"./event\";\n\n/**\n * Represents the event handler for channel deletion.\n * @private\n * @extends Event\n */\nexport class ChannelDelete extends Event {\n /**\n * Handles the channel deletion event.\n *\n * @param {{ id: string }} data - The data for the event, containing the ID of the deleted channel.\n * @returns {{ channel: unknown }} An object containing the deleted channel, or `undefined` if not found.\n */\n handle(data: { id: string }): unknown {\n const channel = this.client.channels.cache.get(data.id);\n\n if (channel) {\n if (channel.inServer()) {\n channel.server?.channels.cache.delete(channel.id);\n }\n this.client.emit(Events.CHANNEL_DELETE, channel);\n }\n\n return { channel };\n }\n}\n","import { Event, Events } from \"./event\";\n\n/**\n * Represents the event handler for a user joining a group channel.\n * @private\n * @extends Event\n */\nexport class ChannelGroupJoin extends Event {\n /**\n * Handles the group channel join event.\n *\n * @param {{ id: string; user: string }} data - The data for the event, containing the channel ID and user ID.\n * @returns {Promise<{ channel: unknown; user: unknown }>} A promise that resolves with the updated channel and user.\n */\n async handle(data: { id: string; user: string }): Promise<unknown> {\n const channel = this.client.channels.cache.get(data.id);\n const user = await this.client.users.fetch(data.user, { force: false });\n\n if (channel?.isGroup()) {\n channel.users.set(user.id, user);\n this.client.emit(Events.GROUP_JOIN, channel, user);\n }\n\n return { channel, user };\n }\n}\n","import { Event, Events } from \"./event\";\n\n/**\n * Represents the event handler for a user leaving a group channel.\n * @private\n * @extends Event\n */\nexport class ChannelGroupLeave extends Event {\n /**\n * Handles the group channel leave event.\n *\n * @param {{ id: string; user: string }} data - The data for the event, containing the channel ID and user ID.\n * @returns {Promise<{ channel: unknown; user: unknown }>} A promise that resolves with the updated channel and user.\n */\n async handle(data: { id: string; user: string }): Promise<unknown> {\n const channel = this.client.channels.cache.get(data.id);\n const user = await this.client.users.fetch(data.user, { force: false });\n\n if (channel?.isGroup()) {\n channel.users.delete(data.user);\n this.client.emit(Events.GROUP_LEAVE, channel, user);\n }\n\n return { channel, user };\n }\n}\n","import { Event, Events } from \"./event\";\n\n/**\n * Represents the event handler for when a user starts typing in a channel.\n * @private\n * @extends Event\n */\nexport class ChannelStartTyping extends Event {\n /**\n * Handles the typing start event.\n *\n * @param {{ id: string; user: string }} data - The data for the event, containing the channel ID and user ID.\n * @returns {{ channel: unknown; user: unknown }} An object containing the channel and user involved in the event.\n */\n handle(data: { id: string; user: string }): unknown {\n const channel = this.client.channels.cache.get(data.id);\n const user = this.client.users.cache.get(data.user);\n\n if (channel?.isText() && user) {\n this.client.emit(Events.TYPING_START, channel, user);\n }\n\n return { channel, user };\n }\n}\n","import { Event, Events } from \"./event\";\n\n/**\n * Represents the event handler for when a user stops typing in a channel.\n * @private\n * @extends Event\n */\nexport class ChannelStopTyping extends Event {\n /**\n * Handles the typing stop event.\n *\n * @param {{ id: string; user: string }} data - The data for the event, containing the channel ID and user ID.\n * @returns {{ channel: unknown; user: unknown }} An object containing the channel and user involved in the event.\n */\n handle(data: { id: string; user: string }): unknown {\n const channel = this.client.channels.cache.get(data.id);\n const user = this.client.users.cache.get(data.user);\n\n if (channel?.isText() && user) {\n this.client.emit(Events.TYPING_STOP, channel, user);\n }\n\n return { channel, user };\n }\n}\n","import { Event, API, Events } from \"./event\";\n\n/**\n * Represents the event handler for channel updates.\n * @private\n * @extends Event\n */\nexport class ChannelUpdate extends Event {\n /**\n * Handles the channel update event.\n *\n * @param {{ id: string; data: API.Channel; clear: API.FieldsChannel }} data - The data for the event, containing the channel ID, updated data, and fields to clear.\n * @returns {void}\n */\n handle(data: {\n id: string;\n data: API.Channel;\n clear: API.FieldsChannel;\n }): void {\n const channel = this.client.channels.cache.get(data.id);\n const oldChannel = channel?._update(data.data);\n\n if (channel && oldChannel && !channel.equals(oldChannel)) {\n this.client.emit(Events.CHANNEL_UPDATE, oldChannel, channel);\n }\n }\n}\n","import { Event, API, Events } from \"./event\";\nimport { SYSTEM_USER_ID } from \"../../utils/constants\";\n\n/**\n * Represents the event handler for incoming messages.\n *\n * @private\n * @extends Event\n */\nexport class Message extends Event {\n /**\n * Handles the message event.\n *\n * @param {API.Message} data - The raw data for the message from the API.\n * @returns {Promise<{ message: unknown }>} A promise that resolves with the created message, or an empty object if the channel is not text-based.\n * @private\n */\n async handle(data: API.Message): Promise<unknown> {\n if (data.system) {\n return {};\n }\n const channel = this.client.channels.cache.get(data.channel);\n\n if (channel?.isText()) {\n const message = channel.messages._add(data);\n if (data.author !== SYSTEM_USER_ID && !data.webhook) {\n await this.client.users.fetch(data.author, { force: false });\n }\n\n this.client.emit(Events.MESSAGE_CREATE, message);\n\n return { message };\n }\n\n return {};\n }\n}\n","import { Event, Events } from \"./event\";\n\n/**\n * Represents the event handler for message deletions.\n * @private\n * @extends Event\n */\nexport class MessageDelete extends Event {\n /**\n * Handles the message deletion event.\n *\n * @param {{ id: string; channel: string }} data - The data for the event, containing the message ID and channel ID.\n * @returns {{ message: unknown } | {}} An object containing the deleted message, or an empty object if the channel is not text-based or the message is not found.\n */\n handle(data: { id: string; channel: string }): unknown {\n const channel = this.client.channels.cache.get(data.channel);\n\n if (channel?.isText()) {\n const message = channel.messages.cache.get(data.id);\n\n if (message) {\n channel.messages._remove(message.id);\n this.client.emit(Events.MESSAGE_DELETE, message);\n }\n\n return { message };\n }\n\n return {};\n }\n}\n","import { Event, API, Events } from \"./event\";\n\n/**\n * Represents the event handler for message updates.\n * @private\n * @extends Event\n */\nexport class MessageUpdate extends Event {\n /**\n * Handles the message update event.\n *\n * @param {{ id: string; channel: string; data: API.Message }} data - The data for the event, containing the message ID, channel ID, and updated message data.\n * @returns {void}\n */\n handle(data: { id: string; channel: string; data: API.Message }): void {\n const channel = this.client.channels.cache.get(data.channel);\n\n if (!channel?.isText()) return;\n\n const message = channel?.messages.cache.get(data.id);\n const oldMessage = message?._update(data.data);\n\n if (oldMessage && message && !message.equals(oldMessage)) {\n this.client.emit(Events.MESSAGE_UPDATE, oldMessage, message);\n }\n }\n}\n","import { Event, API, Events } from \"./event\";\n\n/**\n * Represents the event handler for server creation.\n * @private\n * @extends Event\n */\nexport class ServerCreate extends Event {\n /**\n * Handles the server creation event.\n *\n * @param {API.Server} data - The raw data for the created server from the API.\n * @returns {Promise<void>} A promise that resolves when the server is added and members are optionally fetched.\n * @private\n */\n async handle(data: API.Server): Promise<void> {\n const server = this.client.servers._add(data);\n\n if (this.client.options.fetchMembers) {\n await server.members.fetch();\n }\n\n this.client.emit(Events.SERVER_CREATE, server);\n }\n}\n","import { Event, API, Events } from \"./event\";\n\n/**\n * Represents the event handler for server deletion.\n * @private\n * @extends Event\n */\nexport class ServerDelete extends Event {\n /**\n * Handles the server deletion event.\n *\n * @param {API.Server} data - The raw data for the deleted server from the API.\n * @returns {{ server: unknown }} An object containing the deleted server, or `undefined` if not found.\n */\n handle(data: API.Server): unknown {\n const server = this.client.servers.cache.get(data._id);\n\n if (server) {\n this.client.servers._remove(server.id);\n this.client.emit(Events.SERVER_DELETE, server);\n }\n\n return { server };\n }\n}\n","import { Event, Events } from \"./event\";\n\n/**\n * Represents the event handler for a member joining a server.\n * @private\n * @extends Event\n */\nexport class ServerMemberJoin extends Event {\n /**\n * Handles the server member join event.\n *\n * @param {{ id: string; user: string }} data - The data for the event, containing the server ID and user ID.\n * @returns {Promise<{ member: unknown }>} A promise that resolves with the joined member.\n */\n async handle(data: { id: string; user: string }): Promise<unknown> {\n let server = this.client.servers.cache.get(data.id);\n\n if (!server) {\n server = await this.client.servers.fetch(data.id);\n this.client.emit(Events.SERVER_CREATE, server);\n }\n\n const member = await server.members.fetch(data.user);\n\n server.members.cache.set(member.id, member);\n\n this.client.emit(Events.SERVER_MEMBER_JOIN, member);\n\n return { member };\n }\n}\n","import { Event, Events } from \"./event\";\n\n/**\n * Represents the event handler for a member leaving a server.\n * @private\n * @extends Event\n */\nexport class ServerMemberLeave extends Event {\n /**\n * Handles the server member leave event.\n *\n * @param {{ id: string; user: string }} data - The data for the event, containing the server ID and user ID.\n * @returns {{ server: unknown; member?: unknown }} An object containing the server and the member who left, or just the server if the member is not found.\n */\n handle(data: { id: string; user: string }): unknown {\n const server = this.client.servers.cache.get(data.id);\n\n if (server) {\n const member = server.members.cache.get(data.user);\n\n if (member) {\n server.members._remove(member.id);\n this.client.emit(Events.SERVER_MEMBER_LEAVE, member);\n }\n\n return { server, member };\n }\n\n return { server };\n }\n}\n","import { Role } from \"../../struct\";\nimport { Event, API, Events } from \"./event\";\n\n/**\n * Represents the event handler for server member updates.\n * @private\n * @extends Event\n */\nexport class ServerMemberUpdate extends Event {\n /**\n * Handles the server member update event.\n *\n * @param {{ id: string; data: API.Member }} data - The data for the event, containing the server ID and updated member data.\n * @returns {void}\n */\n handle(data: {\n id: { server: string; user: string };\n data: API.Member;\n }): void {\n const updateData = {\n ...data.data,\n _id: { server: data.id.server, user: data.id.user },\n };\n const server = this.client.servers.cache.get(data.id.server);\n const member = server?.members.cache.get(data.id.user);\n const oldMember = member?._update(updateData);\n\n if (\n oldMember &&\n member &&\n (!member.equals(oldMember) ||\n areRolesDifferent(member.roles, oldMember.roles))\n ) {\n this.client.emit(Events.SERVER_MEMBER_UPDATE, oldMember, member);\n }\n }\n}\n\n/**\n * Compares the role IDs of two members and determines if they are different.\n *\n * @param {API.Role[]} rolesA - The roles of the first member.\n * @param {API.Role[]} rolesB - The roles of the second member.\n * @returns {boolean} - Returns true if the roles are different, otherwise false.\n */\nfunction areRolesDifferent(rolesA: Role[], rolesB: Role[]): boolean {\n const idsA = rolesA.map((role) => role.id).sort();\n const idsB = rolesB.map((role) => role.id).sort();\n\n return (\n idsA.length !== idsB.length ||\n !idsA.every((id, index) => id === idsB[index])\n );\n}\n","import { Event, Events } from \"./event\";\n\n/**\n * Represents the event handler for server role deletions.\n * @private\n * @extends Event\n */\nexport class ServerRoleDelete extends Event {\n /**\n * Handles the server role deletion event.\n *\n * @param {{ id: string; role_id: string }} data - The data for the event, containing the server ID and role ID.\n * @returns {{ role: unknown } | {}} An object containing the deleted role, or an empty object if the role or server is not found.\n */\n handle(data: { id: string; role_id: string }): unknown {\n const server = this.client.servers.cache.get(data.id);\n\n if (server) {\n const role = server.roles.cache.get(data.role_id);\n\n if (role) {\n server.roles._remove(role.id);\n this.client.emit(Events.ROLE_DELETE, role);\n }\n\n return { role };\n }\n\n return {};\n }\n}\n","import { Event, API, Events } from \"./event\";\nimport type { Role as APIRole } from \"revolt-api\";\n\n/**\n * Represents the event handler for server role updates.\n * @private\n * @extends Event\n */\nexport class ServerRoleUpdate extends Event {\n /**\n * Handles the server role update event.\n *\n * @param {{ id: string; role_id: string; data: API.Role & { _id: string }; clear: API.FieldsRole[] }} data - The data for the event, containing the server ID, role ID, updated role data, and fields to clear.\n * @returns {void}\n */\n async handle(data: {\n id: string;\n role_id: string;\n data: API.Role & { _id: string };\n clear: API.FieldsRole[];\n }): Promise<void> {\n const server = this.client.servers.cache.get(data.id);\n\n if (!server) return;\n\n let role = server.roles.cache.get(data.role_id);\n const oldRole = role?._update(data.data, data.clear);\n\n if (!oldRole && !role) {\n await Promise.all(\n Object.values(data.data).map(async (raw) => {\n if (raw && typeof raw === \"object\") {\n server.roles._add({\n name: \"\",\n permissions: {\n a: 0,\n d: 0,\n },\n ...raw,\n id: data.role_id,\n });\n }\n }),\n );\n role = server.roles.cache.get(data.role_id)!;\n }\n\n if (role && oldRole && !role.equals(oldRole)) {\n this.client.emit(Events.ROLE_UPDATE, oldRole, role);\n }\n }\n}\n","import { Event, API, Events } from \"./event\";\n\n/**\n * Represents the event handler for server updates.\n * @private\n * @extends Event\n */\nexport class ServerUpdate extends Event {\n /**\n * Handles the server update event.\n *\n * @param {{ id: string; data: API.Server; clear: API.FieldsServer[] }} data - The data for the event, containing the server ID, updated server data, and fields to clear.\n * @returns {void}\n */\n handle(data: {\n id: string;\n data: API.Server;\n clear: API.FieldsServer[];\n }): void {\n const server = this.client.servers.cache.get(data.id);\n const oldServer = server?._update(data.data, data.clear);\n\n if (oldServer && server && !oldServer.equals(server)) {\n this.client.emit(Events.SERVER_UPDATE, oldServer, server);\n }\n }\n}\n","import { Event, API, Events } from \"./event\";\n\n/**\n * Represents the event handler for user updates.\n * @private\n * @extends Event\n */\nexport class UserUpdate extends Event {\n /**\n * Handles the user update event.\n *\n * @param {{ id: string; data: API.User; clear: API.FieldsUser[] }} data - The data for the event, containing the user ID, updated user data, and fields to clear.\n * @returns {void}\n */\n handle(data: { id: string; data: API.User; clear: API.FieldsUser[] }): void {\n const user =\n data.id === this.client.user!.id\n ? this.client.user\n : this.client.users.cache.get(data.id);\n const oldUser = user?._update(data.data, data.clear);\n\n if (user && oldUser && !user.equals(oldUser)) {\n this.client.emit(Events.USER_UPDATE, oldUser, user);\n }\n }\n}\n","import { Event, API, Events } from \"./event\";\n\n/**\n * Represents the data for a message reaction event.\n */\nexport interface MessageReactData {\n /** The ID of the message being reacted to. */\n id: string;\n\n /** The ID of the channel containing the message. */\n channel_id: string;\n\n /** The ID of the user who reacted. */\n user_id: string;\n\n /** The ID of the emoji used for the reaction. */\n emoji_id: string;\n}\n\n/**\n * Represents the event handler for message reactions.\n * @private\n * @extends Event\n */\nexport class MessageReact extends Event {\n /**\n * Handles the message reaction event.\n *\n * @param {MessageReactData} data - The data for the event, containing the message ID, channel ID, user ID, and emoji ID.\n * @returns {Promise<unknown>} A promise that resolves with an empty object.\n */\n async handle(data: MessageReactData): Promise<unknown> {\n const channel = this.client.channels.cache.get(data.channel_id);\n\n if (channel?.isText()) {\n let message = channel.messages.cache.get(data.id)\n ? channel.messages.cache.get(data.id)\n : await channel.messages.fetch(data.id);\n\n if (message) {\n if (message.reactions.get(data.emoji_id)?.indexOf(data.user_id)) return;\n if (!message.reactions.get(data.emoji_id)?.push(data.user_id))\n message.reactions.set(data.emoji_id, [data.user_id]);\n\n this.client.emit(Events.MESSAGE_REACTION_ADD, message);\n }\n }\n\n return {};\n }\n}\n","import { Event, API, Events } from \"./event\";\nimport { MessageReactData } from \"./messageReact\";\n\n/**\n * Represents the event handler for message reaction removals.\n * @private\n * @extends Event\n */\nexport class MessageUnreact extends Event {\n /**\n * Handles the message reaction removal event.\n *\n * @param {MessageReactData} data - The data for the event, containing the message ID, channel ID, user ID, and emoji ID.\n * @returns {Promise<unknown>} A promise that resolves with an empty object.\n */\n async handle(data: MessageReactData): Promise<unknown> {\n const channel = this.client.channels.cache.get(data.channel_id);\n\n if (channel?.isText()) {\n let message = channel.messages.cache.get(data.id)\n ? channel.messages.cache.get(data.id)\n : await channel.messages.fetch(data.id);\n\n if (message) {\n const reaction = message.reactions.get(data.emoji_id);\n if (reaction) {\n const index = reaction.indexOf(data.user_id);\n if (index !== -1) {\n reaction.splice(index, 1);\n }\n if (reaction.length === 0) {\n message.reactions.delete(data.emoji_id);\n }\n }\n this.client.emit(Events.MESSAGE_REACTION_REMOVE, message);\n }\n }\n\n return {};\n }\n}\n","import { Event, Events } from \"./event\";\nimport { WebhookCreateData } from \"../../utils/types\";\n\n/**\n * Represents the event handler for webhook creations.\n * @extends Event\n * @private\n */\nexport class WebhookCreate extends Event {\n /**\n * Handles the webhook create event.\n * @param {id: string, channel_id: string, server_id: string, name: string} data - The data for the event, containing the webhook ID, channel ID, server ID, and name.\n * @returns {void}\n */\n handle(data: {\n id: string;\n channel_id: string;\n server_id: string;\n name: string;\n creator_id: string;\n token: string;\n }): void {\n const webhookData: WebhookCreateData = {\n webhookId: data.id,\n channelId: data.channel_id,\n name: data.name,\n creatorId: data.creator_id,\n token: data.token,\n };\n\n this.client.emit(Events.WEBHOOKS_CREATE, webhookData);\n }\n}\n","import { Event, Events } from \"./event\";\nimport { WebhookDeleteData } from \"../../utils/types\";\n\n/**\n * Represents the event handler for webhook deletions.\n * @extends Event\n * @private\n */\nexport class WebhookDelete extends Event {\n /**\n * Handles the webhook delete event.\n * @param {id: string, channel_id: string, server_id: string} data - The data for the event, containing the webhook ID, channel ID, and server ID.\n * @returns {void}\n */\n handle(data: { id: string; channel_id: string; server_id: string }): void {\n const webhookData: WebhookDeleteData = {\n webhookId: data.id,\n };\n\n this.client.emit(Events.WEBHOOKS_DELETE, webhookData);\n }\n}\n","import { Event, Events } from \"./event\";\nimport { WebhookUpdateData } from \"../../utils/types\";\n\n/**\n * Represents the event handler for webhook updates.\n * @extends Event\n * @private\n */\nexport class WebhookUpdate extends Event {\n /**\n * Handles the webhook update event.\n * @param {id: string, data: { name: string; avatar?: { _id: string; tag: string; filename: string; metadata: any; content_type: string; size: number; }; remove: string[]; }} data- The data for the event, containing the webhook ID and updated webhook data.\n * @returns {void}\n */\n handle(data: {\n id: string;\n data: {\n name: string;\n avatar?: {\n _id: string;\n tag: string;\n filename: string;\n metadata: any;\n content_type: string;\n size: number;\n };\n remove: string[];\n };\n }): void {\n const webhookData: WebhookUpdateData = {\n webhookId: data.id,\n name: data.data.name,\n avatar: data.data.avatar,\n remove: data.data.remove,\n };\n\n this.client.emit(Events.WEBHOOKS_UPDATE, webhookData);\n }\n}\n","import { Event, API, Events } from \"./event\";\n\n/**\n * Data structure for user voice state update event.\n */\nexport interface UserVoiceStateUpdateData {\n id: string;\n channel_id: string;\n data: { is_publishing: boolean; screensharing: boolean; camera: boolean };\n}\n\n/**\n * Represents the event handler for user voice state updates.\n * @private\n * @extends Event\n */\nexport class UserVoiceStateUpdate extends Event {\n /**\n * Handles the user voice state update event.\n * @param {{ id: string; channel_id: string; data: { is_publishing: boolean; screensharing: boolean; camera: boolean; }; }} data - The data for the event, containing the user ID, channel ID, and updated voice state data.\n * @returns {void}\n */\n handle(data: UserVoiceStateUpdateData): void {\n this.client.emit(Events.USER_VOICE_STATE_UPDATE, data);\n }\n}\n","import { voiceParticipant } from \"../../struct\";\nimport { ChannelTypes } from \"../../utils\";\nimport { Event, API, Events } from \"./event\";\n\n/**\n * Data structure for voice channel join event.\n */\nexport interface VoiceChannelJoinData {\n id: string;\n state: voiceParticipant;\n}\n\n/**\n * Represents the event handler for voice channel joins.\n * @private\n * @extends Event\n */\nexport class VoiceChannelJoin extends Event {\n /**\n * Handles the voice channel join event.\n * @param {{ id: string; state: voiceParticipant; }} data - The data for the event, containing the channel ID and participant state.\n * @returns {void}\n */\n handle(data: VoiceChannelJoinData): void {\n const channel = this.client.channels.cache.get(data.id);\n if (\n channel?.type === ChannelTypes.VOICE ||\n channel?.type === ChannelTypes.GROUP\n ) {\n channel.voice?.set(data.id, data.state);\n }\n this.client.emit(Events.VOICE_CHANNEL_JOIN, data);\n }\n}\n","import { voiceParticipant } from \"../../struct\";\nimport { ChannelTypes } from \"../../utils\";\nimport { Event, API, Events } from \"./event\";\n\n/**\n * Data structure for voice channel leave event.\n */\nexport interface VoiceChannelLeaveData {\n id: string;\n user: string;\n}\n\n/**\n * Represents the event handler for voice channel leaves.\n * @private\n * @extends Event\n */\nexport class VoiceChannelLeave extends Event {\n /**\n * Handles the voice channel leave event.\n * @param {{ id: string; user: string; }} data - The data for the event, containing the channel ID and user ID.\n * @returns {void}\n */\n handle(data: VoiceChannelLeaveData): void {\n const channel = this.client.channels.cache.get(data.id);\n if (\n channel?.type === ChannelTypes.VOICE ||\n channel?.type === ChannelTypes.GROUP\n ) {\n channel.voice?.delete(data.id);\n }\n this.client.emit(Events.VOICE_CHANNEL_LEAVE, data);\n }\n}\n","// Static event map for robust registration\nimport { BulkMessageDelete } from \"./bulkMessageDelete\";\nimport { ChannelCreate } from \"./channelCreate\";\nimport { ChannelDelete } from \"./channelDelete\";\nimport { ChannelGroupJoin } from \"./channelGroupJoin\";\nimport { ChannelGroupLeave } from \"./channelGroupLeave\";\nimport { ChannelStartTyping } from \"./channelStarttyping\";\nimport { ChannelStopTyping } from \"./channelStopTyping\";\nimport { ChannelUpdate } from \"./channelUpdate\";\nimport { Message as MessageReceved } from \"./message\";\nimport { MessageDelete } from \"./messageDelete\";\nimport { MessageUpdate } from \"./messageUpdate\";\nimport { ServerCreate } from \"./serverCreate\";\nimport { ServerDelete } from \"./serverDelete\";\nimport { ServerMemberJoin } from \"./serverMemberJoin\";\nimport { ServerMemberLeave } from \"./serverMemberLeave\";\nimport { ServerMemberUpdate } from \"./serverMemberUpdate\";\nimport { ServerRoleDelete } from \"./serverRoleDelete\";\nimport { ServerRoleUpdate } from \"./serverRoleUpdate\";\nimport { ServerUpdate } from \"./serverupdate\";\nimport { UserUpdate } from \"./userUpdate\";\nimport { MessageReact } from \"./messageReact\";\nimport { MessageUnreact } from \"./messageUnreact\";\nimport { WebhookCreate } from \"./webhookCreate\";\nimport { WebhookDelete } from \"./webhookDelete\";\nimport { WebhookUpdate } from \"./webhookUpdate\";\nimport { UserVoiceStateUpdate } from \"./userVoiceStateUpdate\";\nimport { VoiceChannelJoin } from \"./voiceChannelJoin\";\nimport { VoiceChannelLeave } from \"./voiceChannelLeave\";\n\nexport const EventMap = {\n bulkMessageDelete: BulkMessageDelete,\n channelCreate: ChannelCreate,\n channelDelete: ChannelDelete,\n channelGroupJoin: ChannelGroupJoin,\n channelGroupLeave: ChannelGroupLeave,\n channelStartTyping: ChannelStartTyping,\n channelStopTyping: ChannelStopTyping,\n channelUpdate: ChannelUpdate,\n message: MessageReceved,\n messageDelete: MessageDelete,\n messageUpdate: MessageUpdate,\n serverCreate: ServerCreate,\n serverDelete: ServerDelete,\n serverMemberJoin: ServerMemberJoin,\n serverMemberLeave: ServerMemberLeave,\n serverMemberUpdate: ServerMemberUpdate,\n serverRoleDelete: ServerRoleDelete,\n serverRoleUpdate: ServerRoleUpdate,\n serverUpdate: ServerUpdate,\n userUpdate: UserUpdate,\n messageReact: MessageReact,\n messageUnreact: MessageUnreact,\n webhookCreate: WebhookCreate,\n webhookDelete: WebhookDelete,\n webhookUpdate: WebhookUpdate,\n userVoiceStateUpdate: UserVoiceStateUpdate,\n voiceChannelJoin: VoiceChannelJoin,\n voiceChannelLeave: VoiceChannelLeave,\n};\n","import { EventMap } from \"./index\";\nimport { Event as CustomEvent } from \"./event\";\nimport type { Client } from \"../client\";\n\n/**\n * Manages the registration and retrieval of events for the client.\n * @private\n * @extends Event\n */\nexport class EventManager {\n /** A map of registered events, keyed by their names. */\n #events = new Map<string, CustomEvent>();\n\n /**\n * Creates a new EventManager instance.\n *\n * @param {client} client - The client instance.\n */\n constructor(protected readonly client: Client) {\n for (const [key, Event] of Object.entries(EventMap)) {\n if (this.client.options.ignoreEvents?.includes(key)) return;\n this.register(Event as new (client: Client) => CustomEvent);\n }\n }\n\n /**\n * Registers an event with the manager.\n *\n * @param {new (client: client) => CustomEvent} Event - The event class to register.\n */\n register(Event: new (client: Client) => CustomEvent): void {\n this.#events.set(Event.name.replace(/Events$/, \"\"), new Event(this.client));\n }\n\n /**\n * Retrieves a registered event by its name.\n *\n * @param {string} name - The name of the event to retrieve.\n * @returns {CustomEvent | null} The event instance, or `null` if not found.\n */\n get(name: string): CustomEvent | null {\n return this.#events.get(name) ?? null;\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { Readable } from \"node:stream\";\nimport { EventEmitter } from \"node:events\";\nimport { existsSync } from \"node:fs\";\nimport { URL } from \"node:url\";\nimport {\n AudioFrame,\n AudioSource,\n LocalAudioTrack,\n LocalTrackPublication,\n Room,\n RoomEvent,\n TrackPublishOptions,\n TrackSource,\n} from \"@livekit/rtc-node\";\n\nimport type { Client } from \"./client\";\n\n/**\n * Events emitted by the AudioPlayer\n */\nexport interface AudioPlayerEvents {\n connected: [channelId: string, serverId: string, roomName?: string];\n disconnected: [channelId: string, serverId: string, reason?: string];\n audioStart: [source: string, type: string];\n audioEnd: [source: string, type: string];\n audioError: [source: string, type: string, error: Error];\n volumeChanged: [oldVolume: number, newVolume: number];\n muted: [previousVolume: number];\n unmuted: [newVolume: number];\n trackPublished: [trackId: string];\n trackStopped: [trackId: string];\n conversionStart: [source: string, sampleRate: number, channels: number];\n conversionEnd: [source: string, samplesProcessed: number];\n conversionError: [source: string, error: Error];\n debug: [message: string, data?: any];\n error: [error: Error, context?: string];\n}\n\nexport declare interface AudioPlayer {\n on<K extends keyof AudioPlayerEvents>(\n event: K,\n listener: (...args: AudioPlayerEvents[K]) => void,\n ): this;\n\n off<K extends keyof AudioPlayerEvents>(\n event: K,\n listener: (...args: AudioPlayerEvents[K]) => void,\n ): this;\n\n removeAllListeners<K extends keyof AudioPlayerEvents>(event?: K): this;\n}\n\nexport class AudioPlayer extends EventEmitter {\n private readonly channelId: string;\n private readonly serverId: string;\n private readonly client: Client;\n private _volume: number = 1.0; // Volume from 0.0 to 2.0 (100% = 1.0, 200% = 2.0)\n private room?: Room;\n private publications: Map<string, LocalTrackPublication> = new Map();\n private audioSources: Map<string, AudioSource> = new Map();\n private isConnected: boolean = false;\n private shouldStop: boolean = false; // Flag to control audio playback cancellation\n private isStreaming: boolean = false; // Flag to control streaming audio playback\n\n constructor(channelId: string, serverId: string, client: Client) {\n super();\n this.channelId = channelId;\n this.serverId = serverId;\n this.client = client;\n }\n\n /**\n * Get the channel ID this player is associated with\n */\n get channel(): string {\n return this.channelId;\n }\n\n /**\n * Get the server ID this player is associated with\n */\n get server(): string {\n return this.serverId;\n }\n\n /**\n * Get current volume level (0.0 to 2.0)\n */\n get volume(): number {\n return this._volume;\n }\n\n /**\n * Check if the player is connected to a voice channel\n */\n get connected(): boolean {\n return this.isConnected && !!this.room;\n }\n\n /**\n * Set volume level\n * @param level - Volume level from 0.0 (mute) to 2.0 (200%)\n */\n setVolume(level: number): void {\n const oldVolume = this._volume;\n this._volume = Math.max(0.0, Math.min(2.0, level));\n\n this.emit(\"debug\", `Volume set to ${(this._volume * 100).toFixed(0)}%`, {\n oldVolume,\n newVolume: this._volume,\n });\n\n this.emit(\"volumeChanged\", oldVolume, this._volume);\n }\n\n /**\n * Increase volume by specified amount\n * @param amount - Amount to increase (default: 0.1)\n */\n increaseVolume(amount: number = 0.1): void {\n this.setVolume(this._volume + amount);\n }\n\n /**\n * Decrease volume by specified amount\n * @param amount - Amount to decrease (default: 0.1)\n */\n decreaseVolume(amount: number = 0.1): void {\n this.setVolume(this._volume - amount);\n }\n\n /**\n * Mute audio (set volume to 0)\n */\n mute(): void {\n const oldVolume = this._volume;\n this.setVolume(0);\n this.emit(\"muted\", oldVolume);\n }\n\n /**\n * Unmute audio (restore to 100% if currently muted)\n */\n unmute(): void {\n if (this._volume === 0) {\n this.setVolume(1.0);\n this.emit(\"unmuted\", 1.0);\n }\n }\n\n /**\n * Apply volume to PCM audio data\n * @param pcmData - Int16Array audio data\n * @returns Modified PCM data with volume applied\n * @private\n */\n private applyVolume(pcmData: Int16Array): Int16Array {\n if (this._volume === 1.0) return pcmData; // No change needed\n\n const result = new Int16Array(pcmData.length);\n for (let i = 0; i < pcmData.length; i++) {\n // Apply volume and clamp to prevent overflow\n const sample = pcmData[i] * this._volume;\n result[i] = Math.max(-32768, Math.min(32767, Math.round(sample)));\n }\n return result;\n }\n\n /**\n * Check if a string is a valid URL\n * @param input - The string to check\n * @returns True if the input is a valid URL\n */\n private isUrl(input: string): boolean {\n try {\n const url = new URL(input);\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n }\n\n /**\n * Check if a string is a valid file path that exists\n * @param input - The string to check\n * @returns True if the input is an existing file path\n * @private\n */\n private isFilePath(input: string): boolean {\n try {\n return existsSync(input);\n } catch {\n return false;\n }\n }\n\n /**\n * Check if input is a Readable stream\n * @param input - The input to check\n * @returns True if the input is a Readable stream\n * @private\n */\n private isStream(input: any): input is Readable {\n return input instanceof Readable;\n }\n\n /**\n * Connect to the voice channel\n */\n async connect(targetChannelId?: string): Promise<void> {\n const channelToConnect = targetChannelId || this.channelId;\n\n // If we're already connected and trying to connect to a different channel, disconnect first\n if (this.isConnected && channelToConnect !== this.channelId) {\n await this.disconnect();\n // Update the player's channel ID for the new connection\n (this as any).channelId = channelToConnect;\n } else if (this.isConnected && channelToConnect === this.channelId) {\n return;\n }\n\n this.emit(\"debug\", \"Starting connection\", {\n channelId: channelToConnect,\n serverId: this.serverId,\n });\n\n try {\n const selectedNode =\n this.client.voiceOptions.nodes?.[0].name || \"worldwide\";\n // First attempt: Try normal join_call\n let response: { token: string; url: string };\n\n try {\n response = (await this.client.api.post(\n `/channels/${channelToConnect}/join_call`,\n { body: { node: selectedNode } },\n )) as { token: string; url: string };\n } catch (joinError: any) {\n // Check if this is the AlreadyConnected error\n if (\n joinError.message?.includes(\"AlreadyConnected\") ||\n joinError.response?.data?.type === \"AlreadyConnected\"\n ) {\n // Strategy 1: Try to DELETE on the same channel to clear connection\n try {\n await this.client.api.delete(\n `/channels/${channelToConnect}/join_call`,\n );\n\n // Retry the join after clearing\n response = (await this.client.api.post(\n `/channels/${channelToConnect}/join_call`,\n { body: { node: selectedNode } },\n )) as { token: string; url: string };\n } catch (deleteError) {\n // Strategy 2: Try with force parameter\n try {\n response = (await this.client.api.post(\n `/channels/${channelToConnect}/join_call`,\n { body: { node: selectedNode, force: true } },\n )) as { token: string; url: string };\n } catch (forceError) {\n // Final strategy: Provide clear error with solutions\n throw new Error(\n `Unable to join voice channel: Bot is already connected to another voice channel.\\n\\n` +\n `This typically happens when:\\n` +\n `• The bot didn't disconnect properly from a previous session\\n` +\n `• Another instance of the bot is running\\n` +\n `• The bot crashed without proper cleanup\\n\\n` +\n `Solutions to try:\\n` +\n `1. Restart the bot application completely\\n` +\n `2. Wait 30-60 seconds for the connection to timeout\\n` +\n `3. Check if another bot instance is running\\n` +\n `4. Check server permissions for voice channels\\n\\n` +\n `If this persists, the API may need manual intervention to clear the connection state.`,\n );\n }\n }\n } else {\n // Different error, re-throw it\n throw joinError;\n }\n }\n\n const room = new Room();\n this.room = room;\n\n // Set up room event handlers\n room.on(RoomEvent.Disconnected, this.handleDisconnected.bind(this));\n\n // Connect to the voice room\n await room.connect(response.url, response.token, {\n dynacast: true,\n autoSubscribe: true,\n });\n\n this.isConnected = true;\n this.emit(\"connected\", channelToConnect, this.serverId, room.name);\n this.emit(\"debug\", \"Connection established\", { roomName: room.name });\n } catch (error) {\n this.emit(\n \"error\",\n error instanceof Error ? error : new Error(String(error)),\n \"connection\",\n );\n console.error(`❌ [${channelToConnect}] Failed to connect:`, error);\n throw error;\n }\n }\n\n /**\n * Generic play method that automatically detects the input type and uses the appropriate play method\n * @param input - Can be a URL string, file path string, or Readable stream\n * @returns Promise that resolves when playback starts\n *\n * @example\n * ```typescript\n * // Play from URL\n * await player.play(\"https://example.com/audio.mp3\");\n *\n * // Play from file path\n * await player.play(\"/path/to/audio.mp3\");\n *\n * // Play from stream\n * await player.play(readableStream);\n * ```\n */\n async play(input: string | Readable): Promise<void> {\n if (this.isStream(input)) {\n this.emit(\"debug\", \"Auto-detected stream input\", { type: \"stream\" });\n this.emit(\"audioStart\", \"stream\", \"stream\");\n await this.playFromStream(input, \"stream\", \"stream\");\n } else if (typeof input === \"string\") {\n if (this.isUrl(input)) {\n this.emit(\"debug\", \"Auto-detected URL input\", { url: input });\n await this.playFromUrl(input);\n } else if (this.isFilePath(input)) {\n this.emit(\"debug\", \"Auto-detected file path input\", {\n filePath: input,\n });\n await this.playFromFile(input);\n } else {\n throw new Error(\n `Invalid input: '${input}' is neither a valid URL nor an existing file path`,\n );\n }\n } else {\n throw new Error(\n `Unsupported input type: expected string or Readable stream, got ${typeof input}`,\n );\n }\n }\n\n /**\n * Play audio from a URL (supports both files and streaming URLs like radio stations)\n * @private\n */\n private async playFromUrl(url: string): Promise<void> {\n if (!this.connected) {\n await this.connect();\n }\n\n this.emit(\"audioStart\", url, \"url\");\n this.emit(\"debug\", \"Starting URL playback\", { url });\n\n try {\n const https = await import(\"node:https\");\n const http = await import(\"node:http\");\n\n return new Promise<void>((resolve, reject) => {\n const client = url.startsWith(\"https:\") ? https : http;\n\n const request = client.get(url, (response) => {\n if (response.statusCode !== 200) {\n const error = new Error(`HTTP Error: ${response.statusCode}`);\n console.error(\"HTTP Error:\", error.message);\n this.emit(\"audioError\", url, \"url\", error);\n return;\n }\n\n // Check if this is likely a continuous stream (radio, live stream)\n const contentType = response.headers[\"content-type\"] || \"\";\n const contentLength = response.headers[\"content-length\"];\n const isLiveStream =\n !contentLength ||\n (contentType.includes(\"audio/mpeg\") && url.includes(\"stream\")) ||\n contentType.includes(\"application/ogg\") ||\n url.toLowerCase().includes(\"radio\") ||\n url.toLowerCase().includes(\"stream\");\n\n if (isLiveStream) {\n // Use streaming method for continuous audio\n this.playStreamingAudio(response, url, \"url\")\n .then(() => {\n this.emit(\"audioEnd\", \"URL playback completed\", { url });\n resolve();\n })\n .catch((error) => {\n console.error(\"Error streaming audio from URL:\", error);\n this.emit(\"audioError\", url, \"url\", error);\n this.emit(\"error\", error, \"url-streaming\");\n });\n } else {\n // Use standard conversion for finite files\n this.playFromStream(response, url, \"url\")\n .then(() => {\n this.emit(\"debug\", \"URL playback completed\", { url });\n resolve();\n })\n .catch((error) => {\n console.error(\"Error playing audio from URL:\", error);\n this.emit(\"audioError\", url, \"url\", error);\n this.emit(\"error\", error, \"url-standard\");\n });\n }\n });\n\n request.on(\"error\", (error) => {\n console.error(\"Request error:\", error.message);\n this.emit(\"audioError\", url, \"url\", error);\n });\n\n request.setTimeout(30000, () => {\n const timeoutError = new Error(\"Request timeout\");\n request.destroy();\n this.emit(\"audioError\", url, \"url\", timeoutError);\n });\n });\n } catch (error) {\n const errorObj =\n error instanceof Error ? error : new Error(String(error));\n this.emit(\"audioError\", url, \"url\", errorObj);\n this.emit(\"error\", errorObj, \"url-playback\");\n console.error(`❌ [${this.channelId}] URL playback failed:`, error);\n throw error;\n }\n }\n\n /**\n * Play audio from a stream in real-time (for radio stations, live streams)\n */\n private async playStreamingAudio(\n audioStream: Readable,\n source?: string,\n type?: string,\n ): Promise<void> {\n // Reset stop flags when starting new streaming\n this.shouldStop = false;\n this.isStreaming = true;\n\n if (!this.room) {\n throw new Error(\n `Not connected to voice channel ${this.channelId}. Call connect() first.`,\n );\n }\n\n // Check if localParticipant is available\n if (!this.room.localParticipant) {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n if (!this.room.localParticipant) {\n throw new Error(\"Local participant not available after waiting\");\n }\n }\n\n try {\n const sampleRate = 48000;\n const channels = 1;\n\n const source = new AudioSource(sampleRate, channels);\n const sourceId = `stream_${Date.now()}`;\n this.audioSources.set(sourceId, source);\n const track = LocalAudioTrack.createAudioTrack(\"audio\", source);\n const options = new TrackPublishOptions();\n options.source = TrackSource.SOURCE_MICROPHONE;\n\n const publication = await this.room.localParticipant.publishTrack(\n track,\n options,\n );\n\n if (publication) {\n this.publications.set(publication.sid!, publication);\n this.emit(\"trackPublished\", publication.sid!);\n\n // Try different methods to unmute the track\n try {\n if (typeof (publication as any).setMuted === \"function\") {\n await (publication as any).setMuted(false);\n } else if (typeof (track as any).setMuted === \"function\") {\n await (track as any).setMuted(false);\n }\n } catch (error) {\n this.emit(\"error\", error, \"track-unmute\");\n }\n\n // Set up FFmpeg for real-time conversion with simple, stable arguments\n const args = [\n \"-i\",\n \"pipe:0\", // Read from stdin\n \"-f\",\n \"s16le\", // 16-bit little-endian PCM\n \"-ar\",\n sampleRate.toString(), // Sample rate\n \"-ac\",\n channels.toString(), // Number of channels\n \"-\", // Output to stdout\n ];\n\n const ffmpeg = spawn(\"ffmpeg\", args);\n\n // Enhanced error handling for stdin\n ffmpeg.stdin.on(\"error\", (error) => {\n // Don't stop streaming for stdin errors, they're often recoverable\n });\n\n // Pipe the audio stream to ffmpeg with error handling\n audioStream.pipe(ffmpeg.stdin);\n\n audioStream.on(\"error\", (error) => {\n this.emit(\"audioError\", \"stream\", \"streaming\", error);\n });\n\n audioStream.on(\"close\", () => {\n console.warn(\"⚠️ Audio stream closed unexpectedly\");\n if (this.isStreaming) {\n }\n });\n\n audioStream.on(\"end\", () => {\n if (this.isStreaming) {\n this.isStreaming = false;\n ffmpeg.kill();\n }\n });\n\n // Process audio in real-time chunks\n const chunkDurationMs = 100; // 100ms chunks\n const samplesPerChunk =\n Math.floor((sampleRate * chunkDurationMs) / 1000) * channels;\n const bytesPerChunk = samplesPerChunk * 2; // 2 bytes per 16-bit sample\n\n let buffer = Buffer.alloc(0);\n let chunkCount = 0;\n\n ffmpeg.stdout.on(\"data\", async (chunk: Buffer) => {\n try {\n if (!this.isStreaming || this.shouldStop) return;\n\n buffer = Buffer.concat([buffer, chunk]);\n chunkCount++;\n\n // Process complete chunks\n while (\n buffer.length >= bytesPerChunk &&\n this.isStreaming &&\n !this.shouldStop\n ) {\n const audioChunk = buffer.slice(0, bytesPerChunk);\n buffer = buffer.slice(bytesPerChunk);\n\n // Convert to Int16Array with proper alignment\n const alignedBuffer = Buffer.from(audioChunk);\n const originalPcmData = new Int16Array(\n alignedBuffer.buffer,\n alignedBuffer.byteOffset,\n alignedBuffer.byteLength / 2,\n );\n\n // Apply volume control to the audio data\n const volumeAdjustedPcmData = this.applyVolume(originalPcmData);\n\n // Create AudioFrame and send to track (using actual data length)\n const frame = new AudioFrame(\n volumeAdjustedPcmData,\n sampleRate,\n channels,\n volumeAdjustedPcmData.length,\n );\n\n // Use async captureFrame and handle errors gracefully\n try {\n await source.captureFrame(frame);\n } catch (frameError) {\n console.error(\"Error processing audio chunk:\", frameError);\n if (!this.isStreaming || this.shouldStop) {\n // If we're no longer streaming or should stop, stop processing\n return;\n }\n // For InvalidState errors during active streaming, continue without the frame\n if (\n frameError instanceof Error &&\n frameError.message?.includes(\"InvalidState\")\n ) {\n continue;\n }\n }\n }\n } catch (error) {}\n });\n\n ffmpeg.on(\"close\", (code) => {\n this.isStreaming = false;\n\n // For streaming audio, null or non-zero exit codes are often normal\n // when stopping streams or when streams end naturally\n if (code !== 0 && code !== null) {\n const error = new Error(`FFmpeg exited with code ${code}`);\n this.emit(\"audioError\", \"stream\", \"streaming\", error);\n }\n });\n\n // Set up a way to stop streaming\n this.once(\"disconnected\", () => {\n this.isStreaming = false;\n ffmpeg.kill();\n });\n\n // Return a promise that resolves when streaming ends\n return new Promise<void>((resolve, reject) => {\n ffmpeg.on(\"close\", (code) => {\n this.emit(\"debug\", \"FFmpeg streaming ended\", {\n code,\n source,\n type,\n });\n\n // Emit audioEnd event if source information is provided\n if (source && type) {\n this.emit(\"debug\", \"Emitting audioEnd for streaming\", {\n source,\n type,\n });\n this.emit(\"audioEnd\", source, type);\n } else {\n this.emit(\"debug\", \"No source/type for streaming audioEnd\", {\n source,\n type,\n });\n }\n\n // For streaming audio, null or non-zero exit codes are often normal\n // when stopping streams or when streams end naturally\n if (code === 0 || code === null) {\n resolve();\n } else {\n console.warn(\n `⚠️ FFmpeg exited with code ${code} - this may be normal for streaming`,\n );\n resolve(); // Resolve anyway since streaming termination is often expected\n }\n });\n });\n } else {\n throw new Error(\"Failed to publish audio track\");\n }\n } catch (error) {\n console.error(\n `❌ [${this.channelId}] Failed to set up streaming:`,\n error,\n );\n throw error;\n }\n }\n\n /**\n * Play audio from a finite stream (for regular audio files)\n * @private\n */\n private async playFromStream(\n stream: Readable,\n source?: string,\n type?: string,\n ): Promise<void> {\n // Reset stop flags when starting new playback\n this.shouldStop = false;\n this.isStreaming = false; // This is not streaming audio, it's converted PCM\n\n const pcmData = await this.convertAudioToPCM(stream, 48000, 1);\n this.emit(\"debug\", \"PCM conversion completed\", { source, type });\n\n await this.publishPCMAudio(pcmData);\n this.emit(\"debug\", \"Audio publishing completed\", { source, type });\n\n // Emit audioEnd event if source information is provided\n if (source && type) {\n this.emit(\"debug\", \"Emitting audioEnd event\", { source, type });\n this.emit(\"audioEnd\", source, type);\n } else {\n this.emit(\"debug\", \"No source/type provided, skipping audioEnd\", {\n source,\n type,\n });\n }\n } /**\n * Convert audio to PCM format using FFmpeg\n * @private\n */\n private async convertAudioToPCM(\n input: string | Readable,\n sampleRate: number = 48000,\n channels: number = 1,\n ): Promise<Int16Array> {\n const sourceDesc = typeof input === \"string\" ? input : \"stream\";\n\n this.emit(\"conversionStart\", sourceDesc, sampleRate, channels);\n this.emit(\"debug\", \"Starting FFmpeg audio conversion\", {\n source: sourceDesc,\n sampleRate,\n channels,\n });\n\n return new Promise((resolve, reject) => {\n const args = [];\n\n if (typeof input === \"string\") {\n // File path input\n args.push(\"-i\", input);\n } else {\n // Stream input\n args.push(\"-i\", \"pipe:0\"); // Read from stdin\n }\n\n args.push(\n \"-f\",\n \"s16le\", // 16-bit little-endian PCM\n \"-ar\",\n sampleRate.toString(), // Sample rate\n \"-ac\",\n channels.toString(), // Number of channels\n \"-\", // Output to stdout\n );\n\n const ffmpeg = spawn(\"ffmpeg\", args);\n const chunks: Buffer[] = [];\n let errorOutput = \"\";\n\n // Handle FFmpeg output\n ffmpeg.stdout.on(\"data\", (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n // Capture error messages\n ffmpeg.stderr.on(\"data\", (data: Buffer) => {\n errorOutput += data.toString();\n });\n\n ffmpeg.on(\"close\", (code) => {\n if (code === 0) {\n const pcmBuffer = Buffer.concat(chunks);\n const int16Array = new Int16Array(\n pcmBuffer.buffer,\n pcmBuffer.byteOffset,\n pcmBuffer.length / 2,\n );\n\n this.emit(\"conversionEnd\", sourceDesc, int16Array.length);\n this.emit(\"debug\", \"FFmpeg conversion completed\", {\n pcmDataSize: int16Array.length,\n bufferSize: pcmBuffer.length,\n });\n\n resolve(int16Array);\n } else {\n const error = new Error(\n `FFmpeg failed with code ${code}: ${errorOutput}`,\n );\n this.emit(\"conversionError\", sourceDesc, error);\n console.error(error);\n }\n });\n\n ffmpeg.on(\"error\", (err) => {\n const error = new Error(`FFmpeg spawn error: ${err.message}`);\n this.emit(\"conversionError\", sourceDesc, error);\n console.error(error);\n });\n\n // Send audio data to FFmpeg\n if (typeof input === \"string\") {\n ffmpeg.stdin.end();\n } else {\n input.pipe(ffmpeg.stdin);\n input.on(\"end\", () => {\n ffmpeg.stdin.end();\n });\n input.on(\"error\", (err) => {\n ffmpeg.kill(\"SIGTERM\");\n console.error(err);\n });\n }\n });\n }\n\n /**\n * Publish PCM audio to the voice channel\n */\n private async publishPCMAudio(pcmData: Int16Array): Promise<void> {\n if (!this.room) {\n throw new Error(\n `Not connected to voice channel ${this.channelId}. Call connect() first.`,\n );\n }\n\n // Apply volume control to the PCM data\n const volumeAdjustedPCM = this.applyVolume(pcmData);\n\n return new Promise<void>((resolve, reject) => {\n const processAudio = async () => {\n try {\n // Create audio source with 48kHz, mono, 16-bit\n const source = new AudioSource(48000, 1);\n const sourceId = `file_${Date.now()}`;\n this.audioSources.set(sourceId, source);\n const track = LocalAudioTrack.createAudioTrack(\"audio\", source);\n const options = new TrackPublishOptions();\n options.source = TrackSource.SOURCE_MICROPHONE;\n\n // Publish the track\n if (!this.room!.localParticipant) {\n throw new Error(\"Room local participant not available\");\n }\n const publication = await this.room!.localParticipant.publishTrack(\n track,\n options,\n );\n\n if (publication) {\n // Store the publication for later cleanup\n this.publications.set(publication.sid!, publication);\n\n this.emit(\"trackPublished\", publication.sid!);\n this.emit(\"debug\", \"Audio track published successfully\", {\n trackId: publication.sid,\n publicationCount: this.publications.size,\n });\n\n // Try different methods to unmute the track\n try {\n // Try multiple unmute approaches\n if (typeof (publication as any).setMuted === \"function\") {\n await (publication as any).setMuted(false);\n } else if (typeof (track as any).setMuted === \"function\") {\n await (track as any).setMuted(false);\n }\n\n // Try to ensure the track is enabled and active\n if (typeof (track as any).setEnabled === \"function\") {\n await (track as any).setEnabled(true);\n }\n } catch (error) {\n this.emit(\"error\", error, \"track-unmute\");\n }\n\n // Stream PCM audio in real-time chunks (matching working implementation)\n const chunkDurationMs = 100; // 100ms chunks (like working implementation)\n const samplesPerChunk =\n Math.floor((48000 * chunkDurationMs) / 1000) * 1; // sampleRate * duration * channels\n let offset = 0;\n let chunksSent = 0;\n\n while (offset < volumeAdjustedPCM.length && !this.shouldStop) {\n const chunkEnd = Math.min(\n offset + samplesPerChunk,\n volumeAdjustedPCM.length,\n );\n const chunk = volumeAdjustedPCM.slice(offset, chunkEnd);\n\n // Create AudioFrame with proper format (using total samples, not per-channel)\n const frame = new AudioFrame(\n chunk,\n 48000, // sampleRate\n 1, // channels (mono)\n chunk.length, // total samples in chunk\n );\n\n // Capture the audio frame with better error handling\n try {\n await source.captureFrame(frame);\n chunksSent++;\n } catch (error) {\n this.emit(\"error\", error, \"frame-capture\");\n // Don't reject on individual frame errors, continue playback\n }\n\n offset = chunkEnd;\n\n // Wait for real-time playback (like the working implementation)\n await new Promise((resolve) =>\n setTimeout(resolve, chunkDurationMs),\n );\n }\n\n if (this.shouldStop) {\n this.emit(\"debug\", \"Audio playback stopped by user\", {\n channelId: this.channelId,\n chunksSent,\n });\n } else {\n this.emit(\"debug\", \"Audio playback completed successfully\", {\n channelId: this.channelId,\n chunksSent,\n totalSamples: volumeAdjustedPCM.length,\n });\n }\n this.emit(\"debug\", \"publishPCMAudio resolving\");\n resolve();\n } else {\n console.error(new Error(\"Failed to publish audio track\"));\n }\n } catch (error) {\n console.error(\n `❌ [${this.channelId}] Failed to publish audio:`,\n error,\n );\n console.error(error);\n }\n };\n\n processAudio();\n });\n }\n\n /**\n * Play audio from a file\n * @private\n */\n private async playFromFile(filePath: string): Promise<void> {\n if (!this.connected) {\n await this.connect();\n }\n\n // Reset stop flags when starting new playback\n this.shouldStop = false;\n this.isStreaming = false; // Ensure streaming is disabled for file playback\n\n this.emit(\"audioStart\", filePath, \"file\");\n this.emit(\"debug\", \"Starting file playback\", { filePath });\n\n try {\n const pcmData = await this.convertAudioToPCM(filePath, 48000, 1);\n await this.publishPCMAudio(pcmData);\n\n this.emit(\"audioEnd\", filePath, \"file\");\n this.emit(\"debug\", \"File playback completed\", { filePath });\n } catch (error) {\n const errorObj =\n error instanceof Error ? error : new Error(String(error));\n\n this.emit(\"audioError\", filePath, \"file\", errorObj);\n this.emit(\"error\", errorObj, \"file-playback\");\n\n console.error(`❌ [${this.channelId}] File playback failed:`, error);\n throw error;\n }\n }\n\n /**\n * Stop current audio playback\n */\n async stop(trackName?: string): Promise<void> {\n // Set the stop flags to halt any ongoing playback loops\n this.shouldStop = true;\n this.isStreaming = false;\n\n if (!this.room) {\n return;\n }\n\n if (trackName) {\n // Stop specific track\n const publication = this.publications.get(trackName);\n if (publication) {\n try {\n await this.room.localParticipant?.unpublishTrack(publication.sid!);\n this.publications.delete(trackName);\n this.emit(\"trackStopped\", trackName);\n } catch (error) {\n console.error(\n `❌ [${this.channelId}] Failed to stop track ${trackName}:`,\n error,\n );\n }\n }\n } else {\n // Stop all tracks\n for (const [sid, publication] of this.publications) {\n try {\n await this.room.localParticipant?.unpublishTrack(publication.sid!);\n this.emit(\"trackStopped\", sid);\n } catch (error) {\n console.error(\n `❌ [${this.channelId}] Failed to stop track ${sid}:`,\n error,\n );\n }\n }\n this.publications.clear();\n }\n }\n\n /**\n * Disconnect from the voice channel\n */\n async disconnect(): Promise<void> {\n if (!this.room) {\n return;\n }\n\n try {\n // Stop all audio tracks first\n await this.stop();\n\n // Clean up audio sources tracking\n this.audioSources.clear();\n\n // Disconnect from the room\n await this.room.disconnect();\n\n // Clean up\n this.isConnected = false;\n this.publications.clear();\n this.room = undefined;\n\n this.emit(\"disconnected\", this.channelId, this.serverId, \"manual\");\n this.emit(\"debug\", \"Disconnected manually\");\n } catch (error) {\n console.error(`❌ [${this.channelId}] Error during disconnect:`, error);\n // Still clean up even if there was an error\n this.isConnected = false;\n this.publications.clear();\n this.audioSources.clear();\n this.room = undefined;\n throw error;\n }\n }\n\n /**\n * Handle unexpected disconnection\n * @private\n */\n private async handleDisconnected(): Promise<void> {\n // Clean up audio sources tracking\n this.audioSources.clear();\n\n this.isConnected = false;\n this.publications.clear();\n this.room = undefined;\n\n this.emit(\"disconnected\", this.channelId, this.serverId, \"unexpected\");\n this.emit(\"debug\", \"Voice disconnected unexpectedly\");\n }\n\n /**\n * Get player status information\n */\n getStatus(): {\n connected: boolean;\n volume: number;\n activeTracksCount: number;\n channelId: string;\n serverId: string;\n } {\n return {\n connected: this.connected,\n volume: this._volume,\n activeTracksCount: this.publications.size,\n channelId: this.channelId,\n serverId: this.serverId,\n };\n }\n}\n","import { Client } from \"./client\";\nimport { AudioPlayer } from \"./player\";\n\n/**\n * VoiceClient acts as a factory for creating AudioPlayer instances.\n * Users manage the AudioPlayer instances themselves rather than the VoiceClient managing them internally.\n * This design gives users full control over their voice connections and audio playback.\n */\nexport class VoiceClient {\n private readonly client: Client;\n /** Map of active audio players by server ID */\n private readonly players: Map<string, AudioPlayer>;\n\n constructor(client: Client) {\n this.client = client;\n this.players = new Map();\n }\n\n /**\n * Creates a new AudioPlayer instance for the specified voice channel.\n *\n * @param channelId - The ID of the voice channel to connect to\n * @param serverId - The ID of the server containing the voice channel\n * @returns A new AudioPlayer instance that the user can manage\n *\n * @example\n * ```typescript\n * // Create a player for a specific voice channel\n * const player = client.voice.createPlayer('voice-channel-id', 'server-id');\n *\n * // Set up event listeners\n * player.on('connected', () => {\n * console.log('Connected to voice channel!');\n * });\n *\n * player.on('audioStart', (source, type) => {\n * console.log(`Started playing ${type}: ${source}`);\n * });\n *\n * // Connect and play audio\n * await player.connect();\n * await player.playFromFile('./music.mp3');\n *\n * // The user is responsible for managing the player lifecycle\n * await player.disconnect();\n * ```\n */\n createPlayer(channelId: string, serverId: string): AudioPlayer {\n return new AudioPlayer(channelId, serverId, this.client);\n }\n\n /**\n * Creates a new AudioPlayer instance and immediately connects it to the voice channel.\n * This is a convenience method that combines createPlayer() and connect().\n *\n * @param channelId - The ID of the voice channel to connect to\n * @param serverId - The ID of the server containing the voice channel\n * @returns A new connected AudioPlayer instance\n *\n * @example\n * ```typescript\n * // Create and connect in one step\n * const player = await client.voice.connectToChannel('voice-channel-id', 'server-id');\n *\n * // Player is already connected and ready to use\n * await player.playFromUrl('https://example.com/music.mp3');\n * ```\n */\n async connectToChannel(\n channelId: string,\n serverId: string,\n ): Promise<AudioPlayer> {\n const player =\n this.players.get(serverId) ?? this.createPlayer(channelId, serverId);\n this.players.set(serverId, player);\n await player.connect(channelId);\n return player;\n }\n\n /**\n * Disconnects the AudioPlayer from the specified server.\n *\n * @param serverId - The ID of the server to disconnect from\n */\n async disconnectFromChannel(serverId: string): Promise<void> {\n const player = this.players.get(serverId);\n if (player) {\n await player.disconnect();\n this.players.delete(serverId);\n }\n }\n\n /**\n * Stops the AudioPlayer in the specified server.\n *\n * @param serverId - The ID of the server whose player should be stopped\n */\n async stopPlayerInChannel(serverId: string): Promise<void> {\n const player = this.players.get(serverId);\n if (player) {\n await player.stop();\n }\n }\n}\n","import { NotesChannel, Status, User, UserProfile, Attachment } from \"./index\";\nimport type { User as APIUser } from \"revolt-api\";\nimport type { Client } from \"../client/client\";\nimport { Readable } from \"node:stream\";\nimport FormData from \"form-data\";\nimport axios from \"axios\";\n\nexport class ClientUser extends User {\n notes: NotesChannel | null = null;\n owner: string | null = null;\n\n constructor(client: Client, data: APIUser) {\n super(client, data);\n this._patch(data);\n this.owner = data.bot?.owner || null;\n }\n\n async setUsername(username: string, password?: string): Promise<void> {\n if (this.bot && password) {\n throw new Error(\"Bots do not have passwords\");\n }\n await this.client.api.patch(\"/users/@me/username\", {\n body: { username, password },\n });\n }\n\n async setStatus(text?: string | null): Promise<void>;\n async setStatus(presence?: Status): Promise<void>;\n async setStatus(\n text?: string | null,\n presence?: keyof typeof Status,\n ): Promise<void>;\n async setStatus(text?: unknown, presence?: unknown): Promise<void> {\n if (typeof text === \"string\" && text in Status && !presence) {\n presence = text as keyof typeof Status;\n text = undefined;\n }\n const status = {\n text: text ?? this.client.user?.presence.text,\n presence: presence ?? this.client.user?.presence.status,\n };\n await this.client.api.patch(`/users/${this.client.user?.id}`, {\n body: { status: status },\n });\n }\n\n async setAvatar(avatar: Readable | Buffer | string): Promise<void> {\n const formData = new FormData();\n if (typeof avatar === \"string\") {\n const response = await axios.get(avatar, { responseType: \"stream\" });\n formData.append(\"avatar\", response.data);\n } else if (avatar instanceof Buffer) {\n formData.append(\"avatar\", avatar, { filename: \"avatar.png\" });\n } else {\n formData.append(\"avatar\", avatar);\n }\n await this.client.api.put(\"/users/@me/avatar\", { body: formData });\n }\n\n async setBanner(banner: Readable | Buffer | string): Promise<void> {\n const formData = new FormData();\n if (typeof banner === \"string\") {\n const response = await axios.get(banner, { responseType: \"stream\" });\n formData.append(\"banner\", response.data);\n } else if (banner instanceof Buffer) {\n formData.append(\"banner\", banner, { filename: \"banner.png\" });\n } else {\n formData.append(\"banner\", banner);\n }\n await this.client.api.put(\"/users/@me/banner\", { body: formData });\n }\n\n async setBio(content: string): Promise<void> {\n await this.client.api.patch(\"/users/@me\", {\n body: { profile: { content } },\n });\n }\n\n async setProfile(data: {\n content?: string;\n background?: Readable | Buffer | string;\n }): Promise<void> {\n if (data.content) {\n await this.setBio(data.content);\n }\n if (data.background) {\n await this.client.api.put(\"/users/@me/background\", {\n body: { banner: data.background },\n });\n }\n }\n\n async clearAvatar(): Promise<void> {\n await this.client.api.delete(\"/users/@me/avatar\");\n }\n\n async clearBanner(): Promise<void> {\n await this.client.api.delete(\"/users/@me/banner\");\n }\n\n async clearStatus(): Promise<void> {\n await this.client.api.patch(`/users/${this.id}`, {\n body: { status: { text: null, presence: \"Invisible\" } },\n });\n }\n\n async setPresence(\n presence: \"Online\" | \"Idle\" | \"Busy\" | \"Invisible\",\n ): Promise<void> {\n await this.client.api.patch(`/users/${this.id}`, {\n body: { status: { presence } },\n });\n }\n\n async fetchProfile(): Promise<UserProfile> {\n const data = await this.client.api.get(`/users/${this.id}/profile`);\n return new UserProfile(this.client, { ...(data as any), userId: this.id });\n }\n}\n","import { time } from \"node:console\";\nimport { ClientUser } from \"../struct/clientUser\";\nimport { Emoji } from \"../struct/emoji\";\nimport { Events, WSEvents } from \"../utils/constants\";\nimport { Client } from \"./client\";\n\ndeclare function setInterval(\n cb: (...args: any[]) => void,\n delay?: number,\n ...args: any[]\n): number;\n\n/**\n * Represents the WebSocket client used for real-time communication with the API.\n */\nexport class WebSocketClient {\n /** The interval for sending heartbeats, in milliseconds. */\n heartbeatInterval?: number;\n\n /** The timestamp of the last ping sent, in milliseconds. */\n lastPingTimestamp?: number;\n\n /** Whether the last pong acknowledgment was received. */\n lastPongAck?: boolean = false;\n\n /** The WebSocket connection instance. */\n socket?: WebSocket | null;\n\n /** Whether the WebSocket client is connected. */\n connected: boolean = false;\n\n /** A promise representing the reconnecting process, or `null` if not reconnecting. */\n reconnecting: Promise<unknown> | null = null;\n\n /** Whether the WebSocket client is ready. */\n ready = false;\n\n /** The number of reconnection attempts made. */\n retryCount: number = 0;\n\n /**\n * Creates a new WebSocketClient instance.\n *\n * @param {Client} client - The client instance.\n */\n constructor(protected readonly client: Client) {}\n\n /**\n * Logs a debug message.\n *\n * @param {unknown} message - The message to log.\n * @private\n */\n private debug(message: unknown): void {\n this.client.debug(`[WS] ${message}`);\n }\n\n /**\n * Sends data through the WebSocket connection.\n *\n * @param {unknown} data - The data to send.\n * @returns {Promise<void>} A promise that resolves when the data is sent.\n * @throws {Error} Throws an error if the WebSocket is not open.\n */\n async send(data: unknown): Promise<void> {\n if (this.reconnecting) {\n this.debug(\"Reconnecting, waiting to send message.\");\n await this.reconnecting;\n }\n if (this.socket?.readyState === WebSocket.OPEN) {\n this.socket.send(JSON.stringify(data));\n } else {\n this.debug(\"Socket is not open, cannot send message.\");\n throw new Error(\"Socket is not open\");\n }\n }\n\n /**\n * Handles the WebSocket connection opening.\n *\n * @private\n */\n private onOpen(): void {\n if (!this.client.token) throw new Error(\"Token is required\");\n this.send({\n type: WSEvents.AUTHENTICATE,\n token: this.client.token,\n });\n }\n\n /**\n * Gets the current ping (latency) of the WebSocket connection.\n *\n * @returns {number} The ping in milliseconds, or `-0` if the WebSocket is not connected.\n */\n get ping(): number {\n if (!this.socket) return -0;\n return Date.now() - this.lastPingTimestamp!;\n }\n\n /**\n * Sets the heartbeat interval for the WebSocket connection.\n *\n * @param {number} time - The interval time in milliseconds. Use `-1` to clear the interval.\n */\n setHeartbeatTimer(time: number): void {\n this.debug(`Setting a heartbeat interval for ${time}ms.`);\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n if (time !== -1) {\n this.heartbeatInterval = setInterval(() => this.sendHeartbeat(), time);\n }\n }\n\n /**\n * Sends a heartbeat to the server to keep the connection alive.\n */\n sendHeartbeat(): void {\n this.debug(\"Sending heartbeat.\");\n\n if (!this.lastPongAck) {\n this.debug(\"Did not receive a pong ack.\");\n if (this.client.options.ws?.reconnect) {\n this.reconnecting = this.destroy()\n .then(() => this.connect())\n .then(() => (this.reconnecting = null));\n }\n }\n const now = Date.now();\n this.send({ type: WSEvents.PING, data: now });\n this.lastPongAck = false;\n this.lastPingTimestamp = now;\n }\n\n /**\n * Handles WebSocket errors.\n *\n * @param {unknown} event - The error event.\n * @private\n */\n private onError(event: unknown): void {\n this.client.emit(Events.ERROR, event);\n }\n\n /**\n * Handles incoming WebSocket messages.\n *\n * @param {{ data: unknown }} param0 - The message event containing the data.\n * @private\n */\n private onMessage({ data }: { data: unknown }): void {\n let packet: unknown;\n try {\n packet = JSON.parse(String(data));\n } catch (err) {\n this.client.emit(Events.ERROR, err);\n return;\n }\n\n this.client.emit(Events.RAW, packet);\n\n this.onPacket(packet).catch((e) => this.client.emit(Events.ERROR, e));\n }\n\n /**\n * Handles the WebSocket connection closing.\n *\n * @param {{ code: number; reason: string }} event - The close event containing the code and reason.\n * @private\n */\n private onClose(event: { code: number; reason: string }): void {\n this.debug(`Closed with reason: ${event.reason}, code: ${event.code}`);\n this.destroy();\n }\n\n /**\n * Handles incoming WebSocket packets.\n *\n * @param {any} packet - The packet data.\n * @private\n */\n private async onPacket(packet: any) {\n if (!packet) {\n this.debug(`Received broken packet: '${packet}'.`);\n return;\n }\n\n switch (packet.type) {\n case WSEvents.BULK:\n await Promise.all(packet.v.map((p: unknown) => this.onPacket(p)));\n break;\n case WSEvents.AUTHENTICATED:\n this.connected = true;\n this.retryCount = 0;\n this.debug(`Successfully authenticated.`);\n break;\n case WSEvents.PONG:\n this.debug(`Received a heartbeat.`);\n this.lastPongAck = true;\n break;\n case WSEvents.ERROR:\n this.client.emit(Events.ERROR, packet.error);\n break;\n case WSEvents.READY: {\n this.lastPongAck = true;\n\n const promises: Promise<unknown>[] = [];\n\n for (const user of packet.users) {\n if (user.relationship === \"User\" && !this.client.user) {\n this.client.user = new ClientUser(this.client, user);\n } else {\n this.client.users._add(user);\n }\n }\n\n for (const member of packet.members) {\n this.client.servers.cache\n .get(member._id.server)\n ?.members._add(member);\n }\n\n for (const emoji of packet.emojis) {\n this.client.servers.cache\n .get(emoji.parent.id)\n ?.emojis.set(emoji._id, { ...emoji, _id: emoji._id });\n }\n\n for (const channel of packet.channels) {\n this.client.channels._add(channel);\n }\n\n for (const server of packet.servers) {\n const s = this.client.servers._add(server);\n if (this.client.options.fetchMembers) {\n promises.push(s.members.fetch());\n }\n }\n\n this.setHeartbeatTimer(\n this.client.options.ws?.heartbeatInterval ?? 30000,\n );\n\n await Promise.all(promises);\n\n for (const voice_state of packet.voice_states) {\n const channel = this.client.channels.cache.get(voice_state.id);\n for (const participant of voice_state.participants) {\n channel?.voice?.set(participant.id, participant);\n }\n }\n\n this.ready = true;\n\n this.client.emit(Events.READY, this.client);\n break;\n }\n default: {\n const action = this.client.events.get(packet.type);\n if (action) {\n await action.handle(packet);\n } else {\n this.debug(`Received unknown packet \"${packet.type}\"`);\n }\n\n break;\n }\n }\n }\n\n /**\n * Connects to the WebSocket server.\n *\n * @returns {Promise<this>} A promise that resolves when the connection is established.\n */\n connect(): Promise<this> {\n this.retryCount = this.retryCount + 1;\n if (this.retryCount > 10) {\n this.debug(\"Max retry attempts reached\");\n return Promise.reject(\n new Error(\n \"Max retry attempts reached on WS connection, try again later.\",\n ),\n );\n }\n return new Promise(async (resolve) => {\n if (this.socket?.readyState === WebSocket.OPEN && this.ready) {\n return resolve(this);\n }\n\n if (typeof this.client.options === \"undefined\") {\n throw new Error(\"MISSING_CONFIGURATION_SYNC\");\n }\n\n if (typeof this.client.token !== \"string\") {\n throw new Error(\"INVALID_TOKEN\");\n }\n\n await this.client.init();\n\n if (!this.client.options.ws?.instanceURL)\n return Promise.reject(new Error(\"WebSocket instance URL not set.\"));\n const ws = (this.socket =\n this.socket ?? new WebSocket(this.client.options.ws?.instanceURL));\n\n ws.onopen = this.onOpen.bind(this);\n ws.onmessage = this.onMessage.bind(this);\n ws.onerror = this.onError.bind(this);\n ws.onclose = this.onClose.bind(this);\n ws.addEventListener(\"open\", () => resolve(this));\n });\n }\n\n /**\n * Destroys the WebSocket connection and clears its state.\n *\n * @returns {Promise<void>} A promise that resolves when the connection is destroyed.\n */\n destroy(isUserInitiated?: boolean): Promise<void> {\n return new Promise((resolve) => {\n this.setHeartbeatTimer(-1);\n this.connected = false;\n this.ready = false;\n\n if (this.socket?.readyState === WebSocket.OPEN) {\n this.socket.addEventListener(\"close\", () => {\n this.socket = null;\n if (!isUserInitiated) {\n setTimeout(() => this.connect(), 1000);\n }\n resolve();\n });\n\n this.socket.close();\n if (!isUserInitiated) {\n setTimeout(() => this.connect(), 1000);\n }\n } else {\n this.socket = null;\n if (!isUserInitiated) {\n setTimeout(() => this.connect(), 1000);\n }\n resolve();\n }\n });\n }\n}\n","import { ChannelManager, ServerManager } from \"../managers\";\nimport { UserManager } from \"../managers/userManager\";\nimport { WebhookManager } from \"../managers/webhookManager\";\nimport { ClientUser } from \"../struct/clientUser\";\nimport { BaseClient, clientOptions } from \"./baseClient\";\nimport { EventManager } from \"./events/eventManager\";\nimport { VoiceClient } from \"./voiceClient\";\nimport { WebSocketClient } from \"./webSocket\";\n\n/**\n * Represents the main selfbot client for interacting with the Stoat API (discord.js style).\n *\n * @extends BaseClient\n *\n * @example\n * ```typescript\n * import { Client } from \"stoat-selfbot.js\";\n *\n * const selfbot = new Client({});\n *\n * selfbot.on(\"ready\", () => {\n * console.log(\"Selfbot is ready!\");\n * });\n *\n * selfbot.on(\"messageCreate\", (message) => {\n * if (message.author?.id === selfbot.user?.id) {\n * console.log(\"Received my own message:\", message.content);\n * }\n * });\n *\n * // Login with session token (get from browser localStorage)\n * selfbot.login(\"YOUR_SESSION_TOKEN\");\n * ```\n */\nexport class Client extends BaseClient {\n /** The WebSocket client used for real-time communication. */\n protected readonly ws = new WebSocketClient(this);\n\n /** Manages the channels in the client. */\n readonly channels = new ChannelManager(this);\n\n /** Manages the servers in the client. */\n readonly servers = new ServerManager(this);\n\n /** Manages the users in the client. */\n readonly users = new UserManager(this);\n\n /** Manages the events in the client. */\n readonly events = new EventManager(this);\n\n /** Manages the webhooks in the client. */\n readonly webhooks = new WebhookManager(this);\n\n /** Manages the voice connections in the client. */\n readonly voice = new VoiceClient(this);\n\n /** The authenticated user, or `null` if not logged in. */\n user: ClientUser | null = null;\n\n /** The timestamp when the client became ready, or `null` if not ready. */\n readyAt: Date | null = null;\n\n /**\n * Creates a new Client instance.\n * Automatically configures the client for selfbot mode (X-Session-Token).\n *\n * @param {clientOptions} [options={}] - The options for configuring the client.\n */\n constructor(options: clientOptions = {}) {\n super(options);\n }\n\n /**\n * Initializes the client.\n * @private\n */\n async init(): Promise<void> {\n this.debug(\"Initializing client...\");\n if (process.env.NODE_ENV === \"DEV\") {\n console.info(\n \"Development mode enabled: displaying additional debug info.\",\n );\n }\n await this.api.getConfig();\n }\n\n /**\n * Gets the timestamp when the client became ready.\n *\n * @returns {number | null} The ready timestamp in milliseconds, or `null` if not ready.\n */\n get readyTimestamp(): number | null {\n return this.readyAt ? this.readyAt.getTime() : null;\n }\n\n /**\n * Gets the uptime of the client in milliseconds.\n *\n * @returns {number | null} The uptime in milliseconds, or `null` if the client is not ready.\n */\n get upTime(): number | null {\n return this.readyAt ? Date.now() - this.readyAt.getTime() : null;\n }\n\n /**\n * Logs the selfbot into the API using the provided session token.\n *\n * @param {string} token - The user session token (obtain from browser localStorage).\n * @returns {Promise<void>} A promise that resolves when the selfbot is logged in.\n * @throws {Error} Throws an error if the session token is not provided or is invalid.\n *\n * @example\n * ```typescript\n * await client.login(\"your-session-token-here\");\n * ```\n */\n async login(token: string): Promise<void> {\n if (!token) {\n throw new Error(\"Session token is required. Get it from browser localStorage.\");\n }\n\n // Validate session token format\n if (token.length < 10) {\n throw new Error(\"Invalid session token format. Token appears too short.\");\n }\n\n this.token = token;\n\n this.debug(\"Logging in with session token...\");\n try {\n await this.ws.connect();\n } catch (error) {\n this.debug(`Error connecting to WebSocket: ${error}`);\n throw error;\n }\n\n this.readyAt = new Date();\n }\n\n /**\n * Destroys the client, disconnecting it from the API and clearing its state.\n *\n * @returns {Promise<void>} A promise that resolves when the client is destroyed.\n *\n * @example\n * ```typescript\n * await client.destroy();\n * ```\n */\n async destroy(): Promise<void> {\n this.token = null;\n this.user = null;\n this.readyAt = null;\n await this.ws.destroy(true);\n }\n\n /**\n * Checks if the client is ready.\n *\n * @returns {boolean} `true` if the client is ready, otherwise `false`.\n *\n * @example\n * ```typescript\n * if (client.isReady()) {\n * console.log(\"Client is ready!\");\n * }\n * ```\n */\n isReady(): boolean {\n return this.readyAt !== null;\n }\n\n /**\n * Gets whether this client is a selfbot.\n * Always returns true since this is a selfbot-only package.\n *\n * @returns {boolean} Always true.\n */\n get isSelfbot(): boolean {\n return true;\n }\n}\n\n/** @deprecated Use Client instead */\nexport const client = Client;\n"],"mappings":"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","names":["DMChannel","Emoji","GroupChannel","Server","ServerMember","TextChannel","VoiceChannel","client","client","Events","WSEvents","ChannelTypes","client","client","client","Status","Server","client","FormData","axios","DMChannel","client","GroupChannel","client","client","import_axios","import_form_data","client","FormData","axios","client","client","ServerMember","client","TextChannel","client","VoiceChannel","client","Emoji","client","client","VoiceChannel","TextChannel","DMChannel","GroupChannel","channel","Server","id","server","user","import_node_buffer","import_stream","import_form_data","import_axios","FormData","axios","Emoji","TextChannel","VoiceChannel","channel","ServerMember","member","import_stream","import_axios","import_form_data","client","FormData","axios","import_axios","import_axios","axios","client","axios","_a","_b","import_axios","client","_a","_b","client","client","Event","import_node_events","client","source","resolve","client","import_form_data","import_axios","client","FormData","axios","client"]}
|