Managers_AchievementManager.js

'user strict'
const Discord = require('discord.js')
const { ErrorCodes } = require('../Errors/ErrorCodes')
const { BaseManager } = require('./BaseManager')
const { InvalidValue, DuplicateAchievement, MissingValue } = require('../Errors/LME')

/** @typedef {import('../../typings').Achievement} Achievement */
/** @typedef {import('../../typings').UserCard} UserCard */

/**
 * Manager for the achievements.
 * @extends {BaseManager<Achievement>}
 */
class AchievementManager extends BaseManager {
  /**
   * @param {Discord.Client} client - The Discord Client.
   * @param {Achievement[]} iterable - Array of achievements.
   */
  constructor (client, iterable) {
    super(client, AchievementManager)

    if (!iterable) throw new MissingValue(ErrorCodes.MissingArgument, 'iterable')

    if (!Array.isArray(iterable)) throw new InvalidValue(ErrorCodes.InvalidValue, 'iterable', 'an array')
    for (const item of iterable) {
      this._add(item)
    }
  }

  /**
   * Add a achievement to the cache.
   * @param {Achievement} achievement - The achievement to add.
   * @returns {Achievement} - The achievement added.
   * @private
   * @ignore
   */
  _add (achievement) {
    if (typeof achievement !== 'object') throw new InvalidValue(ErrorCodes.InvalidValue, 'achievement', 'an object')

    const existing = this.cache.get(achievement.name)

    if (existing) throw new DuplicateAchievement(ErrorCodes.DuplicateAchievement, achievement.name)

    this.cache.set(achievement.name, achievement)

    return achievement
  }
}

module.exports = { AchievementManager }