diff --git a/lib/ChannelPermissions.js b/lib/ChannelPermissions.js index cebde6bf..49c0c0c3 100644 --- a/lib/ChannelPermissions.js +++ b/lib/ChannelPermissions.js @@ -71,6 +71,44 @@ var ChannelPermissions = (function () { }; _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", get: function get() { return this.getBit(0); diff --git a/lib/Client.js b/lib/Client.js index 43c36c61..fd354ed8 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -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 Client.prototype.createws = function createws(url) { @@ -1019,6 +1129,7 @@ var Client = (function () { info[key] = data[key]; } + data.mentions = data.mentions || []; var mentions = []; for (var _iterator7 = data.mentions, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { diff --git a/src/ChannelPermissions.js b/src/ChannelPermissions.js index 51316382..7433ec0c 100644 --- a/src/ChannelPermissions.js +++ b/src/ChannelPermissions.js @@ -1,116 +1,153 @@ -class ChannelPermissions{ - constructor(data, channel){ - +class ChannelPermissions { + constructor(data, channel) { + var self = this; - + function getBit(x) { return ((self.packed >>> x) & 1) === 1; } - + this.type = data.type; //either member or role this.id = data.id; - - if(this.type === "member"){ - this.packed = channel.server.getMember("id", data.id).evalPerms.packed; - }else{ - this.packed = channel.server.getRole(data.id).packed; + + 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; - + } - + serialise() { return { - createInstantInvite : this.createInstantInvite, - manageRoles : this.manageRoles, - manageChannels : this.manageChannels, - readMessages : this.readMessages, - sendMessages : this.sendMessage, - sendTTSMessages : this.sendTTSMessages, - manageMessages : this.manageMessages, - embedLinks : this.embedLinks, - attachFiles : this.attachFiles, - readMessageHistory : this.readMessageHistory, - mentionEveryone : this.mentionEveryone, - voiceConnect : this.voiceConnect, - voiceSpeak : this.voiceSpeak, - voiceMuteMembers : this.voiceMuteMembers, - voiceDeafenMembers : this.voiceDeafenMembers, - voiceMoveMember : this.voiceMoveMembers, - voiceUseVoiceActivation : this.voiceUseVoiceActivation + createInstantInvite: this.createInstantInvite, + manageRoles: this.manageRoles, + manageChannels: this.manageChannels, + readMessages: this.readMessages, + sendMessages: this.sendMessage, + sendTTSMessages: this.sendTTSMessages, + manageMessages: this.manageMessages, + embedLinks: this.embedLinks, + attachFiles: this.attachFiles, + readMessageHistory: this.readMessageHistory, + mentionEveryone: this.mentionEveryone, + voiceConnect: this.voiceConnect, + voiceSpeak: this.voiceSpeak, + voiceMuteMembers: this.voiceMuteMembers, + voiceDeafenMembers: this.voiceDeafenMembers, + voiceMoveMember: this.voiceMoveMembers, + voiceUseVoiceActivation: this.voiceUseVoiceActivation } } - - get createInstantInvite(){return this.getBit(0);} - set createInstantInvite(val){this.setBit(0, val);} - - get manageRoles(){return this.getBit(3);} - set manageRoles(val){this.setBit(3, val);} - - get manageChannels(){return this.getBit(4);} - set manageChannels(val){this.setBit(4, val);} - - get readMessages(){return this.getBit(10);} - set readMessages(val){this.setBit(10, val);} - - get sendMessages(){return this.getBit(11);} - set sendMessages(val){this.setBit(11, val);} - - get sendTTSMessages(){return this.getBit(12);} - set sendTTSMessages(val){this.setBit(12, val);} - - get manageMessages(){return this.getBit(13);} - set manageMessages(val){this.setBit(13, val);} - - get embedLinks(){return this.getBit(14);} - set embedLinks(val){this.setBit(14, val);} - - get attachFiles(){return this.getBit(15);} - set attachFiles(val){this.setBit(15, val);} - - get readMessageHistory(){return this.getBit(16);} - set readMessageHistory(val){this.setBit(16, val);} - - get mentionEveryone(){return this.getBit(17);} - 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);} - + + get asAllowDisallow() { + + 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 + }; + } + + get createInstantInvite() { return this.getBit(0); } + set createInstantInvite(val) { this.setBit(0, val); } + + get manageRoles() { return this.getBit(3); } + set manageRoles(val) { this.setBit(3, val); } + + get manageChannels() { return this.getBit(4); } + set manageChannels(val) { this.setBit(4, val); } + + get readMessages() { return this.getBit(10); } + set readMessages(val) { this.setBit(10, val); } + + get sendMessages() { return this.getBit(11); } + set sendMessages(val) { this.setBit(11, val); } + + get sendTTSMessages() { return this.getBit(12); } + set sendTTSMessages(val) { this.setBit(12, val); } + + get manageMessages() { return this.getBit(13); } + set manageMessages(val) { this.setBit(13, val); } + + get embedLinks() { return this.getBit(14); } + set embedLinks(val) { this.setBit(14, val); } + + get attachFiles() { return this.getBit(15); } + set attachFiles(val) { this.setBit(15, val); } + + get readMessageHistory() { return this.getBit(16); } + set readMessageHistory(val) { this.setBit(16, val); } + + get mentionEveryone() { return this.getBit(17); } + 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) { - if( ((this.packed >>> 3) & 1) === 1 ){ + if (((this.packed >>> 3) & 1) === 1) { return true; } return ((this.packed >>> x) & 1) === 1; } - - setBit(location, value){ - - if(value){ + + setBit(location, value) { + + if (value) { // allow that permission this.packed |= (1 << location); - - }else{ + + } else { // not allowed this.packed &= (1 << location); } diff --git a/src/Client.js b/src/Client.js index 969357cf..1cd0f9af 100644 --- a/src/Client.js +++ b/src/Client.js @@ -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 createws(url) { if (this.websocket) @@ -1060,6 +1175,7 @@ class Client { info[key] = data[key]; } + data.mentions = data.mentions || []; var mentions = []; for (var mention of data.mentions) { diff --git a/src/ServerPermissions.js b/src/ServerPermissions.js index 00020484..e571e0b7 100644 --- a/src/ServerPermissions.js +++ b/src/ServerPermissions.js @@ -20,107 +20,107 @@ class ServerPermissions { serialise() { return { - createInstantInvite : this.createInstantInvite, - manageRoles : this.manageRoles, - manageChannels : this.manageChannels, - readMessages : this.readMessages, - sendMessages : this.sendMessage, - sendTTSMessages : this.sendTTSMessages, - manageMessages : this.manageMessages, - embedLinks : this.embedLinks, - attachFiles : this.attachFiles, - readMessageHistory : this.readMessageHistory, - mentionEveryone : this.mentionEveryone, - voiceConnect : this.voiceConnect, - voiceSpeak : this.voiceSpeak, - voiceMuteMembers : this.voiceMuteMembers, - voiceDeafenMembers : this.voiceDeafenMembers, - voiceMoveMember : this.voiceMoveMembers, - voiceUseVoiceActivation : this.voiceUseVoiceActivation + createInstantInvite: this.createInstantInvite, + manageRoles: this.manageRoles, + manageChannels: this.manageChannels, + readMessages: this.readMessages, + sendMessages: this.sendMessage, + sendTTSMessages: this.sendTTSMessages, + manageMessages: this.manageMessages, + embedLinks: this.embedLinks, + attachFiles: this.attachFiles, + readMessageHistory: this.readMessageHistory, + mentionEveryone: this.mentionEveryone, + voiceConnect: this.voiceConnect, + voiceSpeak: this.voiceSpeak, + voiceMuteMembers: this.voiceMuteMembers, + voiceDeafenMembers: this.voiceDeafenMembers, + voiceMoveMember: this.voiceMoveMembers, + voiceUseVoiceActivation: this.voiceUseVoiceActivation } } - - get createInstantInvite(){return this.getBit(0);} - set createInstantInvite(val){this.setBit(0, val);} - - get banMembers(){return this.getBit(1);} - set banMembers(val){this.setBit(1, val);} - - get kickMembers(){return this.getBit(2);} - set kickMembers(val){this.setBit(2, val);} - - get manageRoles(){return this.getBit(3);} - set manageRoles(val){this.setBit(3, val);} - - get manageChannels(){return this.getBit(4);} - set manageChannels(val){this.setBit(4, val);} - - get manageServer(){return this.getBit(5);} - set manageServer(val){this.setBit(5, val);} - - get readMessages(){return this.getBit(10);} - set readMessages(val){this.setBit(10, val);} - - get sendMessages(){return this.getBit(11);} - set sendMessages(val){this.setBit(11, val);} - - get sendTTSMessages(){return this.getBit(12);} - set sendTTSMessages(val){this.setBit(12, val);} - - get manageMessages(){return this.getBit(13);} - set manageMessages(val){this.setBit(13, val);} - - get embedLinks(){return this.getBit(14);} - set embedLinks(val){this.setBit(14, val);} - - get attachFiles(){return this.getBit(15);} - set attachFiles(val){this.setBit(15, val);} - - get readMessageHistory(){return this.getBit(16);} - set readMessageHistory(val){this.setBit(16, val);} - - get mentionEveryone(){return this.getBit(17);} - 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);} + + get createInstantInvite() { return this.getBit(0); } + set createInstantInvite(val) { this.setBit(0, val); } + + get banMembers() { return this.getBit(1); } + set banMembers(val) { this.setBit(1, val); } + + get kickMembers() { return this.getBit(2); } + set kickMembers(val) { this.setBit(2, val); } + + get manageRoles() { return this.getBit(3); } + set manageRoles(val) { this.setBit(3, val); } + + get manageChannels() { return this.getBit(4); } + set manageChannels(val) { this.setBit(4, val); } + + get manageServer() { return this.getBit(5); } + set manageServer(val) { this.setBit(5, val); } + + get readMessages() { return this.getBit(10); } + set readMessages(val) { this.setBit(10, val); } + + get sendMessages() { return this.getBit(11); } + set sendMessages(val) { this.setBit(11, val); } + + get sendTTSMessages() { return this.getBit(12); } + set sendTTSMessages(val) { this.setBit(12, val); } + + get manageMessages() { return this.getBit(13); } + set manageMessages(val) { this.setBit(13, val); } + + get embedLinks() { return this.getBit(14); } + set embedLinks(val) { this.setBit(14, val); } + + get attachFiles() { return this.getBit(15); } + set attachFiles(val) { this.setBit(15, val); } + + get readMessageHistory() { return this.getBit(16); } + set readMessageHistory(val) { this.setBit(16, val); } + + get mentionEveryone() { return this.getBit(17); } + 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) { - if( ((this.packed >>> 3) & 1) === 1 ){ + if (((this.packed >>> 3) & 1) === 1) { return true; } return ((this.packed >>> x) & 1) === 1; } - - setBit(location, value){ - - if(value){ + + setBit(location, value) { + + if (value) { // allow that permission this.packed |= (1 << location); - - }else{ + + } else { // not allowed this.packed &= (1 << location); } } - - toString(){ + + toString() { return this.name; } } diff --git a/test/bot.1.js b/test/bot.1.js index 9a926014..b55fb48e 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -25,8 +25,12 @@ mybot.on("message", function (message) { } else { user = message.sender; } - for(var role of message.sender.roles){ - mybot.removeMemberFromRole(message.sender, role).catch(error); + for(var role of message.channel.server.roles){ + + mybot.overwritePermissions(message.channel, message.sender, { + sendMessages : false + }).catch(error); + } });