Skip to content

refactor(Client)!: Remove emojis getter #10754

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 19 commits into from
Feb 15, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 0 additions & 14 deletions packages/discord.js/src/client/Client.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down Expand Up @@ -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)
Expand Down
1 change: 0 additions & 1 deletion packages/discord.js/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
85 changes: 0 additions & 85 deletions packages/discord.js/src/managers/BaseGuildEmojiManager.js

This file was deleted.

79 changes: 74 additions & 5 deletions packages/discord.js/src/managers/GuildEmojiManager.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
'use strict';

const { Collection } = require('@discordjs/collection');
const { Routes, PermissionFlagsBits } = require('discord-api-types/v10');
const { BaseGuildEmojiManager } = require('./BaseGuildEmojiManager.js');
const { CachedManager } = require('./CachedManager.js');
const { DiscordjsError, DiscordjsTypeError, ErrorCodes } = require('../errors/index.js');
const { ApplicationEmoji } = require('../structures/ApplicationEmoji.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');

/**
* Manages API methods for GuildEmojis and stores their cache.
* @extends {BaseGuildEmojiManager}
* @extends {CachedManager}
*/
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
Expand All @@ -25,6 +28,72 @@ class GuildEmojiManager extends BaseGuildEmojiManager {
return super._add(data, cache, { extras: [this.guild] });
}

/**
* The cache of GuildEmojis
* @type {Collection<Snowflake, GuildEmoji>}
* @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 `<a:name:id>`, `<: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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand Down
11 changes: 3 additions & 8 deletions packages/discord.js/src/structures/MessageReaction.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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;
}

/**
Expand Down
3 changes: 2 additions & 1 deletion packages/discord.js/src/structures/PollAnswer.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

const { Base } = require('./Base.js');
const { Emoji } = require('./Emoji.js');
const { resolveGuildEmoji } = require('../util/Util.js');

/**
* Represents an answer to a {@link Poll}
Expand Down Expand Up @@ -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);
}

/**
Expand Down
2 changes: 1 addition & 1 deletion packages/discord.js/src/structures/WelcomeChannel.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,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 this.guild.emojis.cache.get(this._emoji.id) ?? new Emoji(this.client, this._emoji);
}
}

Expand Down
24 changes: 24 additions & 0 deletions packages/discord.js/src/util/Util.js
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,29 @@ function resolvePartialEmoji(emoji) {
return { id, name, animated: Boolean(animated) };
}

/**
* 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
*/
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
Expand Down Expand Up @@ -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;
Expand Down
13 changes: 5 additions & 8 deletions packages/discord.js/typings/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -976,7 +976,6 @@ export class Client<Ready extends boolean = boolean> extends BaseClient<ClientEv

public application: If<Ready, ClientApplication>;
public channels: ChannelManager;
public get emojis(): BaseGuildEmojiManager;
public guilds: GuildManager;
public lastPingTimestamps: ReadonlyCollection<number, number>;
public options: Omit<ClientOptions, 'intents'> & { intents: IntentsBitField };
Expand Down Expand Up @@ -3456,6 +3455,7 @@ export function discordSort<Key, Value extends { rawPosition: number; id: Snowfl
export function cleanCodeBlockContent(text: string): string;
export function fetchRecommendedShardCount(token: string, options?: FetchRecommendedShardCountOptions): Promise<number>;
export function flatten(obj: unknown, ...props: Record<string, boolean | string>[]): unknown;

/** @internal */
export function makeError(obj: MakeErrorOptions): Error;
/** @internal */
Expand All @@ -3474,6 +3474,8 @@ 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: Snowflake): GuildEmoji | null;
export function verifyString(data: string, error?: typeof Error, errorMessage?: string, allowEmpty?: boolean): string;
/** @internal */
export function setPosition<Item extends Channel | Role>(
Expand Down Expand Up @@ -3997,11 +3999,6 @@ export class AutoModerationRuleManager extends CachedManager<
public delete(autoModerationRule: AutoModerationRuleResolvable, reason?: string): Promise<void>;
}

export class BaseGuildEmojiManager extends CachedManager<Snowflake, GuildEmoji, EmojiResolvable> {
protected constructor(client: Client<true>, iterable?: Iterable<RawGuildEmojiData>);
public resolveIdentifier(emoji: EmojiIdentifierResolvable): string | null;
}

export class CategoryChannelChildManager extends DataManager<Snowflake, CategoryChildChannel, GuildChannelResolvable> {
private constructor(channel: CategoryChannel);

Expand Down Expand Up @@ -4142,7 +4139,7 @@ export class GuildChannelManager extends CachedManager<Snowflake, GuildBasedChan
public delete(channel: GuildChannelResolvable, reason?: string): Promise<void>;
}

export class GuildEmojiManager extends BaseGuildEmojiManager {
export class GuildEmojiManager extends CachedManager<Snowflake, GuildEmoji, EmojiResolvable> {
private constructor(guild: Guild, iterable?: Iterable<RawGuildEmojiData>);
public guild: Guild;
public create(options: GuildEmojiCreateOptions): Promise<GuildEmoji>;
Expand All @@ -4151,6 +4148,7 @@ export class GuildEmojiManager extends BaseGuildEmojiManager {
public fetchAuthor(emoji: EmojiResolvable): Promise<User>;
public delete(emoji: EmojiResolvable, reason?: string): Promise<void>;
public edit(emoji: EmojiResolvable, options: GuildEmojiEditOptions): Promise<GuildEmoji>;
public resolveIdentifier(emoji: EmojiIdentifierResolvable): string | null;
}

export class GuildEmojiRoleManager extends DataManager<Snowflake, Role, RoleResolvable> {
Expand Down Expand Up @@ -4969,7 +4967,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<false>];
EntitlementManager: [manager: typeof EntitlementManager, holds: typeof Entitlement];
Expand Down