UNPKG

@mkody/twitch-emoticons

Version:

Gets Twitch, BTTV, FFZ and 7TV emotes as well as parsing text to emotes!

114 lines (101 loc) 3.35 kB
const Emote = require('./Emote'); const Constants = require('../util/Constants'); /** @augments Emote */ class FFZEmote extends Emote { /** * An FFZ emote. * @param {Channel} channel - Channel this emote belongs to. * @param {string} id - ID of the emote. * @param {data} data - The raw emote data. */ constructor(channel, id, data) { super(channel, id, data); this.type = 'ffz'; } /** * The channel of this emote's creator. * Not guaranteed to contain the emote, or be cached. * @readonly * @type {?Channel} */ get owner() { return this.fetcher.channels.get(this.ownerName); } _setup(data) { super._setup(data); this.code = data.name; /** * The name of the emote creator's channel. * @type {?string} */ this.ownerName = 'owner' in data ? data.owner.name : null; /** * Available image sizes. * @type {string[]} */ this.sizes = 'animated' in data ? Object.keys(data.animated) : Object.keys(data.urls); /** * If emote is animated. * @type {boolean} */ this.animated = 'animated' in data; /** * The image type of the emote. * @type {string} */ this.imageType = 'animated' in data ? 'webp' : 'png'; /** * If the emote is a modifier and should be hidden. * @type {boolean} */ this.modifier = data.modifier && (data.modifier_flags & 1) !== 0; } /** * Gets the image link of the emote. * @param {number} size - The size of the image. * @returns {string} */ toLink(size = 0) { size = this.sizes[size]; if (this.animated) return Constants.FFZ.CDNAnimated(this.id, size); // eslint-disable-line new-cap return Constants.FFZ.CDN(this.id, size); // eslint-disable-line new-cap } /** * Override for `toObject`. * Will result in an Object representation of a FFZEmote * @returns {object} */ toObject() { return Object.assign({}, super.toObject(), { animated: this.animated, sizes: this.sizes, ownerName: this.ownerName, type: this.type, modifier: this.modifier }); } /** * Converts an emote Object into a FFZEmote * @param {object} [emoteObject] - Object representation of this emote * @param {Channel} [channel=null] - Channel this emote belongs to. * @returns {FFZEmote} */ static fromObject(emoteObject, channel = null) { // Need to convert sizes array to object, e.g. [1, 2, 4] -> { 1: '1', 2: '2', 4: '4' } const sizes_obj = emoteObject.sizes.reduce((acc, curr) => { acc[curr] = curr; return acc; }, {}); return new FFZEmote(channel, emoteObject.id, { code: emoteObject.code, name: emoteObject.code, urls: sizes_obj, ...emoteObject.animated ? { animated: sizes_obj } : {}, owner: { name: emoteObject.ownerName }, modifier: emoteObject.modifier, modifier_flags: emoteObject.modifier }); } } module.exports = FFZEmote;