"use strict"; var Permissions = require("../Constants.js").Permissions; /* example data { position: -1, permissions: 36953089, name: '@everyone', managed: false, id: '110007368451915776', hoist: false, color: 0 } */ const DefaultRole = [ Permissions.createInstantInvite, Permissions.readMessages, Permissions.readMessageHistory, Permissions.sendMessages, Permissions.sendTTSMessages, Permissions.embedLinks, Permissions.attachFiles, Permissions.readMessageHistory, Permissions.mentionEveryone, Permissions.voiceConnect, Permissions.voiceSpeak, Permissions.voiceUseVAD ].reduce( (previous, current) => previous | current, 0 ); class Role{ constructor(data, serverID, client){ this.position = data.position || -1; this.permissions = data.permissions || DefaultRole; this.name = data.name || "@everyone"; this.managed = data.managed || false; this.id = data.id; this.hoist = data.hoist || false; this.color = data.color || 0; this.serverID = serverID; this.client = client; } get server(){ return this.client.internal.servers.get("id", this.serverID); } serialise(explicit){ var hp = (perm) => this.hasPermission(perm, explicit); return { // general createInstantInvite : hp( Permissions.createInstantInvite ), kickMembers : hp( Permissions.kickMembers ), banMembers : hp( Permissions.banMembers ), manageRoles : hp ( Permissions.manageRoles ), manageChannels : hp( Permissions.manageChannels ), manageServer : hp( Permissions.manageServer ), // text readMessages : hp( Permissions.readMessages ), sendMessages : hp( Permissions.sendMessages ), sendTTSMessages : hp( Permissions.sendTTSMessages ), manageMessages : hp( Permissions.manageMessages ), embedLinks : hp( Permissions.embedLinks ), attachFiles : hp( Permissions.attachFiles ), readMessageHistory : hp( Permissions.readMessageHistory ), mentionEveryone : hp( Permissions.mentionEveryone ), // voice voiceConnect : hp( Permissions.voiceConnect ), voiceSpeak : hp( Permissions.voiceSpeak ), voiceMuteMembers : hp( Permissions.voiceMuteMembers ), voiceDeafenMembers : hp( Permissions.voiceDeafenMembers ), voiceMoveMembers : hp( Permissions.voiceMoveMembers ), voiceUseVAD : hp( Permissions.voiceUseVAD ) }; } serialize(){ // ;n; return this.serialise(); } hasPermission(perm, explicit=false){ if( perm instanceof String || typeof perm === "string" ){ perm = Permissions[perm]; } if(!perm){ return false; } if(!explicit){ // implicit permissions allowed if( !!(this.permissions & Permissions.manageRoles) ){ // manageRoles allowed, they have all permissions return true; } } // e.g. // !!(36953089 & Permissions.manageRoles) = not allowed to manage roles // !!(36953089 & (1 << 21)) = voice speak allowed return !!(this.permissions & perm); } setPermission(permission, value){ if( permission instanceof String || typeof permission === "string" ){ permission = Permissions[permission]; } if(permission){ // valid permission if(value){ this.permissions |= permission; }else{ this.permissions &= ~permission; } } } setPermissions(obj){ obj.forEach((value, permission) => { if( permission instanceof String || typeof permission === "string" ){ permission = Permissions[permission]; } if(permission){ // valid permission this.setPermission(permission, value); } }); } colorAsHex(){ var val = this.color.toString(); while(val.length < 6){ val = "0" + val; } return "#"+val; } } module.exports = Role;