Added permission overwrites in channels and potential bug fix

Bug may have potentially been fixed under MESSAGE_UPDATE
This commit is contained in:
hydrabolt
2015-10-26 17:31:23 +00:00
parent 9124b2c8b3
commit 555d743dae
6 changed files with 484 additions and 178 deletions

View File

@@ -71,6 +71,44 @@ var ChannelPermissions = (function () {
}; };
_createClass(ChannelPermissions, [{ _createClass(ChannelPermissions, [{
key: "asAllowDisallow",
get: function get() {
var allow = 0,
disallow = 0;
function ad(value, position) {
if (value) {
allow |= 1 << position;
} else {
disallow |= 1 << position;
}
}
ad(this.canCreateInstantInvite, 0);
ad(this.manageRoles, 3);
ad(this.manageChannels, 4);
ad(this.readMessages, 10);
ad(this.sendMessages, 11);
ad(this.sendTTSMessages, 12);
ad(this.manageMessages, 13);
ad(this.embedLinks, 14);
ad(this.attachFiles, 15);
ad(this.readMessageHistory, 16);
ad(this.mentionEveryone, 17);
ad(this.voiceConnect, 20);
ad(this.voiceSpeak, 21);
ad(this.voiceMuteMembers, 22);
ad(this.voiceDeafenMembers, 23);
ad(this.voiceMoveMembers, 24);
ad(this.voiceUseVoiceActivation, 25);
return {
allow: allow,
deny: disallow
};
}
}, {
key: "createInstantInvite", key: "createInstantInvite",
get: function get() { get: function get() {
return this.getBit(0); return this.getBit(0);

View File

@@ -869,6 +869,116 @@ var Client = (function () {
}); });
}; };
Client.prototype.overwritePermissions = function overwritePermissions(channel, role, updatedStuff) {
var callback = arguments.length <= 3 || arguments[3] === undefined ? function (err) {} : arguments[3];
var self = this;
return new Promise(function (resolve, reject) {
var data;
if (role instanceof ServerPermissions || role.type === "role") {
for (var key in updatedStuff) {
role[key] = updatedStuff[key];
}
data = ad(updatedStuff);
data.id = role.id;
data.type = "role";
} else {
data = ad(updatedStuff);
data.id = role.id;
data.type = "member";
}
request.put(Endpoints.CHANNELS + "/" + channel.id + "/permissions/" + role.id).set("authorization", self.token).send(data).end(function (err) {
if (err) {
reject(err);
callback(err);
} else {
resolve();
callback();
}
});
});
function ad(data) {
var allow = 0,
disallow = 0;
function bitit(value, position) {
if (value) {
allow |= 1 << position;
} else {
disallow |= 1 << position;
}
}
for (var perm in data) {
switch (perm) {
case "canCreateInstantInvite":
bitit(data[perm], 0);
break;
case "manageRoles":
bitit(data[perm], 3);
break;
case "manageChannels":
bitit(data[perm], 4);
break;
case "readMessages":
bitit(data[perm], 10);
break;
case "sendMessages":
bitit(data[perm], 11);
break;
case "sendTTSMessages":
bitit(data[perm], 12);
break;
case "manageMessages":
bitit(data[perm], 13);
break;
case "embedLinks":
bitit(data[perm], 14);
break;
case "attachFiles":
bitit(data[perm], 15);
break;
case "readMessageHistory":
bitit(data[perm], 16);
break;
case "mentionEveryone":
bitit(data[perm], 17);
break;
case "voiceConnect":
bitit(data[perm], 20);
break;
case "voiceSpeak":
bitit(data[perm], 21);
break;
case "voiceMuteMembers":
bitit(data[perm], 22);
break;
case "voiceDeafenMembers":
bitit(data[perm], 23);
break;
case "voiceMoveMembers":
bitit(data[perm], 24);
break;
case "voiceUseVoiceActivation":
bitit(data[perm], 25);
break;
default:
break;
}
}
return {
allow: allow,
deny: disallow
};
}
};
//def createws //def createws
Client.prototype.createws = function createws(url) { Client.prototype.createws = function createws(url) {
@@ -1019,6 +1129,7 @@ var Client = (function () {
info[key] = data[key]; info[key] = data[key];
} }
data.mentions = data.mentions || [];
var mentions = []; var mentions = [];
for (var _iterator7 = data.mentions, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { for (var _iterator7 = data.mentions, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) {

View File

@@ -1,5 +1,5 @@
class ChannelPermissions{ class ChannelPermissions {
constructor(data, channel){ constructor(data, channel) {
var self = this; var self = this;
@@ -10,9 +10,9 @@ class ChannelPermissions{
this.type = data.type; //either member or role this.type = data.type; //either member or role
this.id = data.id; this.id = data.id;
if(this.type === "member"){ if (this.type === "member") {
this.packed = channel.server.getMember("id", data.id).evalPerms.packed; this.packed = channel.server.getMember("id", data.id).evalPerms.packed;
}else{ } else {
this.packed = channel.server.getRole(data.id).packed; this.packed = channel.server.getRole(data.id).packed;
} }
@@ -26,91 +26,128 @@ class ChannelPermissions{
serialise() { serialise() {
return { return {
createInstantInvite : this.createInstantInvite, createInstantInvite: this.createInstantInvite,
manageRoles : this.manageRoles, manageRoles: this.manageRoles,
manageChannels : this.manageChannels, manageChannels: this.manageChannels,
readMessages : this.readMessages, readMessages: this.readMessages,
sendMessages : this.sendMessage, sendMessages: this.sendMessage,
sendTTSMessages : this.sendTTSMessages, sendTTSMessages: this.sendTTSMessages,
manageMessages : this.manageMessages, manageMessages: this.manageMessages,
embedLinks : this.embedLinks, embedLinks: this.embedLinks,
attachFiles : this.attachFiles, attachFiles: this.attachFiles,
readMessageHistory : this.readMessageHistory, readMessageHistory: this.readMessageHistory,
mentionEveryone : this.mentionEveryone, mentionEveryone: this.mentionEveryone,
voiceConnect : this.voiceConnect, voiceConnect: this.voiceConnect,
voiceSpeak : this.voiceSpeak, voiceSpeak: this.voiceSpeak,
voiceMuteMembers : this.voiceMuteMembers, voiceMuteMembers: this.voiceMuteMembers,
voiceDeafenMembers : this.voiceDeafenMembers, voiceDeafenMembers: this.voiceDeafenMembers,
voiceMoveMember : this.voiceMoveMembers, voiceMoveMember: this.voiceMoveMembers,
voiceUseVoiceActivation : this.voiceUseVoiceActivation voiceUseVoiceActivation: this.voiceUseVoiceActivation
} }
} }
get createInstantInvite(){return this.getBit(0);} get asAllowDisallow() {
set createInstantInvite(val){this.setBit(0, val);}
get manageRoles(){return this.getBit(3);} var allow = 0, disallow = 0;
set manageRoles(val){this.setBit(3, val);}
get manageChannels(){return this.getBit(4);} function ad(value, position) {
set manageChannels(val){this.setBit(4, val);} if (value) {
allow |= (1 << position);
} else {
disallow |= (1 << position);
}
}
get readMessages(){return this.getBit(10);} ad(this.canCreateInstantInvite, 0);
set readMessages(val){this.setBit(10, val);} ad(this.manageRoles, 3);
ad(this.manageChannels, 4);
ad(this.readMessages, 10);
ad(this.sendMessages, 11);
ad(this.sendTTSMessages, 12);
ad(this.manageMessages, 13);
ad(this.embedLinks, 14);
ad(this.attachFiles, 15);
ad(this.readMessageHistory, 16);
ad(this.mentionEveryone, 17);
ad(this.voiceConnect, 20);
ad(this.voiceSpeak, 21);
ad(this.voiceMuteMembers, 22);
ad(this.voiceDeafenMembers, 23);
ad(this.voiceMoveMembers, 24);
ad(this.voiceUseVoiceActivation, 25);
get sendMessages(){return this.getBit(11);}
set sendMessages(val){this.setBit(11, val);}
get sendTTSMessages(){return this.getBit(12);} return {
set sendTTSMessages(val){this.setBit(12, val);} allow : allow,
deny : disallow
};
}
get manageMessages(){return this.getBit(13);} get createInstantInvite() { return this.getBit(0); }
set manageMessages(val){this.setBit(13, val);} set createInstantInvite(val) { this.setBit(0, val); }
get embedLinks(){return this.getBit(14);} get manageRoles() { return this.getBit(3); }
set embedLinks(val){this.setBit(14, val);} set manageRoles(val) { this.setBit(3, val); }
get attachFiles(){return this.getBit(15);} get manageChannels() { return this.getBit(4); }
set attachFiles(val){this.setBit(15, val);} set manageChannels(val) { this.setBit(4, val); }
get readMessageHistory(){return this.getBit(16);} get readMessages() { return this.getBit(10); }
set readMessageHistory(val){this.setBit(16, val);} set readMessages(val) { this.setBit(10, val); }
get mentionEveryone(){return this.getBit(17);} get sendMessages() { return this.getBit(11); }
set mentionEveryone(val){this.setBit(17, val);} set sendMessages(val) { this.setBit(11, val); }
get voiceConnect(){return this.getBit(20);} get sendTTSMessages() { return this.getBit(12); }
set voiceConnect(val){this.setBit(20, val);} set sendTTSMessages(val) { this.setBit(12, val); }
get voiceSpeak(){return this.getBit(21);} get manageMessages() { return this.getBit(13); }
set voiceSpeak(val){this.setBit(21, val);} set manageMessages(val) { this.setBit(13, val); }
get voiceMuteMembers(){return this.getBit(22);} get embedLinks() { return this.getBit(14); }
set voiceMuteMembers(val){this.setBit(22, val);} set embedLinks(val) { this.setBit(14, val); }
get voiceDeafenMembers(){return this.getBit(23);} get attachFiles() { return this.getBit(15); }
set voiceDeafenMembers(val){this.setBit(23, val);} set attachFiles(val) { this.setBit(15, val); }
get voiceMoveMembers(){return this.getBit(24);} get readMessageHistory() { return this.getBit(16); }
set voiceMoveMembers(val){this.setBit(24, val);} set readMessageHistory(val) { this.setBit(16, val); }
get voiceUseVoiceActivation(){return this.getBit(25);} get mentionEveryone() { return this.getBit(17); }
set voiceUseVoiceActivation(val){this.setBit(25, val);} set mentionEveryone(val) { this.setBit(17, val); }
get voiceConnect() { return this.getBit(20); }
set voiceConnect(val) { this.setBit(20, val); }
get voiceSpeak() { return this.getBit(21); }
set voiceSpeak(val) { this.setBit(21, val); }
get voiceMuteMembers() { return this.getBit(22); }
set voiceMuteMembers(val) { this.setBit(22, val); }
get voiceDeafenMembers() { return this.getBit(23); }
set voiceDeafenMembers(val) { this.setBit(23, val); }
get voiceMoveMembers() { return this.getBit(24); }
set voiceMoveMembers(val) { this.setBit(24, val); }
get voiceUseVoiceActivation() { return this.getBit(25); }
set voiceUseVoiceActivation(val) { this.setBit(25, val); }
getBit(x) { getBit(x) {
if( ((this.packed >>> 3) & 1) === 1 ){ if (((this.packed >>> 3) & 1) === 1) {
return true; return true;
} }
return ((this.packed >>> x) & 1) === 1; return ((this.packed >>> x) & 1) === 1;
} }
setBit(location, value){ setBit(location, value) {
if(value){ if (value) {
// allow that permission // allow that permission
this.packed |= (1 << location); this.packed |= (1 << location);
}else{ } else {
// not allowed // not allowed
this.packed &= (1 << location); this.packed &= (1 << location);
} }

View File

@@ -945,6 +945,121 @@ class Client {
}); });
} }
overwritePermissions(channel, role, updatedStuff, callback=function(err){}){
var self = this;
return new Promise(function(resolve, reject){
var data;
if( role instanceof ServerPermissions || role.type === "role" ){
for(var key in updatedStuff){
role[key] = updatedStuff[key];
}
data = ad(updatedStuff);
data.id = role.id;
data.type = "role";
}else{
data = ad(updatedStuff);
data.id = role.id;
data.type = "member";
}
request
.put(`${Endpoints.CHANNELS}/${channel.id}/permissions/${role.id}`)
.set("authorization", self.token)
.send(data)
.end(function(err){
if (err) {
reject(err);
callback(err);
} else {
resolve();
callback();
}
});
});
function ad(data){
var allow = 0, disallow = 0;
function bitit(value, position){
if (value) {
allow |= (1 << position);
} else {
disallow |= (1 << position);
}
}
for(var perm in data){
switch(perm){
case "canCreateInstantInvite":
bitit(data[perm], 0);
break;
case "manageRoles":
bitit(data[perm], 3);
break;
case "manageChannels":
bitit(data[perm], 4);
break;
case "readMessages":
bitit(data[perm], 10);
break;
case "sendMessages":
bitit(data[perm], 11);
break;
case "sendTTSMessages":
bitit(data[perm], 12);
break;
case "manageMessages":
bitit(data[perm], 13);
break;
case "embedLinks":
bitit(data[perm], 14);
break;
case "attachFiles":
bitit(data[perm], 15);
break;
case "readMessageHistory":
bitit(data[perm], 16);
break;
case "mentionEveryone":
bitit(data[perm], 17);
break;
case "voiceConnect":
bitit(data[perm], 20);
break;
case "voiceSpeak":
bitit(data[perm], 21);
break;
case "voiceMuteMembers":
bitit(data[perm], 22);
break;
case "voiceDeafenMembers":
bitit(data[perm], 23);
break;
case "voiceMoveMembers":
bitit(data[perm], 24);
break;
case "voiceUseVoiceActivation":
bitit(data[perm], 25);
break;
default:
break;
}
}
return {
allow: allow,
deny: disallow
};
}
}
//def createws //def createws
createws(url) { createws(url) {
if (this.websocket) if (this.websocket)
@@ -1060,6 +1175,7 @@ class Client {
info[key] = data[key]; info[key] = data[key];
} }
data.mentions = data.mentions || [];
var mentions = []; var mentions = [];
for (var mention of data.mentions) { for (var mention of data.mentions) {

View File

@@ -20,107 +20,107 @@ class ServerPermissions {
serialise() { serialise() {
return { return {
createInstantInvite : this.createInstantInvite, createInstantInvite: this.createInstantInvite,
manageRoles : this.manageRoles, manageRoles: this.manageRoles,
manageChannels : this.manageChannels, manageChannels: this.manageChannels,
readMessages : this.readMessages, readMessages: this.readMessages,
sendMessages : this.sendMessage, sendMessages: this.sendMessage,
sendTTSMessages : this.sendTTSMessages, sendTTSMessages: this.sendTTSMessages,
manageMessages : this.manageMessages, manageMessages: this.manageMessages,
embedLinks : this.embedLinks, embedLinks: this.embedLinks,
attachFiles : this.attachFiles, attachFiles: this.attachFiles,
readMessageHistory : this.readMessageHistory, readMessageHistory: this.readMessageHistory,
mentionEveryone : this.mentionEveryone, mentionEveryone: this.mentionEveryone,
voiceConnect : this.voiceConnect, voiceConnect: this.voiceConnect,
voiceSpeak : this.voiceSpeak, voiceSpeak: this.voiceSpeak,
voiceMuteMembers : this.voiceMuteMembers, voiceMuteMembers: this.voiceMuteMembers,
voiceDeafenMembers : this.voiceDeafenMembers, voiceDeafenMembers: this.voiceDeafenMembers,
voiceMoveMember : this.voiceMoveMembers, voiceMoveMember: this.voiceMoveMembers,
voiceUseVoiceActivation : this.voiceUseVoiceActivation voiceUseVoiceActivation: this.voiceUseVoiceActivation
} }
} }
get createInstantInvite(){return this.getBit(0);} get createInstantInvite() { return this.getBit(0); }
set createInstantInvite(val){this.setBit(0, val);} set createInstantInvite(val) { this.setBit(0, val); }
get banMembers(){return this.getBit(1);} get banMembers() { return this.getBit(1); }
set banMembers(val){this.setBit(1, val);} set banMembers(val) { this.setBit(1, val); }
get kickMembers(){return this.getBit(2);} get kickMembers() { return this.getBit(2); }
set kickMembers(val){this.setBit(2, val);} set kickMembers(val) { this.setBit(2, val); }
get manageRoles(){return this.getBit(3);} get manageRoles() { return this.getBit(3); }
set manageRoles(val){this.setBit(3, val);} set manageRoles(val) { this.setBit(3, val); }
get manageChannels(){return this.getBit(4);} get manageChannels() { return this.getBit(4); }
set manageChannels(val){this.setBit(4, val);} set manageChannels(val) { this.setBit(4, val); }
get manageServer(){return this.getBit(5);} get manageServer() { return this.getBit(5); }
set manageServer(val){this.setBit(5, val);} set manageServer(val) { this.setBit(5, val); }
get readMessages(){return this.getBit(10);} get readMessages() { return this.getBit(10); }
set readMessages(val){this.setBit(10, val);} set readMessages(val) { this.setBit(10, val); }
get sendMessages(){return this.getBit(11);} get sendMessages() { return this.getBit(11); }
set sendMessages(val){this.setBit(11, val);} set sendMessages(val) { this.setBit(11, val); }
get sendTTSMessages(){return this.getBit(12);} get sendTTSMessages() { return this.getBit(12); }
set sendTTSMessages(val){this.setBit(12, val);} set sendTTSMessages(val) { this.setBit(12, val); }
get manageMessages(){return this.getBit(13);} get manageMessages() { return this.getBit(13); }
set manageMessages(val){this.setBit(13, val);} set manageMessages(val) { this.setBit(13, val); }
get embedLinks(){return this.getBit(14);} get embedLinks() { return this.getBit(14); }
set embedLinks(val){this.setBit(14, val);} set embedLinks(val) { this.setBit(14, val); }
get attachFiles(){return this.getBit(15);} get attachFiles() { return this.getBit(15); }
set attachFiles(val){this.setBit(15, val);} set attachFiles(val) { this.setBit(15, val); }
get readMessageHistory(){return this.getBit(16);} get readMessageHistory() { return this.getBit(16); }
set readMessageHistory(val){this.setBit(16, val);} set readMessageHistory(val) { this.setBit(16, val); }
get mentionEveryone(){return this.getBit(17);} get mentionEveryone() { return this.getBit(17); }
set mentionEveryone(val){this.setBit(17, val);} set mentionEveryone(val) { this.setBit(17, val); }
get voiceConnect(){return this.getBit(20);} get voiceConnect() { return this.getBit(20); }
set voiceConnect(val){this.setBit(20, val);} set voiceConnect(val) { this.setBit(20, val); }
get voiceSpeak(){return this.getBit(21);} get voiceSpeak() { return this.getBit(21); }
set voiceSpeak(val){this.setBit(21, val);} set voiceSpeak(val) { this.setBit(21, val); }
get voiceMuteMembers(){return this.getBit(22);} get voiceMuteMembers() { return this.getBit(22); }
set voiceMuteMembers(val){this.setBit(22, val);} set voiceMuteMembers(val) { this.setBit(22, val); }
get voiceDeafenMembers(){return this.getBit(23);} get voiceDeafenMembers() { return this.getBit(23); }
set voiceDeafenMembers(val){this.setBit(23, val);} set voiceDeafenMembers(val) { this.setBit(23, val); }
get voiceMoveMembers(){return this.getBit(24);} get voiceMoveMembers() { return this.getBit(24); }
set voiceMoveMembers(val){this.setBit(24, val);} set voiceMoveMembers(val) { this.setBit(24, val); }
get voiceUseVoiceActivation(){return this.getBit(25);} get voiceUseVoiceActivation() { return this.getBit(25); }
set voiceUseVoiceActivation(val){this.setBit(25, val);} set voiceUseVoiceActivation(val) { this.setBit(25, val); }
getBit(x) { getBit(x) {
if( ((this.packed >>> 3) & 1) === 1 ){ if (((this.packed >>> 3) & 1) === 1) {
return true; return true;
} }
return ((this.packed >>> x) & 1) === 1; return ((this.packed >>> x) & 1) === 1;
} }
setBit(location, value){ setBit(location, value) {
if(value){ if (value) {
// allow that permission // allow that permission
this.packed |= (1 << location); this.packed |= (1 << location);
}else{ } else {
// not allowed // not allowed
this.packed &= (1 << location); this.packed &= (1 << location);
} }
} }
toString(){ toString() {
return this.name; return this.name;
} }
} }

View File

@@ -25,8 +25,12 @@ mybot.on("message", function (message) {
} else { } else {
user = message.sender; user = message.sender;
} }
for(var role of message.sender.roles){ for(var role of message.channel.server.roles){
mybot.removeMemberFromRole(message.sender, role).catch(error);
mybot.overwritePermissions(message.channel, message.sender, {
sendMessages : false
}).catch(error);
} }
}); });