mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-12 01:23:31 +01:00
Added permissions evaluation!
This commit is contained in:
@@ -1,18 +1,49 @@
|
||||
class ChannelPermissions{
|
||||
constructor(data){
|
||||
constructor(data, channel){
|
||||
|
||||
var self = this;
|
||||
|
||||
function getBit(x) {
|
||||
return ((this.packed >>> x) & 1) === 1;
|
||||
return ((self.packed >>> x) & 1) === 1;
|
||||
}
|
||||
|
||||
this.type = data.type; //either member or role
|
||||
|
||||
this.id = data.id;
|
||||
|
||||
this.deny = data.deny;
|
||||
if(this.type === "member"){
|
||||
this.packed = channel.server.getMember("id", data.id).evalPerms.packed;
|
||||
}else{
|
||||
this.packed = channel.server.getRole(data.id).packed;
|
||||
}
|
||||
|
||||
this.packed = this.packed & ~data.deny;
|
||||
this.packed = this.packed | data.allow;
|
||||
|
||||
this.deny = data.deny;
|
||||
this.allow = data.allow;
|
||||
|
||||
this.createInstantInvite = getBit(0);
|
||||
//this.banMembers = getBit(1);
|
||||
//this.kickMembers = getBit(2);
|
||||
this.managePermissions = getBit(3);
|
||||
this.manageChannels = getBit(4);
|
||||
//this.manageServer = getBit(5);
|
||||
this.readMessages = getBit(10);
|
||||
this.sendMessages = getBit(11);
|
||||
this.sendTTSMessages = getBit(12);
|
||||
this.manageMessages = getBit(13);
|
||||
this.embedLinks = getBit(14);
|
||||
this.attachFiles = getBit(15);
|
||||
this.readMessageHistory = getBit(16);
|
||||
this.mentionEveryone = getBit(17);
|
||||
|
||||
this.voiceConnect = getBit(20);
|
||||
this.voiceSpeak = getBit(21);
|
||||
this.voiceMuteMembers = getBit(22);
|
||||
this.voiceDeafenMembers = getBit(23);
|
||||
this.voiceMoveMembers = getBit(24);
|
||||
this.voiceUseVoiceActivation = getBit(25);
|
||||
|
||||
}
|
||||
|
||||
getBit(x) {
|
||||
|
||||
41
src/EvaluatedPermissions.js
Normal file
41
src/EvaluatedPermissions.js
Normal file
@@ -0,0 +1,41 @@
|
||||
class EvaluatedPermissions{
|
||||
constructor(data){
|
||||
|
||||
var self = this;
|
||||
|
||||
function getBit(x) {
|
||||
return ((self.packed >>> x) & 1) === 1;
|
||||
}
|
||||
|
||||
this.packed = data;
|
||||
|
||||
this.createInstantInvite = getBit(0);
|
||||
//this.banMembers = getBit(1);
|
||||
//this.kickMembers = getBit(2);
|
||||
this.managePermissions = getBit(3);
|
||||
this.manageChannels = getBit(4);
|
||||
//this.manageServer = getBit(5);
|
||||
this.readMessages = getBit(10);
|
||||
this.sendMessages = getBit(11);
|
||||
this.sendTTSMessages = getBit(12);
|
||||
this.manageMessages = getBit(13);
|
||||
this.embedLinks = getBit(14);
|
||||
this.attachFiles = getBit(15);
|
||||
this.readMessageHistory = getBit(16);
|
||||
this.mentionEveryone = getBit(17);
|
||||
|
||||
this.voiceConnect = getBit(20);
|
||||
this.voiceSpeak = getBit(21);
|
||||
this.voiceMuteMembers = getBit(22);
|
||||
this.voiceDeafenMembers = getBit(23);
|
||||
this.voiceMoveMembers = getBit(24);
|
||||
this.voiceUseVoiceActivation = getBit(25);
|
||||
|
||||
}
|
||||
|
||||
getBit(x) {
|
||||
return ((this.packed >>> x) & 1) === 1;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = EvaluatedPermissions;
|
||||
@@ -1,5 +1,6 @@
|
||||
var User = require("./user.js");
|
||||
var ServerPermissions = require("./ServerPermissions.js");
|
||||
var EvaluatedPermissions = require("./EvaluatedPermissions.js");
|
||||
|
||||
class Member extends User{
|
||||
|
||||
@@ -12,8 +13,7 @@ class Member extends User{
|
||||
get roles(){
|
||||
|
||||
var ufRoles = [ this.server.getRole(this.server.id) ];
|
||||
|
||||
console.log(this.rawRoles);
|
||||
|
||||
for(var rawRole of this.rawRoles){
|
||||
ufRoles.push( this.server.getRole(rawRole) );
|
||||
}
|
||||
@@ -23,7 +23,6 @@ class Member extends User{
|
||||
}
|
||||
|
||||
get evalPerms(){
|
||||
|
||||
var basePerms = this.roles, //cache roles as it can be slightly expensive
|
||||
basePerm = basePerms[0].packed;
|
||||
|
||||
@@ -34,6 +33,38 @@ class Member extends User{
|
||||
return new ServerPermissions({
|
||||
permissions : basePerm
|
||||
});
|
||||
}
|
||||
|
||||
permissionsIn(channel){
|
||||
|
||||
var affectingOverwrites = [];
|
||||
var affectingMemberOverwrites = [];
|
||||
|
||||
for(var overwrite of channel.roles){
|
||||
if(overwrite.id === this.id && overwrite.type === "member"){
|
||||
affectingMemberOverwrites.push(overwrite);
|
||||
}else if( this.rawRoles.indexOf(overwrite.id) !== -1 ){
|
||||
affectingOverwrites.push(overwrite);
|
||||
}
|
||||
}
|
||||
|
||||
if(affectingOverwrites.length === 0){
|
||||
return new EvaluatedPermissions(this.evalPerms.packed);
|
||||
}
|
||||
|
||||
var finalPacked = affectingOverwrites[0].packed;
|
||||
|
||||
for(var overwrite of affectingOverwrites){
|
||||
finalPacked = finalPacked & ~overwrite.deny;
|
||||
finalPacked = finalPacked | overwrite.allow;
|
||||
}
|
||||
|
||||
for(var overwrite of affectingMemberOverwrites){
|
||||
finalPacked = finalPacked & ~overwrite.deny;
|
||||
finalPacked = finalPacked | overwrite.allow;
|
||||
}
|
||||
|
||||
return new EvaluatedPermissions(finalPacked);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ class Channel {
|
||||
|
||||
for (var role of data.permission_overwrites) {
|
||||
|
||||
this.roles.push( new ChannelPermissions(role) );
|
||||
this.roles.push( new ChannelPermissions(role, this) );
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user