diff --git a/packages/discord.js/src/index.js b/packages/discord.js/src/index.js index 3c0dcd96319b..a7137270aa17 100644 --- a/packages/discord.js/src/index.js +++ b/packages/discord.js/src/index.js @@ -19,6 +19,7 @@ exports.DiscordjsErrorCodes = require('./errors/ErrorCodes'); // Utilities exports.ActivityFlagsBitField = require('./util/ActivityFlagsBitField'); exports.ApplicationFlagsBitField = require('./util/ApplicationFlagsBitField'); +exports.AttachmentFlagsBitField = require('./util/AttachmentFlagsBitField'); exports.BaseManager = require('./managers/BaseManager'); exports.BitField = require('./util/BitField'); exports.ChannelFlagsBitField = require('./util/ChannelFlagsBitField'); diff --git a/packages/discord.js/src/structures/Attachment.js b/packages/discord.js/src/structures/Attachment.js index 086d7a870731..2576ff59cdb1 100644 --- a/packages/discord.js/src/structures/Attachment.js +++ b/packages/discord.js/src/structures/Attachment.js @@ -1,5 +1,6 @@ 'use strict'; +const AttachmentFlagsBitField = require('../util/AttachmentFlagsBitField.js'); const { basename, flatten } = require('../util/Util'); /** @@ -121,6 +122,16 @@ class Attachment { } else { this.waveform ??= null; } + + if ('flags' in data) { + /** + * The flags of this attachment + * @type {Readonly} + */ + this.flags = new AttachmentFlagsBitField(data.flags).freeze(); + } else { + this.flags ??= new AttachmentFlagsBitField().freeze(); + } } /** diff --git a/packages/discord.js/src/util/APITypes.js b/packages/discord.js/src/util/APITypes.js index 11d468ada3a5..12c67b79ed2b 100644 --- a/packages/discord.js/src/util/APITypes.js +++ b/packages/discord.js/src/util/APITypes.js @@ -210,6 +210,11 @@ * @see {@link https://discord-api-types.dev/api/discord-api-types-v10/enum/ApplicationRoleConnectionMetadataType} */ +/** + * @external AttachmentFlags + * @see {@link https://discord-api-types.dev/api/discord-api-types-v10/enum/AttachmentFlags} + */ + /** * @external AutoModerationActionType * @see {@link https://discord-api-types.dev/api/discord-api-types-v10/enum/AutoModerationActionType} diff --git a/packages/discord.js/src/util/AttachmentFlagsBitField.js b/packages/discord.js/src/util/AttachmentFlagsBitField.js new file mode 100644 index 000000000000..f7f2bd23d0d6 --- /dev/null +++ b/packages/discord.js/src/util/AttachmentFlagsBitField.js @@ -0,0 +1,26 @@ +'use strict'; + +const { AttachmentFlags } = require('discord-api-types/v10'); +const BitField = require('./BitField'); + +/** + * Data structure that makes it easy to interact with an {@link Attachment#flags} bitfield. + * @extends {BitField} + */ +class AttachmentFlagsBitField extends BitField { + /** + * Numeric attachment flags. + * @type {AttachmentFlags} + * @memberof AttachmentFlagsBitField + */ + static Flags = AttachmentFlags; +} + +/** + * @name AttachmentFlagsBitField + * @kind constructor + * @memberof AttachmentFlagsBitField + * @param {BitFieldResolvable} [bits=0] Bit(s) to read from + */ + +module.exports = AttachmentFlagsBitField; diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index 192881db9894..47cf317718e0 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -166,6 +166,7 @@ import { APIGuildOnboardingPrompt, APIGuildOnboardingPromptOption, GuildOnboardingPromptType, + AttachmentFlags, } from 'discord-api-types/v10'; import { ChildProcess } from 'node:child_process'; import { EventEmitter } from 'node:events'; @@ -2070,6 +2071,7 @@ export class Attachment { public description: string | null; public duration: number | null; public ephemeral: boolean; + public flags: AttachmentFlagsBitField; public height: number | null; public id: Snowflake; public name: string; @@ -2082,6 +2084,13 @@ export class Attachment { public toJSON(): unknown; } +export type AttachmentFlagsString = keyof typeof AttachmentFlags; + +export class AttachmentFlagsBitField extends BitField { + public static Flags: Record; + public static resolve(bit?: BitFieldResolvable): number; +} + export class MessageCollector extends Collector]> { public constructor(channel: TextBasedChannel, options?: MessageCollectorOptions); private _handleChannelDeletion(channel: NonThreadGuildBasedChannel): void;