mirror of
https://github.com/danbulant/discord.js
synced 2026-05-27 22:11:53 +00:00
* Initial commit: add 5 initial managers - Base manager - GuildChannelManager - MessageManager - PresenceManager - Reaction Manager - Added LimitedCollection * Add GuildEmojiManager, various fixes * Modify some managers and add guildmembermanager * Initial integration * Delete old stores * Integration part two, removed LRUCollection - Most of the integration has been finished - TODO typings - Removed LRUCollection, needless sweeping * Typings + stuff i somehow missed in ChannelManager * LimitedCollection typings/ final changes * Various jsdoc and syntactical fixes, Removed Util.mixin() * tslint fix * Grammatical and logical changes * Delete temporary file placed by mistake * Grammatical changes * Add missing type * Update jsdoc examples * fix: ChannelManager#remove should call cache#delete not cache#remove * fix recursive require * Fix missed cache in util * fix: more missed cache * Remove accidental _fetchMany change from #3645 * fix: use .cache.delete() over .remove() * fix: missing cache in ReactionCollector * fix: missed cache in client * fix: members is a collection not a manager Co-Authored-By: Sugden <28943913+NotSugden@users.noreply.github.com> * fix: various docs and cache fixes * fix: missed cache * fix: missing _roles * Final testing and debugging * LimitedCollection: return the Collection instead of undefined on .set * Add cache to BaseManager in typings * Commit fixes i forgot to stage yesterday * Update invite events * Account for new commit * fix: MessageReactionRemoveAll should call .cache.clear() * fix: add .cache at various places, correct return type * docs: remove mentions of 'store' * Add extra documented properties to typings Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com> Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
185 lines
4.9 KiB
JavaScript
185 lines
4.9 KiB
JavaScript
'use strict';
|
|
|
|
const GuildEmojiRoleManager = require('../managers/GuildEmojiRoleManager');
|
|
const Permissions = require('../util/Permissions');
|
|
const { Error } = require('../errors');
|
|
const Emoji = require('./Emoji');
|
|
|
|
/**
|
|
* Represents a custom emoji.
|
|
* @extends {Emoji}
|
|
*/
|
|
class GuildEmoji extends Emoji {
|
|
/**
|
|
* @param {Client} client The instantiating client
|
|
* @param {Object} data The data for the guild emoji
|
|
* @param {Guild} guild The guild the guild emoji is part of
|
|
*/
|
|
constructor(client, data, guild) {
|
|
super(client, data);
|
|
|
|
/**
|
|
* The guild this emoji is part of
|
|
* @type {Guild}
|
|
*/
|
|
this.guild = guild;
|
|
|
|
/**
|
|
* The ID of this emoji
|
|
* @type {Snowflake}
|
|
* @name GuildEmoji#id
|
|
*/
|
|
|
|
this._roles = [];
|
|
this._patch(data);
|
|
}
|
|
|
|
_patch(data) {
|
|
if (data.name) this.name = data.name;
|
|
|
|
/**
|
|
* Whether or not this emoji requires colons surrounding it
|
|
* @type {boolean}
|
|
* @name GuildEmoji#requiresColons
|
|
*/
|
|
if (typeof data.require_colons !== 'undefined') this.requiresColons = data.require_colons;
|
|
|
|
/**
|
|
* Whether this emoji is managed by an external service
|
|
* @type {boolean}
|
|
* @name GuildEmoji#managed
|
|
*/
|
|
if (typeof data.managed !== 'undefined') this.managed = data.managed;
|
|
|
|
/**
|
|
* Whether this emoji is available
|
|
* @type {boolean}
|
|
* @name GuildEmoji#available
|
|
*/
|
|
if (typeof data.available !== 'undefined') this.available = data.available;
|
|
|
|
if (data.roles) this._roles = data.roles;
|
|
}
|
|
|
|
_clone() {
|
|
const clone = super._clone();
|
|
clone._roles = this._roles.slice();
|
|
return clone;
|
|
}
|
|
|
|
/**
|
|
* Whether the emoji is deletable by the client user
|
|
* @type {boolean}
|
|
* @readonly
|
|
*/
|
|
get deletable() {
|
|
if (!this.guild.me) throw new Error('GUILD_UNCACHED_ME');
|
|
return !this.managed &&
|
|
this.guild.me.hasPermission(Permissions.FLAGS.MANAGE_EMOJIS);
|
|
}
|
|
|
|
/**
|
|
* A manager for roles this emoji is active for.
|
|
* @type {GuildEmojiRoleManager}
|
|
* @readonly
|
|
*/
|
|
get roles() {
|
|
return new GuildEmojiRoleManager(this);
|
|
}
|
|
|
|
/**
|
|
* Fetches the author for this emoji
|
|
* @returns {Promise<User>}
|
|
*/
|
|
fetchAuthor() {
|
|
if (this.managed) {
|
|
return Promise.reject(new Error('EMOJI_MANAGED'));
|
|
} else {
|
|
if (!this.guild.me) return Promise.reject(new Error('GUILD_UNCACHED_ME'));
|
|
if (!this.guild.me.permissions.has(Permissions.FLAGS.MANAGE_EMOJIS)) {
|
|
return Promise.reject(new Error('MISSING_MANAGE_EMOJIS_PERMISSION', this.guild));
|
|
}
|
|
}
|
|
return this.client.api.guilds(this.guild.id).emojis(this.id).get()
|
|
.then(emoji => this.client.users.add(emoji.user));
|
|
}
|
|
|
|
/**
|
|
* Data for editing an emoji.
|
|
* @typedef {Object} GuildEmojiEditData
|
|
* @property {string} [name] The name of the emoji
|
|
* @property {Collection<Snowflake, Role>|RoleResolvable[]} [roles] Roles to restrict emoji to
|
|
*/
|
|
|
|
/**
|
|
* Edits the emoji.
|
|
* @param {GuildEmojiEditData} data The new data for the emoji
|
|
* @param {string} [reason] Reason for editing this emoji
|
|
* @returns {Promise<GuildEmoji>}
|
|
* @example
|
|
* // Edit an emoji
|
|
* emoji.edit({ name: 'newemoji' })
|
|
* .then(e => console.log(`Edited emoji ${e}`))
|
|
* .catch(console.error);
|
|
*/
|
|
edit(data, reason) {
|
|
const roles = data.roles ? data.roles.map(r => r.id || r) : undefined;
|
|
return this.client.api.guilds(this.guild.id).emojis(this.id)
|
|
.patch({ data: {
|
|
name: data.name,
|
|
roles,
|
|
}, reason })
|
|
.then(newData => {
|
|
const clone = this._clone();
|
|
clone._patch(newData);
|
|
return clone;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Sets the name of the emoji.
|
|
* @param {string} name The new name for the emoji
|
|
* @param {string} [reason] Reason for changing the emoji's name
|
|
* @returns {Promise<GuildEmoji>}
|
|
*/
|
|
setName(name, reason) {
|
|
return this.edit({ name }, reason);
|
|
}
|
|
|
|
/**
|
|
* Deletes the emoji.
|
|
* @param {string} [reason] Reason for deleting the emoji
|
|
* @returns {Promise<GuildEmoji>}
|
|
*/
|
|
delete(reason) {
|
|
return this.client.api.guilds(this.guild.id).emojis(this.id).delete({ reason })
|
|
.then(() => this);
|
|
}
|
|
|
|
/**
|
|
* Whether this emoji is the same as another one.
|
|
* @param {GuildEmoji|Object} other The emoji to compare it to
|
|
* @returns {boolean} Whether the emoji is equal to the given emoji or not
|
|
*/
|
|
equals(other) {
|
|
if (other instanceof GuildEmoji) {
|
|
return (
|
|
other.id === this.id &&
|
|
other.name === this.name &&
|
|
other.managed === this.managed &&
|
|
other.requiresColons === this.requiresColons &&
|
|
other.roles.cache.size === this.roles.cache.size &&
|
|
other.roles.cache.every(role => this.roles.cache.has(role.id))
|
|
);
|
|
} else {
|
|
return (
|
|
other.id === this.id &&
|
|
other.name === this.name &&
|
|
other.roles.length === this.roles.cache.size &&
|
|
other.roles.every(role => this.roles.cache.has(role))
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = GuildEmoji;
|