summaryrefslogtreecommitdiff
path: root/node_modules/discord.js/src/managers/GuildEmojiManager.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/discord.js/src/managers/GuildEmojiManager.js')
-rw-r--r--node_modules/discord.js/src/managers/GuildEmojiManager.js174
1 files changed, 174 insertions, 0 deletions
diff --git a/node_modules/discord.js/src/managers/GuildEmojiManager.js b/node_modules/discord.js/src/managers/GuildEmojiManager.js
new file mode 100644
index 0000000..61f5050
--- /dev/null
+++ b/node_modules/discord.js/src/managers/GuildEmojiManager.js
@@ -0,0 +1,174 @@
+'use strict';
+
+const { Collection } = require('@discordjs/collection');
+const { Routes, PermissionFlagsBits } = require('discord-api-types/v10');
+const BaseGuildEmojiManager = require('./BaseGuildEmojiManager');
+const { DiscordjsError, DiscordjsTypeError, ErrorCodes } = require('../errors');
+const DataResolver = require('../util/DataResolver');
+
+/**
+ * Manages API methods for GuildEmojis and stores their cache.
+ * @extends {BaseGuildEmojiManager}
+ */
+class GuildEmojiManager extends BaseGuildEmojiManager {
+ constructor(guild, iterable) {
+ super(guild.client, iterable);
+
+ /**
+ * The guild this manager belongs to
+ * @type {Guild}
+ */
+ this.guild = guild;
+ }
+
+ _add(data, cache) {
+ return super._add(data, cache, { extras: [this.guild] });
+ }
+
+ /**
+ * Options used for creating an emoji in a guild.
+ * @typedef {Object} GuildEmojiCreateOptions
+ * @property {BufferResolvable|Base64Resolvable} attachment The image for the emoji
+ * @property {string} name The name for the emoji
+ * @property {Collection<Snowflake, Role>|RoleResolvable[]} [roles] The roles to limit the emoji to
+ * @property {string} [reason] The reason for creating the emoji
+ */
+
+ /**
+ * Creates a new custom emoji in the guild.
+ * @param {GuildEmojiCreateOptions} options Options for creating the emoji
+ * @returns {Promise<Emoji>} The created emoji
+ * @example
+ * // Create a new emoji from a URL
+ * guild.emojis.create({ attachment: 'https://i.imgur.com/w3duR07.png', name: 'rip' })
+ * .then(emoji => console.log(`Created new emoji with name ${emoji.name}!`))
+ * .catch(console.error);
+ * @example
+ * // Create a new emoji from a file on your computer
+ * guild.emojis.create({ attachment: './memes/banana.png', name: 'banana' })
+ * .then(emoji => console.log(`Created new emoji with name ${emoji.name}!`))
+ * .catch(console.error);
+ */
+ async create({ attachment, name, roles, reason }) {
+ attachment = await DataResolver.resolveImage(attachment);
+ if (!attachment) throw new DiscordjsTypeError(ErrorCodes.ReqResourceType);
+
+ const body = { image: attachment, name };
+ if (roles) {
+ if (!Array.isArray(roles) && !(roles instanceof Collection)) {
+ throw new DiscordjsTypeError(
+ ErrorCodes.InvalidType,
+ 'options.roles',
+ 'Array or Collection of Roles or Snowflakes',
+ true,
+ );
+ }
+ body.roles = [];
+ for (const role of roles.values()) {
+ const resolvedRole = this.guild.roles.resolveId(role);
+ if (!resolvedRole) {
+ throw new DiscordjsTypeError(ErrorCodes.InvalidElement, 'Array or Collection', 'options.roles', role);
+ }
+ body.roles.push(resolvedRole);
+ }
+ }
+
+ const emoji = await this.client.rest.post(Routes.guildEmojis(this.guild.id), { body, reason });
+ return this.client.actions.GuildEmojiCreate.handle(this.guild, emoji).emoji;
+ }
+
+ /**
+ * Obtains one or more emojis from Discord, or the emoji cache if they're already available.
+ * @param {Snowflake} [id] The emoji's id
+ * @param {BaseFetchOptions} [options] Additional options for this fetch
+ * @returns {Promise<GuildEmoji|Collection<Snowflake, GuildEmoji>>}
+ * @example
+ * // Fetch all emojis from the guild
+ * message.guild.emojis.fetch()
+ * .then(emojis => console.log(`There are ${emojis.size} emojis.`))
+ * .catch(console.error);
+ * @example
+ * // Fetch a single emoji
+ * message.guild.emojis.fetch('222078108977594368')
+ * .then(emoji => console.log(`The emoji name is: ${emoji.name}`))
+ * .catch(console.error);
+ */
+ async fetch(id, { cache = true, force = false } = {}) {
+ if (id) {
+ if (!force) {
+ const existing = this.cache.get(id);
+ if (existing) return existing;
+ }
+ const emoji = await this.client.rest.get(Routes.guildEmoji(this.guild.id, id));
+ return this._add(emoji, cache);
+ }
+
+ const data = await this.client.rest.get(Routes.guildEmojis(this.guild.id));
+ const emojis = new Collection();
+ for (const emoji of data) emojis.set(emoji.id, this._add(emoji, cache));
+ return emojis;
+ }
+
+ /**
+ * Deletes an emoji.
+ * @param {EmojiResolvable} emoji The Emoji resolvable to delete
+ * @param {string} [reason] Reason for deleting the emoji
+ * @returns {Promise<void>}
+ */
+ async delete(emoji, reason) {
+ const id = this.resolveId(emoji);
+ if (!id) throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'emoji', 'EmojiResolvable', true);
+ await this.client.rest.delete(Routes.guildEmoji(this.guild.id, id), { reason });
+ }
+
+ /**
+ * Edits an emoji.
+ * @param {EmojiResolvable} emoji The Emoji resolvable to edit
+ * @param {GuildEmojiEditOptions} options The options to provide
+ * @returns {Promise<GuildEmoji>}
+ */
+ async edit(emoji, options) {
+ const id = this.resolveId(emoji);
+ if (!id) throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'emoji', 'EmojiResolvable', true);
+ const roles = options.roles?.map(r => this.guild.roles.resolveId(r));
+ const newData = await this.client.rest.patch(Routes.guildEmoji(this.guild.id, id), {
+ body: {
+ name: options.name,
+ roles,
+ },
+ reason: options.reason,
+ });
+ const existing = this.cache.get(id);
+ if (existing) {
+ const clone = existing._clone();
+ clone._patch(newData);
+ return clone;
+ }
+ return this._add(newData);
+ }
+
+ /**
+ * Fetches the author for this emoji
+ * @param {EmojiResolvable} emoji The emoji to fetch the author of
+ * @returns {Promise<User>}
+ */
+ async fetchAuthor(emoji) {
+ emoji = this.resolve(emoji);
+ if (!emoji) throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'emoji', 'EmojiResolvable', true);
+ if (emoji.managed) {
+ throw new DiscordjsError(ErrorCodes.EmojiManaged);
+ }
+
+ const { me } = this.guild.members;
+ if (!me) throw new DiscordjsError(ErrorCodes.GuildUncachedMe);
+ if (!me.permissions.has(PermissionFlagsBits.ManageGuildExpressions)) {
+ throw new DiscordjsError(ErrorCodes.MissingManageGuildExpressionsPermission, this.guild);
+ }
+
+ const data = await this.client.rest.get(Routes.guildEmoji(this.guild.id, emoji.id));
+ emoji._patch(data);
+ return emoji.author;
+ }
+}
+
+module.exports = GuildEmojiManager;