discord.js 15.0.0-dev.1739361916-64494137d → 15.0.0-dev.1739621068-b7fd2d105

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  <a href="https://www.npmjs.com/package/discord.js"><img src="https://img.shields.io/npm/v/discord.js.svg?maxAge=3600" alt="npm version" /></a>
10
10
  <a href="https://www.npmjs.com/package/discord.js"><img src="https://img.shields.io/npm/dt/discord.js.svg?maxAge=3600" alt="npm downloads" /></a>
11
11
  <a href="https://github.com/discordjs/discord.js/actions"><img src="https://github.com/discordjs/discord.js/actions/workflows/test.yml/badge.svg" alt="Tests status" /></a>
12
- <a href="https://github.com/discordjs/discord.js/commits/main/packages/discord.js"><img alt="Last commit." src="https://img.shields.io/github/last-commit/discordjs/discord.js?logo=github&logoColor=ffffff&path=packages%2Fdiscord.js"></a>
12
+ <a href="https://github.com/discordjs/discord.js/commits/main/packages/discord.js"><img alt="Last commit." src="https://img.shields.io/github/last-commit/discordjs/discord.js?logo=github&logoColor=ffffff&path=packages%2Fdiscord.js" /></a>
13
13
  <a href="https://codecov.io/gh/discordjs/discord.js"><img src="https://codecov.io/gh/discordjs/discord.js/branch/main/graph/badge.svg?precision=2" alt="Code coverage" /></a>
14
14
  </p>
15
15
  <p>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "discord.js",
4
- "version": "15.0.0-dev.1739361916-64494137d",
4
+ "version": "15.0.0-dev.1739621068-b7fd2d105",
5
5
  "description": "A powerful library for interacting with the Discord API",
6
6
  "main": "./src/index.js",
7
7
  "types": "./typings/index.d.ts",
@@ -60,11 +60,11 @@
60
60
  "lodash.snakecase": "4.1.1",
61
61
  "tslib": "^2.8.1",
62
62
  "undici": "6.21.1",
63
+ "@discordjs/collection": "^2.1.1",
63
64
  "@discordjs/rest": "^2.4.0",
64
- "@discordjs/ws": "^2.0.0",
65
- "@discordjs/formatters": "^0.5.0",
66
65
  "@discordjs/util": "^1.1.1",
67
- "@discordjs/collection": "^2.1.1"
66
+ "@discordjs/formatters": "^0.5.0",
67
+ "@discordjs/ws": "^2.0.0"
68
68
  },
69
69
  "devDependencies": {
70
70
  "@favware/cliff-jumper": "^4.1.0",
@@ -81,8 +81,8 @@
81
81
  "tslint": "6.1.3",
82
82
  "turbo": "^2.3.3",
83
83
  "typescript": "~5.5.4",
84
- "@discordjs/docgen": "^0.12.1",
85
84
  "@discordjs/api-extractor": "^7.38.1",
85
+ "@discordjs/docgen": "^0.12.1",
86
86
  "@discordjs/scripts": "^0.1.0"
87
87
  },
88
88
  "engines": {
@@ -11,7 +11,6 @@ const { ActionsManager } = require('./actions/ActionsManager.js');
11
11
  const { ClientVoiceManager } = require('./voice/ClientVoiceManager.js');
12
12
  const { PacketHandlers } = require('./websocket/handlers/index.js');
13
13
  const { DiscordjsError, DiscordjsTypeError, ErrorCodes } = require('../errors/index.js');
14
- const { BaseGuildEmojiManager } = require('../managers/BaseGuildEmojiManager.js');
15
14
  const { ChannelManager } = require('../managers/ChannelManager.js');
16
15
  const { GuildManager } = require('../managers/GuildManager.js');
17
16
  const { UserManager } = require('../managers/UserManager.js');
@@ -217,19 +216,6 @@ class Client extends BaseClient {
217
216
  this._attachEvents();
218
217
  }
219
218
 
220
- /**
221
- * A manager of all the custom emojis that the client has access to
222
- * @type {BaseGuildEmojiManager}
223
- * @readonly
224
- */
225
- get emojis() {
226
- const emojis = new BaseGuildEmojiManager(this);
227
- for (const guild of this.guilds.cache.values()) {
228
- if (guild.available) for (const emoji of guild.emojis.cache.values()) emojis.cache.set(emoji.id, emoji);
229
- }
230
- return emojis;
231
- }
232
-
233
219
  /**
234
220
  * Time at which the client was last regarded as being in the {@link Status.Ready} state
235
221
  * (each time the client disconnects and successfully reconnects, this will be overwritten)
package/src/index.js CHANGED
@@ -58,7 +58,6 @@ exports.ApplicationCommandPermissionsManager =
58
58
  require('./managers/ApplicationCommandPermissionsManager.js').ApplicationCommandPermissionsManager;
59
59
  exports.ApplicationEmojiManager = require('./managers/ApplicationEmojiManager.js').ApplicationEmojiManager;
60
60
  exports.AutoModerationRuleManager = require('./managers/AutoModerationRuleManager.js').AutoModerationRuleManager;
61
- exports.BaseGuildEmojiManager = require('./managers/BaseGuildEmojiManager.js').BaseGuildEmojiManager;
62
61
  exports.CachedManager = require('./managers/CachedManager.js').CachedManager;
63
62
  exports.ChannelManager = require('./managers/ChannelManager.js').ChannelManager;
64
63
  exports.ClientVoiceManager = require('./client/voice/ClientVoiceManager.js').ClientVoiceManager;
@@ -1,18 +1,21 @@
1
1
  'use strict';
2
-
3
2
  const { Collection } = require('@discordjs/collection');
4
3
  const { Routes, PermissionFlagsBits } = require('discord-api-types/v10');
5
- const { BaseGuildEmojiManager } = require('./BaseGuildEmojiManager.js');
4
+ const { CachedManager } = require('./CachedManager.js');
6
5
  const { DiscordjsError, DiscordjsTypeError, ErrorCodes } = require('../errors/index.js');
6
+ const { ApplicationEmoji } = require('../structures/ApplicationEmoji.js');
7
+ const { GuildEmoji } = require('../structures/GuildEmoji.js');
8
+ const { ReactionEmoji } = require('../structures/ReactionEmoji.js');
7
9
  const { resolveImage } = require('../util/DataResolver.js');
10
+ const { parseEmoji } = require('../util/Util.js');
8
11
 
9
12
  /**
10
13
  * Manages API methods for GuildEmojis and stores their cache.
11
- * @extends {BaseGuildEmojiManager}
14
+ * @extends {CachedManager}
12
15
  */
13
- class GuildEmojiManager extends BaseGuildEmojiManager {
16
+ class GuildEmojiManager extends CachedManager {
14
17
  constructor(guild, iterable) {
15
- super(guild.client, iterable);
18
+ super(guild.client, GuildEmoji, iterable);
16
19
 
17
20
  /**
18
21
  * The guild this manager belongs to
@@ -25,6 +28,72 @@ class GuildEmojiManager extends BaseGuildEmojiManager {
25
28
  return super._add(data, cache, { extras: [this.guild] });
26
29
  }
27
30
 
31
+ /**
32
+ * The cache of GuildEmojis
33
+ * @type {Collection<Snowflake, GuildEmoji>}
34
+ * @name GuildEmojiManager#cache
35
+ */
36
+
37
+ /**
38
+ * Data that can be resolved into a GuildEmoji object. This can be:
39
+ * * A Snowflake
40
+ * * A GuildEmoji object
41
+ * * A ReactionEmoji object
42
+ * * An ApplicationEmoji object
43
+ * @typedef {Snowflake|GuildEmoji|ReactionEmoji|ApplicationEmoji} EmojiResolvable
44
+ */
45
+
46
+ /**
47
+ * Resolves an EmojiResolvable to an Emoji object.
48
+ * @param {EmojiResolvable} emoji The Emoji resolvable to identify
49
+ * @returns {?GuildEmoji}
50
+ */
51
+ resolve(emoji) {
52
+ if (emoji instanceof ReactionEmoji) return super.cache.get(emoji.id) ?? null;
53
+ if (emoji instanceof ApplicationEmoji) return super.cache.get(emoji.id) ?? null;
54
+ return super.resolve(emoji);
55
+ }
56
+
57
+ /**
58
+ * Resolves an EmojiResolvable to an Emoji id string.
59
+ * @param {EmojiResolvable} emoji The Emoji resolvable to identify
60
+ * @returns {?Snowflake}
61
+ */
62
+ resolveId(emoji) {
63
+ if (emoji instanceof ReactionEmoji) return emoji.id;
64
+ if (emoji instanceof ApplicationEmoji) return emoji.id;
65
+ return super.resolveId(emoji);
66
+ }
67
+
68
+ /**
69
+ * Data that can be resolved to give an emoji identifier. This can be:
70
+ * * An EmojiResolvable
71
+ * * The `<a:name:id>`, `<:name:id>`, `a:name:id` or `name:id` emoji identifier string of an emoji
72
+ * * The Unicode representation of an emoji
73
+ * @typedef {string|EmojiResolvable} EmojiIdentifierResolvable
74
+ */
75
+
76
+ /**
77
+ * Resolves an EmojiResolvable to an emoji identifier.
78
+ * @param {EmojiIdentifierResolvable} emoji The emoji resolvable to resolve
79
+ * @returns {?string}
80
+ */
81
+ resolveIdentifier(emoji) {
82
+ const emojiResolvable = this.resolve(emoji);
83
+ if (emojiResolvable) return emojiResolvable.identifier;
84
+ if (emoji instanceof ReactionEmoji) return emoji.identifier;
85
+ if (emoji instanceof ApplicationEmoji) return emoji.identifier;
86
+ if (typeof emoji === 'string') {
87
+ const res = parseEmoji(emoji);
88
+ if (res?.name.length) {
89
+ emoji = `${res.animated ? 'a:' : ''}${res.name}${res.id ? `:${res.id}` : ''}`;
90
+ }
91
+ if (!emoji.includes('%')) return encodeURIComponent(emoji);
92
+ return emoji;
93
+ }
94
+ return null;
95
+ }
96
+
28
97
  /**
29
98
  * Options used for creating an emoji in a guild.
30
99
  * @typedef {Object} GuildEmojiCreateOptions
@@ -79,7 +79,7 @@ class GuildOnboardingPromptOption extends Base {
79
79
  */
80
80
  get emoji() {
81
81
  if (!this._emoji.id && !this._emoji.name) return null;
82
- return this.client.emojis.cache.get(this._emoji.id) ?? new Emoji(this.client, this._emoji);
82
+ return this.guild.emojis.cache.get(this._emoji.id) ?? new Emoji(this.client, this._emoji);
83
83
  }
84
84
  }
85
85
 
@@ -5,7 +5,7 @@ const { ApplicationEmoji } = require('./ApplicationEmoji.js');
5
5
  const { GuildEmoji } = require('./GuildEmoji.js');
6
6
  const { ReactionEmoji } = require('./ReactionEmoji.js');
7
7
  const { ReactionUserManager } = require('../managers/ReactionUserManager.js');
8
- const { flatten } = require('../util/Util.js');
8
+ const { flatten, resolveGuildEmoji } = require('../util/Util.js');
9
9
 
10
10
  /**
11
11
  * Represents a reaction to a message.
@@ -127,14 +127,9 @@ class MessageReaction {
127
127
  this._emoji = emoji;
128
128
  return emoji;
129
129
  }
130
- const emojis = this.message.client.emojis.cache;
131
- if (emojis.has(this._emoji.id)) {
132
- const emoji = emojis.get(this._emoji.id);
133
- this._emoji = emoji;
134
- return emoji;
135
- }
136
130
  }
137
- return this._emoji;
131
+ const emoji = resolveGuildEmoji(this.client, this._emoji.id);
132
+ return emoji ?? this._emoji;
138
133
  }
139
134
 
140
135
  /**
@@ -2,6 +2,7 @@
2
2
 
3
3
  const { Base } = require('./Base.js');
4
4
  const { Emoji } = require('./Emoji.js');
5
+ const { resolveGuildEmoji } = require('../util/Util.js');
5
6
 
6
7
  /**
7
8
  * Represents an answer to a {@link Poll}
@@ -61,7 +62,7 @@ class PollAnswer extends Base {
61
62
  */
62
63
  get emoji() {
63
64
  if (!this._emoji || (!this._emoji.id && !this._emoji.name)) return null;
64
- return this.client.emojis.cache.get(this._emoji.id) ?? new Emoji(this.client, this._emoji);
65
+ return resolveGuildEmoji(this.client, this._emoji.id) ?? new Emoji(this.client, this._emoji);
65
66
  }
66
67
 
67
68
  /**
@@ -53,7 +53,7 @@ class WelcomeChannel extends Base {
53
53
  * @type {GuildEmoji|Emoji}
54
54
  */
55
55
  get emoji() {
56
- return this.client.emojis.cache.get(this._emoji.id) ?? new Emoji(this.client, this._emoji);
56
+ return this.guild.emojis.cache.get(this._emoji.id) ?? new Emoji(this.client, this._emoji);
57
57
  }
58
58
  }
59
59
 
package/src/util/Util.js CHANGED
@@ -122,6 +122,29 @@ function resolvePartialEmoji(emoji) {
122
122
  return { id, name, animated: Boolean(animated) };
123
123
  }
124
124
 
125
+ /**
126
+ * Resolves a {@link GuildEmoji} from an emoji id.
127
+ * @param {Client} client The client to use to resolve the emoji
128
+ * @param {Snowflake} emojiId The emoji id to resolve
129
+ * @returns {?GuildEmoji}
130
+ * @private
131
+ */
132
+ function resolveGuildEmoji(client, emojiId) {
133
+ for (const guild of client.guilds.cache.values()) {
134
+ if (!guild.available) {
135
+ continue;
136
+ }
137
+
138
+ const emoji = guild.emojis.cache.get(emojiId);
139
+
140
+ if (emoji) {
141
+ return emoji;
142
+ }
143
+ }
144
+
145
+ return null;
146
+ }
147
+
125
148
  /**
126
149
  * Options used to make an error object.
127
150
  * @typedef {Object} MakeErrorOptions
@@ -503,6 +526,7 @@ exports.flatten = flatten;
503
526
  exports.fetchRecommendedShardCount = fetchRecommendedShardCount;
504
527
  exports.parseEmoji = parseEmoji;
505
528
  exports.resolvePartialEmoji = resolvePartialEmoji;
529
+ exports.resolveGuildEmoji = resolveGuildEmoji;
506
530
  exports.makeError = makeError;
507
531
  exports.makePlainError = makePlainError;
508
532
  exports.getSortableGroupTypes = getSortableGroupTypes;
@@ -976,7 +976,6 @@ export class Client<Ready extends boolean = boolean> extends BaseClient<ClientEv
976
976
 
977
977
  public application: If<Ready, ClientApplication>;
978
978
  public channels: ChannelManager;
979
- public get emojis(): BaseGuildEmojiManager;
980
979
  public guilds: GuildManager;
981
980
  public lastPingTimestamps: ReadonlyCollection<number, number>;
982
981
  public options: Omit<ClientOptions, 'intents'> & { intents: IntentsBitField };
@@ -3456,6 +3455,7 @@ export function discordSort<Key, Value extends { rawPosition: number; id: Snowfl
3456
3455
  export function cleanCodeBlockContent(text: string): string;
3457
3456
  export function fetchRecommendedShardCount(token: string, options?: FetchRecommendedShardCountOptions): Promise<number>;
3458
3457
  export function flatten(obj: unknown, ...props: Record<string, boolean | string>[]): unknown;
3458
+
3459
3459
  /** @internal */
3460
3460
  export function makeError(obj: MakeErrorOptions): Error;
3461
3461
  /** @internal */
@@ -3474,6 +3474,8 @@ export function resolveColor(color: ColorResolvable): number;
3474
3474
  export function resolvePartialEmoji(emoji: Snowflake): PartialEmojiOnlyId;
3475
3475
  /** @internal */
3476
3476
  export function resolvePartialEmoji(emoji: Emoji | EmojiIdentifierResolvable): PartialEmoji | null;
3477
+ /** @internal */
3478
+ export function resolveGuildEmoji(client: Client, emojiId: Snowflake): GuildEmoji | null;
3477
3479
  export function verifyString(data: string, error?: typeof Error, errorMessage?: string, allowEmpty?: boolean): string;
3478
3480
  /** @internal */
3479
3481
  export function setPosition<Item extends Channel | Role>(
@@ -3997,11 +3999,6 @@ export class AutoModerationRuleManager extends CachedManager<
3997
3999
  public delete(autoModerationRule: AutoModerationRuleResolvable, reason?: string): Promise<void>;
3998
4000
  }
3999
4001
 
4000
- export class BaseGuildEmojiManager extends CachedManager<Snowflake, GuildEmoji, EmojiResolvable> {
4001
- protected constructor(client: Client<true>, iterable?: Iterable<RawGuildEmojiData>);
4002
- public resolveIdentifier(emoji: EmojiIdentifierResolvable): string | null;
4003
- }
4004
-
4005
4002
  export class CategoryChannelChildManager extends DataManager<Snowflake, CategoryChildChannel, GuildChannelResolvable> {
4006
4003
  private constructor(channel: CategoryChannel);
4007
4004
 
@@ -4142,7 +4139,7 @@ export class GuildChannelManager extends CachedManager<Snowflake, GuildBasedChan
4142
4139
  public delete(channel: GuildChannelResolvable, reason?: string): Promise<void>;
4143
4140
  }
4144
4141
 
4145
- export class GuildEmojiManager extends BaseGuildEmojiManager {
4142
+ export class GuildEmojiManager extends CachedManager<Snowflake, GuildEmoji, EmojiResolvable> {
4146
4143
  private constructor(guild: Guild, iterable?: Iterable<RawGuildEmojiData>);
4147
4144
  public guild: Guild;
4148
4145
  public create(options: GuildEmojiCreateOptions): Promise<GuildEmoji>;
@@ -4151,6 +4148,7 @@ export class GuildEmojiManager extends BaseGuildEmojiManager {
4151
4148
  public fetchAuthor(emoji: EmojiResolvable): Promise<User>;
4152
4149
  public delete(emoji: EmojiResolvable, reason?: string): Promise<void>;
4153
4150
  public edit(emoji: EmojiResolvable, options: GuildEmojiEditOptions): Promise<GuildEmoji>;
4151
+ public resolveIdentifier(emoji: EmojiIdentifierResolvable): string | null;
4154
4152
  }
4155
4153
 
4156
4154
  export class GuildEmojiRoleManager extends DataManager<Snowflake, Role, RoleResolvable> {
@@ -4969,7 +4967,6 @@ export interface Caches {
4969
4967
  ApplicationCommandManager: [manager: typeof ApplicationCommandManager, holds: typeof ApplicationCommand];
4970
4968
  ApplicationEmojiManager: [manager: typeof ApplicationEmojiManager, holds: typeof ApplicationEmoji];
4971
4969
  AutoModerationRuleManager: [manager: typeof AutoModerationRuleManager, holds: typeof AutoModerationRule];
4972
- BaseGuildEmojiManager: [manager: typeof BaseGuildEmojiManager, holds: typeof GuildEmoji];
4973
4970
  // TODO: ChannelManager: [manager: typeof ChannelManager, holds: typeof Channel];
4974
4971
  DMMessageManager: [manager: typeof MessageManager, holds: typeof Message<false>];
4975
4972
  EntitlementManager: [manager: typeof EntitlementManager, holds: typeof Entitlement];
@@ -976,7 +976,6 @@ export class Client<Ready extends boolean = boolean> extends BaseClient<ClientEv
976
976
 
977
977
  public application: If<Ready, ClientApplication>;
978
978
  public channels: ChannelManager;
979
- public get emojis(): BaseGuildEmojiManager;
980
979
  public guilds: GuildManager;
981
980
  public lastPingTimestamps: ReadonlyCollection<number, number>;
982
981
  public options: Omit<ClientOptions, 'intents'> & { intents: IntentsBitField };
@@ -3456,6 +3455,7 @@ export function discordSort<Key, Value extends { rawPosition: number; id: Snowfl
3456
3455
  export function cleanCodeBlockContent(text: string): string;
3457
3456
  export function fetchRecommendedShardCount(token: string, options?: FetchRecommendedShardCountOptions): Promise<number>;
3458
3457
  export function flatten(obj: unknown, ...props: Record<string, boolean | string>[]): unknown;
3458
+
3459
3459
  /** @internal */
3460
3460
  export function makeError(obj: MakeErrorOptions): Error;
3461
3461
  /** @internal */
@@ -3474,6 +3474,8 @@ export function resolveColor(color: ColorResolvable): number;
3474
3474
  export function resolvePartialEmoji(emoji: Snowflake): PartialEmojiOnlyId;
3475
3475
  /** @internal */
3476
3476
  export function resolvePartialEmoji(emoji: Emoji | EmojiIdentifierResolvable): PartialEmoji | null;
3477
+ /** @internal */
3478
+ export function resolveGuildEmoji(client: Client, emojiId: Snowflake): GuildEmoji | null;
3477
3479
  export function verifyString(data: string, error?: typeof Error, errorMessage?: string, allowEmpty?: boolean): string;
3478
3480
  /** @internal */
3479
3481
  export function setPosition<Item extends Channel | Role>(
@@ -3997,11 +3999,6 @@ export class AutoModerationRuleManager extends CachedManager<
3997
3999
  public delete(autoModerationRule: AutoModerationRuleResolvable, reason?: string): Promise<void>;
3998
4000
  }
3999
4001
 
4000
- export class BaseGuildEmojiManager extends CachedManager<Snowflake, GuildEmoji, EmojiResolvable> {
4001
- protected constructor(client: Client<true>, iterable?: Iterable<RawGuildEmojiData>);
4002
- public resolveIdentifier(emoji: EmojiIdentifierResolvable): string | null;
4003
- }
4004
-
4005
4002
  export class CategoryChannelChildManager extends DataManager<Snowflake, CategoryChildChannel, GuildChannelResolvable> {
4006
4003
  private constructor(channel: CategoryChannel);
4007
4004
 
@@ -4142,7 +4139,7 @@ export class GuildChannelManager extends CachedManager<Snowflake, GuildBasedChan
4142
4139
  public delete(channel: GuildChannelResolvable, reason?: string): Promise<void>;
4143
4140
  }
4144
4141
 
4145
- export class GuildEmojiManager extends BaseGuildEmojiManager {
4142
+ export class GuildEmojiManager extends CachedManager<Snowflake, GuildEmoji, EmojiResolvable> {
4146
4143
  private constructor(guild: Guild, iterable?: Iterable<RawGuildEmojiData>);
4147
4144
  public guild: Guild;
4148
4145
  public create(options: GuildEmojiCreateOptions): Promise<GuildEmoji>;
@@ -4151,6 +4148,7 @@ export class GuildEmojiManager extends BaseGuildEmojiManager {
4151
4148
  public fetchAuthor(emoji: EmojiResolvable): Promise<User>;
4152
4149
  public delete(emoji: EmojiResolvable, reason?: string): Promise<void>;
4153
4150
  public edit(emoji: EmojiResolvable, options: GuildEmojiEditOptions): Promise<GuildEmoji>;
4151
+ public resolveIdentifier(emoji: EmojiIdentifierResolvable): string | null;
4154
4152
  }
4155
4153
 
4156
4154
  export class GuildEmojiRoleManager extends DataManager<Snowflake, Role, RoleResolvable> {
@@ -4969,7 +4967,6 @@ export interface Caches {
4969
4967
  ApplicationCommandManager: [manager: typeof ApplicationCommandManager, holds: typeof ApplicationCommand];
4970
4968
  ApplicationEmojiManager: [manager: typeof ApplicationEmojiManager, holds: typeof ApplicationEmoji];
4971
4969
  AutoModerationRuleManager: [manager: typeof AutoModerationRuleManager, holds: typeof AutoModerationRule];
4972
- BaseGuildEmojiManager: [manager: typeof BaseGuildEmojiManager, holds: typeof GuildEmoji];
4973
4970
  // TODO: ChannelManager: [manager: typeof ChannelManager, holds: typeof Channel];
4974
4971
  DMMessageManager: [manager: typeof MessageManager, holds: typeof Message<false>];
4975
4972
  EntitlementManager: [manager: typeof EntitlementManager, holds: typeof Entitlement];
@@ -1,85 +0,0 @@
1
- 'use strict';
2
-
3
- const { CachedManager } = require('./CachedManager.js');
4
- const { ApplicationEmoji } = require('../structures/ApplicationEmoji.js');
5
- const { GuildEmoji } = require('../structures/GuildEmoji.js');
6
- const { ReactionEmoji } = require('../structures/ReactionEmoji.js');
7
- const { parseEmoji } = require('../util/Util.js');
8
-
9
- /**
10
- * Holds methods to resolve GuildEmojis and stores their cache.
11
- * @extends {CachedManager}
12
- */
13
- class BaseGuildEmojiManager extends CachedManager {
14
- constructor(client, iterable) {
15
- super(client, GuildEmoji, iterable);
16
- }
17
-
18
- /**
19
- * The cache of GuildEmojis
20
- * @type {Collection<Snowflake, GuildEmoji>}
21
- * @name BaseGuildEmojiManager#cache
22
- */
23
-
24
- /**
25
- * Data that can be resolved into a GuildEmoji object. This can be:
26
- * * A Snowflake
27
- * * A GuildEmoji object
28
- * * A ReactionEmoji object
29
- * * An ApplicationEmoji object
30
- * @typedef {Snowflake|GuildEmoji|ReactionEmoji|ApplicationEmoji} EmojiResolvable
31
- */
32
-
33
- /**
34
- * Resolves an EmojiResolvable to an Emoji object.
35
- * @param {EmojiResolvable} emoji The Emoji resolvable to identify
36
- * @returns {?GuildEmoji}
37
- */
38
- resolve(emoji) {
39
- if (emoji instanceof ReactionEmoji) return super.cache.get(emoji.id) ?? null;
40
- if (emoji instanceof ApplicationEmoji) return super.cache.get(emoji.id) ?? null;
41
- return super.resolve(emoji);
42
- }
43
-
44
- /**
45
- * Resolves an EmojiResolvable to an Emoji id string.
46
- * @param {EmojiResolvable} emoji The Emoji resolvable to identify
47
- * @returns {?Snowflake}
48
- */
49
- resolveId(emoji) {
50
- if (emoji instanceof ReactionEmoji) return emoji.id;
51
- if (emoji instanceof ApplicationEmoji) return emoji.id;
52
- return super.resolveId(emoji);
53
- }
54
-
55
- /**
56
- * Data that can be resolved to give an emoji identifier. This can be:
57
- * * An EmojiResolvable
58
- * * The `<a:name:id>`, `<:name:id>`, `a:name:id` or `name:id` emoji identifier string of an emoji
59
- * * The Unicode representation of an emoji
60
- * @typedef {string|EmojiResolvable} EmojiIdentifierResolvable
61
- */
62
-
63
- /**
64
- * Resolves an EmojiResolvable to an emoji identifier.
65
- * @param {EmojiIdentifierResolvable} emoji The emoji resolvable to resolve
66
- * @returns {?string}
67
- */
68
- resolveIdentifier(emoji) {
69
- const emojiResolvable = this.resolve(emoji);
70
- if (emojiResolvable) return emojiResolvable.identifier;
71
- if (emoji instanceof ReactionEmoji) return emoji.identifier;
72
- if (emoji instanceof ApplicationEmoji) return emoji.identifier;
73
- if (typeof emoji === 'string') {
74
- const res = parseEmoji(emoji);
75
- if (res?.name.length) {
76
- emoji = `${res.animated ? 'a:' : ''}${res.name}${res.id ? `:${res.id}` : ''}`;
77
- }
78
- if (!emoji.includes('%')) return encodeURIComponent(emoji);
79
- return emoji;
80
- }
81
- return null;
82
- }
83
- }
84
-
85
- exports.BaseGuildEmojiManager = BaseGuildEmojiManager;