@discordjs/structures 0.2.0-dev.1752365789-3cff4d741

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bitfields/BitField.ts","../src/bitfields/ChannelFlagsBitField.ts","../src/bitfields/PermissionsBitField.ts","../src/utils/symbols.ts","../src/channels/mixins/AppliedTagsMixin.ts","../src/channels/mixins/ChannelOwnerMixin.ts","../src/channels/mixins/GuildChannelMixin.ts","../src/channels/mixins/ChannelParentMixin.ts","../src/channels/mixins/ChannelPermissionMixin.ts","../src/channels/mixins/ChannelPinMixin.ts","../src/channels/mixins/TextChannelMixin.ts","../src/channels/mixins/ChannelSlowmodeMixin.ts","../src/channels/mixins/ChannelWebhookMixin.ts","../src/channels/mixins/ChannelTopicMixin.ts","../src/channels/mixins/DMChannelMixin.ts","../src/channels/mixins/GroupDMMixin.ts","../src/channels/mixins/ThreadChannelMixin.ts","../src/channels/mixins/ThreadOnlyChannelMixin.ts","../src/channels/mixins/VoiceChannelMixin.ts","../src/Structure.ts","../src/channels/ForumTag.ts","../src/channels/PermissionOverwrite.ts","../src/channels/ThreadMetadata.ts","../src/channels/Channel.ts","../src/utils/type-guards.ts","../src/Mixin.ts","../src/channels/AnnouncementChannel.ts","../src/channels/AnnouncementThreadChannel.ts","../src/channels/CategoryChannel.ts","../src/channels/DMChannel.ts","../src/channels/ForumChannel.ts","../src/channels/GroupDMChannel.ts","../src/channels/MediaChannel.ts","../src/channels/PrivateThreadChannel.ts","../src/channels/PublicThreadChannel.ts","../src/channels/StageChannel.ts","../src/channels/TextChannel.ts","../src/channels/VoiceChannel.ts","../src/invites/Invite.ts","../src/users/AvatarDecorationData.ts","../src/users/User.ts","../src/users/Connection.ts","../src/utils/optimization.ts"],"sourcesContent":["import type { EnumLike, NonAbstract, RecursiveReadonlyArray } from '../utils/types.js';\n\n// TODO: this currently is mostly copied from mainlib discord.js v14 and definitely needs a refactor in a later iteration\n\n/**\n * Data that can be resolved to give a bit field. This can be:\n * A bit number (this can be a number literal or a value taken from {@link (BitField:class).Flags})\n * A string bit number\n * An instance of BitField\n * An Array of BitFieldResolvable\n */\nexport type BitFieldResolvable<Flags extends string> =\n\t| Flags\n\t| Readonly<BitField<Flags>>\n\t| RecursiveReadonlyArray<Flags | Readonly<BitField<Flags>> | bigint | number | `${bigint}`>\n\t| bigint\n\t| number\n\t| `${bigint}`;\n\n/**\n * Data structure that makes it easy to interact with a bit field.\n */\nexport abstract class BitField<Flags extends string> {\n\t/**\n\t * Numeric bit field flags.\n\t *\n\t * @remarks Defined in extension classes\n\t */\n\tpublic static readonly Flags: EnumLike<unknown, bigint | number> = {};\n\n\tpublic static readonly DefaultBit: bigint = 0n;\n\n\t/**\n\t * Bitfield of the packed bits\n\t */\n\tpublic bitField: bigint;\n\n\tdeclare public ['constructor']: NonAbstract<typeof BitField<Flags>>;\n\n\t/**\n\t * @param bits - Bit(s) to read from\n\t */\n\tpublic constructor(bits: BitFieldResolvable<Flags> = this.constructor.DefaultBit) {\n\t\tthis.bitField = this.constructor.resolve(bits);\n\t}\n\n\t/**\n\t * Checks whether the bit field has a bit, or any of multiple bits.\n\t *\n\t * @param bit - Bit(s) to check for\n\t * @returns Whether the bit field has the bit(s)\n\t */\n\tpublic any(bit: BitFieldResolvable<Flags>) {\n\t\treturn (this.bitField & this.constructor.resolve(bit)) !== this.constructor.DefaultBit;\n\t}\n\n\t/**\n\t * Checks if this bit field equals another\n\t *\n\t * @param bit - Bit(s) to check for\n\t * @returns Whether this bit field equals the other\n\t */\n\tpublic equals(bit: BitFieldResolvable<Flags>) {\n\t\treturn this.bitField === this.constructor.resolve(bit);\n\t}\n\n\t/**\n\t * Checks whether the bit field has a bit, or multiple bits.\n\t *\n\t * @param bit - Bit(s) to check for\n\t * @returns Whether the bit field has the bit(s)\n\t */\n\tpublic has(bit: BitFieldResolvable<Flags>, ..._hasParams: unknown[]) {\n\t\tconst resolvedBit = this.constructor.resolve(bit);\n\t\treturn (this.bitField & resolvedBit) === resolvedBit;\n\t}\n\n\t/**\n\t * Gets all given bits that are missing from the bit field.\n\t *\n\t * @param bits - Bit(s) to check for\n\t * @param hasParams - Additional parameters for the has method, if any\n\t * @returns A bit field containing the missing bits\n\t */\n\tpublic missing(bits: BitFieldResolvable<Flags>, ...hasParams: readonly unknown[]) {\n\t\treturn new this.constructor(bits).remove(this).toArray(...hasParams);\n\t}\n\n\t/**\n\t * Freezes these bits, making them immutable.\n\t *\n\t * @returns This bit field but frozen\n\t */\n\tpublic freeze() {\n\t\treturn Object.freeze(this);\n\t}\n\n\t/**\n\t * Adds bits to these ones.\n\t *\n\t * @param bits - Bits to add\n\t * @returns These bits or new BitField if the instance is frozen.\n\t */\n\tpublic add(...bits: BitFieldResolvable<Flags>[]) {\n\t\tlet total = this.constructor.DefaultBit;\n\t\tfor (const bit of bits) {\n\t\t\ttotal |= this.constructor.resolve(bit);\n\t\t}\n\n\t\tif (Object.isFrozen(this)) return new this.constructor(this.bitField | total);\n\t\tthis.bitField |= total;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes bits from these.\n\t *\n\t * @param bits - Bits to remove\n\t * @returns These bits or new BitField if the instance is frozen.\n\t */\n\tpublic remove(...bits: BitFieldResolvable<Flags>[]) {\n\t\tlet total = this.constructor.DefaultBit;\n\t\tfor (const bit of bits) {\n\t\t\ttotal |= this.constructor.resolve(bit);\n\t\t}\n\n\t\tif (Object.isFrozen(this)) return new this.constructor(this.bitField & ~total);\n\t\tthis.bitField &= ~total;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Gets an object mapping field names to a boolean indicating whether the bit is available.\n\t *\n\t * @param hasParams - Additional parameters for the has method, if any\n\t * @returns An object mapping field names to a boolean indicating whether the bit is available\n\t */\n\tpublic serialize(...hasParams: readonly unknown[]) {\n\t\tconst serialized: Partial<Record<keyof Flags, boolean>> = {};\n\t\tfor (const [flag, bit] of Object.entries(this.constructor.Flags)) {\n\t\t\tif (Number.isNaN(Number(flag))) serialized[flag as keyof Flags] = this.has(bit as bigint | number, ...hasParams);\n\t\t}\n\n\t\treturn serialized;\n\t}\n\n\t/**\n\t * Gets an Array of bit field names based on the bits available.\n\t *\n\t * @param hasParams - Additional parameters for the has method, if any\n\t * @returns An Array of bit field names\n\t */\n\tpublic toArray(...hasParams: readonly unknown[]) {\n\t\treturn [...this[Symbol.iterator](...hasParams)];\n\t}\n\n\tpublic toJSON(asNumber?: boolean) {\n\t\tif (asNumber) {\n\t\t\tif (this.bitField > Number.MAX_SAFE_INTEGER) {\n\t\t\t\tthrow new RangeError(\n\t\t\t\t\t`Cannot convert bitfield value ${this.bitField} to number, as it is bigger than ${Number.MAX_SAFE_INTEGER} (the maximum safe integer)`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn Number(this.bitField);\n\t\t}\n\n\t\treturn this.bitField.toString();\n\t}\n\n\tpublic valueOf() {\n\t\treturn this.bitField;\n\t}\n\n\tpublic *[Symbol.iterator](...hasParams: unknown[]) {\n\t\tfor (const bitName of Object.keys(this.constructor.Flags)) {\n\t\t\tif (Number.isNaN(Number(bitName)) && this.has(bitName as Flags, ...hasParams)) yield bitName as Flags;\n\t\t}\n\t}\n\n\t/**\n\t * Resolves bit fields to their numeric form.\n\t *\n\t * @param bit - bit(s) to resolve\n\t * @returns the numeric value of the bit fields\n\t */\n\tpublic static resolve<Flags extends string = string>(bit: BitFieldResolvable<Flags>): bigint {\n\t\tconst DefaultBit = this.DefaultBit;\n\t\tif (typeof bit === 'bigint' && bit >= DefaultBit) return bit;\n\t\tif (typeof bit === 'number' && BigInt(bit) >= DefaultBit) return BigInt(bit);\n\t\tif (bit instanceof BitField) return bit.bitField;\n\t\tif (Array.isArray(bit)) {\n\t\t\treturn bit.map((bit_) => this.resolve(bit_)).reduce((prev, bit_) => prev | bit_, DefaultBit);\n\t\t}\n\n\t\tif (typeof bit === 'string') {\n\t\t\tif (!Number.isNaN(Number(bit))) return BigInt(bit);\n\t\t\tif (bit in this.Flags) return this.Flags[bit as keyof typeof this.Flags];\n\t\t}\n\n\t\tthrow new Error(`BitFieldInvalid: ${JSON.stringify(bit)}`);\n\t}\n}\n","import { ChannelFlags } from 'discord-api-types/v10';\nimport { BitField } from './BitField.js';\n\n/**\n * Data structure that makes it easy to interact with a {@link (Channel:class).flags} bitfield.\n */\nexport class ChannelFlagsBitField extends BitField<keyof ChannelFlags> {\n\t/**\n\t * Numeric guild channel flags.\n\t */\n\tpublic static override readonly Flags = ChannelFlags;\n\n\tpublic override toJSON() {\n\t\treturn super.toJSON(true);\n\t}\n}\n","/* eslint-disable unicorn/consistent-function-scoping */\nimport { PermissionFlagsBits } from 'discord-api-types/v10';\nimport type { BitFieldResolvable } from './BitField.js';\nimport { BitField } from './BitField.js';\n\n/**\n * Data structure that makes it easy to interact with a permission bit field. All {@link GuildMember}s have a set of\n * permissions in their guild, and each channel in the guild may also have {@link PermissionOverwrite}s for the member\n * that override their default permissions.\n */\nexport class PermissionsBitField extends BitField<keyof typeof PermissionFlagsBits> {\n\t/**\n\t * Numeric permission flags.\n\t *\n\t * @see {@link https://discord.com/developers/docs/topics/permissions#permissions-bitwise-permission-flags}\n\t */\n\tpublic static override Flags = PermissionFlagsBits;\n\n\t/**\n\t * Bit field representing every permission combined\n\t */\n\tpublic static readonly All = Object.values(PermissionFlagsBits).reduce((all, perm) => all | perm, 0n);\n\n\t/**\n\t * Bit field representing the default permissions for users\n\t */\n\tpublic static readonly Default = 104_324_673n;\n\n\t/**\n\t * Bit field representing the permissions required for moderators of stage channels\n\t */\n\tpublic static readonly StageModerator =\n\t\tPermissionFlagsBits.ManageChannels | PermissionFlagsBits.MuteMembers | PermissionFlagsBits.MoveMembers;\n\n\t/**\n\t * Gets all given bits that are missing from the bit field.\n\t *\n\t * @param bits - Bit(s) to check for\n\t * @param checkAdmin - Whether to allow the administrator permission to override\n\t * @returns A bit field containing the missing permissions\n\t */\n\tpublic override missing(bits: BitFieldResolvable<keyof typeof PermissionFlagsBits>, checkAdmin = true) {\n\t\treturn checkAdmin && this.has(PermissionFlagsBits.Administrator) ? [] : super.missing(bits);\n\t}\n\n\t/**\n\t * Checks whether the bit field has a permission, or any of multiple permissions.\n\t *\n\t * @param permission - Permission(s) to check for\n\t * @param checkAdmin - Whether to allow the administrator permission to override\n\t * @returns Whether the bit field has the permission(s)\n\t */\n\tpublic override any(permission: BitFieldResolvable<keyof typeof PermissionFlagsBits>, checkAdmin = true) {\n\t\treturn (checkAdmin && super.has(PermissionFlagsBits.Administrator)) || super.any(permission);\n\t}\n\n\t/**\n\t * Checks whether the bit field has a permission, or multiple permissions.\n\t *\n\t * @param permission - Permission(s) to check for\n\t * @param checkAdmin - Whether to allow the administrator permission to override\n\t * @returns Whether the bit field has the permission(s)\n\t */\n\tpublic override has(permission: BitFieldResolvable<keyof typeof PermissionFlagsBits>, checkAdmin = true) {\n\t\treturn (checkAdmin && super.has(PermissionFlagsBits.Administrator)) || super.has(permission);\n\t}\n\n\t/**\n\t * Gets an Array of bitfield names based on the permissions available.\n\t *\n\t * @returns An Array of permission names\n\t */\n\tpublic override toArray() {\n\t\treturn super.toArray(false);\n\t}\n}\n","export const kData = Symbol.for('djs.structures.data');\nexport const kClone = Symbol.for('djs.structures.clone');\nexport const kPatch = Symbol.for('djs.structures.patch');\nexport const kExpiresTimestamp = Symbol.for('djs.structures.expiresTimestamp');\nexport const kCreatedTimestamp = Symbol.for('djs.structures.createdTimestamp');\nexport const kEditedTimestamp = Symbol.for('djs.structures.editedTimestamp');\nexport const kArchiveTimestamp = Symbol.for('djs.structures.archiveTimestamp');\n\nexport const kAllow = Symbol.for('djs.structures.allow');\nexport const kDeny = Symbol.for('djs.structures.deny');\n\nexport const kLastPinTimestamp = Symbol.for('djs.structures.lastPinTimestamp');\n\nexport const kMixinConstruct = Symbol.for('djs.structures.mixin.construct');\nexport const kMixinToJSON = Symbol.for('djs.structures.mixin.toJSON');\n","import type { ChannelType } from 'discord-api-types/v10';\nimport { kData } from '../../utils/symbols.js';\nimport type { Channel } from '../Channel.js';\n\nexport interface AppliedTagsMixin extends Channel<ChannelType.PublicThread> {}\n\nexport class AppliedTagsMixin {\n\t/**\n\t * The ids of the set of tags that have been applied to a thread in a {@link (ForumChannel:class)} or a {@link (MediaChannel:class)}.\n\t */\n\tpublic get appliedTags(): readonly string[] | null {\n\t\treturn Array.isArray(this[kData].applied_tags) ? this[kData].applied_tags : null;\n\t}\n}\n","import type { ChannelType, ThreadChannelType } from 'discord-api-types/v10';\nimport { kData } from '../../utils/symbols.js';\nimport type { Channel } from '../Channel.js';\n\nexport interface ChannelOwnerMixin<Type extends ChannelType.GroupDM | ThreadChannelType> extends Channel<Type> {}\n\nexport class ChannelOwnerMixin<Type extends ChannelType.GroupDM | ThreadChannelType> {\n\t/**\n\t * The id of the creator of the group DM or thread\n\t */\n\tpublic get ownerId() {\n\t\treturn this[kData].owner_id;\n\t}\n}\n","import { channelLink } from '@discordjs/formatters';\nimport type { GuildChannelType } from 'discord-api-types/v10';\nimport { ChannelFlagsBitField } from '../../bitfields/ChannelFlagsBitField.js';\nimport { kData } from '../../utils/symbols.js';\nimport type { Channel } from '../Channel.js';\n\nexport interface GuildChannelMixin<Type extends GuildChannelType = GuildChannelType> extends Channel<Type> {}\n\nexport class GuildChannelMixin<Type extends GuildChannelType = GuildChannelType> {\n\t/**\n\t * The flags that are applied to the channel.\n\t *\n\t * @privateRemarks The type of `flags` can be narrowed in Guild Channels and DMChannel to ChannelFlags, and in GroupDM channel\n\t * to null, respecting Omit behaviors\n\t */\n\tpublic get flags() {\n\t\treturn this[kData].flags ? new ChannelFlagsBitField(this[kData].flags) : null;\n\t}\n\n\t/**\n\t * THe id of the guild this channel is in.\n\t */\n\tpublic get guildId() {\n\t\treturn this[kData].guild_id!;\n\t}\n\n\t/**\n\t * The URL to this channel.\n\t */\n\tpublic get url() {\n\t\treturn channelLink(this.id, this.guildId);\n\t}\n\n\t/**\n\t * Indicates whether this channel is in a guild\n\t */\n\tpublic isGuildBased(): this is GuildChannelMixin & this {\n\t\treturn true;\n\t}\n}\n","import type { ChannelType, GuildChannelType } from 'discord-api-types/v10';\nimport { kData } from '../../utils/symbols.js';\nimport { GuildChannelMixin } from './GuildChannelMixin.js';\n\nexport class ChannelParentMixin<\n\tType extends Exclude<GuildChannelType, ChannelType.GuildCategory | ChannelType.GuildDirectory>,\n> extends GuildChannelMixin<Type> {\n\t/**\n\t * The id of the parent category for a channel (each parent category can contain up to 50 channels) or id of the parent channel for a thread\n\t */\n\tpublic get parentId() {\n\t\treturn this[kData].parent_id;\n\t}\n\n\t/**\n\t * Whether the channel is nsfw\n\t */\n\tpublic get nsfw() {\n\t\treturn this[kData].nsfw;\n\t}\n}\n","import type { ChannelType, GuildChannelType, ThreadChannelType } from 'discord-api-types/v10';\nimport { kData } from '../../utils/symbols.js';\nimport type { Channel } from '../Channel.js';\n\nexport interface ChannelPermissionMixin<\n\tType extends Exclude<GuildChannelType, ChannelType.GuildDirectory | ThreadChannelType> = Exclude<\n\t\tGuildChannelType,\n\t\tChannelType.GuildDirectory | ThreadChannelType\n\t>,\n> extends Channel<Type> {}\n\n/**\n * @remarks has an array of sub-structures {@link PermissionOverwrite} that extending mixins should add to their DataTemplate and _optimizeData\n */\nexport class ChannelPermissionMixin<\n\tType extends Exclude<GuildChannelType, ChannelType.GuildDirectory | ThreadChannelType> = Exclude<\n\t\tGuildChannelType,\n\t\tChannelType.GuildDirectory | ThreadChannelType\n\t>,\n> {\n\t/**\n\t * The sorting position of the channel\n\t */\n\tpublic get position() {\n\t\treturn this[kData].position;\n\t}\n\n\t/**\n\t * Indicates whether this channel can have permission overwrites\n\t */\n\tpublic isPermissionCapable(): this is ChannelPermissionMixin & this {\n\t\treturn true;\n\t}\n}\n","import type { ChannelType, ThreadChannelType } from 'discord-api-types/v10';\nimport { kLastPinTimestamp, kMixinConstruct, kMixinToJSON } from '../../utils/symbols.js';\nimport type { Channel, ChannelDataType } from '../Channel.js';\n\nexport interface ChannelPinMixin<\n\tType extends ChannelType.DM | ChannelType.GuildAnnouncement | ChannelType.GuildText | ThreadChannelType,\n> extends Channel<Type> {}\n\nexport class ChannelPinMixin<\n\tType extends ChannelType.DM | ChannelType.GuildAnnouncement | ChannelType.GuildText | ThreadChannelType,\n> {\n\t/**\n\t * The timestamp of when the last pin in the channel happened\n\t */\n\tdeclare protected [kLastPinTimestamp]: number | null;\n\n\t/**\n\t * The template used for removing data from the raw data stored for each Channel.\n\t */\n\tpublic static readonly DataTemplate: Partial<\n\t\tChannelDataType<ChannelType.DM | ChannelType.GuildAnnouncement | ChannelType.GuildText | ThreadChannelType>\n\t> = {\n\t\tset last_pin_timestamp(_: string) {},\n\t};\n\n\tpublic [kMixinConstruct]() {\n\t\tthis[kLastPinTimestamp] ??= null;\n\t}\n\n\t/**\n\t * {@inheritDoc Structure.optimizeData}\n\t */\n\tprotected optimizeData(data: Partial<ChannelDataType<Type>>) {\n\t\tif (data.last_pin_timestamp) {\n\t\t\tthis[kLastPinTimestamp] = Date.parse(data.last_pin_timestamp);\n\t\t}\n\t}\n\n\t/**\n\t * The timestamp of when the last pin in the channel happened.\n\t */\n\tpublic get lastPinTimestamp() {\n\t\treturn this[kLastPinTimestamp];\n\t}\n\n\t/**\n\t * The Date of when the last pin in the channel happened\n\t */\n\tpublic get lastPinAt() {\n\t\tconst lastPinTimestamp = this.lastPinTimestamp;\n\t\treturn lastPinTimestamp ? new Date(lastPinTimestamp) : null;\n\t}\n\n\t/**\n\t * Adds data from optimized properties omitted from [kData].\n\t *\n\t * @param data - the result of {@link (Structure:class).toJSON}\n\t */\n\tprotected [kMixinToJSON](data: Partial<ChannelDataType<Type>>) {\n\t\tdata.last_pin_timestamp = this[kLastPinTimestamp] ? new Date(this[kLastPinTimestamp]).toISOString() : null;\n\t}\n}\n","import type { TextChannelType } from 'discord-api-types/v10';\nimport { kData } from '../../utils/symbols.js';\nimport type { Channel } from '../Channel.js';\n\nexport interface TextChannelMixin<Type extends TextChannelType = TextChannelType> extends Channel<Type> {}\n\nexport class TextChannelMixin<Type extends TextChannelType = TextChannelType> {\n\t/**\n\t * The id of the last message sent in this channel.\n\t */\n\tpublic get lastMessageId() {\n\t\treturn this[kData].last_message_id;\n\t}\n\n\t/**\n\t * Indicates whether this channel can contain messages\n\t */\n\tpublic isTextBased(): this is TextChannelMixin & this {\n\t\treturn true;\n\t}\n}\n","import type { GuildTextChannelType } from 'discord-api-types/v10';\nimport { kData } from '../../utils/symbols.js';\nimport { TextChannelMixin } from './TextChannelMixin.js';\n\nexport class ChannelSlowmodeMixin<Type extends GuildTextChannelType> extends TextChannelMixin<Type> {\n\t/**\n\t * The rate limit per user (slowmode) of this channel.\n\t */\n\tpublic get rateLimitPerUser() {\n\t\treturn this[kData].rate_limit_per_user;\n\t}\n}\n","import type { ChannelType, GuildTextChannelType, ThreadChannelType } from 'discord-api-types/v10';\nimport type { Channel } from '../Channel.js';\n\nexport interface ChannelWebhookMixin<\n\tType extends ChannelType.GuildForum | ChannelType.GuildMedia | Exclude<GuildTextChannelType, ThreadChannelType> =\n\t\t| ChannelType.GuildForum\n\t\t| ChannelType.GuildMedia\n\t\t| Exclude<GuildTextChannelType, ThreadChannelType>,\n> extends Channel<Type> {}\n\nexport class ChannelWebhookMixin<\n\tType extends ChannelType.GuildForum | ChannelType.GuildMedia | Exclude<GuildTextChannelType, ThreadChannelType> =\n\t\t| ChannelType.GuildForum\n\t\t| ChannelType.GuildMedia\n\t\t| Exclude<GuildTextChannelType, ThreadChannelType>,\n> {\n\t/**\n\t * Indicates whether this channel can have webhooks\n\t */\n\tpublic isWebhookCapable(): this is ChannelWebhookMixin & this {\n\t\treturn true;\n\t}\n}\n","import type { ChannelType } from 'discord-api-types/v10';\nimport { kData } from '../../utils/symbols.js';\nimport type { Channel } from '../Channel.js';\nimport { ChannelWebhookMixin } from './ChannelWebhookMixin.js';\n\nexport interface ChannelTopicMixin<\n\tType extends ChannelType.GuildAnnouncement | ChannelType.GuildForum | ChannelType.GuildMedia | ChannelType.GuildText,\n> extends Channel<Type> {}\n\nexport class ChannelTopicMixin<\n\tType extends ChannelType.GuildAnnouncement | ChannelType.GuildForum | ChannelType.GuildMedia | ChannelType.GuildText,\n> extends ChannelWebhookMixin<Type> {\n\t/**\n\t * The topic of this channel.\n\t */\n\tpublic get topic() {\n\t\treturn this[kData].topic;\n\t}\n\n\t/**\n\t * The duration after which new threads get archived by default on this channel.\n\t */\n\tpublic get defaultAutoArchiveDuration() {\n\t\treturn this[kData].default_auto_archive_duration;\n\t}\n\n\t/**\n\t * The default value for rate limit per user (slowmode) on new threads in this channel.\n\t */\n\tpublic get defaultThreadRateLimitPerUser() {\n\t\treturn this[kData].default_thread_rate_limit_per_user;\n\t}\n}\n","import { channelLink } from '@discordjs/formatters';\nimport type { ChannelType } from 'discord-api-types/v10';\nimport type { User } from '../../users/User.js';\nimport type { Channel } from '../Channel.js';\n\nexport interface DMChannelMixin<\n\tType extends ChannelType.DM | ChannelType.GroupDM = ChannelType.DM | ChannelType.GroupDM,\n> extends Channel<Type> {}\n\n/**\n * @remarks has recipients, an array of sub-structures {@link User} that extending mixins should add to their DataTemplate and _optimizeData\n */\nexport class DMChannelMixin<Type extends ChannelType.DM | ChannelType.GroupDM = ChannelType.DM | ChannelType.GroupDM> {\n\t/**\n\t * The URL to this channel.\n\t */\n\tpublic get url() {\n\t\treturn channelLink(this.id);\n\t}\n\n\t/**\n\t * Indicates whether this channel is a DM or DM Group\n\t */\n\tpublic isDMBased(): this is DMChannelMixin & this {\n\t\treturn true;\n\t}\n}\n","import type { ChannelType } from 'discord-api-types/v10';\nimport { kData } from '../../utils/symbols.js';\nimport type { Channel } from '../Channel.js';\n\nexport interface GroupDMMixin extends Channel<ChannelType.GroupDM> {}\n\nexport class GroupDMMixin {\n\t/**\n\t * The icon hash of the group DM.\n\t */\n\tpublic get icon() {\n\t\treturn this[kData].icon;\n\t}\n\n\t/**\n\t * Whether the channel is managed by an application via the `gdm.join` OAuth2 scope.\n\t */\n\tpublic get managed() {\n\t\treturn this[kData].managed;\n\t}\n\n\t/**\n\t * The application id of the group DM creator if it is bot-created.\n\t */\n\tpublic get applicationId() {\n\t\treturn this[kData].application_id;\n\t}\n}\n","import type { ThreadChannelType } from 'discord-api-types/v10';\nimport { kData } from '../../utils/symbols.js';\nimport type { Channel } from '../Channel.js';\n\nexport interface ThreadChannelMixin<Type extends ThreadChannelType = ThreadChannelType> extends Channel<Type> {}\n\n/**\n * @remarks has a sub-structure {@link ThreadMetadata} that extending mixins should add to their DataTemplate and _optimizeData\n */\nexport class ThreadChannelMixin<Type extends ThreadChannelType = ThreadChannelType> {\n\t/**\n\t * The approximate count of users in a thread, stops counting at 50\n\t */\n\tpublic get memberCount() {\n\t\treturn this[kData].member_count;\n\t}\n\n\t/**\n\t * The number of messages (not including the initial message or deleted messages) in a thread.\n\t */\n\tpublic get messageCount() {\n\t\treturn this[kData].message_count;\n\t}\n\n\t/**\n\t * The number of messages ever sent in a thread, it's similar to message_count on message creation,\n\t * but will not decrement the number when a message is deleted.\n\t */\n\tpublic get totalMessageSent() {\n\t\treturn this[kData].total_message_sent;\n\t}\n\n\t/**\n\t * Indicates whether this channel is a thread channel\n\t */\n\tpublic isThread(): this is ThreadChannelMixin & this {\n\t\treturn true;\n\t}\n}\n","import type { ChannelType } from 'discord-api-types/v10';\nimport { kData } from '../../utils/symbols.js';\nimport type { Channel } from '../Channel.js';\n\nexport interface ThreadOnlyChannelMixin<\n\tType extends ChannelType.GuildForum | ChannelType.GuildMedia = ChannelType.GuildForum | ChannelType.GuildMedia,\n> extends Channel<Type> {}\n\n/**\n * @remarks has an array of sub-structures {@link ForumTag} that extending mixins should add to their DataTemplate and _optimizeData\n */\nexport class ThreadOnlyChannelMixin<\n\tType extends ChannelType.GuildForum | ChannelType.GuildMedia = ChannelType.GuildForum | ChannelType.GuildMedia,\n> {\n\t/**\n\t * The emoji to show in the add reaction button on a thread in this channel.\n\t */\n\tpublic get defaultReactionEmoji() {\n\t\treturn this[kData].default_reaction_emoji;\n\t}\n\n\t/**\n\t * The default sort order type used to order posts in this channel.\n\t *\n\t * @defaultValue `null` – indicates a preferred sort order hasn't been set.\n\t */\n\tpublic get defaultSortOrder() {\n\t\treturn this[kData].default_sort_order!;\n\t}\n\n\t/**\n\t * Indicates whether this channel only allows thread creation\n\t */\n\tpublic isThreadOnly(): this is ThreadOnlyChannelMixin & this {\n\t\treturn true;\n\t}\n}\n","import type { ChannelType } from 'discord-api-types/v10';\nimport { kData } from '../../utils/symbols.js';\nimport type { Channel } from '../Channel.js';\nimport { TextChannelMixin } from './TextChannelMixin.js';\n\nexport interface VoiceChannelMixin<\n\tType extends ChannelType.GuildStageVoice | ChannelType.GuildVoice =\n\t\t| ChannelType.GuildStageVoice\n\t\t| ChannelType.GuildVoice,\n> extends Channel<Type> {}\n\nexport class VoiceChannelMixin<\n\tType extends ChannelType.GuildStageVoice | ChannelType.GuildVoice =\n\t\t| ChannelType.GuildStageVoice\n\t\t| ChannelType.GuildVoice,\n> extends TextChannelMixin<Type> {\n\t/**\n\t * The bitrate (in bits) of the voice channel.\n\t */\n\tpublic get bitrate() {\n\t\treturn this[kData].bitrate!;\n\t}\n\n\t/**\n\t * The voice region id for this channel, automatic when set to null.\n\t */\n\tpublic get rtcRegion() {\n\t\treturn this[kData].rtc_region!;\n\t}\n\n\t/**\n\t * The camera video quality mode of the voice channel, {@link discord-api-types/v10#(VideoQualityMode:enum) | Auto} when not present.\n\t */\n\tpublic get videoQualityMode() {\n\t\treturn this[kData].video_quality_mode!;\n\t}\n\n\t/**\n\t * The user limit of the voice channel.\n\t */\n\tpublic get userLimit() {\n\t\treturn this[kData].user_limit!;\n\t}\n\n\t/**\n\t * Indicates whether this channel has voice connection capabilities\n\t */\n\tpublic override isVoiceBased(): this is VoiceChannelMixin & this {\n\t\treturn true;\n\t}\n}\n","import { kClone, kData, kMixinConstruct, kMixinToJSON, kPatch } from './utils/symbols.js';\nimport type { ReplaceOmittedWithUnknown } from './utils/types.js';\n\nexport const DataTemplatePropertyName = 'DataTemplate';\nexport const OptimizeDataPropertyName = 'optimizeData';\n\n/**\n * Represents a data model from the Discord API\n *\n * @privateRemarks\n * Explanation of the type complexity surround Structure:\n *\n * There are two layers of Omitted generics, one here, which allows omitting things at the library level so we do not accidentally\n * access them, in addition to whatever the user does at the layer above.\n *\n * The second layer, in the exported structure is effectively a type cast that allows the getters types to match whatever data template is used\n *\n * In order to safely set and access this data, the constructor and patch take data as \"partial\" and forcibly assigns it to kData. To accommodate this,\n * kData stores properties as `unknown` when it is omitted, which allows accessing the property in getters even when it may not actually be present.\n * This is the most technically correct way of representing the value, especially since there is no way to guarantee runtime matches the \"type cast.\"\n */\nexport abstract class Structure<DataType extends {}, Omitted extends keyof DataType | '' = ''> {\n\t/**\n\t * A construct function used when mixing to allow mixins to set optimized property defaults\n\t *\n\t * @internal\n\t * @remarks This should only be used to set defaults, setting optimized values should be done\n\t * in the mixins `optimizeData` method, which will be called automatically.\n\t * @param data - The full API data received by the Structure\n\t */\n\tprotected [kMixinConstruct]?(data: Partial<DataType>): void;\n\n\t/**\n\t * A function used when mixing to allow mixins to add properties to the result of toJSON\n\t *\n\t * @internal\n\t * @remarks This should only be used to add properties that the mixin optimizes, if the raw\n\t * JSON data is unchanged the property will already be returned.\n\t * @param data - The result of the base class toJSON Structure before it gets returned\n\t */\n\tprotected [kMixinToJSON]?(data: Partial<DataType>): void;\n\n\t/**\n\t * The template used for removing data from the raw data stored for each Structure.\n\t *\n\t * @remarks This template should be overridden in all subclasses to provide more accurate type information.\n\t * The template in the base {@link Structure} class will have no effect on most subclasses for this reason.\n\t */\n\tprotected static readonly DataTemplate: Record<string, unknown> = {};\n\n\t/**\n\t * @returns A cloned version of the data template, ready to create a new data object.\n\t */\n\tprivate getDataTemplate() {\n\t\treturn Object.create((this.constructor as typeof Structure).DataTemplate);\n\t}\n\n\t/**\n\t * The raw data from the API for this structure\n\t *\n\t * @internal\n\t */\n\tprotected [kData]: Readonly<ReplaceOmittedWithUnknown<Omitted, DataType>>;\n\n\t/**\n\t * Creates a new structure to represent API data\n\t *\n\t * @param data - the data from the API that this structure will represent\n\t * @remarks To be made public in subclasses\n\t * @internal\n\t */\n\tpublic constructor(data: Readonly<Partial<DataType>>, ..._rest: unknown[]) {\n\t\tthis[kData] = Object.assign(this.getDataTemplate(), data);\n\t\tthis[kMixinConstruct]?.(data);\n\t}\n\n\t/**\n\t * Patches the raw data of this object in place\n\t *\n\t * @param data - the updated data from the API to patch with\n\t * @remarks To be made public in subclasses\n\t * @returns this\n\t * @internal\n\t */\n\tprotected [kPatch](data: Readonly<Partial<DataType>>): this {\n\t\tthis[kData] = Object.assign(this.getDataTemplate(), this[kData], data);\n\t\tthis.optimizeData(data);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Creates a clone of this structure\n\t *\n\t * @returns a clone of this\n\t * @internal\n\t */\n\tprotected [kClone](patchPayload?: Readonly<Partial<DataType>>): typeof this {\n\t\tconst clone = this.toJSON();\n\t\t// @ts-expect-error constructor is of abstract class is unknown\n\t\treturn new this.constructor(\n\t\t\t// Ensure the ts-expect-error only applies to the constructor call\n\t\t\tpatchPayload ? Object.assign(clone, patchPayload) : clone,\n\t\t);\n\t}\n\n\t/**\n\t * Function called to ensure stored raw data is in optimized formats, used in tandem with a data template\n\t *\n\t * @example created_timestamp is an ISO string, this can be stored in optimized form as a number\n\t * @param _data - the raw data received from the API to optimize\n\t * @remarks Implementation to be done in subclasses and mixins where needed.\n\t * For typescript users, mixins must use the closest ancestors access modifier.\n\t * @remarks Automatically called in Structure[kPatch] but must be called manually in the constructor\n\t * of any class implementing this method.\n\t * @remarks Additionally, when implementing, ensure to call `super._optimizeData` if any class in the super chain aside\n\t * from Structure contains an implementation.\n\t * Note: mixins do not need to call super ever as the process of mixing walks the prototype chain.\n\t * @virtual\n\t * @internal\n\t */\n\tprotected optimizeData(_data: Partial<DataType>) {}\n\n\t/**\n\t * Transforms this object to its JSON format with raw API data (or close to it),\n\t * automatically called by `JSON.stringify()` when this structure is stringified\n\t *\n\t * @remarks\n\t * The type of this data is determined by omissions at runtime and is only guaranteed for default omissions\n\t * @privateRemarks\n\t * When omitting properties at the library level, this must be overridden to re-add those properties\n\t */\n\tpublic toJSON(): DataType {\n\t\t// This will be DataType provided nothing is omitted, when omits occur, subclass needs to overwrite this.\n\t\tconst data =\n\t\t\t// Spread is way faster than structuredClone, but is shallow. So use it only if there is no nested objects\n\t\t\t(\n\t\t\t\tObject.values(this[kData]).some((value) => typeof value === 'object' && value !== null)\n\t\t\t\t\t? structuredClone(this[kData])\n\t\t\t\t\t: { ...this[kData] }\n\t\t\t) as DataType;\n\t\tthis[kMixinToJSON]?.(data);\n\t\treturn data;\n\t}\n}\n","import type { APIGuildForumTag } from 'discord-api-types/v10';\nimport { Structure } from '../Structure.js';\nimport { kData } from '../utils/symbols.js';\nimport type { Partialize } from '../utils/types.js';\n\n/**\n * Represents metadata of a thread channel on Discord.\n *\n * @typeParam Omitted - Specify the properties that will not be stored in the raw data field as a union, implement via `DataTemplate`\n */\nexport class ForumTag<Omitted extends keyof APIGuildForumTag | '' = ''> extends Structure<APIGuildForumTag, Omitted> {\n\tpublic constructor(data: Partialize<APIGuildForumTag, Omitted>) {\n\t\tsuper(data);\n\t}\n\n\t/**\n\t * The id of the tag.\n\t */\n\tpublic get id() {\n\t\treturn this[kData].id;\n\t}\n\n\t/**\n\t * The name of the tag.\n\t */\n\tpublic get name() {\n\t\treturn this[kData].name;\n\t}\n\n\t/**\n\t * Whether this tag can only be added to or removed from threads by a member with the {@link discord-api-types/v10#(PermissionFlagsBits:variable) | ManageThreads} permission.\n\t */\n\tpublic get moderated() {\n\t\treturn this[kData].moderated;\n\t}\n\n\t/**\n\t * The id of a guild's custom emoji.\n\t */\n\tpublic get emojiId() {\n\t\treturn this[kData].emoji_id;\n\t}\n\n\t/**\n\t * The unicode character of the emoji.\n\t */\n\tpublic get emojiName() {\n\t\treturn this[kData].emoji_name;\n\t}\n\n\t/**\n\t * The textual representation of this tag's emoji. Either a unicode character or a guild emoji mention.\n\t */\n\tpublic get emoji() {\n\t\treturn this.emojiName ?? `<:_:${this.emojiId}>`;\n\t}\n}\n","import type { APIOverwrite } from 'discord-api-types/v10';\nimport { Structure } from '../Structure.js';\nimport { PermissionsBitField } from '../bitfields/PermissionsBitField.js';\nimport { kAllow, kData, kDeny } from '../utils/symbols.js';\nimport type { Partialize } from '../utils/types.js';\n\n/**\n * Represents metadata of a thread channel on Discord.\n *\n * @typeParam Omitted - Specify the properties that will not be stored in the raw data field as a union, implement via `DataTemplate`\n */\nexport class PermissionOverwrite<Omitted extends keyof APIOverwrite | '' = 'allow' | 'deny'> extends Structure<\n\tAPIOverwrite,\n\tOmitted\n> {\n\tprotected [kAllow]: bigint | null = null;\n\n\tprotected [kDeny]: bigint | null = null;\n\n\tpublic constructor(data: Partialize<APIOverwrite, Omitted>) {\n\t\tsuper(data);\n\t\tthis.optimizeData(data);\n\t}\n\n\t/**\n\t * The template used for removing data from the raw data stored for each ThreadMetadata\n\t *\n\t * @remarks This template has defaults, if you want to remove additional data and keep the defaults,\n\t * use `Object.defineProperties`. To override the defaults, set this value directly.\n\t */\n\tpublic static override readonly DataTemplate: Partial<APIOverwrite> = {\n\t\tset allow(_: string) {},\n\t\tset deny(_: string) {},\n\t};\n\n\t/**\n\t * {@inheritDoc Structure.optimizeData}\n\t */\n\tprotected override optimizeData(data: Partial<APIOverwrite>) {\n\t\tif (data.allow) {\n\t\t\tthis[kAllow] = BigInt(data.allow);\n\t\t}\n\n\t\tif (data.deny) {\n\t\t\tthis[kDeny] = BigInt(data.deny);\n\t\t}\n\t}\n\n\t/**\n\t * The permission bit set allowed by this overwrite.\n\t */\n\tpublic get allow() {\n\t\tconst allow = this[kAllow];\n\t\treturn typeof allow === 'bigint' ? new PermissionsBitField(allow) : null;\n\t}\n\n\t/**\n\t * The permission bit set denied by this overwrite.\n\t */\n\tpublic get deny() {\n\t\tconst deny = this[kDeny];\n\t\treturn typeof deny === 'bigint' ? new PermissionsBitField(deny) : null;\n\t}\n\n\t/**\n\t * The role or user id for this overwrite.\n\t */\n\tpublic get id() {\n\t\treturn this[kData].id;\n\t}\n\n\t/**\n\t * The type of this overwrite.\n\t */\n\tpublic get type() {\n\t\treturn this[kData].type;\n\t}\n\n\t/**\n\t * {@inheritDoc Structure.toJSON}\n\t */\n\tpublic override toJSON() {\n\t\tconst clone = super.toJSON();\n\t\tif (this[kAllow]) {\n\t\t\tclone.allow = this[kAllow].toString();\n\t\t}\n\n\t\tif (this[kDeny]) {\n\t\t\tclone.deny = this[kDeny].toString();\n\t\t}\n\n\t\treturn clone;\n\t}\n}\n","import type { APIThreadMetadata } from 'discord-api-types/v10';\nimport { Structure } from '../Structure.js';\nimport { kArchiveTimestamp, kCreatedTimestamp, kData } from '../utils/symbols.js';\nimport type { Partialize } from '../utils/types.js';\n\n/**\n * Represents metadata of a thread channel on Discord.\n *\n * @typeParam Omitted - Specify the properties that will not be stored in the raw data field as a union, implement via `DataTemplate`\n */\nexport class ThreadMetadata<\n\tOmitted extends keyof APIThreadMetadata | '' = 'archive_timestamp' | 'create_timestamp',\n> extends Structure<APIThreadMetadata, Omitted> {\n\tprotected [kArchiveTimestamp]: number | null = null;\n\n\tprotected [kCreatedTimestamp]: number | null = null;\n\n\tpublic constructor(data: Partialize<APIThreadMetadata, Omitted>) {\n\t\tsuper(data);\n\t\tthis.optimizeData(data);\n\t}\n\n\t/**\n\t * The template used for removing data from the raw data stored for each ThreadMetadata\n\t *\n\t * @remarks This template has defaults, if you want to remove additional data and keep the defaults,\n\t * use `Object.defineProperties`. To override the defaults, set this value directly.\n\t */\n\tpublic static override readonly DataTemplate: Partial<APIThreadMetadata> = {\n\t\tset create_timestamp(_: string) {},\n\t\tset archive_timestamp(_: string) {},\n\t};\n\n\t/**\n\t * {@inheritDoc Structure.optimizeData}\n\t */\n\tprotected override optimizeData(data: Partial<APIThreadMetadata>) {\n\t\tif (data.create_timestamp) {\n\t\t\tthis[kCreatedTimestamp] = Date.parse(data.create_timestamp);\n\t\t}\n\n\t\tif (data.archive_timestamp) {\n\t\t\tthis[kArchiveTimestamp] = Date.parse(data.archive_timestamp);\n\t\t}\n\t}\n\n\t/**\n\t * Whether the thread is archived.\n\t */\n\tpublic get archived() {\n\t\treturn this[kData].archived;\n\t}\n\n\t/**\n\t * The timestamp when the thread's archive status was last changed, used for calculating recent activity.\n\t */\n\tpublic get archivedTimestamp() {\n\t\treturn this[kArchiveTimestamp];\n\t}\n\n\t/**\n\t * The timestamp when the thread was created; only populated for threads created after 2022-01-09.\n\t */\n\tpublic get createdTimestamp() {\n\t\treturn this[kCreatedTimestamp];\n\t}\n\n\t/**\n\t * The thread will stop showing in the channel list after auto_archive_duration minutes of inactivity,\n\t */\n\tpublic get autoArchiveDuration() {\n\t\treturn this[kData].auto_archive_duration;\n\t}\n\n\t/**\n\t * Whether non-moderators can add other non-moderators to a thread; only available on private threads.\n\t */\n\tpublic get invitable() {\n\t\treturn this[kData].invitable;\n\t}\n\n\t/**\n\t * Whether the thread is locked; when a thread is locked, only users with {@link discord-api-types/v10#(PermissionFlagsBits:variable) | ManageThreads} can unarchive it.\n\t */\n\tpublic get locked() {\n\t\treturn this[kData].locked;\n\t}\n\n\t/**\n\t * The time the thread was archived at\n\t */\n\tpublic get archivedAt() {\n\t\tconst archivedTimestamp = this.archivedTimestamp;\n\t\treturn archivedTimestamp ? new Date(archivedTimestamp) : null;\n\t}\n\n\t/**\n\t * The time the thread was created at\n\t */\n\tpublic get createdAt() {\n\t\tconst createdTimestamp = this.createdTimestamp;\n\t\treturn createdTimestamp ? new Date(createdTimestamp) : null;\n\t}\n\n\t/**\n\t * {@inheritDoc Structure.toJSON}\n\t */\n\tpublic override toJSON() {\n\t\tconst data = super.toJSON();\n\t\tif (this[kArchiveTimestamp]) {\n\t\t\tdata.archive_timestamp = new Date(this[kArchiveTimestamp]).toISOString();\n\t\t}\n\n\t\tif (this[kCreatedTimestamp]) {\n\t\t\tdata.create_timestamp = new Date(this[kCreatedTimestamp]).toISOString();\n\t\t}\n\n\t\treturn data;\n\t}\n}\n","import { DiscordSnowflake } from '@sapphire/snowflake';\nimport type { APIChannel, APIPartialChannel, ChannelType, ChannelFlags } from 'discord-api-types/v10';\nimport { Structure } from '../Structure.js';\nimport { ChannelFlagsBitField } from '../bitfields/ChannelFlagsBitField.js';\nimport { kData, kPatch } from '../utils/symbols.js';\nimport { isIdSet } from '../utils/type-guards.js';\nimport type { Partialize } from '../utils/types.js';\nimport type { ChannelPermissionMixin } from './mixins/ChannelPermissionMixin.js';\nimport type { ChannelWebhookMixin } from './mixins/ChannelWebhookMixin.js';\nimport type { DMChannelMixin } from './mixins/DMChannelMixin.js';\nimport type { GuildChannelMixin } from './mixins/GuildChannelMixin.js';\nimport type { TextChannelMixin } from './mixins/TextChannelMixin.js';\nimport type { ThreadChannelMixin } from './mixins/ThreadChannelMixin.js';\nimport type { ThreadOnlyChannelMixin } from './mixins/ThreadOnlyChannelMixin.js';\nimport type { VoiceChannelMixin } from './mixins/VoiceChannelMixin.js';\n\nexport type PartialChannel = Channel<ChannelType, Exclude<keyof APIChannel, keyof APIPartialChannel>>;\n\n/**\n * The data stored by a {@link Channel} structure based on its {@link (Channel:class).\"type\"} property.\n */\nexport type ChannelDataType<Type extends ChannelType | 'unknown'> = Type extends ChannelType\n\t? Extract<APIChannel, { type: Type }>\n\t: APIPartialChannel;\n\n/**\n * Represents any channel on Discord.\n *\n * @typeParam Type - Specify the type of the channel being constructed for more accurate data types\n * @typeParam Omitted - Specify the properties that will not be stored in the raw data field as a union, implement via `DataTemplate`\n * @remarks Although this class _can_ be instantiated directly for any channel type,\n * it's intended to be subclassed with the appropriate mixins for each channel type.\n */\nexport class Channel<\n\tType extends ChannelType | 'unknown' = ChannelType,\n\tOmitted extends keyof ChannelDataType<Type> | '' = '',\n> extends Structure<ChannelDataType<Type>, Omitted> {\n\t/**\n\t * The template used for removing data from the raw data stored for each Channel.\n\t *\n\t * @remarks This template is only guaranteed to apply to channels constructed directly via `new Channel()`.\n\t * Use the appropriate subclass template to remove data from that channel type.\n\t */\n\tpublic static override readonly DataTemplate: Partial<APIChannel> = {};\n\n\t/**\n\t * @param data - The raw data received from the API for the channel\n\t */\n\tpublic constructor(data: Partialize<ChannelDataType<Type>, Omitted>) {\n\t\tsuper(data as ChannelDataType<Type>);\n\t}\n\n\t/**\n\t * {@inheritDoc Structure.[kPatch]}\n\t *\n\t * @internal\n\t */\n\tpublic override [kPatch](data: Partial<ChannelDataType<Type>>) {\n\t\treturn super[kPatch](data);\n\t}\n\n\t/**\n\t * The id of the channel\n\t */\n\tpublic get id() {\n\t\treturn this[kData].id;\n\t}\n\n\t/**\n\t * The type of the channel\n\t */\n\tpublic get type() {\n\t\t// This cast can be incorrect when type is omitted and if the wrong type of channel was constructed\n\t\treturn this[kData].type as Type extends 'unknown' ? number : Type;\n\t}\n\n\t/**\n\t * The name of the channel, null for DMs\n\t *\n\t * @privateRemarks The type of `name` can be narrowed in Guild Channels and DM channels to string and null respectively,\n\t * respecting Omit behaviors\n\t */\n\tpublic get name() {\n\t\treturn this[kData].name;\n\t}\n\n\t/**\n\t * The flags that are applied to the channel.\n\t *\n\t * @privateRemarks The type of `flags` can be narrowed in Guild Channels and DMChannel to ChannelFlags, and in GroupDM channel\n\t * to null, respecting Omit behaviors\n\t */\n\tpublic get flags() {\n\t\tconst flags =\n\t\t\t'flags' in this[kData] && typeof this[kData].flags === 'number' ? (this[kData].flags as ChannelFlags) : null;\n\t\treturn flags ? new ChannelFlagsBitField(flags) : null;\n\t}\n\n\t/**\n\t * The timestamp the channel was created at\n\t */\n\tpublic get createdTimestamp() {\n\t\treturn isIdSet(this.id) ? DiscordSnowflake.timestampFrom(this.id) : null;\n\t}\n\n\t/**\n\t * The time the channel was created at\n\t */\n\tpublic get createdAt() {\n\t\tconst createdTimestamp = this.createdTimestamp;\n\t\treturn createdTimestamp ? new Date(createdTimestamp) : null;\n\t}\n\n\t/**\n\t * Indicates whether this channel is a thread channel\n\t *\n\t * @privateRemarks Overridden to `true` on `ThreadChannelMixin`\n\t */\n\tpublic isThread(): this is ThreadChannelMixin & this {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Indicates whether this channel can contain messages\n\t *\n\t * @privateRemarks Overridden to `true` on `TextChannelMixin`\n\t */\n\tpublic isTextBased(): this is TextChannelMixin & this {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Indicates whether this channel is in a guild\n\t *\n\t * @privateRemarks Overridden to `true` on `GuildChannelMixin`\n\t */\n\tpublic isGuildBased(): this is GuildChannelMixin & this {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Indicates whether this channel is a DM or DM Group\n\t *\n\t * @privateRemarks Overridden to `true` on `DMChannelMixin`\n\t */\n\tpublic isDMBased(): this is DMChannelMixin & this {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Indicates whether this channel has voice connection capabilities\n\t *\n\t * @privateRemarks Overridden to `true` on `VoiceChannelMixin`\n\t */\n\tpublic isVoiceBased(): this is VoiceChannelMixin & this {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Indicates whether this channel only allows thread creation\n\t *\n\t * @privateRemarks Overridden to `true` on `ThreadOnlyChannelMixin`\n\t */\n\tpublic isThreadOnly(): this is ThreadOnlyChannelMixin & this {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Indicates whether this channel can have permission overwrites\n\t *\n\t * @privateRemarks Overridden to `true` on `ChannelPermissionsMixin`\n\t */\n\tpublic isPermissionCapable(): this is ChannelPermissionMixin & this {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Indicates whether this channel can have webhooks\n\t *\n\t * @privateRemarks Overridden to `true` on `ChannelWebhooksMixin`\n\t */\n\tpublic isWebhookCapable(): this is ChannelWebhookMixin & this {\n\t\treturn false;\n\t}\n}\n","export function isIdSet(id: unknown): id is bigint | string {\n\treturn typeof id === 'string' || typeof id === 'bigint';\n}\n","import { DataTemplatePropertyName, OptimizeDataPropertyName, type Structure } from './Structure.js';\nimport { kMixinConstruct, kMixinToJSON } from './utils/symbols.js';\n\nexport type Mixinable<ClassType> = new (...args: unknown[]) => ClassType;\n\nexport type MixinBase<BaseClass extends Structure<{}>> =\n\tBaseClass extends Structure<infer DataType, infer Omitted> ? Structure<DataType, Omitted> : never;\n\n/**\n * Copies the prototype (getters, setters, and methods) of all mixins to the destination class.\n * For type information see {@link MixinTypes}\n *\n * @param destination - The class to apply the mixins to, must extend the base that the mixins expect it to.\n * @param mixins - Classes that contain \"pure\" prototypes to be copied on top of the destination class prototype\n * @remarks All mixins should be \"pure\" in that they only contain getters, setters, and methods.\n * The runtime code will only copy these, and adding properties to the class only results\n * in the types of the mixed class being wrong.\n * @example\n * ```\n * // Interface merging on the mixin to give type access to props on the base and kData that are available once copied\n * interface TextMixin extends Channel {}\n * class TextMixin {\n * \t// Methods / getters\n * }\n *\n * // Interface merging on the mixed class to give it accurate type information within the declaration and when instantiated\n * interface TextChannel extends MixinTypes<Channel, [TextMixin]> {}\n * class TextChannel extends Channel {}\n *\n * // Apply for runtime\n * Mixin(TextChannel, [TextMixin])\n * ```\n * @typeParam DestinationClass - The class to be mixed, ensures that the mixins provided can be used with this destination\n */\nexport function Mixin<DestinationClass extends typeof Structure<{}>>(\n\tdestination: DestinationClass,\n\tmixins: Mixinable<MixinBase<DestinationClass['prototype']>>[],\n) {\n\tconst dataTemplates: Record<string, unknown>[] = [];\n\tconst dataOptimizations: ((data: unknown) => void)[] = [];\n\tconst enrichToJSONs: ((data: Partial<unknown>) => void)[] = [];\n\tconst constructors: ((data: Partial<unknown>) => void)[] = [];\n\n\tfor (const mixin of mixins) {\n\t\t// The entire prototype chain, in reverse order, since we want to copy it all\n\t\tconst prototypeChain: MixinBase<DestinationClass['prototype']>[] = [];\n\t\tlet extendedClass = mixin;\n\t\twhile (extendedClass.prototype !== undefined) {\n\t\t\tif (\n\t\t\t\tDataTemplatePropertyName in extendedClass &&\n\t\t\t\ttypeof extendedClass.DataTemplate === 'object' &&\n\t\t\t\t// eslint-disable-next-line no-eq-null, eqeqeq\n\t\t\t\textendedClass.DataTemplate != null\n\t\t\t) {\n\t\t\t\tdataTemplates.push(extendedClass.DataTemplate as Record<string, unknown>);\n\t\t\t}\n\n\t\t\tprototypeChain.unshift(extendedClass.prototype);\n\t\t\textendedClass = Object.getPrototypeOf(extendedClass);\n\t\t}\n\n\t\tfor (const prototype of prototypeChain) {\n\t\t\t// Symboled data isn't traversed by Object.entries, we can handle it here\n\t\t\tif (prototype[kMixinConstruct]) {\n\t\t\t\tconstructors.push(prototype[kMixinConstruct]);\n\t\t\t}\n\n\t\t\tif (prototype[kMixinToJSON]) {\n\t\t\t\tenrichToJSONs.push(prototype[kMixinToJSON]);\n\t\t\t}\n\n\t\t\t// Copy instance methods and setters / getters\n\t\t\tconst originalDescriptors = Object.getOwnPropertyDescriptors(prototype);\n\t\t\tconst usingDescriptors: { [prop: string]: PropertyDescriptor } = {};\n\t\t\tfor (const [prop, descriptor] of Object.entries(originalDescriptors)) {\n\t\t\t\t// Drop constructor\n\t\t\t\tif (['constructor'].includes(prop)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Special case for optimize function, we want to combine these\n\t\t\t\tif (prop === OptimizeDataPropertyName) {\n\t\t\t\t\tif (typeof descriptor.value !== 'function')\n\t\t\t\t\t\tthrow new RangeError(`Expected ${prop} to be a function, received ${typeof descriptor.value} instead.`);\n\t\t\t\t\tdataOptimizations.push(descriptor.value);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Shouldn't be anything other than these without being instantiated, but just in case\n\t\t\t\tif (\n\t\t\t\t\ttypeof descriptor.get !== 'undefined' ||\n\t\t\t\t\ttypeof descriptor.set !== 'undefined' ||\n\t\t\t\t\ttypeof descriptor.value === 'function'\n\t\t\t\t) {\n\t\t\t\t\tusingDescriptors[prop] = descriptor;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tObject.defineProperties(destination.prototype, usingDescriptors);\n\t\t}\n\t}\n\n\t// Set the function to call any mixed constructors\n\tif (constructors.length > 0) {\n\t\tObject.defineProperty(destination.prototype, kMixinConstruct, {\n\t\t\twritable: true,\n\t\t\tenumerable: false,\n\t\t\tconfigurable: true,\n\t\t\t// eslint-disable-next-line func-name-matching\n\t\t\tvalue: function _mixinConstructors(data: Partial<unknown>) {\n\t\t\t\tfor (const construct of constructors) {\n\t\t\t\t\tconstruct.call(this, data);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n\n\t// Combine all optimizations into a single function\n\tconst baseOptimize = Object.getOwnPropertyDescriptor(destination, OptimizeDataPropertyName);\n\tif (baseOptimize && typeof baseOptimize.value === 'function') {\n\t\t// call base last (mimic constructor behavior)\n\t\tdataOptimizations.push(baseOptimize.value);\n\t}\n\n\tconst superOptimize = Object.getOwnPropertyDescriptor(\n\t\tObject.getPrototypeOf(destination).prototype,\n\t\tOptimizeDataPropertyName,\n\t);\n\t// the mixin base optimize should call super, so we can ignore the super in that case\n\tif (!baseOptimize && superOptimize && typeof superOptimize.value === 'function') {\n\t\t// call super first (mimic constructor behavior)\n\t\tdataOptimizations.unshift(superOptimize.value);\n\t}\n\n\t// If there's more than one optimization or if there's an optimization that isn't on the destination (base)\n\tif (dataOptimizations.length > 1 || (dataOptimizations.length === 1 && !baseOptimize)) {\n\t\tObject.defineProperty(destination.prototype, OptimizeDataPropertyName, {\n\t\t\twritable: true,\n\t\t\tenumerable: false,\n\t\t\tconfigurable: true,\n\t\t\t// eslint-disable-next-line func-name-matching\n\t\t\tvalue: function _mixinOptimizeData(data: unknown) {\n\t\t\t\tfor (const optimization of dataOptimizations) {\n\t\t\t\t\toptimization.call(this, data);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n\n\tif (enrichToJSONs.length > 0) {\n\t\tObject.defineProperty(destination.prototype, kMixinToJSON, {\n\t\t\twritable: true,\n\t\t\tenumerable: false,\n\t\t\tconfigurable: true,\n\t\t\t// eslint-disable-next-line func-name-matching\n\t\t\tvalue: function _mixinToJSON(data: Partial<unknown>) {\n\t\t\t\tfor (const enricher of enrichToJSONs) {\n\t\t\t\t\tenricher.call(this, data);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n\n\t// Copy the properties (setters) of each mixins template to the destinations template\n\tif (dataTemplates.length > 0) {\n\t\tif (!Object.getOwnPropertyDescriptor(destination, DataTemplatePropertyName)) {\n\t\t\tObject.defineProperty(destination, DataTemplatePropertyName, {\n\t\t\t\tvalue: Object.defineProperties({}, Object.getOwnPropertyDescriptors(destination[DataTemplatePropertyName])),\n\t\t\t\twritable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t});\n\t\t}\n\n\t\tfor (const template of dataTemplates) {\n\t\t\tObject.defineProperties(destination[DataTemplatePropertyName], Object.getOwnPropertyDescriptors(template));\n\t\t}\n\t}\n}\n","import type { APINewsChannel, ChannelType } from 'discord-api-types/v10';\nimport { Mixin } from '../Mixin.js';\nimport type { MixinTypes } from '../MixinTypes.d.ts';\nimport type { Partialize } from '../utils/types.js';\nimport { Channel } from './Channel.js';\nimport { ChannelParentMixin } from './mixins/ChannelParentMixin.js';\nimport { ChannelPermissionMixin } from './mixins/ChannelPermissionMixin.js';\nimport { ChannelPinMixin } from './mixins/ChannelPinMixin.js';\nimport { ChannelSlowmodeMixin } from './mixins/ChannelSlowmodeMixin.js';\nimport { ChannelTopicMixin } from './mixins/ChannelTopicMixin.js';\nimport { TextChannelMixin } from './mixins/TextChannelMixin.js';\n\nexport interface AnnouncementChannel<Omitted extends keyof APINewsChannel | '' = ''>\n\textends MixinTypes<\n\t\tChannel<ChannelType.GuildAnnouncement>,\n\t\t[\n\t\t\tTextChannelMixin<ChannelType.GuildAnnouncement>,\n\t\t\tChannelParentMixin<ChannelType.GuildAnnouncement>,\n\t\t\tChannelPermissionMixin<ChannelType.GuildAnnouncement>,\n\t\t\tChannelPinMixin<ChannelType.GuildAnnouncement>,\n\t\t\tChannelSlowmodeMixin<ChannelType.GuildAnnouncement>,\n\t\t\tChannelTopicMixin<ChannelType.GuildAnnouncement>,\n\t\t]\n\t> {}\n\n/**\n * Sample Implementation of a structure for announcement channels, usable by direct end consumers.\n */\nexport class AnnouncementChannel<Omitted extends keyof APINewsChannel | '' = ''> extends Channel<\n\tChannelType.GuildAnnouncement,\n\tOmitted\n> {\n\tpublic constructor(data: Partialize<APINewsChannel, Omitted>) {\n\t\tsuper(data);\n\t\tthis.optimizeData(data);\n\t}\n}\n\nMixin(AnnouncementChannel, [\n\tTextChannelMixin,\n\tChannelParentMixin,\n\tChannelPermissionMixin,\n\tChannelPinMixin,\n\tChannelSlowmodeMixin,\n\tChannelTopicMixin,\n]);\n","import type { APIAnnouncementThreadChannel, ChannelType } from 'discord-api-types/v10';\nimport { Mixin } from '../Mixin.js';\nimport type { MixinTypes } from '../MixinTypes.d.ts';\nimport type { Partialize } from '../utils/types.js';\nimport { Channel } from './Channel.js';\nimport { ChannelOwnerMixin } from './mixins/ChannelOwnerMixin.js';\nimport { ChannelParentMixin } from './mixins/ChannelParentMixin.js';\nimport { ChannelPinMixin } from './mixins/ChannelPinMixin.js';\nimport { ChannelSlowmodeMixin } from './mixins/ChannelSlowmodeMixin.js';\nimport { GuildChannelMixin } from './mixins/GuildChannelMixin.js';\nimport { TextChannelMixin } from './mixins/TextChannelMixin.js';\nimport { ThreadChannelMixin } from './mixins/ThreadChannelMixin.js';\n\nexport interface AnnouncementThreadChannel<Omitted extends keyof APIAnnouncementThreadChannel | '' = ''>\n\textends MixinTypes<\n\t\tChannel<ChannelType.AnnouncementThread>,\n\t\t[\n\t\t\tTextChannelMixin<ChannelType.AnnouncementThread>,\n\t\t\tChannelOwnerMixin<ChannelType.AnnouncementThread>,\n\t\t\tChannelParentMixin<ChannelType.AnnouncementThread>,\n\t\t\tChannelPinMixin<ChannelType.AnnouncementThread>,\n\t\t\tChannelSlowmodeMixin<ChannelType.AnnouncementThread>,\n\t\t\tGuildChannelMixin<ChannelType.AnnouncementThread>,\n\t\t\tThreadChannelMixin<ChannelType.AnnouncementThread>,\n\t\t]\n\t> {}\n\n/**\n * Sample Implementation of a structure for announcement threads, usable by direct end consumers.\n */\nexport class AnnouncementThreadChannel<Omitted extends keyof APIAnnouncementThreadChannel | '' = ''> extends Channel<\n\tChannelType.AnnouncementThread,\n\tOmitted\n> {\n\tpublic constructor(data: Partialize<APIAnnouncementThreadChannel, Omitted>) {\n\t\tsuper(data);\n\t\tthis.optimizeData?.(data);\n\t}\n}\n\nMixin(AnnouncementThreadChannel, [\n\tTextChannelMixin,\n\tChannelOwnerMixin,\n\tChannelParentMixin,\n\tChannelPinMixin,\n\tChannelSlowmodeMixin,\n\tGuildChannelMixin,\n\tThreadChannelMixin,\n]);\n","import type { APIGuildCategoryChannel, ChannelType } from 'discord-api-types/v10';\nimport { Mixin } from '../Mixin.js';\nimport type { MixinTypes } from '../MixinTypes.d.ts';\nimport type { Partialize } from '../utils/types.js';\nimport { Channel } from './Channel.js';\nimport { ChannelPermissionMixin } from './mixins/ChannelPermissionMixin.js';\nimport { GuildChannelMixin } from './mixins/GuildChannelMixin.js';\n\nexport interface CategoryChannel<Omitted extends keyof APIGuildCategoryChannel | '' = ''>\n\textends MixinTypes<\n\t\tChannel<ChannelType.GuildCategory>,\n\t\t[ChannelPermissionMixin<ChannelType.GuildCategory>, GuildChannelMixin<ChannelType.GuildCategory>]\n\t> {}\n\n/**\n * Sample Implementation of a structure for category channels, usable by direct end consumers.\n */\nexport class CategoryChannel<Omitted extends keyof APIGuildCategoryChannel | '' = ''> extends Channel<\n\tChannelType.GuildCategory,\n\tOmitted\n> {\n\tpublic constructor(data: Partialize<APIGuildCategoryChannel, Omitted>) {\n\t\tsuper(data);\n\t\tthis.optimizeData(data);\n\t}\n}\n\nMixin(CategoryChannel, [ChannelPermissionMixin, GuildChannelMixin]);\n","import type { APIDMChannel, ChannelType } from 'discord-api-types/v10';\nimport { Mixin } from '../Mixin.js';\nimport type { MixinTypes } from '../MixinTypes.d.ts';\nimport type { Partialize } from '../utils/types.js';\nimport { Channel } from './Channel.js';\nimport { ChannelPinMixin } from './mixins/ChannelPinMixin.js';\nimport { DMChannelMixin } from './mixins/DMChannelMixin.js';\nimport { TextChannelMixin } from './mixins/TextChannelMixin.js';\n\nexport interface DMChannel<Omitted extends keyof APIDMChannel | '' = ''>\n\textends MixinTypes<\n\t\tChannel<ChannelType.DM>,\n\t\t[DMChannelMixin<ChannelType.DM>, TextChannelMixin<ChannelType.DM>, ChannelPinMixin<ChannelType.DM>]\n\t> {}\n\n/**\n * Sample Implementation of a structure for dm channels, usable by direct end consumers.\n */\nexport class DMChannel<Omitted extends keyof APIDMChannel | '' = ''> extends Channel<ChannelType.DM, Omitted> {\n\tpublic constructor(data: Partialize<APIDMChannel, Omitted>) {\n\t\tsuper(data);\n\t\tthis.optimizeData(data);\n\t}\n}\n\nMixin(DMChannel, [DMChannelMixin, TextChannelMixin, ChannelPinMixin]);\n","import type { APIGuildForumChannel, ChannelType } from 'discord-api-types/v10';\nimport { Mixin } from '../Mixin.js';\nimport type { MixinTypes } from '../MixinTypes.d.ts';\nimport { kData } from '../utils/symbols.js';\nimport type { Partialize } from '../utils/types.js';\nimport { Channel } from './Channel.js';\nimport { ChannelParentMixin } from './mixins/ChannelParentMixin.js';\nimport { ChannelPermissionMixin } from './mixins/ChannelPermissionMixin.js';\nimport { ChannelTopicMixin } from './mixins/ChannelTopicMixin.js';\nimport { ThreadOnlyChannelMixin } from './mixins/ThreadOnlyChannelMixin.js';\n\nexport interface ForumChannel<Omitted extends keyof APIGuildForumChannel | '' = ''>\n\textends MixinTypes<\n\t\tChannel<ChannelType.GuildForum>,\n\t\t[\n\t\t\tChannelParentMixin<ChannelType.GuildForum>,\n\t\t\tChannelPermissionMixin<ChannelType.GuildForum>,\n\t\t\tChannelTopicMixin<ChannelType.GuildForum>,\n\t\t\tThreadOnlyChannelMixin<ChannelType.GuildForum>,\n\t\t]\n\t> {}\n\n/**\n * Sample Implementation of a structure for forum channels, usable by direct end consumers.\n */\nexport class ForumChannel<Omitted extends keyof APIGuildForumChannel | '' = ''> extends Channel<\n\tChannelType.GuildForum,\n\tOmitted\n> {\n\tpublic constructor(data: Partialize<APIGuildForumChannel, Omitted>) {\n\t\tsuper(data);\n\t\tthis.optimizeData(data);\n\t}\n\n\t/**\n\t * The default forum layout view used to display posts in this channel.\n\t * Defaults to 0, which indicates a layout view has not been set by a channel admin.\n\t */\n\tpublic get defaultForumLayout() {\n\t\treturn this[kData].default_forum_layout;\n\t}\n}\n\nMixin(ForumChannel, [ChannelParentMixin, ChannelPermissionMixin, ChannelTopicMixin, ThreadOnlyChannelMixin]);\n","import type { APIGroupDMChannel, ChannelType } from 'discord-api-types/v10';\nimport { Mixin } from '../Mixin.js';\nimport type { MixinTypes } from '../MixinTypes.d.ts';\nimport type { Partialize } from '../utils/types.js';\nimport { Channel } from './Channel.js';\nimport { ChannelOwnerMixin } from './mixins/ChannelOwnerMixin.js';\nimport { DMChannelMixin } from './mixins/DMChannelMixin.js';\nimport { GroupDMMixin } from './mixins/GroupDMMixin.js';\nimport { TextChannelMixin } from './mixins/TextChannelMixin.js';\n\nexport interface GroupDMChannel<Omitted extends keyof APIGroupDMChannel | '' = ''>\n\textends MixinTypes<\n\t\tChannel<ChannelType.GroupDM>,\n\t\t[\n\t\t\tDMChannelMixin<ChannelType.GroupDM>,\n\t\t\tTextChannelMixin<ChannelType.GroupDM>,\n\t\t\tChannelOwnerMixin<ChannelType.GroupDM>,\n\t\t\tGroupDMMixin,\n\t\t]\n\t> {}\n\n/**\n * Sample Implementation of a structure for group dm channels, usable by direct end consumers.\n */\nexport class GroupDMChannel<Omitted extends keyof APIGroupDMChannel | '' = ''> extends Channel<\n\tChannelType.GroupDM,\n\tOmitted\n> {\n\tpublic constructor(data: Partialize<APIGroupDMChannel, Omitted>) {\n\t\tsuper(data);\n\t\tthis.optimizeData(data);\n\t}\n}\n\nMixin(GroupDMChannel, [DMChannelMixin, TextChannelMixin, ChannelOwnerMixin, GroupDMMixin]);\n","import type { APIGuildMediaChannel, ChannelType } from 'discord-api-types/v10';\nimport { Mixin } from '../Mixin.js';\nimport type { MixinTypes } from '../MixinTypes.d.ts';\nimport type { Partialize } from '../utils/types.js';\nimport { Channel } from './Channel.js';\nimport { ChannelParentMixin } from './mixins/ChannelParentMixin.js';\nimport { ChannelPermissionMixin } from './mixins/ChannelPermissionMixin.js';\nimport { ChannelTopicMixin } from './mixins/ChannelTopicMixin.js';\nimport { ThreadOnlyChannelMixin } from './mixins/ThreadOnlyChannelMixin.js';\n\nexport interface MediaChannel<Omitted extends keyof APIGuildMediaChannel | '' = ''>\n\textends MixinTypes<\n\t\tChannel<ChannelType.GuildMedia>,\n\t\t[\n\t\t\tChannelParentMixin<ChannelType.GuildMedia>,\n\t\t\tChannelPermissionMixin<ChannelType.GuildMedia>,\n\t\t\tChannelTopicMixin<ChannelType.GuildMedia>,\n\t\t\tThreadOnlyChannelMixin<ChannelType.GuildMedia>,\n\t\t]\n\t> {}\n\n/**\n * Sample Implementation of a structure for media channels, usable by direct end consumers.\n */\nexport class MediaChannel<Omitted extends keyof APIGuildMediaChannel | '' = ''> extends Channel<\n\tChannelType.GuildMedia,\n\tOmitted\n> {\n\tpublic constructor(data: Partialize<APIGuildMediaChannel, Omitted>) {\n\t\tsuper(data);\n\t\tthis.optimizeData(data);\n\t}\n}\n\nMixin(MediaChannel, [ChannelParentMixin, ChannelPermissionMixin, ChannelTopicMixin, ThreadOnlyChannelMixin]);\n","import type { APIPrivateThreadChannel, ChannelType } from 'discord-api-types/v10';\nimport { Mixin } from '../Mixin.js';\nimport type { MixinTypes } from '../MixinTypes.d.ts';\nimport type { Partialize } from '../utils/types.js';\nimport { Channel } from './Channel.js';\nimport { ChannelOwnerMixin } from './mixins/ChannelOwnerMixin.js';\nimport { ChannelParentMixin } from './mixins/ChannelParentMixin.js';\nimport { ChannelPinMixin } from './mixins/ChannelPinMixin.js';\nimport { ChannelSlowmodeMixin } from './mixins/ChannelSlowmodeMixin.js';\nimport { TextChannelMixin } from './mixins/TextChannelMixin.js';\nimport { ThreadChannelMixin } from './mixins/ThreadChannelMixin.js';\n\nexport interface PrivateThreadChannel<Omitted extends keyof APIPrivateThreadChannel | '' = ''>\n\textends MixinTypes<\n\t\tChannel<ChannelType.PrivateThread>,\n\t\t[\n\t\t\tTextChannelMixin<ChannelType.PrivateThread>,\n\t\t\tChannelOwnerMixin<ChannelType.PrivateThread>,\n\t\t\tChannelParentMixin<ChannelType.PrivateThread>,\n\t\t\tChannelPinMixin<ChannelType.PrivateThread>,\n\t\t\tChannelSlowmodeMixin<ChannelType.PrivateThread>,\n\t\t\tThreadChannelMixin<ChannelType.PrivateThread>,\n\t\t]\n\t> {}\n\n/**\n * Sample Implementation of a structure for private thread channels, usable by direct end consumers.\n */\nexport class PrivateThreadChannel<Omitted extends keyof APIPrivateThreadChannel | '' = ''> extends Channel<\n\tChannelType.PrivateThread,\n\tOmitted\n> {\n\tpublic constructor(data: Partialize<APIPrivateThreadChannel, Omitted>) {\n\t\tsuper(data);\n\t\tthis.optimizeData(data);\n\t}\n}\n\nMixin(PrivateThreadChannel, [\n\tTextChannelMixin,\n\tChannelOwnerMixin,\n\tChannelParentMixin,\n\tChannelPinMixin,\n\tChannelSlowmodeMixin,\n\tThreadChannelMixin,\n]);\n","import type { APIPublicThreadChannel, ChannelType } from 'discord-api-types/v10';\nimport { Mixin } from '../Mixin.js';\nimport type { MixinTypes } from '../MixinTypes.d.ts';\nimport type { Partialize } from '../utils/types.js';\nimport { Channel } from './Channel.js';\nimport { AppliedTagsMixin } from './mixins/AppliedTagsMixin.js';\nimport { ChannelOwnerMixin } from './mixins/ChannelOwnerMixin.js';\nimport { ChannelParentMixin } from './mixins/ChannelParentMixin.js';\nimport { ChannelPinMixin } from './mixins/ChannelPinMixin.js';\nimport { ChannelSlowmodeMixin } from './mixins/ChannelSlowmodeMixin.js';\nimport { TextChannelMixin } from './mixins/TextChannelMixin.js';\nimport { ThreadChannelMixin } from './mixins/ThreadChannelMixin.js';\n\nexport interface PublicThreadChannel<Omitted extends keyof APIPublicThreadChannel | '' = ''>\n\textends MixinTypes<\n\t\tChannel<ChannelType.PublicThread>,\n\t\t[\n\t\t\tTextChannelMixin<ChannelType.PublicThread>,\n\t\t\tChannelOwnerMixin<ChannelType.PublicThread>,\n\t\t\tChannelParentMixin<ChannelType.PublicThread>,\n\t\t\tChannelPinMixin<ChannelType.PublicThread>,\n\t\t\tChannelSlowmodeMixin<ChannelType.PublicThread>,\n\t\t\tThreadChannelMixin<ChannelType.PublicThread>,\n\t\t\tAppliedTagsMixin,\n\t\t]\n\t> {}\n\n/**\n * Sample Implementation of a structure for public thread channels, usable by direct end consumers.\n */\nexport class PublicThreadChannel<Omitted extends keyof APIPublicThreadChannel | '' = ''> extends Channel<\n\tChannelType.PublicThread,\n\tOmitted\n> {\n\tpublic constructor(data: Partialize<APIPublicThreadChannel, Omitted>) {\n\t\tsuper(data);\n\t\tthis.optimizeData(data);\n\t}\n}\n\nMixin(PublicThreadChannel, [\n\tTextChannelMixin,\n\tChannelOwnerMixin,\n\tChannelParentMixin,\n\tChannelPinMixin,\n\tChannelSlowmodeMixin,\n\tThreadChannelMixin,\n\tAppliedTagsMixin,\n]);\n","import type { APIGuildStageVoiceChannel, ChannelType } from 'discord-api-types/v10';\nimport { Mixin } from '../Mixin.js';\nimport type { MixinTypes } from '../MixinTypes.d.ts';\nimport type { Partialize } from '../utils/types.js';\nimport { Channel } from './Channel.js';\nimport { ChannelParentMixin } from './mixins/ChannelParentMixin.js';\nimport { ChannelPermissionMixin } from './mixins/ChannelPermissionMixin.js';\nimport { ChannelSlowmodeMixin } from './mixins/ChannelSlowmodeMixin.js';\nimport { ChannelWebhookMixin } from './mixins/ChannelWebhookMixin.js';\nimport { VoiceChannelMixin } from './mixins/VoiceChannelMixin.js';\n\nexport interface StageChannel<Omitted extends keyof APIGuildStageVoiceChannel | '' = ''>\n\textends MixinTypes<\n\t\tChannel<ChannelType.GuildStageVoice>,\n\t\t[\n\t\t\tChannelParentMixin<ChannelType.GuildStageVoice>,\n\t\t\tChannelPermissionMixin<ChannelType.GuildStageVoice>,\n\t\t\tChannelSlowmodeMixin<ChannelType.GuildStageVoice>,\n\t\t\tChannelWebhookMixin<ChannelType.GuildStageVoice>,\n\t\t\tVoiceChannelMixin<ChannelType.GuildStageVoice>,\n\t\t]\n\t> {}\n\nexport class StageChannel<Omitted extends keyof APIGuildStageVoiceChannel | '' = ''> extends Channel<\n\tChannelType.GuildStageVoice,\n\tOmitted\n> {\n\tpublic constructor(data: Partialize<APIGuildStageVoiceChannel, Omitted>) {\n\t\tsuper(data);\n\t\tthis.optimizeData(data);\n\t}\n}\n\nMixin(StageChannel, [\n\tChannelParentMixin,\n\tChannelPermissionMixin,\n\tChannelSlowmodeMixin,\n\tChannelWebhookMixin,\n\tVoiceChannelMixin,\n]);\n","import type { APITextChannel, ChannelType } from 'discord-api-types/v10';\nimport { Mixin } from '../Mixin.js';\nimport type { MixinTypes } from '../MixinTypes.d.ts';\nimport type { Partialize } from '../utils/types.js';\nimport { Channel } from './Channel.js';\nimport { ChannelParentMixin } from './mixins/ChannelParentMixin.js';\nimport { ChannelPermissionMixin } from './mixins/ChannelPermissionMixin.js';\nimport { ChannelPinMixin } from './mixins/ChannelPinMixin.js';\nimport { ChannelSlowmodeMixin } from './mixins/ChannelSlowmodeMixin.js';\nimport { ChannelTopicMixin } from './mixins/ChannelTopicMixin.js';\nimport { TextChannelMixin } from './mixins/TextChannelMixin.js';\n\nexport interface TextChannel<Omitted extends keyof APITextChannel | '' = ''>\n\textends MixinTypes<\n\t\tChannel<ChannelType.GuildText>,\n\t\t[\n\t\t\tTextChannelMixin<ChannelType.GuildText>,\n\t\t\tChannelParentMixin<ChannelType.GuildText>,\n\t\t\tChannelPermissionMixin<ChannelType.GuildText>,\n\t\t\tChannelPinMixin<ChannelType.GuildText>,\n\t\t\tChannelSlowmodeMixin<ChannelType.GuildText>,\n\t\t\tChannelTopicMixin<ChannelType.GuildText>,\n\t\t]\n\t> {}\n\nexport class TextChannel<Omitted extends keyof APITextChannel | '' = ''> extends Channel<\n\tChannelType.GuildText,\n\tOmitted\n> {\n\tpublic constructor(data: Partialize<APITextChannel, Omitted>) {\n\t\tsuper(data);\n\t\tthis.optimizeData(data);\n\t}\n}\n\nMixin(TextChannel, [\n\tTextChannelMixin,\n\tChannelParentMixin,\n\tChannelPermissionMixin,\n\tChannelPinMixin,\n\tChannelSlowmodeMixin,\n\tChannelTopicMixin,\n]);\n","import type { APIGuildVoiceChannel, ChannelType } from 'discord-api-types/v10';\nimport { Mixin } from '../Mixin.js';\nimport type { MixinTypes } from '../MixinTypes.d.ts';\nimport type { Partialize } from '../utils/types.js';\nimport { Channel } from './Channel.js';\nimport { ChannelParentMixin } from './mixins/ChannelParentMixin.js';\nimport { ChannelPermissionMixin } from './mixins/ChannelPermissionMixin.js';\nimport { ChannelSlowmodeMixin } from './mixins/ChannelSlowmodeMixin.js';\nimport { ChannelWebhookMixin } from './mixins/ChannelWebhookMixin.js';\nimport { VoiceChannelMixin } from './mixins/VoiceChannelMixin.js';\n\nexport interface VoiceChannel<Omitted extends keyof APIGuildVoiceChannel | '' = ''>\n\textends MixinTypes<\n\t\tChannel<ChannelType.GuildVoice>,\n\t\t[\n\t\t\tChannelParentMixin<ChannelType.GuildVoice>,\n\t\t\tChannelPermissionMixin<ChannelType.GuildVoice>,\n\t\t\tChannelSlowmodeMixin<ChannelType.GuildVoice>,\n\t\t\tChannelWebhookMixin<ChannelType.GuildVoice>,\n\t\t\tVoiceChannelMixin<ChannelType.GuildVoice>,\n\t\t]\n\t> {}\n\nexport class VoiceChannel<Omitted extends keyof APIGuildVoiceChannel | '' = ''> extends Channel<\n\tChannelType.GuildVoice,\n\tOmitted\n> {\n\tpublic constructor(data: Partialize<APIGuildVoiceChannel, Omitted>) {\n\t\tsuper(data);\n\t\tthis.optimizeData(data);\n\t}\n}\n\nMixin(VoiceChannel, [\n\tChannelParentMixin,\n\tChannelPermissionMixin,\n\tChannelSlowmodeMixin,\n\tChannelWebhookMixin,\n\tVoiceChannelMixin,\n]);\n","import { type APIInvite, type APIExtendedInvite, RouteBases } from 'discord-api-types/v10';\nimport { Structure } from '../Structure.js';\nimport { kData, kExpiresTimestamp, kCreatedTimestamp, kPatch } from '../utils/symbols.js';\nimport type { Partialize } from '../utils/types.js';\n\nexport interface APIActualInvite extends APIInvite, Partial<Omit<APIExtendedInvite, keyof APIInvite>> {}\n\n/**\n * Represents an invitation to a Discord channel\n *\n * @typeParam Omitted - Specify the properties that will not be stored in the raw data field as a union, implement via `DataTemplate`\n */\nexport class Invite<Omitted extends keyof APIActualInvite | '' = 'created_at' | 'expires_at'> extends Structure<\n\tAPIActualInvite,\n\tOmitted\n> {\n\t/**\n\t * The template used for removing data from the raw data stored for each Invite\n\t *\n\t * @remarks This template has defaults, if you want to remove additional data and keep the defaults,\n\t * use `Object.defineProperties`. To override the defaults, set this value directly.\n\t */\n\tpublic static override readonly DataTemplate: Partial<APIActualInvite> = {\n\t\tset created_at(_: string) {},\n\t\tset expires_at(_: string) {},\n\t};\n\n\t/**\n\t * Optimized storage of {@link discord-api-types/v10#(APIActualInvite:interface).expires_at}\n\t *\n\t * @internal\n\t */\n\tprotected [kExpiresTimestamp]: number | null = null;\n\n\t/**\n\t * Optimized storage of {@link discord-api-types/v10#(APIActualInvite:interface).created_at}\n\t *\n\t * @internal\n\t */\n\tprotected [kCreatedTimestamp]: number | null = null;\n\n\t/**\n\t * @param data - The raw data received from the API for the invite\n\t */\n\tpublic constructor(data: Partialize<APIActualInvite, Omitted>) {\n\t\tsuper(data);\n\t\tthis.optimizeData(data);\n\t}\n\n\t/**\n\t * {@inheritDoc Structure.[kPatch]}\n\t *\n\t * @internal\n\t */\n\tpublic override [kPatch](data: Partial<APIActualInvite>) {\n\t\tsuper[kPatch](data);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc Structure.optimizeData}\n\t *\n\t * @internal\n\t */\n\tprotected override optimizeData(data: Partial<APIActualInvite>) {\n\t\tif (data.expires_at) {\n\t\t\tthis[kExpiresTimestamp] = Date.parse(data.expires_at);\n\t\t}\n\n\t\tif (data.created_at) {\n\t\t\tthis[kCreatedTimestamp] = Date.parse(data.created_at);\n\t\t}\n\t}\n\n\t/**\n\t * The code for this invite\n\t */\n\tpublic get code() {\n\t\treturn this[kData].code;\n\t}\n\n\t/**\n\t * The target type (for voice channel invites)\n\t */\n\tpublic get targetType() {\n\t\treturn this[kData].target_type;\n\t}\n\n\t/**\n\t * The type of this invite\n\t */\n\tpublic get type() {\n\t\treturn this[kData].type;\n\t}\n\n\t/**\n\t * The approximate number of online members of the guild this invite is for\n\t *\n\t * @remarks Only available when the invite was fetched from `GET /invites/<code>` with counts\n\t */\n\tpublic get approximatePresenceCount() {\n\t\treturn this[kData].approximate_presence_count;\n\t}\n\n\t/**\n\t * The approximate total number of members of the guild this invite is for\n\t *\n\t * @remarks Only available when the invite was fetched from `GET /invites/<code>` with counts\n\t */\n\tpublic get approximateMemberCount() {\n\t\treturn this[kData].approximate_member_count;\n\t}\n\n\t/**\n\t * The timestamp this invite will expire at\n\t */\n\tpublic get expiresTimestamp() {\n\t\tif (this[kExpiresTimestamp]) {\n\t\t\treturn this[kExpiresTimestamp];\n\t\t}\n\n\t\tconst createdTimestamp = this.createdTimestamp;\n\t\tconst maxAge = this.maxAge;\n\t\tif (createdTimestamp && maxAge) {\n\t\t\tthis[kExpiresTimestamp] = createdTimestamp + (maxAge as number) * 1_000;\n\t\t}\n\n\t\treturn this[kExpiresTimestamp];\n\t}\n\n\t/**\n\t * The time the invite will expire at\n\t */\n\tpublic get expiresAt() {\n\t\tconst expiresTimestamp = this.expiresTimestamp;\n\t\treturn expiresTimestamp ? new Date(expiresTimestamp) : null;\n\t}\n\n\t/**\n\t * The number of times this invite has been used\n\t */\n\tpublic get uses() {\n\t\treturn this[kData].uses;\n\t}\n\n\t/**\n\t * The maximum number of times this invite can be used\n\t */\n\tpublic get maxUses() {\n\t\treturn this[kData].max_uses;\n\t}\n\n\t/**\n\t * The maximum age of the invite, in seconds, 0 for non-expiring\n\t */\n\tpublic get maxAge() {\n\t\treturn this[kData].max_age;\n\t}\n\n\t/**\n\t * Whether this invite only grants temporary membership\n\t */\n\tpublic get temporary() {\n\t\treturn this[kData].temporary;\n\t}\n\n\t/**\n\t * The timestamp this invite was created at\n\t */\n\tpublic get createdTimestamp() {\n\t\treturn this[kCreatedTimestamp];\n\t}\n\n\t/**\n\t * The time the invite was created at\n\t */\n\tpublic get createdAt() {\n\t\tconst createdTimestamp = this.createdTimestamp;\n\t\treturn createdTimestamp ? new Date(createdTimestamp) : null;\n\t}\n\n\t/**\n\t * The URL to the invite\n\t */\n\tpublic get url() {\n\t\treturn this.code ? `${RouteBases.invite}/${this.code}` : null;\n\t}\n\n\t/**\n\t * When concatenated with a string, this automatically concatenates the invite's URL instead of the object.\n\t *\n\t * @returns The URL to the invite or an empty string if it doesn't have a code\n\t */\n\tpublic override toString() {\n\t\treturn this.url ?? '';\n\t}\n\n\t/**\n\t * {@inheritDoc Structure.toJSON}\n\t */\n\tpublic override toJSON() {\n\t\tconst clone = super.toJSON();\n\t\tif (this[kExpiresTimestamp]) {\n\t\t\tclone.expires_at = new Date(this[kExpiresTimestamp]).toISOString();\n\t\t}\n\n\t\tif (this[kCreatedTimestamp]) {\n\t\t\tclone.created_at = new Date(this[kCreatedTimestamp]).toISOString();\n\t\t}\n\n\t\treturn clone;\n\t}\n\n\t/**\n\t * Returns the primitive value of the specified object.\n\t */\n\tpublic override valueOf() {\n\t\treturn this.code ?? super.valueOf();\n\t}\n}\n","import type { APIAvatarDecorationData } from 'discord-api-types/v10';\nimport { Structure } from '../Structure.js';\nimport { kData } from '../utils/symbols.js';\nimport type { Partialize } from '../utils/types.js';\n\n/**\n * Represents metadata of an avatar decoration of a User.\n *\n * @typeParam Omitted - Specify the properties that will not be stored in the raw data field as a union, implement via `DataTemplate`\n */\nexport class AvatarDecorationData<Omitted extends keyof APIAvatarDecorationData | '' = ''> extends Structure<\n\tAPIAvatarDecorationData,\n\tOmitted\n> {\n\t/**\n\t * The template used for removing data from the raw data stored for each Connection\n\t */\n\tpublic static override readonly DataTemplate: Partial<APIAvatarDecorationData> = {};\n\n\t/**\n\t * @param data - The raw data received from the API for the connection\n\t */\n\tpublic constructor(data: Partialize<APIAvatarDecorationData, Omitted>) {\n\t\tsuper(data);\n\t}\n\n\t/**\n\t * The id of the SKU this avatar decoration is part of.\n\t */\n\tpublic get skuId() {\n\t\treturn this[kData].sku_id;\n\t}\n\n\t/**\n\t * The asset of this avatar decoration.\n\t */\n\tpublic get asset() {\n\t\treturn this[kData].asset;\n\t}\n}\n","import { DiscordSnowflake } from '@sapphire/snowflake';\nimport type { APIUser } from 'discord-api-types/v10';\nimport { Structure } from '../Structure.js';\nimport { kData, kPatch } from '../utils/symbols.js';\nimport { isIdSet } from '../utils/type-guards.js';\nimport type { Partialize } from '../utils/types.js';\n\n/**\n * Represents any user on Discord.\n *\n * @typeParam Omitted - Specify the properties that will not be stored in the raw data field as a union, implement via `DataTemplate`\n * @remarks has a substructure `AvatarDecorationData`, which needs to be instantiated and stored by an extending class using it\n */\nexport class User<Omitted extends keyof APIUser | '' = ''> extends Structure<APIUser, Omitted> {\n\t/**\n\t * The template used for removing data from the raw data stored for each User\n\t */\n\tpublic static override readonly DataTemplate: Partial<APIUser> = {};\n\n\t/**\n\t * @param data - The raw data received from the API for the user\n\t */\n\tpublic constructor(data: Partialize<APIUser, Omitted>) {\n\t\tsuper(data);\n\t}\n\n\t/**\n\t * {@inheritDoc Structure.[kPatch]}\n\t *\n\t * @internal\n\t */\n\tpublic override [kPatch](data: Partial<APIUser>) {\n\t\treturn super[kPatch](data);\n\t}\n\n\t/**\n\t * The user's id\n\t */\n\tpublic get id() {\n\t\treturn this[kData].id;\n\t}\n\n\t/**\n\t * The username of the user\n\t */\n\tpublic get username() {\n\t\treturn this[kData].username;\n\t}\n\n\t/**\n\t * The user's 4 digit tag, if a bot\n\t */\n\tpublic get discriminator() {\n\t\treturn this[kData].discriminator;\n\t}\n\n\t/**\n\t * The user's display name, the application name for bots\n\t */\n\tpublic get globalName() {\n\t\treturn this[kData].global_name;\n\t}\n\n\t/**\n\t * The name displayed in the client for this user when no nickname is set\n\t */\n\tpublic get displayName() {\n\t\treturn this.globalName ?? this.username;\n\t}\n\n\t/**\n\t * The user avatar's hash\n\t */\n\tpublic get avatar() {\n\t\treturn this[kData].avatar;\n\t}\n\n\t/**\n\t * Whether the user is a bot\n\t */\n\tpublic get bot() {\n\t\treturn this[kData].bot ?? false;\n\t}\n\n\t/**\n\t * Whether the user is an Official Discord System user\n\t */\n\tpublic get system() {\n\t\treturn this[kData].system ?? false;\n\t}\n\n\t/**\n\t * Whether the user has mfa enabled\n\t *\n\t * @remarks This property is only set when the user was fetched with an OAuth2 token and the `identify` scope\n\t */\n\tpublic get mfaEnabled() {\n\t\treturn this[kData].mfa_enabled;\n\t}\n\n\t/**\n\t * The user's banner hash\n\t *\n\t * @remarks This property is only set when the user was manually fetched\n\t */\n\tpublic get banner() {\n\t\treturn this[kData].banner;\n\t}\n\n\t/**\n\t * The base 10 accent color of the user's banner\n\t *\n\t * @remarks This property is only set when the user was manually fetched\n\t */\n\tpublic get accentColor() {\n\t\treturn this[kData].accent_color;\n\t}\n\n\t/**\n\t * The user's primary Discord language\n\t *\n\t * @remarks This property is only set when the user was fetched with an Oauth2 token and the `identify` scope\n\t */\n\tpublic get locale() {\n\t\treturn this[kData].locale;\n\t}\n\n\t/**\n\t * Whether the email on the user's account has been verified\n\t *\n\t * @remarks This property is only set when the user was fetched with an OAuth2 token and the `email` scope\n\t */\n\tpublic get verified() {\n\t\treturn this[kData].verified;\n\t}\n\n\t/**\n\t * The user's email\n\t *\n\t * @remarks This property is only set when the user was fetched with an OAuth2 token and the `email` scope\n\t */\n\tpublic get email() {\n\t\treturn this[kData].email;\n\t}\n\n\t/**\n\t * The type of nitro subscription on the user's account\n\t *\n\t * @remarks This property is only set when the user was fetched with an OAuth2 token and the `identify` scope\n\t */\n\tpublic get premiumType() {\n\t\treturn this[kData].premium_type;\n\t}\n\n\t/**\n\t * The timestamp the user was created at\n\t */\n\tpublic get createdTimestamp() {\n\t\treturn isIdSet(this.id) ? DiscordSnowflake.timestampFrom(this.id) : null;\n\t}\n\n\t/**\n\t * The time the user was created at\n\t */\n\tpublic get createdAt() {\n\t\tconst createdTimestamp = this.createdTimestamp;\n\t\treturn createdTimestamp ? new Date(createdTimestamp) : null;\n\t}\n\n\t/**\n\t * The hexadecimal version of the user accent color, with a leading hash\n\t *\n\t * @remarks This property is only set when the user was manually fetched\n\t */\n\tpublic get hexAccentColor() {\n\t\tconst accentColor = this.accentColor;\n\t\tif (typeof accentColor !== 'number') return accentColor;\n\t\treturn `#${accentColor.toString(16).padStart(6, '0')}`;\n\t}\n}\n","import type { APIConnection } from 'discord-api-types/v10';\nimport { Structure } from '../Structure.js';\nimport { kData, kPatch } from '../utils/symbols.js';\nimport type { Partialize } from '../utils/types.js';\n\n/**\n * Represents a user's connection on Discord.\n *\n * @typeParam Omitted - Specify the properties that will not be stored in the raw data field as a union, implement via `DataTemplate`\n */\nexport class Connection<Omitted extends keyof APIConnection | '' = ''> extends Structure<APIConnection, Omitted> {\n\t/**\n\t * The template used for removing data from the raw data stored for each Connection\n\t */\n\tpublic static override readonly DataTemplate: Partial<APIConnection> = {};\n\n\t/**\n\t * @param data - The raw data received from the API for the connection\n\t */\n\tpublic constructor(data: Partialize<APIConnection, Omitted>) {\n\t\tsuper(data);\n\t}\n\n\t/**\n\t * {@inheritDoc Structure.[kPatch]}\n\t *\n\t * @internal\n\t */\n\tpublic override [kPatch](data: Partial<APIConnection>) {\n\t\treturn super[kPatch](data);\n\t}\n\n\t/**\n\t * The id of the connection account\n\t */\n\tpublic get id() {\n\t\treturn this[kData].id;\n\t}\n\n\t/**\n\t * The username of the connection account\n\t */\n\tpublic get name() {\n\t\treturn this[kData].name;\n\t}\n\n\t/**\n\t * The type of service this connection is for\n\t */\n\tpublic get type() {\n\t\treturn this[kData].type;\n\t}\n\n\t/**\n\t * Whether the connection is revoked\n\t */\n\tpublic get revoked() {\n\t\treturn this[kData].revoked ?? false;\n\t}\n\n\t/**\n\t * Whether the connection is verified\n\t */\n\tpublic get verified() {\n\t\treturn this[kData].verified;\n\t}\n\n\t/**\n\t * Whether friend sync is enabled for this connection\n\t */\n\tpublic get friendSync() {\n\t\treturn this[kData].friend_sync;\n\t}\n\n\t/**\n\t * Whether activities related to this connection are shown in the users presence\n\t */\n\tpublic get showActivity() {\n\t\treturn this[kData].show_activity;\n\t}\n\n\t/**\n\t * Whether this connection has an Oauth2 token for console voice transfer\n\t */\n\tpublic get twoWayLink() {\n\t\treturn this[kData].two_way_link;\n\t}\n\n\t/**\n\t * The visibility state for this connection\n\t */\n\tpublic get visibility() {\n\t\treturn this[kData].visibility;\n\t}\n}\n","export function extendTemplate<SuperTemplate extends Record<string, unknown>>(\n\tsuperTemplate: SuperTemplate,\n\tadditions: Record<string, unknown>,\n): Record<string, unknown> & SuperTemplate {\n\treturn Object.defineProperties(additions, Object.getOwnPropertyDescriptors(superTemplate)) as Record<\n\t\tstring,\n\t\tunknown\n\t> &\n\t\tSuperTemplate;\n}\n"],"mappings":"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","names":["channelLink","channelLink","DiscordSnowflake","DiscordSnowflake"]}
package/package.json ADDED
@@ -0,0 +1,97 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/package.json",
3
+ "name": "@discordjs/structures",
4
+ "version": "0.2.0-dev.1752365789-3cff4d741",
5
+ "description": "Wrapper around Discord's structures",
6
+ "exports": {
7
+ ".": {
8
+ "require": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ },
12
+ "import": {
13
+ "types": "./dist/index.d.mts",
14
+ "default": "./dist/index.mjs"
15
+ }
16
+ }
17
+ },
18
+ "main": "./dist/index.js",
19
+ "module": "./dist/index.mjs",
20
+ "types": "./dist/index.d.ts",
21
+ "directories": {
22
+ "lib": "src",
23
+ "test": "__tests__"
24
+ },
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "contributors": [
29
+ "Crawl <icrawltogo@gmail.com>",
30
+ "SpaceEEC <spaceeec@yahoo.com>",
31
+ "Vlad Frangu <me@vladfrangu.dev>",
32
+ "Aura Román <kyradiscord@gmail.com>",
33
+ "Chai Kohen <chaikohen@gmail.com>"
34
+ ],
35
+ "license": "Apache-2.0",
36
+ "keywords": [
37
+ "discord",
38
+ "api",
39
+ "discordapp",
40
+ "discordjs"
41
+ ],
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "https://github.com/discordjs/discord.js.git",
45
+ "directory": "packages/structures"
46
+ },
47
+ "bugs": {
48
+ "url": "https://github.com/discordjs/discord.js/issues"
49
+ },
50
+ "homepage": "https://discord.js.org",
51
+ "dependencies": {
52
+ "@sapphire/snowflake": "^3.5.5",
53
+ "discord-api-types": "^0.38.15",
54
+ "@discordjs/formatters": "^0.6.1"
55
+ },
56
+ "devDependencies": {
57
+ "@favware/cliff-jumper": "^4.1.0",
58
+ "@types/node": "^22.15.2",
59
+ "@vitest/coverage-v8": "^3.1.1",
60
+ "cpy-cli": "^5.0.0",
61
+ "cross-env": "^7.0.3",
62
+ "esbuild-plugin-version-injector": "^1.2.1",
63
+ "eslint": "^9.25.1",
64
+ "eslint-config-neon": "^0.2.7",
65
+ "eslint-formatter-compact": "^8.40.0",
66
+ "eslint-formatter-pretty": "^6.0.1",
67
+ "prettier": "^3.5.3",
68
+ "tsd": "^0.31.2",
69
+ "tsup": "^8.4.0",
70
+ "turbo": "^2.5.2",
71
+ "typescript": "~5.8.3",
72
+ "vitest": "^3.1.1",
73
+ "@discordjs/scripts": "^0.1.0",
74
+ "@discordjs/api-extractor": "^7.52.7"
75
+ },
76
+ "engines": {
77
+ "node": ">=22.12.0"
78
+ },
79
+ "publishConfig": {
80
+ "access": "public",
81
+ "provenance": true
82
+ },
83
+ "tsd": {
84
+ "directory": "__tests__/types"
85
+ },
86
+ "scripts": {
87
+ "build": "tsc --noEmit && tsup",
88
+ "build:docs": "tsc -p tsconfig.docs.json && cpy \"./src/*.d.ts\" \"./dist-docs\"",
89
+ "test": "vitest run --config ../../vitest.config.ts",
90
+ "lint": "prettier --check . && cross-env TIMING=1 eslint --format=pretty src",
91
+ "format": "prettier --write . && cross-env TIMING=1 eslint --fix --format=pretty src",
92
+ "fmt": "pnpm run format",
93
+ "docs": "pnpm run build:docs && api-extractor run --local --minify && generate-split-documentation",
94
+ "changelog": "git cliff --prepend ./CHANGELOG.md -u -c ./cliff.toml -r ../../ --include-path 'packages/structures/*'",
95
+ "release": "cliff-jumper"
96
+ }
97
+ }