struct/Emote.js

class Emote {
  /**
   * Base class for emotes.
   * This constructor is not to be used.
   * @param {Channel} channel - Channel this emote belongs to.
   * @param {string} id - ID of the emote.
   * @param {data} data - The raw emote data.
   * @throws {Error} When trying to use the base Emote class directly.
   */
  constructor (channel, id, data) {
    if (new.target.name === Emote.name) {
      throw new Error('Base Emote class cannot be used')
    }

    /**
     * The emote fetcher.
     * @type {EmoteFetcher}
     */
    this.fetcher = channel.fetcher

    /**
     * The channel this emote belongs to.
     * Only accurate and constant on Twitch emotes.
     * For other types of emotes, use the `owner` or `ownerName` property.
     * @type {Channel}
     */
    this.channel = channel

    /**
     * The ID of this emote.
     * @type {string}
     */
    this.id = id

    /**
     * The type of this emote.
     * Either `twitch`, `bttv`, `ffz`, or '7tv'.
     * @type {string | null}
     */
    this.type = null

    this._setup(data)
  }

  _setup (data) {
    /**
     * The code or name of the emote.
     * @type {string}
     */
    this.code = data.code
  }

  /**
   * Gets the image link of the emote.
   * @param {number} size - The size of the image.
   * @returns {string} - The URL to the emote.
   */
  /* c8 ignore next 3 */
  toLink () {
    return null
  }

  /**
   * Override for `toString`.
   * Will give the emote's name.
   * @returns {string} - The emote code.
   */
  /* c8 ignore next 3 */
  toString () {
    return this.code
  }

  /**
   * Override for `toObject`.
   * Will result in an Object representation of an Emote
   * @returns {object} - Object representation of the Emote.
   */
  toObject () {
    return {
      code: this.code,
      id: this.id,
      channel_id: this.channel.channel_id,
    }
  }
}

export default Emote