Source: permissions.js

/**
 * Handles permissions depending on roles.
 */
class PermissionsManager {
  constructor() {
    /**
     * Array of owner user IDs
     * @type {string[]}
     */
    this.owner = Core.settings.owner || [];
    /**
     * Array of admin user IDs
     * @type {string[]}
     */
    this.admins = Core.settings.admins || [];
    /**
     * Array of admin role names
     * @type {string[]}
     */
    this.adminRoles = Core.settings.adminRoles || [];
    /**
     * Array of DJ role names
     * @type {string[]}
     */
    this.djRoles = Core.settings.djRoles || [];
  }

  /**
   * Checks if an user has certain roles (by name).
   *
   * Note: Only one of the roles passed is required for this to return a positive value.
   * @param {string|string[]} roles - Role name(s) to check.
   * @param {object} user - The user to check. Can also be a Discordie IGuildMember.
   * @param {object} guild - The guild to check. Not needed if user is an IGuildMember.
   * @return {boolean}
   */
  hasRoles(roles, user, guild = user.guild) {
    if (!guild) return false; // DMs have no guild object
    const member = user.memberOf(guild);
    if (!member) return false; // wut?
    const r = (typeof roles === 'string') ? [roles] : roles;
    return member.roles.filter(i => r.indexOf(i.name) >= 0).length > 0;
  }

  /**
   * Checks if an user has admin rights.
   * @param {object} user - The user to check. Can also be a Discordie IGuildMember.
   * @param {object} guild - The guild to check. Not needed if user is an IGuildMember.
   * @param {boolean} globalOnly - Check only for global admins.
   * @return {boolean}
   */
  isAdmin(user, guild = user.guild, globalOnly) {
    // always return true for global admins and bot owners
    if (this.admins.indexOf(user.id) >= 0 || this.isOwner(user)) return true;
    if (globalOnly) return false;
    if (!guild) return false;
    if (user.id === guild.owner_id) return true; // Owner of guild
    return this.hasRoles(this.adminRoles, user, guild);
  }

  /**
   * Checks if an user has DJ roles.
   * @param {object} user - The user to check. Can also be a Discordie IGuildMember.
   * @param {object} guild - The guild to check. Not needed if user is an IGuildMember.
   * @return {boolean}
   */
  isDJ(user, guild = user.guild) {
    // always return true for global admins and bot owners
    if (this.admins.indexOf(user.id) >= 0 || this.isOwner(user)) return true;
    if (!guild) return false; // DMs have no guild object
    if (user.id === guild.owner_id) return true; // Owner of guild
    return this.hasRoles(this.djRoles, user, guild) || this.hasRoles(this.adminRoles, user, guild);
  }

  /**
   * Checks if an user is the guild owner.
   * @param {object} user - The user or member to check
   * @param {object} guild - The guild to check
   * @return {boolean}
   */
  isGuildOwner(user, guild = user.guild) {
    return user.id === guild.owner_id || this.isOwner(user);
  }

  /**
   * Check if an user is the bot owner
   * @param {object} user - User to check
   * @return {boolean}
   */
  isOwner(user) {
    return this.owner.indexOf(user.id) >= 0;
  }
}

module.exports = PermissionsManager;