Interfaces.js

// FOR JSDOC PURPOSES ONLY

const Discord = require('discord.js')

/** @typedef {import('../../typings').Rank} Rank */
/** @typedef {import('../../typings').Achievement} Achievement */
/** @typedef {import('../../typings').LevelManagerOptions} LevelManagerOptions */
/** @typedef {import('../../typings').UserEntry} UserEntry */
/** @typedef {import('../../typings').DatabaseData} DatabaseData */
/** @typedef {import('../../typings').LeaderboardOptions} LeaderboardOptions */
/** @typedef {import('../../typings').RankBuilder} RankBuilder */
/** @typedef {import('../../typings').AchievementBuilder} AchievementBuilder */

/**
 * @typedef {Object} LeaderboardOptions
 * @property {Discord.Snowflake} [guildId='global'] - The id of the guild.
 * @property {Number} [limit=10] - The limit of the leaderboard.
 */

/** @typedef {DatabaseData} GuildData */

/**
 * @typedef {Object} DatabaseData
 * @property {Discord.Snowflake} guildId - The id of the guild.
 * @property {Rank[]} ranks - The ranks of the guild.
 * @property {Achievement[]} achievements - The achievements of the guild.
 * @property {UserEntry[]} users - The users of the guild.
 */

/** @typedef {Achievement} AchievementData */

/**
 * @typedef {Object} Achievement
 * @property {String} name - The name of the achievement.
 * @property {String} description - The description of the achievement.
 * @property {String|undefined} [thumbnail] - The thumbnail of the achievement.
 * @property {Number} reward - The reward of the achievement.
 * @property {AchievementType} type - The type of the achievement.
 * @property {Number[]} progress - The progress of the achievement.
 */

/**
 * @typedef {Object} UserEntry
 * @property {Discord.Snowflake} id - The id of the user.
 * @property {Number} xp - The xp of the user.
 * @property {Number} level - The level of the user.
 * @property {Number} maxXpToLevelUp - The max xp to level up.
 * @property {Rank} rank - The rank of the user.
 * @property {Achievement[]} achievements - The achievements of the user.
 */

/** @typedef {Rank} RankData */

/**
 * @typedef {Object} Rank
 * @property {String} nameplate - The nameplate of the rank.
 * @property {Discord.ColorResolvable|String} color - The color accent of the rank.
 * @property {Number} priority - The priority of the rank.
 * @property {Number} min - The minimum level of the rank.
 * @property {Number} max - The maximum level of the rank.
 */

/**
 * @typedef {Object} LevelManagerOptions
 * @property {String} mongoUri - The uri of the mongo database.
 * @property {Rank[]|RankBuilder[]|undefined} [ranks] - The general ranks that will be used in every guild (default in Options class).
 * @property {Achievement[]|AchievementBuilder[]|undefined} [achievements] - The general achievements that will be used in every guild (default in Options class).
 * @property {Number|undefined} [maxXpToLevelUp=2500] - The max xp to level up (only works for the first level then it will be calculated with calculateXpToLevelUp function).
 * @property {Number|undefined} [saveInterval=1000 * 60 * 60 * 3] - The interval to save the data in the database (in milliseconds).
 * @property {Boolean|undefined} [autoSave=true] - If the data will be saved automatically.
 * @property {String|undefined} [eventsPath] - The path to the events folder.
 */

/**
 * @typedef {Object} AchievementType
 * @property {Number} Progressive - The achievement is progressive (example: x messages sended).
 * @property {Number} OneTime - The achievement is one time only (example: first message).
 */

/**
 * @typedef {Object} AchievementStatus
 * @property {Number} Locked - The achievement is locked.
 * @property {Number} Unlocked - The achievement is unlocked.
 */

/**
 * @typedef {Object} LevelManagerEvents
 * @property {String} ManagerReady - The manager is ready.
 * @property {String} XpAdded - The user has added xp.
 * @property {String} LevelUp - The user has leveled up.
 * @property {String} LevelDown - The user has leveled down.
 * @property {String} DegradeLevel - The user has degraded level.
 * @property {String} RankUp - The user has ranked up.
 * @property {String} RankDown - The user has ranked down.
 * @property {String} DegradeRank - The user has degraded rank.
 */

/**
 * @type {AchievementType}
 * @ignore
 */
const AchievementType = Object.freeze({
  Progressive: 0,
  OneTime: 1
})

/**
 * @type {AchievementStatus}
 * @ignore
 */
const AchievementStatus = Object.freeze({
  Locked: 0,
  Unlocked: 1
})

/**
 * @type {LevelManagerEvents}
 * @ignore
 */
const LevelManagerEvents = Object.freeze({
  ManagerReady: 'managerReady',
  XpAdded: 'xpAdded',
  LevelUp: 'levelUp',
  LevelDown: 'levelDown',
  Bypass: 'bypass',
  RankUp: 'rankUp',
  RankDown: 'rankDown'
})

module.exports = {
  AchievementType,
  AchievementStatus,
  LevelManagerEvents
}