import {GuildMember, Permissions} from "discord.js"; import {Config} from "./structures"; import $ from "./lib"; export enum PERMISSIONS { NONE, MOD, ADMIN, OWNER, BOT_SUPPORT, BOT_ADMIN, BOT_OWNER } export const PermissionNames = [ "User", "Moderator", "Administrator", "Server Owner", "Bot Support", "Bot Admin", "Bot Owner" ]; // Here is where you enter in the functions that check for permissions. const PermissionChecker: ((member: GuildMember) => boolean)[] = [ // NONE // () => true, // MOD // (member) => member.hasPermission(Permissions.FLAGS.MANAGE_ROLES) || member.hasPermission(Permissions.FLAGS.MANAGE_MESSAGES) || member.hasPermission(Permissions.FLAGS.KICK_MEMBERS) || member.hasPermission(Permissions.FLAGS.BAN_MEMBERS), // ADMIN // (member) => member.hasPermission(Permissions.FLAGS.ADMINISTRATOR), // OWNER // (member) => member.guild.ownerID === member.id, // BOT_SUPPORT // (member) => Config.support.includes(member.id), // BOT_ADMIN // (member) => Config.admins.includes(member.id), // BOT_OWNER // (member) => Config.owner === member.id ]; // After checking the lengths of these three objects, use this as the length for consistency. const length = Object.keys(PERMISSIONS).length / 2; export function hasPermission(member: GuildMember, permission: PERMISSIONS): boolean { for (let i = length - 1; i >= permission; i--) if (PermissionChecker[i](member)) return true; return false; } export function getPermissionLevel(member: GuildMember): number { for (let i = length - 1; i >= 0; i--) if (PermissionChecker[i](member)) return i; return 0; } // Length Checking (() => { const lenNames = PermissionNames.length; const lenChecker = PermissionChecker.length; // By transitive property, lenNames and lenChecker have to be equal to each other as well. if (length !== lenNames || length !== lenChecker) $.error( `Permission object lengths aren't equal! Enum Length (${length}), Names Length (${lenNames}), and Functions Length (${lenChecker}). This WILL cause problems!` ); })();