2020-12-15 01:44:28 +00:00
import { GuildMember , Permissions } from "discord.js" ;
import { Config } from "./structures" ;
import $ from "./lib" ;
2020-07-26 10:02:35 +00:00
2020-10-15 09:23:24 +00:00
export enum PERMISSIONS {
2020-12-15 01:44:28 +00:00
NONE ,
MOD ,
ADMIN ,
OWNER ,
BOT_SUPPORT ,
BOT_ADMIN ,
BOT_OWNER
2020-10-15 09:23:24 +00:00
}
2020-12-15 01:44:28 +00:00
2020-10-15 09:23:24 +00:00
export const PermissionNames = [
2020-12-15 01:44:28 +00:00
"User" ,
"Moderator" ,
"Administrator" ,
"Server Owner" ,
"Bot Support" ,
"Bot Admin" ,
"Bot Owner"
2020-10-15 09:23:24 +00:00
] ;
2020-07-26 10:02:35 +00:00
// Here is where you enter in the functions that check for permissions.
const PermissionChecker : ( ( member : GuildMember ) = > boolean ) [ ] = [
2020-12-15 01:44:28 +00:00
// NONE //
( ) = > true ,
2020-10-15 09:23:24 +00:00
2020-12-15 01:44:28 +00:00
// 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 ) ,
2020-10-15 09:23:24 +00:00
2020-12-15 01:44:28 +00:00
// ADMIN //
( member ) = > member . hasPermission ( Permissions . FLAGS . ADMINISTRATOR ) ,
2020-10-15 09:23:24 +00:00
2020-12-15 01:44:28 +00:00
// OWNER //
( member ) = > member . guild . ownerID === member . id ,
2020-10-15 09:23:24 +00:00
2020-12-15 01:44:28 +00:00
// BOT_SUPPORT //
( member ) = > Config . support . includes ( member . id ) ,
2020-10-15 09:23:24 +00:00
2020-12-15 01:44:28 +00:00
// BOT_ADMIN //
( member ) = > Config . admins . includes ( member . id ) ,
2020-10-15 09:23:24 +00:00
2020-12-15 01:44:28 +00:00
// BOT_OWNER //
( member ) = > Config . owner === member . id
2020-07-26 10:02:35 +00:00
] ;
// After checking the lengths of these three objects, use this as the length for consistency.
const length = Object . keys ( PERMISSIONS ) . length / 2 ;
2020-10-15 09:23:24 +00:00
export function hasPermission (
2020-12-15 01:44:28 +00:00
member : GuildMember ,
permission : PERMISSIONS
2020-10-15 09:23:24 +00:00
) : boolean {
2020-12-15 01:44:28 +00:00
for ( let i = length - 1 ; i >= permission ; i -- )
if ( PermissionChecker [ i ] ( member ) ) return true ;
return false ;
2020-07-26 10:02:35 +00:00
}
2020-10-15 09:23:24 +00:00
export function getPermissionLevel ( member : GuildMember ) : number {
2020-12-15 01:44:28 +00:00
for ( let i = length - 1 ; i >= 0 ; i -- )
if ( PermissionChecker [ i ] ( member ) ) return i ;
return 0 ;
2020-07-26 10:02:35 +00:00
}
// Length Checking
( ( ) = > {
2020-12-15 01:44:28 +00:00
const lenNames = PermissionNames . length ;
const lenChecker = PermissionChecker . length ;
2020-10-15 09:23:24 +00:00
2020-12-15 01:44:28 +00:00
// 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! `
) ;
2020-10-15 09:23:24 +00:00
} ) ( ) ;