diff --git a/packages/structures/src/automoderation/AutoModerationRule.ts b/packages/structures/src/automoderation/AutoModerationRule.ts index 336d5404a..952e11a0c 100644 --- a/packages/structures/src/automoderation/AutoModerationRule.ts +++ b/packages/structures/src/automoderation/AutoModerationRule.ts @@ -55,14 +55,18 @@ export class AutoModerationRule { +export class AttachmentFlagsBitField extends BitField { /** * Numeric attachment flags. */ diff --git a/packages/structures/src/bitfields/ChannelFlagsBitField.ts b/packages/structures/src/bitfields/ChannelFlagsBitField.ts index 309cf9615..49d7f896c 100644 --- a/packages/structures/src/bitfields/ChannelFlagsBitField.ts +++ b/packages/structures/src/bitfields/ChannelFlagsBitField.ts @@ -4,7 +4,7 @@ import { BitField } from './BitField.js'; /** * Data structure that makes it easy to interact with a {@link (Channel:class).flags} bitfield. */ -export class ChannelFlagsBitField extends BitField { +export class ChannelFlagsBitField extends BitField { /** * Numeric guild channel flags. */ diff --git a/packages/structures/src/bitfields/MessageFlagsBitField.ts b/packages/structures/src/bitfields/MessageFlagsBitField.ts index 233baf559..4f52e3a5d 100644 --- a/packages/structures/src/bitfields/MessageFlagsBitField.ts +++ b/packages/structures/src/bitfields/MessageFlagsBitField.ts @@ -4,7 +4,7 @@ import { BitField } from './BitField.js'; /** * Data structure that makes it easy to interact with a {@link Message#flags} bitfield. */ -export class MessageFlagsBitField extends BitField { +export class MessageFlagsBitField extends BitField { /** * Numeric message flags. */ diff --git a/packages/structures/src/bitfields/SKUFlagsBitField.ts b/packages/structures/src/bitfields/SKUFlagsBitField.ts new file mode 100644 index 000000000..121c99eb4 --- /dev/null +++ b/packages/structures/src/bitfields/SKUFlagsBitField.ts @@ -0,0 +1,16 @@ +import { SKUFlags } from 'discord-api-types/v10'; +import { BitField } from './BitField.js'; + +/** + * Data structure that makes it easy to interact with an {@link SKUFlags} bitfield. + */ +export class SKUFlagsBitField extends BitField { + /** + * Numeric SKU flags. + */ + public static override readonly Flags = SKUFlags; + + public override toJSON() { + return super.toJSON(true); + } +} diff --git a/packages/structures/src/bitfields/index.ts b/packages/structures/src/bitfields/index.ts index 9598b8090..694b4815b 100644 --- a/packages/structures/src/bitfields/index.ts +++ b/packages/structures/src/bitfields/index.ts @@ -4,3 +4,4 @@ export * from './AttachmentFlagsBitField.js'; export * from './ChannelFlagsBitField.js'; export * from './MessageFlagsBitField.js'; export * from './PermissionsBitField.js'; +export * from './SKUFlagsBitField.js'; diff --git a/packages/structures/src/index.ts b/packages/structures/src/index.ts index d21ff8bf0..f5bfbcecd 100644 --- a/packages/structures/src/index.ts +++ b/packages/structures/src/index.ts @@ -7,6 +7,7 @@ export * from './interactions/index.js'; export * from './invites/index.js'; export * from './messages/index.js'; export * from './polls/index.js'; +export * from './skus/index.js'; export * from './soundboards/index.js'; export * from './stageInstances/index.js'; export * from './stickers/index.js'; diff --git a/packages/structures/src/skus/SKU.ts b/packages/structures/src/skus/SKU.ts new file mode 100644 index 000000000..7d81847f0 --- /dev/null +++ b/packages/structures/src/skus/SKU.ts @@ -0,0 +1,69 @@ +import type { SKUFlags, APISKU } from 'discord-api-types/v10'; +import { Structure } from '../Structure.js'; +import { SKUFlagsBitField } from '../bitfields/SKUFlagsBitField.js'; +import { kData } from '../utils/symbols.js'; +import { isFieldSet } from '../utils/type-guards.js'; +import type { Partialize } from '../utils/types.js'; + +/** + * Represents any SKU (stock-keeping units) on Discord. + * + * @typeParam Omitted - Specify the properties that will not be stored in the raw data field as a union, implement via `DataTemplate` + */ +export class SKU extends Structure { + /** + * The template used for removing data from the raw data stored for each SKU + */ + public static override readonly DataTemplate: Partial = {}; + + /** + * @param data - The raw data received from the API for the SKU + */ + public constructor(data: Partialize) { + super(data); + } + + /** + * Id of the SKU + */ + public get id() { + return this[kData].id; + } + + /** + * Type of SKU + * + * @see {@link https://discord.com/developers/docs/resources/sku#sku-object-sku-types} + */ + public get type() { + return this[kData].type; + } + + /** + * Id of the parent application + */ + public get applicationId() { + return this[kData].application_id; + } + + /** + * Customer-facing name of your premium offering + */ + public get name() { + return this[kData].name; + } + + /** + * System-generated URL slug based on the SKU's name + */ + public get slug() { + return this[kData].slug; + } + + /** + * SKU flags combined as a bitfield + */ + public get flags() { + return isFieldSet(this[kData], 'flags', 'number') ? new SKUFlagsBitField(this[kData].flags as SKUFlags) : null; + } +} diff --git a/packages/structures/src/skus/index.ts b/packages/structures/src/skus/index.ts new file mode 100644 index 000000000..1f0232db5 --- /dev/null +++ b/packages/structures/src/skus/index.ts @@ -0,0 +1 @@ +export * from './SKU.js';