diff --git a/src/structures/Emoji.js b/src/structures/Emoji.js index d1cca2843..302ebfccd 100644 --- a/src/structures/Emoji.js +++ b/src/structures/Emoji.js @@ -45,6 +45,12 @@ class Emoji extends Base { */ this.managed = data.managed; + /** + * Whether this emoji is animated + * @type {boolean} + */ + this.animated = data.animated; + this._roles = data.roles; } @@ -85,7 +91,7 @@ class Emoji extends Base { * @readonly */ get url() { - return this.client.rest.cdn.Emoji(this.id); + return this.client.rest.cdn.Emoji(this.id, this.animated ? 'gif' : 'png'); } /** @@ -198,7 +204,11 @@ class Emoji extends Base { * msg.reply(`Hello! ${emoji}`); */ toString() { - return this.requiresColons ? `<:${this.name}:${this.id}>` : this.name; + if (!this.id || !this.requiresColons) { + return this.name; + } + + return `<${this.animated ? 'a' : ''}:${this.name}:${this.id}>`; } /** diff --git a/src/util/Constants.js b/src/util/Constants.js index efeeb29fa..bc67df35c 100644 --- a/src/util/Constants.js +++ b/src/util/Constants.js @@ -110,7 +110,7 @@ function makeImageUrl(root, { format = 'webp', size } = {}) { exports.Endpoints = { CDN(root) { return { - Emoji: emojiID => `${root}/emojis/${emojiID}.png`, + Emoji: (emojiID, format = 'png') => `${root}/emojis/${emojiID}.${format}`, Asset: name => `${root}/assets/${name}`, DefaultAvatar: number => `${root}/embed/avatars/${number}.png`, Avatar: (userID, hash, format = 'default', size) => { diff --git a/src/util/Util.js b/src/util/Util.js index d92dc94b7..f1758000d 100644 --- a/src/util/Util.js +++ b/src/util/Util.js @@ -70,18 +70,21 @@ class Util { * Parses emoji info out of a string. The string must be one of: * * A UTF-8 emoji (no ID) * * A URL-encoded UTF-8 emoji (no ID) - * * A Discord custom emoji (`<:name:id>`) + * * A Discord custom emoji (`<:name:id>` or ``) * @param {string} text Emoji string to parse - * @returns {Object} Object with `name` and `id` properties + * @returns {Object} Object with `animated`, `name`, and `id` properties * @private */ static parseEmoji(text) { if (text.includes('%')) text = decodeURIComponent(text); if (text.includes(':')) { - const [name, id] = text.split(':'); - return { name, id }; + const m = text.match(/?/); + if (!m) { + return null; + } + return { animated: Boolean(m[1]), name: m[2], id: m[3] }; } else { - return { name: text, id: null }; + return { animated: false, name: text, id: null }; } }