Added permissions evaluation!

This commit is contained in:
hydrabolt
2015-10-03 22:50:46 +01:00
parent 8f4e6e34d5
commit c60fe26657
9 changed files with 313 additions and 32 deletions

View File

@@ -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) {

View 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;

View File

@@ -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);
}

View File

@@ -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) );
}