diff --git a/packages/discord.js/src/index.js b/packages/discord.js/src/index.js index a7137270aa17..502133141320 100644 --- a/packages/discord.js/src/index.js +++ b/packages/discord.js/src/index.js @@ -36,6 +36,7 @@ exports.MessageFlagsBitField = require('./util/MessageFlagsBitField'); exports.Options = require('./util/Options'); exports.Partials = require('./util/Partials'); exports.PermissionsBitField = require('./util/PermissionsBitField'); +exports.RoleFlagsBitField = require('./util/RoleFlagsBitField'); exports.ShardEvents = require('./util/ShardEvents'); exports.Status = require('./util/Status'); exports.SnowflakeUtil = require('@sapphire/snowflake').DiscordSnowflake; diff --git a/packages/discord.js/src/structures/Role.js b/packages/discord.js/src/structures/Role.js index 63f10961a44c..09a2a52ca880 100644 --- a/packages/discord.js/src/structures/Role.js +++ b/packages/discord.js/src/structures/Role.js @@ -5,6 +5,7 @@ const { PermissionFlagsBits } = require('discord-api-types/v10'); const Base = require('./Base'); const { DiscordjsError, ErrorCodes } = require('../errors'); const PermissionsBitField = require('../util/PermissionsBitField'); +const RoleFlagsBitField = require('../util/RoleFlagsBitField'); /** * Represents a role on Discord. @@ -101,6 +102,16 @@ class Role extends Base { if ('unicode_emoji' in data) this.unicodeEmoji = data.unicode_emoji; + if ('flags' in data) { + /** + * The flags of this role + * @type {Readonly} + */ + this.flags = new RoleFlagsBitField(data.flags).freeze(); + } else { + this.flags ??= new RoleFlagsBitField().freeze(); + } + /** * The tags this role has * @type {?Object} diff --git a/packages/discord.js/src/util/APITypes.js b/packages/discord.js/src/util/APITypes.js index 12c67b79ed2b..e8ab25a89d13 100644 --- a/packages/discord.js/src/util/APITypes.js +++ b/packages/discord.js/src/util/APITypes.js @@ -410,6 +410,11 @@ * @see {@link https://discord-api-types.dev/api/discord-api-types-payloads/common#PermissionFlagsBits} */ +/** + * @external RoleFlags + * @see {@link https://discord-api-types.dev/api/discord-api-types-v10/enum/RoleFlags} + */ + /** * @external RESTGetAPIGuildThreadsResult * @see {@link https://discord-api-types.dev/api/discord-api-types-v10#RESTGetAPIGuildThreadsResult} diff --git a/packages/discord.js/src/util/RoleFlagsBitField.js b/packages/discord.js/src/util/RoleFlagsBitField.js new file mode 100644 index 000000000000..1e0f89548922 --- /dev/null +++ b/packages/discord.js/src/util/RoleFlagsBitField.js @@ -0,0 +1,26 @@ +'use strict'; + +const { RoleFlags } = require('discord-api-types/v10'); +const BitField = require('./BitField'); + +/** + * Data structure that makes it easy to interact with a {@link Role#flags} bitfield. + * @extends {BitField} + */ +class RoleFlagsBitField extends BitField { + /** + * Numeric role flags. + * @type {RoleFlags} + * @memberof RoleFlagsBitField + */ + static Flags = RoleFlags; +} + +/** + * @name RoleFlagsBitField + * @kind constructor + * @memberof RoleFlagsBitField + * @param {BitFieldResolvable} [bits=0] Bit(s) to read from + */ + +module.exports = RoleFlagsBitField; diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index 47cf317718e0..d5e9feee2558 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -167,6 +167,7 @@ import { APIGuildOnboardingPromptOption, GuildOnboardingPromptType, AttachmentFlags, + RoleFlags, } from 'discord-api-types/v10'; import { ChildProcess } from 'node:child_process'; import { EventEmitter } from 'node:events'; @@ -2524,6 +2525,7 @@ export class Role extends Base { public get createdAt(): Date; public get createdTimestamp(): number; public get editable(): boolean; + public flags: RoleFlagsBitField; public guild: Guild; public get hexColor(): HexColorString; public hoist: boolean; @@ -2559,6 +2561,13 @@ export class Role extends Base { public toString(): RoleMention; } +export type RoleFlagsString = keyof typeof RoleFlags; + +export class RoleFlagsBitField extends BitField { + public static Flags: typeof RoleFlags; + public static resolve(bit?: BitFieldResolvable): number; +} + export class StringSelectMenuInteraction< Cached extends CacheType = CacheType, > extends MessageComponentInteraction {