From 39cf072683cd81ee65b5070216b59146d5da3319 Mon Sep 17 00:00:00 2001 From: Wolvinny Date: Tue, 11 Feb 2025 19:12:32 +0100 Subject: [PATCH 01/16] Remove Client#emojis --- packages/discord.js/src/client/Client.js | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/packages/discord.js/src/client/Client.js b/packages/discord.js/src/client/Client.js index 828a492319cb..0290c5daba74 100644 --- a/packages/discord.js/src/client/Client.js +++ b/packages/discord.js/src/client/Client.js @@ -11,7 +11,6 @@ const { ActionsManager } = require('./actions/ActionsManager.js'); const { ClientVoiceManager } = require('./voice/ClientVoiceManager.js'); const { PacketHandlers } = require('./websocket/handlers/index.js'); const { DiscordjsError, DiscordjsTypeError, ErrorCodes } = require('../errors/index.js'); -const { BaseGuildEmojiManager } = require('../managers/BaseGuildEmojiManager.js'); const { ChannelManager } = require('../managers/ChannelManager.js'); const { GuildManager } = require('../managers/GuildManager.js'); const { UserManager } = require('../managers/UserManager.js'); @@ -217,19 +216,6 @@ class Client extends BaseClient { this._attachEvents(); } - /** - * A manager of all the custom emojis that the client has access to - * @type {BaseGuildEmojiManager} - * @readonly - */ - get emojis() { - const emojis = new BaseGuildEmojiManager(this); - for (const guild of this.guilds.cache.values()) { - if (guild.available) for (const emoji of guild.emojis.cache.values()) emojis.cache.set(emoji.id, emoji); - } - return emojis; - } - /** * Time at which the client was last regarded as being in the {@link Status.Ready} state * (each time the client disconnects and successfully reconnects, this will be overwritten) From c45bcff6edb1a94e5d5c76000deffe4de66f5797 Mon Sep 17 00:00:00 2001 From: Wolvinny Date: Tue, 11 Feb 2025 19:15:35 +0100 Subject: [PATCH 02/16] Remove typings --- packages/discord.js/typings/index.d.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index 91f1f4b88e49..d5b90958c477 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -979,7 +979,6 @@ export class Client extends BaseClient; public channels: ChannelManager; - public get emojis(): BaseGuildEmojiManager; public guilds: GuildManager; public lastPingTimestamps: ReadonlyCollection; public options: Omit & { intents: IntentsBitField }; From 049d910fcea17a6fab4f7c54c79fc07f7054b654 Mon Sep 17 00:00:00 2001 From: Wolvinny Date: Wed, 12 Feb 2025 17:12:14 +0100 Subject: [PATCH 03/16] Add util function to resolve guild emojis --- .../structures/GuildOnboardingPromptOption.js | 2 +- .../src/structures/MessageReaction.js | 11 ++------ .../discord.js/src/structures/PollAnswer.js | 3 +- .../src/structures/WelcomeChannel.js | 3 +- packages/discord.js/src/util/Util.js | 28 ++++++++++++++++++- 5 files changed, 35 insertions(+), 12 deletions(-) diff --git a/packages/discord.js/src/structures/GuildOnboardingPromptOption.js b/packages/discord.js/src/structures/GuildOnboardingPromptOption.js index b5dca0025bcb..503c1d9a7461 100644 --- a/packages/discord.js/src/structures/GuildOnboardingPromptOption.js +++ b/packages/discord.js/src/structures/GuildOnboardingPromptOption.js @@ -79,7 +79,7 @@ class GuildOnboardingPromptOption extends Base { */ get emoji() { if (!this._emoji.id && !this._emoji.name) return null; - return this.client.emojis.cache.get(this._emoji.id) ?? new Emoji(this.client, this._emoji); + return this.guild.emojis.cache.get(this._emoji.id) ?? new Emoji(this.client, this._emoji); } } diff --git a/packages/discord.js/src/structures/MessageReaction.js b/packages/discord.js/src/structures/MessageReaction.js index f59efa60efd7..33572f87b2e4 100644 --- a/packages/discord.js/src/structures/MessageReaction.js +++ b/packages/discord.js/src/structures/MessageReaction.js @@ -5,7 +5,7 @@ const { ApplicationEmoji } = require('./ApplicationEmoji.js'); const { GuildEmoji } = require('./GuildEmoji.js'); const { ReactionEmoji } = require('./ReactionEmoji.js'); const { ReactionUserManager } = require('../managers/ReactionUserManager.js'); -const { flatten } = require('../util/Util.js'); +const { flatten, resolveGuildEmoji } = require('../util/Util.js'); /** * Represents a reaction to a message. @@ -127,14 +127,9 @@ class MessageReaction { this._emoji = emoji; return emoji; } - const emojis = this.message.client.emojis.cache; - if (emojis.has(this._emoji.id)) { - const emoji = emojis.get(this._emoji.id); - this._emoji = emoji; - return emoji; - } } - return this._emoji; + const emoji = resolveGuildEmoji(this.client, this._emoji.id) + return emoji ?? this._emoji; } /** diff --git a/packages/discord.js/src/structures/PollAnswer.js b/packages/discord.js/src/structures/PollAnswer.js index b37794b628ed..de7a43a0ce74 100644 --- a/packages/discord.js/src/structures/PollAnswer.js +++ b/packages/discord.js/src/structures/PollAnswer.js @@ -1,5 +1,6 @@ 'use strict'; +const { resolveGuildEmoji } = require('../util/Util.js'); const { Base } = require('./Base.js'); const { Emoji } = require('./Emoji.js'); @@ -61,7 +62,7 @@ class PollAnswer extends Base { */ get emoji() { if (!this._emoji || (!this._emoji.id && !this._emoji.name)) return null; - return this.client.emojis.cache.get(this._emoji.id) ?? new Emoji(this.client, this._emoji); + return resolveGuildEmoji(this.client, this._emoji.id) ?? new Emoji(this.client, this._emoji); } /** diff --git a/packages/discord.js/src/structures/WelcomeChannel.js b/packages/discord.js/src/structures/WelcomeChannel.js index 72a87e237f23..ee4ef29f501a 100644 --- a/packages/discord.js/src/structures/WelcomeChannel.js +++ b/packages/discord.js/src/structures/WelcomeChannel.js @@ -1,5 +1,6 @@ 'use strict'; +const { resolveGuildEmoji } = require('../util/Util.js'); const { Base } = require('./Base.js'); const { Emoji } = require('./Emoji.js'); @@ -53,7 +54,7 @@ class WelcomeChannel extends Base { * @type {GuildEmoji|Emoji} */ get emoji() { - return this.client.emojis.cache.get(this._emoji.id) ?? new Emoji(this.client, this._emoji); + return resolveGuildEmoji(this.client, this._emoji.id) ?? new Emoji(this.client, this._emoji) } } diff --git a/packages/discord.js/src/util/Util.js b/packages/discord.js/src/util/Util.js index a76b3bb23519..3251ad64d5c6 100644 --- a/packages/discord.js/src/util/Util.js +++ b/packages/discord.js/src/util/Util.js @@ -122,6 +122,29 @@ function resolvePartialEmoji(emoji) { return { id, name, animated: Boolean(animated) }; } +/** + * Resolve an emoji object from a Guild + * @param {Client} client The Client + * @param {string} emojiId The id of the emoji + * @returns {GuildEmoji | undefined} + * + */ +export function resolveGuildEmoji(client, emojiId) { + for (const guild of client.guilds.cache.values()) { + if (!guild.available) { + continue; + } + + const emoji = guild.emojis.cache.get(emojiId); + + if (emoji) { + return emoji; + } + } + + return null; +} + /** * Options used to make an error object. * @typedef {Object} MakeErrorOptions @@ -503,6 +526,7 @@ exports.flatten = flatten; exports.fetchRecommendedShardCount = fetchRecommendedShardCount; exports.parseEmoji = parseEmoji; exports.resolvePartialEmoji = resolvePartialEmoji; +exports.resolveGuildEmoji = resolveGuildEmoji; exports.makeError = makeError; exports.makePlainError = makePlainError; exports.getSortableGroupTypes = getSortableGroupTypes; @@ -518,7 +542,9 @@ exports.parseWebhookURL = parseWebhookURL; exports.transformResolved = transformResolved; exports.resolveSKUId = resolveSKUId; + // Fixes Circular const { Attachment } = require('../structures/Attachment.js'); const { GuildChannel } = require('../structures/GuildChannel.js'); -const { SKU } = require('../structures/SKU.js'); +const { SKU } = require('../structures/SKU.js');const { GuildEmoji } = require('../structures/GuildEmoji.js'); + From aac0bbbc6a25522de99ebb05978c561663f290a0 Mon Sep 17 00:00:00 2001 From: Wolvinny Date: Wed, 12 Feb 2025 17:15:08 +0100 Subject: [PATCH 04/16] update typings --- packages/discord.js/typings/index.d.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index d5b90958c477..14501199d760 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -3458,6 +3458,7 @@ export function discordSort; export function flatten(obj: unknown, ...props: Record[]): unknown; + /** @internal */ export function makeError(obj: MakeErrorOptions): Error; /** @internal */ @@ -3476,6 +3477,7 @@ export function resolveColor(color: ColorResolvable): number; export function resolvePartialEmoji(emoji: Snowflake): PartialEmojiOnlyId; /** @internal */ export function resolvePartialEmoji(emoji: Emoji | EmojiIdentifierResolvable): PartialEmoji | null; +export function resolveGuildEmoji(client: Client, emojiId: string): GuildEmoji | null; export function verifyString(data: string, error?: typeof Error, errorMessage?: string, allowEmpty?: boolean): string; /** @internal */ export function setPosition( From 5f027242419afb8c7e60d6889c188d7c9f2a80e9 Mon Sep 17 00:00:00 2001 From: Wolvinny Date: Wed, 12 Feb 2025 17:17:06 +0100 Subject: [PATCH 05/16] add enter --- packages/discord.js/src/util/Util.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/discord.js/src/util/Util.js b/packages/discord.js/src/util/Util.js index 3251ad64d5c6..439b28cf421c 100644 --- a/packages/discord.js/src/util/Util.js +++ b/packages/discord.js/src/util/Util.js @@ -546,5 +546,6 @@ exports.resolveSKUId = resolveSKUId; // Fixes Circular const { Attachment } = require('../structures/Attachment.js'); const { GuildChannel } = require('../structures/GuildChannel.js'); -const { SKU } = require('../structures/SKU.js');const { GuildEmoji } = require('../structures/GuildEmoji.js'); +const { SKU } = require('../structures/SKU.js'); +const { GuildEmoji } = require('../structures/GuildEmoji.js'); From 9fc5f35556d4e5518238f737d79495145ca2bb28 Mon Sep 17 00:00:00 2001 From: Wolvinny Date: Wed, 12 Feb 2025 17:19:41 +0100 Subject: [PATCH 06/16] make util function @internal --- packages/discord.js/typings/index.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index 14501199d760..d7258ee3cfcb 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -3477,6 +3477,7 @@ export function resolveColor(color: ColorResolvable): number; export function resolvePartialEmoji(emoji: Snowflake): PartialEmojiOnlyId; /** @internal */ export function resolvePartialEmoji(emoji: Emoji | EmojiIdentifierResolvable): PartialEmoji | null; +/** @internal */ export function resolveGuildEmoji(client: Client, emojiId: string): GuildEmoji | null; export function verifyString(data: string, error?: typeof Error, errorMessage?: string, allowEmpty?: boolean): string; /** @internal */ From 54314c99efc7bafbe1e524f0c51cf7d4b009ff32 Mon Sep 17 00:00:00 2001 From: Wolvinny Date: Wed, 12 Feb 2025 17:25:22 +0100 Subject: [PATCH 07/16] get emoji from guild cache for WelcomeChannel --- packages/discord.js/src/structures/WelcomeChannel.js | 2 +- packages/discord.js/src/util/Util.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/discord.js/src/structures/WelcomeChannel.js b/packages/discord.js/src/structures/WelcomeChannel.js index ee4ef29f501a..f3820cceeee8 100644 --- a/packages/discord.js/src/structures/WelcomeChannel.js +++ b/packages/discord.js/src/structures/WelcomeChannel.js @@ -54,7 +54,7 @@ class WelcomeChannel extends Base { * @type {GuildEmoji|Emoji} */ get emoji() { - return resolveGuildEmoji(this.client, this._emoji.id) ?? new Emoji(this.client, this._emoji) + return this.guild.emojis.cache.get(this._emoji.id) ?? new Emoji(this.client, this._emoji) } } diff --git a/packages/discord.js/src/util/Util.js b/packages/discord.js/src/util/Util.js index 439b28cf421c..cb60aa51976f 100644 --- a/packages/discord.js/src/util/Util.js +++ b/packages/discord.js/src/util/Util.js @@ -127,7 +127,7 @@ function resolvePartialEmoji(emoji) { * @param {Client} client The Client * @param {string} emojiId The id of the emoji * @returns {GuildEmoji | undefined} - * + * @private */ export function resolveGuildEmoji(client, emojiId) { for (const guild of client.guilds.cache.values()) { From 0af22916c572b0fd3e787e5aa10ad1ca9373ed26 Mon Sep 17 00:00:00 2001 From: Wolvinny Date: Wed, 12 Feb 2025 18:10:13 +0100 Subject: [PATCH 08/16] run prettier --- packages/discord.js/src/structures/MessageReaction.js | 2 +- packages/discord.js/src/structures/WelcomeChannel.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/discord.js/src/structures/MessageReaction.js b/packages/discord.js/src/structures/MessageReaction.js index 33572f87b2e4..334b0dffa42f 100644 --- a/packages/discord.js/src/structures/MessageReaction.js +++ b/packages/discord.js/src/structures/MessageReaction.js @@ -128,7 +128,7 @@ class MessageReaction { return emoji; } } - const emoji = resolveGuildEmoji(this.client, this._emoji.id) + const emoji = resolveGuildEmoji(this.client, this._emoji.id); return emoji ?? this._emoji; } diff --git a/packages/discord.js/src/structures/WelcomeChannel.js b/packages/discord.js/src/structures/WelcomeChannel.js index f3820cceeee8..61ddae1eeec2 100644 --- a/packages/discord.js/src/structures/WelcomeChannel.js +++ b/packages/discord.js/src/structures/WelcomeChannel.js @@ -54,7 +54,7 @@ class WelcomeChannel extends Base { * @type {GuildEmoji|Emoji} */ get emoji() { - return this.guild.emojis.cache.get(this._emoji.id) ?? new Emoji(this.client, this._emoji) + return this.guild.emojis.cache.get(this._emoji.id) ?? new Emoji(this.client, this._emoji); } } From 6a011011503525d437cf16d459041678f1b44bd8 Mon Sep 17 00:00:00 2001 From: Luna <84203950+Wolvinny@users.noreply.github.com> Date: Wed, 12 Feb 2025 18:11:34 +0100 Subject: [PATCH 09/16] Update packages/discord.js/src/util/Util.js Co-authored-by: Danial Raza --- packages/discord.js/src/util/Util.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/discord.js/src/util/Util.js b/packages/discord.js/src/util/Util.js index cb60aa51976f..f684c2cd1ee3 100644 --- a/packages/discord.js/src/util/Util.js +++ b/packages/discord.js/src/util/Util.js @@ -123,10 +123,10 @@ function resolvePartialEmoji(emoji) { } /** - * Resolve an emoji object from a Guild - * @param {Client} client The Client - * @param {string} emojiId The id of the emoji - * @returns {GuildEmoji | undefined} + * Resolves a {@link GuildEmoji} from an emoji id. + * @param {Client} client The client to use to resolve the emoji + * @param {Snowflake} emojiId The emoji id to resolve + * @returns {?GuildEmoji} * @private */ export function resolveGuildEmoji(client, emojiId) { From 3720194e1734c8da454825056ebf39d82bf412ae Mon Sep 17 00:00:00 2001 From: Luna <84203950+Wolvinny@users.noreply.github.com> Date: Wed, 12 Feb 2025 18:11:50 +0100 Subject: [PATCH 10/16] Update packages/discord.js/typings/index.d.ts Co-authored-by: Danial Raza --- packages/discord.js/typings/index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index d7258ee3cfcb..05673cd6e874 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -3478,7 +3478,7 @@ export function resolvePartialEmoji(emoji: Snowflake): PartialEmojiOnlyId; /** @internal */ export function resolvePartialEmoji(emoji: Emoji | EmojiIdentifierResolvable): PartialEmoji | null; /** @internal */ -export function resolveGuildEmoji(client: Client, emojiId: string): GuildEmoji | null; +export function resolveGuildEmoji(client: Client, emojiId: Snowflake): GuildEmoji | null; export function verifyString(data: string, error?: typeof Error, errorMessage?: string, allowEmpty?: boolean): string; /** @internal */ export function setPosition( From 54ae361fb80d209dd35ef2b150ef2ff28ce1b7d2 Mon Sep 17 00:00:00 2001 From: Wolvinny Date: Wed, 12 Feb 2025 18:18:56 +0100 Subject: [PATCH 11/16] run prettier (i forgot a file) --- packages/discord.js/src/util/Util.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/discord.js/src/util/Util.js b/packages/discord.js/src/util/Util.js index cb60aa51976f..78a556d9ac01 100644 --- a/packages/discord.js/src/util/Util.js +++ b/packages/discord.js/src/util/Util.js @@ -131,15 +131,15 @@ function resolvePartialEmoji(emoji) { */ export function resolveGuildEmoji(client, emojiId) { for (const guild of client.guilds.cache.values()) { - if (!guild.available) { - continue; - } + if (!guild.available) { + continue; + } - const emoji = guild.emojis.cache.get(emojiId); + const emoji = guild.emojis.cache.get(emojiId); - if (emoji) { - return emoji; - } + if (emoji) { + return emoji; + } } return null; @@ -542,10 +542,8 @@ exports.parseWebhookURL = parseWebhookURL; exports.transformResolved = transformResolved; exports.resolveSKUId = resolveSKUId; - // Fixes Circular const { Attachment } = require('../structures/Attachment.js'); const { GuildChannel } = require('../structures/GuildChannel.js'); const { SKU } = require('../structures/SKU.js'); const { GuildEmoji } = require('../structures/GuildEmoji.js'); - From bdfc9d51eb58b0054edcd6df211e5c85b27da445 Mon Sep 17 00:00:00 2001 From: Wolvinny Date: Wed, 12 Feb 2025 18:51:49 +0100 Subject: [PATCH 12/16] Remove BaseGuildEmojiManager --- .../src/managers/BaseGuildEmojiManager.js | 85 ------------------- .../src/managers/GuildEmojiManager.js | 75 +++++++++++++++- packages/discord.js/src/util/Util.js | 2 +- packages/discord.js/typings/index.d.ts | 8 +- 4 files changed, 75 insertions(+), 95 deletions(-) delete mode 100644 packages/discord.js/src/managers/BaseGuildEmojiManager.js diff --git a/packages/discord.js/src/managers/BaseGuildEmojiManager.js b/packages/discord.js/src/managers/BaseGuildEmojiManager.js deleted file mode 100644 index 9efc116da707..000000000000 --- a/packages/discord.js/src/managers/BaseGuildEmojiManager.js +++ /dev/null @@ -1,85 +0,0 @@ -'use strict'; - -const { CachedManager } = require('./CachedManager.js'); -const { ApplicationEmoji } = require('../structures/ApplicationEmoji.js'); -const { GuildEmoji } = require('../structures/GuildEmoji.js'); -const { ReactionEmoji } = require('../structures/ReactionEmoji.js'); -const { parseEmoji } = require('../util/Util.js'); - -/** - * Holds methods to resolve GuildEmojis and stores their cache. - * @extends {CachedManager} - */ -class BaseGuildEmojiManager extends CachedManager { - constructor(client, iterable) { - super(client, GuildEmoji, iterable); - } - - /** - * The cache of GuildEmojis - * @type {Collection} - * @name BaseGuildEmojiManager#cache - */ - - /** - * Data that can be resolved into a GuildEmoji object. This can be: - * * A Snowflake - * * A GuildEmoji object - * * A ReactionEmoji object - * * An ApplicationEmoji object - * @typedef {Snowflake|GuildEmoji|ReactionEmoji|ApplicationEmoji} EmojiResolvable - */ - - /** - * Resolves an EmojiResolvable to an Emoji object. - * @param {EmojiResolvable} emoji The Emoji resolvable to identify - * @returns {?GuildEmoji} - */ - resolve(emoji) { - if (emoji instanceof ReactionEmoji) return super.cache.get(emoji.id) ?? null; - if (emoji instanceof ApplicationEmoji) return super.cache.get(emoji.id) ?? null; - return super.resolve(emoji); - } - - /** - * Resolves an EmojiResolvable to an Emoji id string. - * @param {EmojiResolvable} emoji The Emoji resolvable to identify - * @returns {?Snowflake} - */ - resolveId(emoji) { - if (emoji instanceof ReactionEmoji) return emoji.id; - if (emoji instanceof ApplicationEmoji) return emoji.id; - return super.resolveId(emoji); - } - - /** - * Data that can be resolved to give an emoji identifier. This can be: - * * An EmojiResolvable - * * The ``, `<:name:id>`, `a:name:id` or `name:id` emoji identifier string of an emoji - * * The Unicode representation of an emoji - * @typedef {string|EmojiResolvable} EmojiIdentifierResolvable - */ - - /** - * Resolves an EmojiResolvable to an emoji identifier. - * @param {EmojiIdentifierResolvable} emoji The emoji resolvable to resolve - * @returns {?string} - */ - resolveIdentifier(emoji) { - const emojiResolvable = this.resolve(emoji); - if (emojiResolvable) return emojiResolvable.identifier; - if (emoji instanceof ReactionEmoji) return emoji.identifier; - if (emoji instanceof ApplicationEmoji) return emoji.identifier; - if (typeof emoji === 'string') { - const res = parseEmoji(emoji); - if (res?.name.length) { - emoji = `${res.animated ? 'a:' : ''}${res.name}${res.id ? `:${res.id}` : ''}`; - } - if (!emoji.includes('%')) return encodeURIComponent(emoji); - return emoji; - } - return null; - } -} - -exports.BaseGuildEmojiManager = BaseGuildEmojiManager; diff --git a/packages/discord.js/src/managers/GuildEmojiManager.js b/packages/discord.js/src/managers/GuildEmojiManager.js index 695faa2c68af..ea49cf02ed6f 100644 --- a/packages/discord.js/src/managers/GuildEmojiManager.js +++ b/packages/discord.js/src/managers/GuildEmojiManager.js @@ -5,14 +5,19 @@ const { Routes, PermissionFlagsBits } = require('discord-api-types/v10'); const { BaseGuildEmojiManager } = require('./BaseGuildEmojiManager.js'); const { DiscordjsError, DiscordjsTypeError, ErrorCodes } = require('../errors/index.js'); const { resolveImage } = require('../util/DataResolver.js'); +const { CachedManager } = require('./CachedManager.js'); +const { GuildEmoji } = require('../structures/GuildEmoji.js'); +const { parseEmoji } = require('../util/Util.js'); +const { ApplicationEmoji } = require('../structures/ApplicationEmoji.js'); +const { ReactionEmoji } = require('../structures/ReactionEmoji.js'); /** * Manages API methods for GuildEmojis and stores their cache. * @extends {BaseGuildEmojiManager} */ -class GuildEmojiManager extends BaseGuildEmojiManager { +class GuildEmojiManager extends CachedManager { constructor(guild, iterable) { - super(guild.client, iterable); + super(guild.client, GuildEmoji, iterable); /** * The guild this manager belongs to @@ -25,6 +30,72 @@ class GuildEmojiManager extends BaseGuildEmojiManager { return super._add(data, cache, { extras: [this.guild] }); } + /** + * The cache of GuildEmojis + * @type {Collection} + * @name GuildEmojiManager#cache + */ + + /** + * Data that can be resolved into a GuildEmoji object. This can be: + * * A Snowflake + * * A GuildEmoji object + * * A ReactionEmoji object + * * An ApplicationEmoji object + * @typedef {Snowflake|GuildEmoji|ReactionEmoji|ApplicationEmoji} EmojiResolvable + */ + + /** + * Resolves an EmojiResolvable to an Emoji object. + * @param {EmojiResolvable} emoji The Emoji resolvable to identify + * @returns {?GuildEmoji} + */ + resolve(emoji) { + if (emoji instanceof ReactionEmoji) return super.cache.get(emoji.id) ?? null; + if (emoji instanceof ApplicationEmoji) return super.cache.get(emoji.id) ?? null; + return super.resolve(emoji); + } + + /** + * Resolves an EmojiResolvable to an Emoji id string. + * @param {EmojiResolvable} emoji The Emoji resolvable to identify + * @returns {?Snowflake} + */ + resolveId(emoji) { + if (emoji instanceof ReactionEmoji) return emoji.id; + if (emoji instanceof ApplicationEmoji) return emoji.id; + return super.resolveId(emoji); + } + + /** + * Data that can be resolved to give an emoji identifier. This can be: + * * An EmojiResolvable + * * The ``, `<:name:id>`, `a:name:id` or `name:id` emoji identifier string of an emoji + * * The Unicode representation of an emoji + * @typedef {string|EmojiResolvable} EmojiIdentifierResolvable + */ + + /** + * Resolves an EmojiResolvable to an emoji identifier. + * @param {EmojiIdentifierResolvable} emoji The emoji resolvable to resolve + * @returns {?string} + */ + resolveIdentifier(emoji) { + const emojiResolvable = this.resolve(emoji); + if (emojiResolvable) return emojiResolvable.identifier; + if (emoji instanceof ReactionEmoji) return emoji.identifier; + if (emoji instanceof ApplicationEmoji) return emoji.identifier; + if (typeof emoji === 'string') { + const res = parseEmoji(emoji); + if (res?.name.length) { + emoji = `${res.animated ? 'a:' : ''}${res.name}${res.id ? `:${res.id}` : ''}`; + } + if (!emoji.includes('%')) return encodeURIComponent(emoji); + return emoji; + } + return null; + } + /** * Options used for creating an emoji in a guild. * @typedef {Object} GuildEmojiCreateOptions diff --git a/packages/discord.js/src/util/Util.js b/packages/discord.js/src/util/Util.js index 92858059b795..247570807ac2 100644 --- a/packages/discord.js/src/util/Util.js +++ b/packages/discord.js/src/util/Util.js @@ -129,7 +129,7 @@ function resolvePartialEmoji(emoji) { * @returns {?GuildEmoji} * @private */ -export function resolveGuildEmoji(client, emojiId) { +function resolveGuildEmoji(client, emojiId) { for (const guild of client.guilds.cache.values()) { if (!guild.available) { continue; diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index 52550491ec29..6498937cd0bd 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -3999,11 +3999,6 @@ export class AutoModerationRuleManager extends CachedManager< public delete(autoModerationRule: AutoModerationRuleResolvable, reason?: string): Promise; } -export class BaseGuildEmojiManager extends CachedManager { - protected constructor(client: Client, iterable?: Iterable); - public resolveIdentifier(emoji: EmojiIdentifierResolvable): string | null; -} - export class CategoryChannelChildManager extends DataManager { private constructor(channel: CategoryChannel); @@ -4144,7 +4139,7 @@ export class GuildChannelManager extends CachedManager; } -export class GuildEmojiManager extends BaseGuildEmojiManager { +export class GuildEmojiManager extends CachedManager { private constructor(guild: Guild, iterable?: Iterable); public guild: Guild; public create(options: GuildEmojiCreateOptions): Promise; @@ -4971,7 +4966,6 @@ export interface Caches { ApplicationCommandManager: [manager: typeof ApplicationCommandManager, holds: typeof ApplicationCommand]; ApplicationEmojiManager: [manager: typeof ApplicationEmojiManager, holds: typeof ApplicationEmoji]; AutoModerationRuleManager: [manager: typeof AutoModerationRuleManager, holds: typeof AutoModerationRule]; - BaseGuildEmojiManager: [manager: typeof BaseGuildEmojiManager, holds: typeof GuildEmoji]; // TODO: ChannelManager: [manager: typeof ChannelManager, holds: typeof Channel]; DMMessageManager: [manager: typeof MessageManager, holds: typeof Message]; EntitlementManager: [manager: typeof EntitlementManager, holds: typeof Entitlement]; From 1bd4c2b934b46486183133eb845a233fc6dec35b Mon Sep 17 00:00:00 2001 From: Wolvinny Date: Wed, 12 Feb 2025 19:54:22 +0100 Subject: [PATCH 13/16] fix linting issues --- .../discord.js/src/managers/GuildEmojiManager.js | 12 +++++------- packages/discord.js/src/structures/PollAnswer.js | 2 +- packages/discord.js/src/structures/WelcomeChannel.js | 1 - packages/discord.js/src/util/Util.js | 1 - 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/discord.js/src/managers/GuildEmojiManager.js b/packages/discord.js/src/managers/GuildEmojiManager.js index ea49cf02ed6f..2dd4c3af1934 100644 --- a/packages/discord.js/src/managers/GuildEmojiManager.js +++ b/packages/discord.js/src/managers/GuildEmojiManager.js @@ -1,19 +1,17 @@ 'use strict'; - +const { CachedManager } = require('./CachedManager.js'); const { Collection } = require('@discordjs/collection'); const { Routes, PermissionFlagsBits } = require('discord-api-types/v10'); -const { BaseGuildEmojiManager } = require('./BaseGuildEmojiManager.js'); const { DiscordjsError, DiscordjsTypeError, ErrorCodes } = require('../errors/index.js'); -const { resolveImage } = require('../util/DataResolver.js'); -const { CachedManager } = require('./CachedManager.js'); -const { GuildEmoji } = require('../structures/GuildEmoji.js'); -const { parseEmoji } = require('../util/Util.js'); const { ApplicationEmoji } = require('../structures/ApplicationEmoji.js'); const { ReactionEmoji } = require('../structures/ReactionEmoji.js'); +const { GuildEmoji } = require('../structures/GuildEmoji.js'); +const { resolveImage } = require('../util/DataResolver.js'); +const { parseEmoji } = require('../util/Util.js'); /** * Manages API methods for GuildEmojis and stores their cache. - * @extends {BaseGuildEmojiManager} + * @extends {CachedManager} */ class GuildEmojiManager extends CachedManager { constructor(guild, iterable) { diff --git a/packages/discord.js/src/structures/PollAnswer.js b/packages/discord.js/src/structures/PollAnswer.js index de7a43a0ce74..19a83a21daa2 100644 --- a/packages/discord.js/src/structures/PollAnswer.js +++ b/packages/discord.js/src/structures/PollAnswer.js @@ -1,8 +1,8 @@ 'use strict'; -const { resolveGuildEmoji } = require('../util/Util.js'); const { Base } = require('./Base.js'); const { Emoji } = require('./Emoji.js'); +const { resolveGuildEmoji } = require('../util/Util.js'); /** * Represents an answer to a {@link Poll} diff --git a/packages/discord.js/src/structures/WelcomeChannel.js b/packages/discord.js/src/structures/WelcomeChannel.js index 61ddae1eeec2..86701dec8003 100644 --- a/packages/discord.js/src/structures/WelcomeChannel.js +++ b/packages/discord.js/src/structures/WelcomeChannel.js @@ -1,6 +1,5 @@ 'use strict'; -const { resolveGuildEmoji } = require('../util/Util.js'); const { Base } = require('./Base.js'); const { Emoji } = require('./Emoji.js'); diff --git a/packages/discord.js/src/util/Util.js b/packages/discord.js/src/util/Util.js index 247570807ac2..ae8126dd43cf 100644 --- a/packages/discord.js/src/util/Util.js +++ b/packages/discord.js/src/util/Util.js @@ -546,4 +546,3 @@ exports.resolveSKUId = resolveSKUId; const { Attachment } = require('../structures/Attachment.js'); const { GuildChannel } = require('../structures/GuildChannel.js'); const { SKU } = require('../structures/SKU.js'); -const { GuildEmoji } = require('../structures/GuildEmoji.js'); From 1ca6c040f6f7fd636b53d9071f60b3b8167a3eb7 Mon Sep 17 00:00:00 2001 From: Wolvinny Date: Wed, 12 Feb 2025 19:59:25 +0100 Subject: [PATCH 14/16] fix linting issues, att 2 --- packages/discord.js/src/managers/GuildEmojiManager.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/discord.js/src/managers/GuildEmojiManager.js b/packages/discord.js/src/managers/GuildEmojiManager.js index 2dd4c3af1934..0ca7d26677e3 100644 --- a/packages/discord.js/src/managers/GuildEmojiManager.js +++ b/packages/discord.js/src/managers/GuildEmojiManager.js @@ -1,11 +1,11 @@ 'use strict'; -const { CachedManager } = require('./CachedManager.js'); const { Collection } = require('@discordjs/collection'); const { Routes, PermissionFlagsBits } = require('discord-api-types/v10'); +const { CachedManager } = require('./CachedManager.js'); const { DiscordjsError, DiscordjsTypeError, ErrorCodes } = require('../errors/index.js'); const { ApplicationEmoji } = require('../structures/ApplicationEmoji.js'); -const { ReactionEmoji } = require('../structures/ReactionEmoji.js'); const { GuildEmoji } = require('../structures/GuildEmoji.js'); +const { ReactionEmoji } = require('../structures/ReactionEmoji.js'); const { resolveImage } = require('../util/DataResolver.js'); const { parseEmoji } = require('../util/Util.js'); From 916c44ec8869f93d69f28bef210c4009409ddeb1 Mon Sep 17 00:00:00 2001 From: Wolvinny Date: Wed, 12 Feb 2025 20:04:16 +0100 Subject: [PATCH 15/16] add resolveIdentifier type to GuildEmojiManager --- packages/discord.js/typings/index.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index 6498937cd0bd..7f42f57338c0 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -4148,6 +4148,7 @@ export class GuildEmojiManager extends CachedManager; public delete(emoji: EmojiResolvable, reason?: string): Promise; public edit(emoji: EmojiResolvable, options: GuildEmojiEditOptions): Promise; + public resolveIdentifier(emoji: EmojiIdentifierResolvable): string | null; } export class GuildEmojiRoleManager extends DataManager { From 4e9c831b93c4834661c5838ff804c4656243aed8 Mon Sep 17 00:00:00 2001 From: Wolvinny Date: Wed, 12 Feb 2025 20:08:04 +0100 Subject: [PATCH 16/16] remove BaseGuildEmojiManager from index.js --- packages/discord.js/src/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/discord.js/src/index.js b/packages/discord.js/src/index.js index 20e7cd157208..87a0c662e8ac 100644 --- a/packages/discord.js/src/index.js +++ b/packages/discord.js/src/index.js @@ -58,7 +58,6 @@ exports.ApplicationCommandPermissionsManager = require('./managers/ApplicationCommandPermissionsManager.js').ApplicationCommandPermissionsManager; exports.ApplicationEmojiManager = require('./managers/ApplicationEmojiManager.js').ApplicationEmojiManager; exports.AutoModerationRuleManager = require('./managers/AutoModerationRuleManager.js').AutoModerationRuleManager; -exports.BaseGuildEmojiManager = require('./managers/BaseGuildEmojiManager.js').BaseGuildEmojiManager; exports.CachedManager = require('./managers/CachedManager.js').CachedManager; exports.ChannelManager = require('./managers/ChannelManager.js').ChannelManager; exports.ClientVoiceManager = require('./client/voice/ClientVoiceManager.js').ClientVoiceManager;