From 0f02856a8c84d776d84c831c63da846f7c4cda5d Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 12:06:38 +0000 Subject: [PATCH 01/20] Added role creation and new role listening bot.createRole(server, cb(err, ServerPermissions)) and bot.on("serverRoleCreate", server, ServerPermissions) --- lib/ChannelPermissions.js | 22 +++++++++++++++++++++ lib/Client.js | 35 +++++++++++++++++++++++++++++++++ lib/ServerPermissions.js | 22 +++++++++++++++++++++ lib/server.js | 11 +++++++++++ src/ChannelPermissions.js | 22 +++++++++++++++++++++ src/Client.js | 41 +++++++++++++++++++++++++++++++++++++++ src/ServerPermissions.js | 22 +++++++++++++++++++++ src/server.js | 12 ++++++++++++ test/bot.1.js | 6 ++---- 9 files changed, 189 insertions(+), 4 deletions(-) diff --git a/lib/ChannelPermissions.js b/lib/ChannelPermissions.js index 5193b5938..e163b37e7 100644 --- a/lib/ChannelPermissions.js +++ b/lib/ChannelPermissions.js @@ -30,6 +30,28 @@ var ChannelPermissions = (function () { this.allow = data.allow; } + ChannelPermissions.prototype.serialise = function 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 + }; + }; + ChannelPermissions.prototype.getBit = function getBit(x) { return (this.packed >>> x & 1) === 1; }; diff --git a/lib/Client.js b/lib/Client.js index 6f5b8eb32..0ad98abee 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -712,6 +712,30 @@ var Client = (function () { return prom; }; + Client.prototype.createRole = function createRole(server) { + var cb = arguments.length <= 1 || arguments[1] === undefined ? function (err, perm) {} : arguments[1]; + + var self = this; + + return new Promise(function (resolve, reject) { + + server = self.resolveServerID(server); + + request.post(Endpoints.SERVERS + "/" + server + "/roles").set("authorization", self.token).end(function (err, res) { + + if (err) { + cb(err); + reject(err); + } else { + + var data = self.getServer("id", server).addRole(res.body); + resolve(data); + cb(null, data); + } + }); + }); + }; + //def createws Client.prototype.createws = function createws(url) { @@ -1089,6 +1113,17 @@ var Client = (function () { break; + case "GUILD_ROLE_CREATE": + + var server = self.getServer("id", data.guild_id); + var role = data.role; + + self.trigger("serverRoleCreate", server, server.addRole(role)); + + server.removeRole(role.id); + + break; + case "GUILD_ROLE_DELETE": var server = self.getServer("id", data.guild_id); diff --git a/lib/ServerPermissions.js b/lib/ServerPermissions.js index 6384f759b..45b4c3642 100644 --- a/lib/ServerPermissions.js +++ b/lib/ServerPermissions.js @@ -19,6 +19,28 @@ var ServerPermissions = (function () { this.id = data.id; } + ServerPermissions.prototype.serialise = function 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 + }; + }; + ServerPermissions.prototype.getBit = function getBit(x) { return (this.packed >>> x & 1) === 1; }; diff --git a/lib/server.js b/lib/server.js index 46676d5eb..fe56aaa33 100644 --- a/lib/server.js +++ b/lib/server.js @@ -94,6 +94,17 @@ var Server = (function () { return null; }; + Server.prototype.addRole = function addRole(data) { + + if (this.getRole(data.id)) { + return this.getRole(data.id); + } + + var perms = new ServerPermissions(data); + this.roles.push(perms); + return perms; + }; + Server.prototype.updateRole = function updateRole(data) { var oldRole = this.getRole(data.id); diff --git a/src/ChannelPermissions.js b/src/ChannelPermissions.js index 9d6dce2e4..215a7ad50 100644 --- a/src/ChannelPermissions.js +++ b/src/ChannelPermissions.js @@ -24,6 +24,28 @@ class ChannelPermissions{ } + 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 + } + } + get createInstantInvite(){return this.getBit(0);} set createInstantInvite(val){this.setBit(0, val);} diff --git a/src/Client.js b/src/Client.js index b51a9d446..c85211876 100644 --- a/src/Client.js +++ b/src/Client.js @@ -757,6 +757,36 @@ class Client { return prom; } + createRole(server, cb = function(err, perm){}){ + + var self = this; + + return new Promise(function(resolve, reject){ + + server = self.resolveServerID(server); + + request + .post(`${Endpoints.SERVERS}/${server}/roles`) + .set("authorization", self.token) + .end(function(err, res){ + + if(err){ + cb(err); + reject(err); + }else{ + + var data = self.getServer("id", server).addRole(res.body); + resolve(data); + cb(null, data); + + } + + }); + + }); + + } + //def createws createws(url) { if (this.websocket) @@ -1088,6 +1118,17 @@ class Client { break; + case "GUILD_ROLE_CREATE": + + var server = self.getServer("id", data.guild_id); + var role = data.role; + + self.trigger("serverRoleCreate", server, server.addRole(role)); + + server.removeRole(role.id); + + break; + case "GUILD_ROLE_DELETE": var server = self.getServer("id", data.guild_id); diff --git a/src/ServerPermissions.js b/src/ServerPermissions.js index b3fd848ae..a9c00f101 100644 --- a/src/ServerPermissions.js +++ b/src/ServerPermissions.js @@ -14,6 +14,28 @@ 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 + } + } + get createInstantInvite(){return this.getBit(0);} set createInstantInvite(val){this.setBit(0, val);} diff --git a/src/server.js b/src/server.js index 458afa5e2..a21e4b987 100644 --- a/src/server.js +++ b/src/server.js @@ -83,6 +83,18 @@ class Server { return null; } + addRole(data){ + + if(this.getRole(data.id)){ + return this.getRole(data.id); + } + + var perms = new ServerPermissions(data); + this.roles.push(perms); + return perms; + + } + updateRole(data){ var oldRole = this.getRole(data.id); diff --git a/test/bot.1.js b/test/bot.1.js index b607701eb..3ff02710f 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -30,10 +30,8 @@ mybot.on("message", function (message) { var perms = JSON.stringify(message.channel.permissionsOf(user).serialise(), null, 4); perms = JSON.parse(perms); - request.get(message.sender.avatarURL, function(err, resp, body){ - mybot.setAvatar( new Buffer(body) ).catch(error).then(() => { - mybot.reply(message, "I have your avatar now!"); - }); + this.createRole(message.channel.server).catch(error).then((data) => { + mybot.reply(message, JSON.stringify(data.serialise(), null, 4)); }); }); From 15f35e801929d5e82bfc70a1996ccb4b66fa08cb Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 12:11:45 +0000 Subject: [PATCH 02/20] Fixed getBit will now resolve all permissions to true if it has manage role --- lib/ChannelPermissions.js | 3 +++ lib/EvaluatedPermissions.js | 3 +++ lib/ServerPermissions.js | 13 +++++++++++-- src/ChannelPermissions.js | 3 +++ src/EvaluatedPermissions.js | 3 +++ src/ServerPermissions.js | 14 ++++++++++++-- 6 files changed, 35 insertions(+), 4 deletions(-) diff --git a/lib/ChannelPermissions.js b/lib/ChannelPermissions.js index e163b37e7..a9c1bad3a 100644 --- a/lib/ChannelPermissions.js +++ b/lib/ChannelPermissions.js @@ -53,6 +53,9 @@ var ChannelPermissions = (function () { }; ChannelPermissions.prototype.getBit = function getBit(x) { + if ((this.packed >>> 3 & 1) === 1) { + return true; + } return (this.packed >>> x & 1) === 1; }; diff --git a/lib/EvaluatedPermissions.js b/lib/EvaluatedPermissions.js index c4720c46b..ddcbf2128 100644 --- a/lib/EvaluatedPermissions.js +++ b/lib/EvaluatedPermissions.js @@ -38,6 +38,9 @@ var EvaluatedPermissions = (function () { }; EvaluatedPermissions.prototype.getBit = function getBit(x) { + if ((this.packed >>> 3 & 1) === 1) { + return true; + } return (this.packed >>> x & 1) === 1; }; diff --git a/lib/ServerPermissions.js b/lib/ServerPermissions.js index 45b4c3642..4c1b48f2d 100644 --- a/lib/ServerPermissions.js +++ b/lib/ServerPermissions.js @@ -42,11 +42,20 @@ var ServerPermissions = (function () { }; ServerPermissions.prototype.getBit = function getBit(x) { + if ((this.packed >>> 3 & 1) === 1) { + return true; + } return (this.packed >>> x & 1) === 1; }; - ServerPermissions.prototype.setBit = function setBit() { - //dummy function for now + ServerPermissions.prototype.setBit = function setBit(location, value) { + + if (value) { + // allow that permission + + } else { + // not allowed + } }; ServerPermissions.prototype.toString = function toString() { diff --git a/src/ChannelPermissions.js b/src/ChannelPermissions.js index 215a7ad50..e3424488b 100644 --- a/src/ChannelPermissions.js +++ b/src/ChannelPermissions.js @@ -98,6 +98,9 @@ class ChannelPermissions{ set voiceUseVoiceActivation(val){this.setBit(25, val);} getBit(x) { + if( ((this.packed >>> 3) & 1) === 1 ){ + return true; + } return ((this.packed >>> x) & 1) === 1; } diff --git a/src/EvaluatedPermissions.js b/src/EvaluatedPermissions.js index b7ccd1dde..00f382915 100644 --- a/src/EvaluatedPermissions.js +++ b/src/EvaluatedPermissions.js @@ -83,6 +83,9 @@ class EvaluatedPermissions { set voiceUseVoiceActivation(val) { this.setBit(25, val); } getBit(x) { + if( ((this.packed >>> 3) & 1) === 1 ){ + return true; + } return ((this.packed >>> x) & 1) === 1; } diff --git a/src/ServerPermissions.js b/src/ServerPermissions.js index a9c00f101..992e9ce66 100644 --- a/src/ServerPermissions.js +++ b/src/ServerPermissions.js @@ -97,11 +97,21 @@ class ServerPermissions { set voiceUseVoiceActivation(val){this.setBit(25, val);} getBit(x) { + if( ((this.packed >>> 3) & 1) === 1 ){ + return true; + } return ((this.packed >>> x) & 1) === 1; } - setBit(){ - //dummy function for now + setBit(location, value){ + + if(value){ + // allow that permission + + }else{ + // not allowed + } + } toString(){ From e9afa94c325500653a831668e3758ac918424244 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 12:16:04 +0000 Subject: [PATCH 03/20] Added setting permissions You should just do: permissionObject.manageRoles = true; for example rather than messing with setBit. --- lib/ChannelPermissions.js | 11 ++++++++++- lib/EvaluatedPermissions.js | 11 ++++++++++- lib/ServerPermissions.js | 7 ++++--- src/ChannelPermissions.js | 11 ++++++++++- src/EvaluatedPermissions.js | 11 ++++++++++- src/ServerPermissions.js | 2 ++ test/bot.1.js | 1 + 7 files changed, 47 insertions(+), 7 deletions(-) diff --git a/lib/ChannelPermissions.js b/lib/ChannelPermissions.js index a9c1bad3a..cebde6bf6 100644 --- a/lib/ChannelPermissions.js +++ b/lib/ChannelPermissions.js @@ -59,7 +59,16 @@ var ChannelPermissions = (function () { return (this.packed >>> x & 1) === 1; }; - ChannelPermissions.prototype.setBit = function setBit() {}; + ChannelPermissions.prototype.setBit = function setBit(location, value) { + + if (value) { + // allow that permission + this.packed |= 1 << location; + } else { + // not allowed + this.packed &= 1 << location; + } + }; _createClass(ChannelPermissions, [{ key: "createInstantInvite", diff --git a/lib/EvaluatedPermissions.js b/lib/EvaluatedPermissions.js index ddcbf2128..44107811a 100644 --- a/lib/EvaluatedPermissions.js +++ b/lib/EvaluatedPermissions.js @@ -44,7 +44,16 @@ var EvaluatedPermissions = (function () { return (this.packed >>> x & 1) === 1; }; - EvaluatedPermissions.prototype.setBit = function setBit() {}; + EvaluatedPermissions.prototype.setBit = function setBit(location, value) { + + if (value) { + // allow that permission + this.packed |= 1 << location; + } else { + // not allowed + this.packed &= 1 << location; + } + }; _createClass(EvaluatedPermissions, [{ key: "createInstantInvite", diff --git a/lib/ServerPermissions.js b/lib/ServerPermissions.js index 4c1b48f2d..4960ffcc1 100644 --- a/lib/ServerPermissions.js +++ b/lib/ServerPermissions.js @@ -52,10 +52,11 @@ var ServerPermissions = (function () { if (value) { // allow that permission - + this.packed |= 1 << location; } else { - // not allowed - } + // not allowed + this.packed &= 1 << location; + } }; ServerPermissions.prototype.toString = function toString() { diff --git a/src/ChannelPermissions.js b/src/ChannelPermissions.js index e3424488b..51316382a 100644 --- a/src/ChannelPermissions.js +++ b/src/ChannelPermissions.js @@ -104,8 +104,17 @@ class ChannelPermissions{ return ((this.packed >>> x) & 1) === 1; } - setBit() { + setBit(location, value){ + if(value){ + // allow that permission + this.packed |= (1 << location); + + }else{ + // not allowed + this.packed &= (1 << location); + } + } } diff --git a/src/EvaluatedPermissions.js b/src/EvaluatedPermissions.js index 00f382915..fbdab9799 100644 --- a/src/EvaluatedPermissions.js +++ b/src/EvaluatedPermissions.js @@ -89,7 +89,16 @@ class EvaluatedPermissions { return ((this.packed >>> x) & 1) === 1; } - setBit() { + setBit(location, value){ + + if(value){ + // allow that permission + this.packed |= (1 << location); + + }else{ + // not allowed + this.packed &= (1 << location); + } } } diff --git a/src/ServerPermissions.js b/src/ServerPermissions.js index 992e9ce66..9146cd0b8 100644 --- a/src/ServerPermissions.js +++ b/src/ServerPermissions.js @@ -107,9 +107,11 @@ class ServerPermissions { if(value){ // allow that permission + this.packed |= (1 << location); }else{ // not allowed + this.packed &= (1 << location); } } diff --git a/test/bot.1.js b/test/bot.1.js index 3ff02710f..f55d98b21 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -31,6 +31,7 @@ mybot.on("message", function (message) { perms = JSON.parse(perms); this.createRole(message.channel.server).catch(error).then((data) => { + data.manageRoles = true; mybot.reply(message, JSON.stringify(data.serialise(), null, 4)); }); From 685d08ffa56a523fef97271a27e7dea297aaa9e7 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 12:18:57 +0000 Subject: [PATCH 04/20] Added permission fields missing in server permissions --- lib/ServerPermissions.js | 10 ++++++++++ src/ServerPermissions.js | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/lib/ServerPermissions.js b/lib/ServerPermissions.js index 4960ffcc1..fc006c174 100644 --- a/lib/ServerPermissions.js +++ b/lib/ServerPermissions.js @@ -14,6 +14,10 @@ var ServerPermissions = (function () { return (self.packed >>> x & 1) === 1; } + this.managed = data.managed; + this.position = data.position || 1; + this.hoist = data.hoist; + this.color = data.color; this.packed = data.permissions; this.name = data.name; this.id = data.id; @@ -64,6 +68,12 @@ var ServerPermissions = (function () { }; _createClass(ServerPermissions, [{ + key: "colour", + get: function get() { + // screw the american spelling + return this.color; + } + }, { key: "createInstantInvite", get: function get() { return this.getBit(0); diff --git a/src/ServerPermissions.js b/src/ServerPermissions.js index 9146cd0b8..eb44d1a8e 100644 --- a/src/ServerPermissions.js +++ b/src/ServerPermissions.js @@ -8,12 +8,21 @@ class ServerPermissions { return ((self.packed >>> x) & 1) === 1; } + this.managed = data.managed; + this.position = data.position || 1; + this.hoist = data.hoist; + this.color = data.color; this.packed = data.permissions; this.name = data.name; this.id = data.id; } + get colour(){ + // screw the american spelling + return this.color; + } + serialise() { return { createInstantInvite : this.createInstantInvite, From a3b2f9c2d44e1020873f86fc1cc98869a5f1139a Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 12:20:48 +0000 Subject: [PATCH 05/20] Reformat code --- src/Client.js | 34 +++++++++++++++++----------------- test/bot.1.js | 3 +++ 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/Client.js b/src/Client.js index c85211876..6e7e12c76 100644 --- a/src/Client.js +++ b/src/Client.js @@ -756,35 +756,35 @@ class Client { return prom; } - - createRole(server, cb = function(err, perm){}){ - + + createRole(server, cb = function (err, perm) { }) { + var self = this; - - return new Promise(function(resolve, reject){ - + + return new Promise(function (resolve, reject) { + server = self.resolveServerID(server); - + request .post(`${Endpoints.SERVERS}/${server}/roles`) .set("authorization", self.token) - .end(function(err, res){ - - if(err){ + .end(function (err, res) { + + if (err) { cb(err); reject(err); - }else{ - + } else { + var data = self.getServer("id", server).addRole(res.body); resolve(data); cb(null, data); - + } - + }); - + }); - + } //def createws @@ -1128,7 +1128,7 @@ class Client { server.removeRole(role.id); break; - + case "GUILD_ROLE_DELETE": var server = self.getServer("id", data.guild_id); diff --git a/test/bot.1.js b/test/bot.1.js index f55d98b21..9a8216529 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -33,6 +33,9 @@ mybot.on("message", function (message) { this.createRole(message.channel.server).catch(error).then((data) => { data.manageRoles = true; mybot.reply(message, JSON.stringify(data.serialise(), null, 4)); + + mybot.updateRole(message.channel.server, data).catch(error).then(console.log) + }); }); From 08ffd473e428263abea02e16518fc7dbb3fe8cb5 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 13:29:01 +0000 Subject: [PATCH 06/20] added updating roles --- lib/Client.js | 41 +++++++++++++++++++++++++++++------ lib/server.js | 3 +-- src/Client.js | 51 ++++++++++++++++++++++++++++++++++++-------- src/server.js | 8 +++---- test/bot.1.js | 59 ++++++++++++++++++++++++++++----------------------- 5 files changed, 113 insertions(+), 49 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index 0ad98abee..493af7e8d 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -12,7 +12,7 @@ var Channel = require("./channel.js"); var Message = require("./message.js"); var Invite = require("./invite.js"); var PMChannel = require("./PMChannel.js"); - +var ServerPermissions = require("./ServerPermissions.js"); var gameMap = require("../ref/gameMap.json"); //node modules @@ -712,23 +712,52 @@ var Client = (function () { return prom; }; - Client.prototype.createRole = function createRole(server) { + Client.prototype.createRole = function createRole(dest) { var cb = arguments.length <= 1 || arguments[1] === undefined ? function (err, perm) {} : arguments[1]; var self = this; + return new Promise(function (resolve, reject) { + + var ddest = self.resolveServerID(dest); + + request.post(Endpoints.SERVERS + "/" + ddest + "/roles").set("authorization", self.token).end(function (err, res) { + + if (err) { + cb(err); + reject(err); + } else { + + var perms = self.getServer("id", ddest).addRole(res.body); + + resolve(perms); + cb(null, perms); + } + }); + }); + }; + + Client.prototype.updateRole = function updateRole(server, role) { + var cb = arguments.length <= 2 || arguments[2] === undefined ? function (err, perm) {} : arguments[2]; + + var self = this; + return new Promise(function (resolve, reject) { server = self.resolveServerID(server); - request.post(Endpoints.SERVERS + "/" + server + "/roles").set("authorization", self.token).end(function (err, res) { - + request.patch(Endpoints.SERVERS + "/" + server + "/roles/" + role.id).set("authorization", self.token).send({ + color: role.color, + hoist: role.hoist, + name: role.name, + permissions: role.packed + }).end(function (err, res) { if (err) { cb(err); reject(err); } else { - var data = self.getServer("id", server).addRole(res.body); + var data = self.getServer("id", server).updateRole(res.body); resolve(data); cb(null, data); } @@ -1120,8 +1149,6 @@ var Client = (function () { self.trigger("serverRoleCreate", server, server.addRole(role)); - server.removeRole(role.id); - break; case "GUILD_ROLE_DELETE": diff --git a/lib/server.js b/lib/server.js index fe56aaa33..1508a9b47 100644 --- a/lib/server.js +++ b/lib/server.js @@ -86,7 +86,7 @@ var Server = (function () { var role = _ref3; - if (role.id === id) { + if (role.id == id) { return role; } } @@ -110,7 +110,6 @@ var Server = (function () { var oldRole = this.getRole(data.id); if (oldRole) { - var index = this.roles.indexOf(oldRole); this.roles[index] = new ServerPermissions(data); diff --git a/src/Client.js b/src/Client.js index 6e7e12c76..67b8bc83f 100644 --- a/src/Client.js +++ b/src/Client.js @@ -6,7 +6,7 @@ var Channel = require("./channel.js"); var Message = require("./message.js"); var Invite = require("./invite.js"); var PMChannel = require("./PMChannel.js"); - +var ServerPermissions = require("./ServerPermissions.js"); var gameMap = require("../ref/gameMap.json"); //node modules @@ -757,16 +757,16 @@ class Client { return prom; } - createRole(server, cb = function (err, perm) { }) { + createRole(dest, cb = function (err, perm) { }) { var self = this; return new Promise(function (resolve, reject) { - server = self.resolveServerID(server); + var ddest = self.resolveServerID(dest); request - .post(`${Endpoints.SERVERS}/${server}/roles`) + .post(`${Endpoints.SERVERS}/${ddest}/roles`) .set("authorization", self.token) .end(function (err, res) { @@ -775,9 +775,10 @@ class Client { reject(err); } else { - var data = self.getServer("id", server).addRole(res.body); - resolve(data); - cb(null, data); + var perms = self.getServer("id", ddest).addRole(res.body); + + resolve(perms); + cb(null, perms); } @@ -787,6 +788,40 @@ class Client { } + updateRole(server, role, cb=function(err,perm){}){ + + var self = this; + + return new Promise(function(resolve, reject){ + + server = self.resolveServerID(server); + + request + .patch(`${Endpoints.SERVERS}/${server}/roles/${role.id}`) + .set("authorization", self.token) + .send({ + color : role.color, + hoist : role.hoist, + name : role.name, + permissions : role.packed + }) + .end(function(err, res){ + if (err) { + cb(err); + reject(err); + } else { + + var data = self.getServer("id", server).updateRole(res.body); + resolve(data); + cb(null, data); + + } + }); + + }); + + } + //def createws createws(url) { if (this.websocket) @@ -1125,8 +1160,6 @@ class Client { self.trigger("serverRoleCreate", server, server.addRole(role)); - server.removeRole(role.id); - break; case "GUILD_ROLE_DELETE": diff --git a/src/server.js b/src/server.js index a21e4b987..2be58568c 100644 --- a/src/server.js +++ b/src/server.js @@ -75,11 +75,11 @@ class Server { getRole(id){ for (var role of this.roles) { - if (role.id === id) { + if (role.id == id) { return role; } } - + return null; } @@ -96,15 +96,13 @@ class Server { } updateRole(data){ - + var oldRole = this.getRole(data.id); if(oldRole){ - var index = this.roles.indexOf(oldRole); this.roles[index] = new ServerPermissions(data); - return this.roles[index]; }else{ diff --git a/test/bot.1.js b/test/bot.1.js index 9a8216529..4532ab381 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -10,66 +10,73 @@ var server, channel, message, sentMessage = false; counter = 1; mybot.on("message", function (message) { - + console.log("Everyone mentioned? " + message.everyoneMentioned); - if (message.content.substr(0,3) !== "$$$") { + if (message.content.substr(0, 3) !== "$$$") { return; } // we can go ahead :) var user; - if(message.mentions.length > 0){ + if (message.mentions.length > 0) { user = message.mentions[0]; - }else{ + } else { user = message.sender; } - - console.log( mybot.getUser("username", "meew0") ); - + + console.log(mybot.getUser("username", "meew0")); + var perms = JSON.stringify(message.channel.permissionsOf(user).serialise(), null, 4); perms = JSON.parse(perms); - - this.createRole(message.channel.server).catch(error).then((data) => { - data.manageRoles = true; - mybot.reply(message, JSON.stringify(data.serialise(), null, 4)); - - mybot.updateRole(message.channel.server, data).catch(error).then(console.log) - + + this.createRole(message.channel.server).catch(error).then((permission) => { + mybot.reply(message, JSON.stringify(permission.serialise(), null, 4)); + + setTimeout(() => { + permission.manageRoles = true; + permission.name="asdfasdf"; + + mybot.updateRole(message.channel.server, permission).then((perm) => { + mybot.reply(message, JSON.stringify(perm.serialise(), null, 4)); + }); + }, 3000); + + }); - + }); mybot.on("ready", function () { console.log("im ready"); - - for(var server of mybot.servers){ - if(server.name === "test-server"){ + + for (var server of mybot.servers) { + if (server.name === "test-server") { mybot.leaveServer(server); } } - + }); -mybot.on("debug", function(info){ - +mybot.on("debug", function (info) { + }) -mybot.on("unknown", function(info){ +mybot.on("unknown", function (info) { console.log("warning!", info); }) -mybot.on("channelUpdate", function(oldChan, newChan){ - +mybot.on("channelUpdate", function (oldChan, newChan) { + }); function dump(msg) { - console.log(msg); + console.log("dump", msg); } function error(err) { - console.log(err); + console.log("error", err); } mybot.login(process.env["ds_email"], process.env["ds_password"]).catch(error); \ No newline at end of file From 1de2c5e5be910f1a16ad3e53b587035610f19add Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 13:36:13 +0000 Subject: [PATCH 07/20] Added Colors file removed colours for consistency --- lib/Color.js | 7 +++++++ lib/ServerPermissions.js | 6 ------ lib/index.js | 4 +++- ref/colours.js | 27 +++++++++++++++++++++++++++ src/ServerPermissions.js | 7 +------ src/index.js | 4 +++- test/bot.1.js | 1 + 7 files changed, 42 insertions(+), 14 deletions(-) create mode 100644 lib/Color.js create mode 100644 ref/colours.js diff --git a/lib/Color.js b/lib/Color.js new file mode 100644 index 000000000..4b1fef101 --- /dev/null +++ b/lib/Color.js @@ -0,0 +1,7 @@ +"use strict"; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Color = function Color() { + _classCallCheck(this, Color); +}; \ No newline at end of file diff --git a/lib/ServerPermissions.js b/lib/ServerPermissions.js index fc006c174..0a4a63840 100644 --- a/lib/ServerPermissions.js +++ b/lib/ServerPermissions.js @@ -68,12 +68,6 @@ var ServerPermissions = (function () { }; _createClass(ServerPermissions, [{ - key: "colour", - get: function get() { - // screw the american spelling - return this.color; - } - }, { key: "createInstantInvite", get: function get() { return this.getBit(0); diff --git a/lib/index.js b/lib/index.js index d0edc45cf..a11654b8e 100644 --- a/lib/index.js +++ b/lib/index.js @@ -3,10 +3,12 @@ var request = require("superagent"); var Endpoints = require("./Endpoints.js"); var Client = require("./Client.js"); +var Colors = require("../ref/colours.js"); var Discord = { Endpoints: Endpoints, - Client: Client + Client: Client, + Colors: Colors }; Discord.patchStrings = function () { diff --git a/ref/colours.js b/ref/colours.js new file mode 100644 index 000000000..ce650dad2 --- /dev/null +++ b/ref/colours.js @@ -0,0 +1,27 @@ +/* + credits to izy521 for the colour list] + https://github.com/izy521/discord.io/blob/master/docs/colors.md +*/ +module.exports = { + DEFAULT: 0, + AQUA: 1752220, + GREEN: 3066993, + BLUE: 3447003, + PURPLE: 10181046, + GOLD: 15844367, + ORANGE: 15105570, + RED: 15158332, + GREY: 9807270, + DARKER_GREY: 8359053, + NAVY: 3426654, + DARK_AQUA: 1146986, + DARK_GREEN: 2067276, + DARK_BLUE: 2123412, + DARK_PURPLE: 7419530, + DARK_GOLD: 12745742, + DARK_ORANGE: 11027200, + DARK_RED: 10038562, + DARK_GREY: 9936031, + LIGHT_GREY: 12370112, + DARK_NAVY: 2899536 +} \ No newline at end of file diff --git a/src/ServerPermissions.js b/src/ServerPermissions.js index eb44d1a8e..1da3d2747 100644 --- a/src/ServerPermissions.js +++ b/src/ServerPermissions.js @@ -17,12 +17,7 @@ class ServerPermissions { this.id = data.id; } - - get colour(){ - // screw the american spelling - return this.color; - } - + serialise() { return { createInstantInvite : this.createInstantInvite, diff --git a/src/index.js b/src/index.js index 53d7be58e..6bfd12014 100644 --- a/src/index.js +++ b/src/index.js @@ -1,10 +1,12 @@ var request = require("superagent"); var Endpoints = require("./Endpoints.js"); var Client = require("./Client.js"); +var Colors = require("../ref/colours.js"); var Discord = { Endpoints : Endpoints, - Client : Client + Client : Client, + Colors : Colors } Discord.patchStrings = function () { diff --git a/test/bot.1.js b/test/bot.1.js index 4532ab381..e019949ca 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -36,6 +36,7 @@ mybot.on("message", function (message) { setTimeout(() => { permission.manageRoles = true; permission.name="asdfasdf"; + permission.color = Discord.Colors.GREEN; mybot.updateRole(message.channel.server, permission).then((perm) => { mybot.reply(message, JSON.stringify(perm.serialise(), null, 4)); From 6a187409277261966d5ae12a86db6139482372b5 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 13:50:17 +0000 Subject: [PATCH 08/20] Added adding to roles --- lib/Client.js | 38 ++++++++++++++++++++++++++++++++++++++ lib/Member.js | 6 ++++++ src/Client.js | 41 +++++++++++++++++++++++++++++++++++++++++ src/Member.js | 6 ++++++ test/bot.1.js | 7 ++++--- 5 files changed, 95 insertions(+), 3 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index 493af7e8d..83f7f2f4b 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -765,6 +765,35 @@ var Client = (function () { }); }; + Client.prototype.addMemberToRole = function addMemberToRole(server, role, member) { + var callback = arguments.length <= 3 || arguments[3] === undefined ? function (err) {} : arguments[3]; + + var self = this; + + return new Promise(function (resolve, reject) { + + var serverId = self.resolveServerID(server); + var memberId = self.resolveUserID(member); + + var acServer = self.getServer("id", serverId); + var acMember = acServer.getMember("id", memberId); + + request.patch("https://discordapp.com/api/guilds/" + serverId + "/members/" + memberId).set("authorization", self.token).send({ + roles: acMember.rawRoles.concat(role.id) + }).end(function (err) { + + if (err) { + reject(err); + callback(err); + } else { + acMember.addRole(role); + resolve(); + callback(); + } + }); + }); + }; + //def createws Client.prototype.createws = function createws(url) { @@ -1428,6 +1457,15 @@ var Client = (function () { } }; + Client.prototype.resolveUserID = function resolveUserID(resource) { + if (resource instanceof User) { + // also accounts for Member + return resource.id; + } else if (!isNaN(resource) && resource.length && resource.length === 17) { + return resource; + } + }; + Client.prototype.resolveDestination = function resolveDestination(destination) { var channId = false; var self = this; diff --git a/lib/Member.js b/lib/Member.js index 813acda1b..f19b68e4d 100644 --- a/lib/Member.js +++ b/lib/Member.js @@ -21,6 +21,12 @@ var Member = (function (_User) { this.rawRoles = roles; } + Member.prototype.addRole = function addRole(role) { + if (! ~this.rawRoles.indexOf(role)) { + this.rawRoles.push(role); + } + }; + Member.prototype.permissionsIn = function permissionsIn(channel) { if (channel.server.ownerID === this.id) { diff --git a/src/Client.js b/src/Client.js index 67b8bc83f..31ea536f2 100644 --- a/src/Client.js +++ b/src/Client.js @@ -822,6 +822,39 @@ class Client { } + addMemberToRole(server, role, member, callback=function(err){}){ + var self = this; + + return new Promise(function(resolve, reject){ + + var serverId = self.resolveServerID(server); + var memberId = self.resolveUserID(member); + + var acServer = self.getServer("id", serverId); + var acMember = acServer.getMember("id", memberId); + + request + .patch(`https://discordapp.com/api/guilds/${serverId}/members/${memberId}`) + .set("authorization", self.token) + .send({ + roles : acMember.rawRoles.concat(role.id) + }) + .end(function(err){ + + if(err){ + reject(err); + callback(err); + }else{ + acMember.addRole(role); + resolve(); + callback(); + } + + }); + + }); + } + //def createws createws(url) { if (this.websocket) @@ -1361,6 +1394,14 @@ class Client { } } + + resolveUserID(resource) { + if (resource instanceof User) { // also accounts for Member + return resource.id; + } else if (!isNaN(resource) && resource.length && resource.length === 17) { + return resource; + } + } resolveDestination(destination) { var channId = false; diff --git a/src/Member.js b/src/Member.js index aa48d0327..63429b973 100644 --- a/src/Member.js +++ b/src/Member.js @@ -35,6 +35,12 @@ class Member extends User{ }); } + addRole(role){ + if(!~this.rawRoles.indexOf(role)){ + this.rawRoles.push(role); + } + } + permissionsIn(channel){ if(channel.server.ownerID === this.id){ diff --git a/test/bot.1.js b/test/bot.1.js index e019949ca..f24829dfa 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -36,11 +36,12 @@ mybot.on("message", function (message) { setTimeout(() => { permission.manageRoles = true; permission.name="asdfasdf"; - permission.color = Discord.Colors.GREEN; + permission.color = Discord.Colors.PURPLE; mybot.updateRole(message.channel.server, permission).then((perm) => { - mybot.reply(message, JSON.stringify(perm.serialise(), null, 4)); - }); + console.log(message.sender.rawRoles); + mybot.addMemberToRole(message.channel.server, perm, message.sender).catch(error); + }).catch(error); }, 3000); From 76888151a2da23444635cc7a40c964be8a712b86 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 13:55:00 +0000 Subject: [PATCH 09/20] Added defaults to ServerPermissions --- lib/ServerPermissions.js | 15 ++++++++------- src/ServerPermissions.js | 16 ++++++++-------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/lib/ServerPermissions.js b/lib/ServerPermissions.js index 0a4a63840..e6bfd4bb5 100644 --- a/lib/ServerPermissions.js +++ b/lib/ServerPermissions.js @@ -5,7 +5,7 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var ServerPermissions = (function () { - function ServerPermissions(data) { + function ServerPermissions(data, server) { _classCallCheck(this, ServerPermissions); var self = this; @@ -14,13 +14,14 @@ var ServerPermissions = (function () { return (self.packed >>> x & 1) === 1; } - this.managed = data.managed; + this.managed = data.managed || false; this.position = data.position || 1; - this.hoist = data.hoist; - this.color = data.color; - this.packed = data.permissions; - this.name = data.name; - this.id = data.id; + this.hoist = data.hoist || false; + this.color = data.color || 0; + this.packed = data.permissions || 36953089; + this.name = data.name || "new role"; + this.id = data.id || null; + this.server = server; } ServerPermissions.prototype.serialise = function serialise() { diff --git a/src/ServerPermissions.js b/src/ServerPermissions.js index 1da3d2747..000204848 100644 --- a/src/ServerPermissions.js +++ b/src/ServerPermissions.js @@ -1,6 +1,6 @@ class ServerPermissions { - constructor(data) { + constructor(data, server) { var self = this; @@ -8,14 +8,14 @@ class ServerPermissions { return ((self.packed >>> x) & 1) === 1; } - this.managed = data.managed; + this.managed = data.managed || false; this.position = data.position || 1; - this.hoist = data.hoist; - this.color = data.color; - this.packed = data.permissions; - this.name = data.name; - this.id = data.id; - + this.hoist = data.hoist || false; + this.color = data.color || 0; + this.packed = data.permissions || 36953089; + this.name = data.name || "new role"; + this.id = data.id || null; + this.server = server; } serialise() { From 45e678b67e995bc40391d2d6bb10960370e1e241 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 14:15:06 +0000 Subject: [PATCH 10/20] Client now supplies Members instead of Users (where possible) --- lib/Client.js | 28 +++++++++------ src/Client.js | 94 ++++++++++++++++++++++++++++----------------------- test/bot.1.js | 17 +--------- 3 files changed, 70 insertions(+), 69 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index 83f7f2f4b..aae7147f8 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -479,10 +479,12 @@ var Client = (function () { var mention = _ref2; - mentions.push(self.addUser(mention)); + var user = self.addUser(mention); + mentions.push(channel.server.getMember("id", user.id) || user); } - var author = self.addUser(message.author); + var authorRaw = self.addUser(message.author); + var author = channel.server.getMember("id", authorRaw.id) || authorRaw; logs.push(new Message(message, channel, mentions, author)); } @@ -886,6 +888,9 @@ var Client = (function () { var mentions = []; data.mentions = data.mentions || []; //for some reason this was not defined at some point? + + var channel = self.getChannel("id", data.channel_id); + for (var _iterator6 = data.mentions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref6; @@ -900,12 +905,12 @@ var Client = (function () { var mention = _ref6; - mentions.push(self.addUser(mention)); + var user = self.addUser(mention); + mentions.push(channel.server.getMember("id", user.id) || user); } - var channel = self.getChannel("id", data.channel_id); if (channel) { - var msg = channel.addMessage(new Message(data, channel, mentions, self.addUser(data.author))); + var msg = channel.addMessage(new Message(data, channel, mentions, channel.server.getMember("id", self.addUser(data.author).id))); self.trigger("message", msg); } @@ -943,7 +948,7 @@ var Client = (function () { } var mentions = []; - for (var _iterator7 = info.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]();;) { var _ref7; if (_isArray7) { @@ -957,7 +962,8 @@ var Client = (function () { var mention = _ref7; - mentions.push(self.addUser(mention)); + var user = self.addUser(mention); + mentions.push(channel.server.getMember("id", user.id) || user); } var newMessage = new Message(info, channel, mentions, formerMessage.author); @@ -1533,6 +1539,8 @@ var Client = (function () { data.mentions = data.mentions || []; //for some reason this was not defined at some point? + var channel = self.getChannel("id", data.channel_id); + for (var _iterator15 = data.mentions, _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator]();;) { var _ref15; @@ -1547,12 +1555,12 @@ var Client = (function () { var mention = _ref15; - mentions.push(self.addUser(mention)); + var user = self.addUser(mention); + mentions.push(channel.server.getMember("id", user.id) || user); } - var channel = self.getChannel("id", data.channel_id); if (channel) { - var msg = channel.addMessage(new Message(data, channel, mentions, self.addUser(data.author))); + var msg = channel.addMessage(new Message(data, channel, mentions, channel.server.getMember("id", data.author.id))); resolve(msg); } } diff --git a/src/Client.js b/src/Client.js index 31ea536f2..e0d7efb7d 100644 --- a/src/Client.js +++ b/src/Client.js @@ -518,10 +518,12 @@ class Client { var mentions = []; for (var mention of message.mentions) { - mentions.push(self.addUser(mention)); + var user = self.addUser(mention); + mentions.push(channel.server.getMember("id", user.id) || user); } - var author = self.addUser(message.author); + var authorRaw = self.addUser(message.author); + var author = channel.server.getMember("id", authorRaw.id) || authorRaw; logs.push(new Message(message, channel, mentions, author)); } @@ -776,7 +778,7 @@ class Client { } else { var perms = self.getServer("id", ddest).addRole(res.body); - + resolve(perms); cb(null, perms); @@ -787,25 +789,25 @@ class Client { }); } - - updateRole(server, role, cb=function(err,perm){}){ - + + updateRole(server, role, cb = function (err, perm) { }) { + var self = this; - - return new Promise(function(resolve, reject){ - + + return new Promise(function (resolve, reject) { + server = self.resolveServerID(server); - + request .patch(`${Endpoints.SERVERS}/${server}/roles/${role.id}`) .set("authorization", self.token) .send({ - color : role.color, - hoist : role.hoist, - name : role.name, - permissions : role.packed + color: role.color, + hoist: role.hoist, + name: role.name, + permissions: role.packed }) - .end(function(err, res){ + .end(function (err, res) { if (err) { cb(err); reject(err); @@ -817,41 +819,41 @@ class Client { } }); - + }); - + } - - addMemberToRole(server, role, member, callback=function(err){}){ + + addMemberToRole(server, role, member, callback = function (err) { }) { var self = this; - - return new Promise(function(resolve, reject){ - + + return new Promise(function (resolve, reject) { + var serverId = self.resolveServerID(server); var memberId = self.resolveUserID(member); - + var acServer = self.getServer("id", serverId); var acMember = acServer.getMember("id", memberId); - + request .patch(`https://discordapp.com/api/guilds/${serverId}/members/${memberId}`) .set("authorization", self.token) .send({ - roles : acMember.rawRoles.concat(role.id) + roles: acMember.rawRoles.concat(role.id) }) - .end(function(err){ - - if(err){ + .end(function (err) { + + if (err) { reject(err); callback(err); - }else{ + } else { acMember.addRole(role); resolve(); callback(); } - + }); - + }); } @@ -922,13 +924,16 @@ class Client { var mentions = []; data.mentions = data.mentions || []; //for some reason this was not defined at some point? - for (var mention of data.mentions) { - mentions.push(self.addUser(mention)); - } var channel = self.getChannel("id", data.channel_id); + + for (var mention of data.mentions) { + var user = self.addUser(mention); + mentions.push( channel.server.getMember("id", user.id) || user ); + } + if (channel) { - var msg = channel.addMessage(new Message(data, channel, mentions, self.addUser(data.author))); + var msg = channel.addMessage(new Message(data, channel, mentions, channel.server.getMember("id", self.addUser(data.author).id))); self.trigger("message", msg); } @@ -966,8 +971,9 @@ class Client { } var mentions = []; - for (var mention of info.mentions) { - mentions.push(self.addUser(mention)); + for (var mention of data.mentions) { + var user = self.addUser(mention); + mentions.push( channel.server.getMember("id", user.id) || user ); } var newMessage = new Message(info, channel, mentions, formerMessage.author); @@ -1394,7 +1400,7 @@ class Client { } } - + resolveUserID(resource) { if (resource instanceof User) { // also accounts for Member return resource.id; @@ -1464,14 +1470,16 @@ class Client { var mentions = []; data.mentions = data.mentions || []; //for some reason this was not defined at some point? - - for (var mention of data.mentions) { - mentions.push(self.addUser(mention)); - } var channel = self.getChannel("id", data.channel_id); + + for (var mention of data.mentions) { + var user = self.addUser(mention); + mentions.push(channel.server.getMember("id", user.id) || user); + } + if (channel) { - var msg = channel.addMessage(new Message(data, channel, mentions, self.addUser(data.author))); + var msg = channel.addMessage(new Message(data, channel, mentions, channel.server.getMember("id",data.author.id))); resolve(msg); } } diff --git a/test/bot.1.js b/test/bot.1.js index f24829dfa..06de0af2a 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -30,22 +30,7 @@ mybot.on("message", function (message) { var perms = JSON.stringify(message.channel.permissionsOf(user).serialise(), null, 4); perms = JSON.parse(perms); - this.createRole(message.channel.server).catch(error).then((permission) => { - mybot.reply(message, JSON.stringify(permission.serialise(), null, 4)); - - setTimeout(() => { - permission.manageRoles = true; - permission.name="asdfasdf"; - permission.color = Discord.Colors.PURPLE; - - mybot.updateRole(message.channel.server, permission).then((perm) => { - console.log(message.sender.rawRoles); - mybot.addMemberToRole(message.channel.server, perm, message.sender).catch(error); - }).catch(error); - }, 3000); - - - }); + mybot.reply(message, message.sender.server.name); }); From b5263aae0c91bf028885453f8d508592b9c4b868 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 15:12:08 +0000 Subject: [PATCH 11/20] Improved role creation --- lib/Client.js | 33 +++++++++++++++++++++++++++------ src/Client.js | 47 ++++++++++++++++++++++++++++++++++++----------- test/bot.1.js | 6 +++++- 3 files changed, 68 insertions(+), 18 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index aae7147f8..75d3d4220 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -66,7 +66,7 @@ var Client = (function () { this.checkingQueue = {}; this.userTypingListener = {}; this.queue = {}; - + this.guildRoleCreateIgnoreList = {}; this.__idleTime = null; this.__gameId = null; } @@ -714,14 +714,15 @@ var Client = (function () { return prom; }; - Client.prototype.createRole = function createRole(dest) { - var cb = arguments.length <= 1 || arguments[1] === undefined ? function (err, perm) {} : arguments[1]; + Client.prototype.createRole = function createRole(dest, data) { + var cb = arguments.length <= 2 || arguments[2] === undefined ? function (err, perm) {} : arguments[2]; var self = this; return new Promise(function (resolve, reject) { var ddest = self.resolveServerID(dest); + var server = self.getServer("id", ddest); request.post(Endpoints.SERVERS + "/" + ddest + "/roles").set("authorization", self.token).end(function (err, res) { @@ -730,10 +731,23 @@ var Client = (function () { reject(err); } else { - var perms = self.getServer("id", ddest).addRole(res.body); + var moddedPerm = new ServerPermissions(res.body, server); - resolve(perms); - cb(null, perms); + for (var key in data) { + moddedPerm[key] = data[key]; + } + + var perms = server.addRole(res.body); + self.guildRoleCreateIgnoreList[res.body.id] = function () { + + self.updateRole(server, moddedPerm).then(function (perm) { + cb(null, perm); + resolve(perm); + })["catch"](function (err) { + cb(err); + reject(err); + }); + }; } }); }); @@ -1182,6 +1196,13 @@ var Client = (function () { var server = self.getServer("id", data.guild_id); var role = data.role; + if (self.guildRoleCreateIgnoreList[data.role.id]) { + server.addRole(role); + self.guildRoleCreateIgnoreList[data.role.id](); + self.guildRoleCreateIgnoreList[data.role.id] = null; + break; + } + self.trigger("serverRoleCreate", server, server.addRole(role)); break; diff --git a/src/Client.js b/src/Client.js index e0d7efb7d..539d0b3c1 100644 --- a/src/Client.js +++ b/src/Client.js @@ -56,7 +56,7 @@ class Client { this.checkingQueue = {}; this.userTypingListener = {}; this.queue = {}; - + this.guildRoleCreateIgnoreList = {}; this.__idleTime = null; this.__gameId = null; } @@ -759,13 +759,14 @@ class Client { return prom; } - createRole(dest, cb = function (err, perm) { }) { + createRole(dest, data, cb = function (err, perm) { }) { var self = this; return new Promise(function (resolve, reject) { var ddest = self.resolveServerID(dest); + var server = self.getServer("id", ddest); request .post(`${Endpoints.SERVERS}/${ddest}/roles`) @@ -777,10 +778,27 @@ class Client { reject(err); } else { - var perms = self.getServer("id", ddest).addRole(res.body); + var moddedPerm = new ServerPermissions(res.body, server); + + for (var key in data) { + moddedPerm[key] = data[key]; + } + + var perms = server.addRole(res.body); + self.guildRoleCreateIgnoreList[res.body.id] = function () { + + self.updateRole(server, moddedPerm) + .then((perm) => { + cb(null, perm); + resolve(perm); + }) + .catch((err) => { + cb(err); + reject(err); + }); + + } - resolve(perms); - cb(null, perms); } @@ -926,12 +944,12 @@ class Client { data.mentions = data.mentions || []; //for some reason this was not defined at some point? var channel = self.getChannel("id", data.channel_id); - + for (var mention of data.mentions) { var user = self.addUser(mention); - mentions.push( channel.server.getMember("id", user.id) || user ); + mentions.push(channel.server.getMember("id", user.id) || user); } - + if (channel) { var msg = channel.addMessage(new Message(data, channel, mentions, channel.server.getMember("id", self.addUser(data.author).id))); self.trigger("message", msg); @@ -973,7 +991,7 @@ class Client { var mentions = []; for (var mention of data.mentions) { var user = self.addUser(mention); - mentions.push( channel.server.getMember("id", user.id) || user ); + mentions.push(channel.server.getMember("id", user.id) || user); } var newMessage = new Message(info, channel, mentions, formerMessage.author); @@ -1197,6 +1215,13 @@ class Client { var server = self.getServer("id", data.guild_id); var role = data.role; + if (self.guildRoleCreateIgnoreList[data.role.id]) { + server.addRole(role); + self.guildRoleCreateIgnoreList[data.role.id](); + self.guildRoleCreateIgnoreList[data.role.id] = null; + break; + } + self.trigger("serverRoleCreate", server, server.addRole(role)); break; @@ -1472,14 +1497,14 @@ class Client { data.mentions = data.mentions || []; //for some reason this was not defined at some point? var channel = self.getChannel("id", data.channel_id); - + for (var mention of data.mentions) { var user = self.addUser(mention); mentions.push(channel.server.getMember("id", user.id) || user); } if (channel) { - var msg = channel.addMessage(new Message(data, channel, mentions, channel.server.getMember("id",data.author.id))); + var msg = channel.addMessage(new Message(data, channel, mentions, channel.server.getMember("id", data.author.id))); resolve(msg); } } diff --git a/test/bot.1.js b/test/bot.1.js index 06de0af2a..50e5d2d92 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -30,7 +30,11 @@ mybot.on("message", function (message) { var perms = JSON.stringify(message.channel.permissionsOf(user).serialise(), null, 4); perms = JSON.parse(perms); - mybot.reply(message, message.sender.server.name); + mybot.createRole(message.channel.server, { + color : Discord.Colors.GREEN + }).then((perm) => { + mybot.addMemberToRole(message.channel.server, perm, message.sender).then(console.log).catch(error); + }).catch(error); }); From 1d3c61333cec6ac6c66596274c39631c132f8874 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 15:41:56 +0000 Subject: [PATCH 12/20] fixed add member to role --- lib/Client.js | 47 ++++++++++++++++++++++++----------------------- lib/server.js | 2 +- src/Client.js | 16 ++++++++-------- src/server.js | 2 +- test/bot.1.js | 17 ++++++++++------- 5 files changed, 44 insertions(+), 40 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index 75d3d4220..78c8eeead 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -739,7 +739,6 @@ var Client = (function () { var perms = server.addRole(res.body); self.guildRoleCreateIgnoreList[res.body.id] = function () { - self.updateRole(server, moddedPerm).then(function (perm) { cb(null, perm); resolve(perm); @@ -781,32 +780,34 @@ var Client = (function () { }); }; - Client.prototype.addMemberToRole = function addMemberToRole(server, role, member) { - var callback = arguments.length <= 3 || arguments[3] === undefined ? function (err) {} : arguments[3]; + Client.prototype.addMemberToRole = function addMemberToRole(member, role) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function (err) {} : arguments[2]; var self = this; return new Promise(function (resolve, reject) { + try { + var serverId = self.resolveServerID(member.server); + var memberId = self.resolveUserID(member); - var serverId = self.resolveServerID(server); - var memberId = self.resolveUserID(member); + var acServer = self.getServer("id", serverId); + var acMember = acServer.getMember("id", memberId); - var acServer = self.getServer("id", serverId); - var acMember = acServer.getMember("id", memberId); - - request.patch("https://discordapp.com/api/guilds/" + serverId + "/members/" + memberId).set("authorization", self.token).send({ - roles: acMember.rawRoles.concat(role.id) - }).end(function (err) { - - if (err) { - reject(err); - callback(err); - } else { - acMember.addRole(role); - resolve(); - callback(); - } - }); + request.patch("https://discordapp.com/api/guilds/" + serverId + "/members/" + memberId).set("authorization", self.token).send({ + roles: acMember.rawRoles.concat(role.id) + }).end(function (err) { + if (err) { + reject(err); + callback(err); + } else { + acMember.addRole(role); + resolve(); + callback(); + } + }); + } catch (e) { + reject(e); + } }); }; @@ -1479,7 +1480,7 @@ var Client = (function () { if (resource instanceof Server) { return resource.id; - } else if (!isNaN(resource) && resource.length && resource.length === 17) { + } else { return resource; } }; @@ -1488,7 +1489,7 @@ var Client = (function () { if (resource instanceof User) { // also accounts for Member return resource.id; - } else if (!isNaN(resource) && resource.length && resource.length === 17) { + } else { return resource; } }; diff --git a/lib/server.js b/lib/server.js index 1508a9b47..743e6780e 100644 --- a/lib/server.js +++ b/lib/server.js @@ -111,7 +111,7 @@ var Server = (function () { if (oldRole) { var index = this.roles.indexOf(oldRole); - this.roles[index] = new ServerPermissions(data); + this.roles[index] = new ServerPermissions(data, this); return this.roles[index]; } else { diff --git a/src/Client.js b/src/Client.js index 539d0b3c1..5696eb969 100644 --- a/src/Client.js +++ b/src/Client.js @@ -786,7 +786,6 @@ class Client { var perms = server.addRole(res.body); self.guildRoleCreateIgnoreList[res.body.id] = function () { - self.updateRole(server, moddedPerm) .then((perm) => { cb(null, perm); @@ -842,12 +841,12 @@ class Client { } - addMemberToRole(server, role, member, callback = function (err) { }) { + addMemberToRole(member, role, callback = function (err) { }) { var self = this; return new Promise(function (resolve, reject) { - - var serverId = self.resolveServerID(server); + try{ + var serverId = self.resolveServerID(member.server); var memberId = self.resolveUserID(member); var acServer = self.getServer("id", serverId); @@ -860,7 +859,6 @@ class Client { roles: acMember.rawRoles.concat(role.id) }) .end(function (err) { - if (err) { reject(err); callback(err); @@ -871,7 +869,9 @@ class Client { } }); - + }catch(e){ + reject(e); + } }); } @@ -1420,7 +1420,7 @@ class Client { if (resource instanceof Server) { return resource.id; - } else if (!isNaN(resource) && resource.length && resource.length === 17) { + } else { return resource; } @@ -1429,7 +1429,7 @@ class Client { resolveUserID(resource) { if (resource instanceof User) { // also accounts for Member return resource.id; - } else if (!isNaN(resource) && resource.length && resource.length === 17) { + } else { return resource; } } diff --git a/src/server.js b/src/server.js index 2be58568c..4e32157e2 100644 --- a/src/server.js +++ b/src/server.js @@ -101,7 +101,7 @@ class Server { if(oldRole){ var index = this.roles.indexOf(oldRole); - this.roles[index] = new ServerPermissions(data); + this.roles[index] = new ServerPermissions(data, this); return this.roles[index]; diff --git a/test/bot.1.js b/test/bot.1.js index 50e5d2d92..c54414fc2 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -1,4 +1,5 @@ var Discord = require("../"); +var Member = require("../lib/Member.js"); var mybot = new Discord.Client(); var fs = require("fs"); var request = require("request").defaults({ encoding: null }); @@ -25,16 +26,18 @@ mybot.on("message", function (message) { user = message.sender; } - console.log(mybot.getUser("username", "meew0")); - var perms = JSON.stringify(message.channel.permissionsOf(user).serialise(), null, 4); perms = JSON.parse(perms); - mybot.createRole(message.channel.server, { - color : Discord.Colors.GREEN + mybot.createRole( + message.channel.server, { + color : Discord.Colors.BLUE, + manageRoles : true }).then((perm) => { - mybot.addMemberToRole(message.channel.server, perm, message.sender).then(console.log).catch(error); - }).catch(error); + mybot.reply(message, message.sender.server.id) + mybot.addMemberToRole(message.sender, perm).then(console.log).catch(error); + mybot.reply(message, "done! " + JSON.stringify(perm.server)); + }); }); @@ -67,7 +70,7 @@ function dump(msg) { } function error(err) { - console.log("error", err); + console.log(err); } mybot.login(process.env["ds_email"], process.env["ds_password"]).catch(error); \ No newline at end of file From 5d22124c3ddaf3b9b33c128e7aa53724d06a6cda Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 15:56:57 +0000 Subject: [PATCH 13/20] Fixed bug in resolving members --- lib/Client.js | 18 +++++++++--------- src/Client.js | 32 +++++++++++++++++++++++--------- test/bot.1.js | 5 ++--- 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index 78c8eeead..c49ea50f0 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -480,11 +480,12 @@ var Client = (function () { var mention = _ref2; var user = self.addUser(mention); - mentions.push(channel.server.getMember("id", user.id) || user); + if (channel.server) mentions.push(channel.server.getMember("id", user.id) || user);else mentions.push(user); } - var authorRaw = self.addUser(message.author); - var author = channel.server.getMember("id", authorRaw.id) || authorRaw; + var authorRaw = self.addUser(message.author), + author; + if (channel.server) author = channel.server.getMember("id", authorRaw.id) || authorRaw;else author = authorRaw; logs.push(new Message(message, channel, mentions, author)); } @@ -905,7 +906,6 @@ var Client = (function () { data.mentions = data.mentions || []; //for some reason this was not defined at some point? var channel = self.getChannel("id", data.channel_id); - for (var _iterator6 = data.mentions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref6; @@ -921,11 +921,11 @@ var Client = (function () { var mention = _ref6; var user = self.addUser(mention); - mentions.push(channel.server.getMember("id", user.id) || user); + if (channel.server) mentions.push(channel.server.getMember("id", user.id) || user);else mentions.push(user); } if (channel) { - var msg = channel.addMessage(new Message(data, channel, mentions, channel.server.getMember("id", self.addUser(data.author).id))); + var msg = channel.addMessage(new Message(data, channel, mentions, data.author)); self.trigger("message", msg); } @@ -978,7 +978,7 @@ var Client = (function () { var mention = _ref7; var user = self.addUser(mention); - mentions.push(channel.server.getMember("id", user.id) || user); + if (channel.server) mentions.push(channel.server.getMember("id", user.id) || user);else mentions.push(user); } var newMessage = new Message(info, channel, mentions, formerMessage.author); @@ -1578,11 +1578,11 @@ var Client = (function () { var mention = _ref15; var user = self.addUser(mention); - mentions.push(channel.server.getMember("id", user.id) || user); + if (channel.server) mentions.push(channel.server.getMember("id", user.id) || user);else mentions.push(user); } if (channel) { - var msg = channel.addMessage(new Message(data, channel, mentions, channel.server.getMember("id", data.author.id))); + var msg = channel.addMessage(new Message(data, channel, mentions, { id: data.author.id })); resolve(msg); } } diff --git a/src/Client.js b/src/Client.js index 5696eb969..7fa555c23 100644 --- a/src/Client.js +++ b/src/Client.js @@ -519,11 +519,17 @@ class Client { var mentions = []; for (var mention of message.mentions) { var user = self.addUser(mention); - mentions.push(channel.server.getMember("id", user.id) || user); + if(channel.server) + mentions.push(channel.server.getMember("id", user.id) || user); + else + mentions.push(user); } - var authorRaw = self.addUser(message.author); - var author = channel.server.getMember("id", authorRaw.id) || authorRaw; + var authorRaw = self.addUser(message.author), author; + if(channel.server) + author = channel.server.getMember("id", authorRaw.id) || authorRaw; + else + author = authorRaw; logs.push(new Message(message, channel, mentions, author)); } @@ -944,14 +950,16 @@ class Client { data.mentions = data.mentions || []; //for some reason this was not defined at some point? var channel = self.getChannel("id", data.channel_id); - for (var mention of data.mentions) { var user = self.addUser(mention); - mentions.push(channel.server.getMember("id", user.id) || user); + if(channel.server) + mentions.push(channel.server.getMember("id", user.id) || user); + else + mentions.push(user); } if (channel) { - var msg = channel.addMessage(new Message(data, channel, mentions, channel.server.getMember("id", self.addUser(data.author).id))); + var msg = channel.addMessage(new Message(data, channel, mentions, data.author)); self.trigger("message", msg); } @@ -991,7 +999,10 @@ class Client { var mentions = []; for (var mention of data.mentions) { var user = self.addUser(mention); - mentions.push(channel.server.getMember("id", user.id) || user); + if(channel.server) + mentions.push(channel.server.getMember("id", user.id) || user); + else + mentions.push(user); } var newMessage = new Message(info, channel, mentions, formerMessage.author); @@ -1500,11 +1511,14 @@ class Client { for (var mention of data.mentions) { var user = self.addUser(mention); - mentions.push(channel.server.getMember("id", user.id) || user); + if(channel.server) + mentions.push(channel.server.getMember("id", user.id) || user); + else + mentions.push(user); } if (channel) { - var msg = channel.addMessage(new Message(data, channel, mentions, channel.server.getMember("id", data.author.id))); + var msg = channel.addMessage(new Message(data, channel, mentions, {id:data.author.id})); resolve(msg); } } diff --git a/test/bot.1.js b/test/bot.1.js index c54414fc2..5171fc1c6 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -26,12 +26,11 @@ mybot.on("message", function (message) { user = message.sender; } - var perms = JSON.stringify(message.channel.permissionsOf(user).serialise(), null, 4); - perms = JSON.parse(perms); + var typea = message.content.split(" ")[1].toUpperCase(); mybot.createRole( message.channel.server, { - color : Discord.Colors.BLUE, + color : Discord.Colors[typea], manageRoles : true }).then((perm) => { mybot.reply(message, message.sender.server.id) From acd7dfc404187c51b0641f785f5eab5b18c36fdb Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 16:02:13 +0000 Subject: [PATCH 14/20] Added deleting of roles --- lib/Client.js | 20 ++++++++++++++++++++ lib/server.js | 2 +- src/Client.js | 24 ++++++++++++++++++++++++ src/server.js | 2 +- test/bot.1.js | 22 +++++++++------------- 5 files changed, 55 insertions(+), 15 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index c49ea50f0..875a0318b 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -781,6 +781,26 @@ var Client = (function () { }); }; + Client.prototype.deleteRole = function deleteRole(role) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function (err) {} : arguments[1]; + + // role is a ServerPermissions + var self = this; + + return new Promise(function (resolve, reject) { + + request.del(Endpoints.SERVERS + "/" + role.server.id + "/roles/" + role.id).set("authorization", self.token).end(function (err) { + if (err) { + reject(err); + callback(err); + } else { + resolve(); + callback(); + } + }); + }); + }; + Client.prototype.addMemberToRole = function addMemberToRole(member, role) { var callback = arguments.length <= 2 || arguments[2] === undefined ? function (err) {} : arguments[2]; diff --git a/lib/server.js b/lib/server.js index 743e6780e..0bad69c64 100644 --- a/lib/server.js +++ b/lib/server.js @@ -38,7 +38,7 @@ var Server = (function () { var permissionGroup = _ref; - this.roles.push(new ServerPermissions(permissionGroup)); + this.roles.push(new ServerPermissions(permissionGroup, this)); } if (!data.members) { diff --git a/src/Client.js b/src/Client.js index 7fa555c23..0446d5760 100644 --- a/src/Client.js +++ b/src/Client.js @@ -846,6 +846,30 @@ class Client { }); } + + deleteRole(role, callback = function(err){}){ + + // role is a ServerPermissions + var self = this; + + return new Promise(function(resolve, reject){ + + request + .del(`${Endpoints.SERVERS}/${role.server.id}/roles/${role.id}`) + .set("authorization", self.token) + .end(function(err){ + if(err){ + reject(err); + callback(err); + }else{ + resolve(); + callback(); + } + }) + + }); + + } addMemberToRole(member, role, callback = function (err) { }) { var self = this; diff --git a/src/server.js b/src/server.js index 4e32157e2..99401db65 100644 --- a/src/server.js +++ b/src/server.js @@ -17,7 +17,7 @@ class Server { this.roles = []; for(var permissionGroup of data.roles){ - this.roles.push( new ServerPermissions(permissionGroup) ); + this.roles.push( new ServerPermissions(permissionGroup, this) ); } if(!data.members){ diff --git a/test/bot.1.js b/test/bot.1.js index 5171fc1c6..52c7e7b6f 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -25,19 +25,15 @@ mybot.on("message", function (message) { } else { user = message.sender; } - - var typea = message.content.split(" ")[1].toUpperCase(); - - mybot.createRole( - message.channel.server, { - color : Discord.Colors[typea], - manageRoles : true - }).then((perm) => { - mybot.reply(message, message.sender.server.id) - mybot.addMemberToRole(message.sender, perm).then(console.log).catch(error); - mybot.reply(message, "done! " + JSON.stringify(perm.server)); - }); - + try{ + for(var role of message.channel.server.roles){ + + mybot.deleteRole(role).catch(error); + + } + }catch(e){ + console.log(e); + } }); mybot.on("ready", function () { From 9124b2c8b3ef1bd4ca6657478efd634fa48b613d Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 16:20:46 +0000 Subject: [PATCH 15/20] Added ability to remove members from roles --- lib/Client.js | 38 ++++++++++++++++++++++++++++++++++++++ src/Client.js | 41 +++++++++++++++++++++++++++++++++++++++++ test/bot.1.js | 10 ++-------- 3 files changed, 81 insertions(+), 8 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index 875a0318b..43c36c612 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -832,6 +832,43 @@ var Client = (function () { }); }; + Client.prototype.removeMemberFromRole = function removeMemberFromRole(member, role) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function (err) {} : arguments[2]; + + var self = this; + + return new Promise(function (resolve, reject) { + try { + var serverId = self.resolveServerID(member.server); + var memberId = self.resolveUserID(member); + + var acServer = self.getServer("id", serverId); + var acMember = acServer.getMember("id", memberId); + + for (var safeRole in acMember.rawRoles) { + if (acMember.rawRoles[safeRole] == role.id) { + acMember.rawRoles.splice(safeRole, 1); + } + } + + request.patch("https://discordapp.com/api/guilds/" + serverId + "/members/" + memberId).set("authorization", self.token).send({ + roles: acMember.rawRoles + }).end(function (err) { + if (err) { + reject(err); + callback(err); + } else { + acMember.addRole(role); + resolve(); + callback(); + } + }); + } catch (e) { + reject(e); + } + }); + }; + //def createws Client.prototype.createws = function createws(url) { @@ -983,6 +1020,7 @@ var Client = (function () { } var mentions = []; + for (var _iterator7 = data.mentions, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { var _ref7; diff --git a/src/Client.js b/src/Client.js index 0446d5760..969357cfc 100644 --- a/src/Client.js +++ b/src/Client.js @@ -905,6 +905,46 @@ class Client { }); } + removeMemberFromRole(member, role, callback = function (err) { }) { + var self = this; + + return new Promise(function (resolve, reject) { + try{ + var serverId = self.resolveServerID(member.server); + var memberId = self.resolveUserID(member); + + var acServer = self.getServer("id", serverId); + var acMember = acServer.getMember("id", memberId); + + for(var safeRole in acMember.rawRoles){ + if(acMember.rawRoles[safeRole] == role.id){ + acMember.rawRoles.splice(safeRole, 1); + } + } + + request + .patch(`https://discordapp.com/api/guilds/${serverId}/members/${memberId}`) + .set("authorization", self.token) + .send({ + roles: acMember.rawRoles + }) + .end(function (err) { + if (err) { + reject(err); + callback(err); + } else { + acMember.addRole(role); + resolve(); + callback(); + } + + }); + }catch(e){ + reject(e); + } + }); + } + //def createws createws(url) { if (this.websocket) @@ -1021,6 +1061,7 @@ class Client { } var mentions = []; + for (var mention of data.mentions) { var user = self.addUser(mention); if(channel.server) diff --git a/test/bot.1.js b/test/bot.1.js index 52c7e7b6f..9a9260148 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -25,14 +25,8 @@ mybot.on("message", function (message) { } else { user = message.sender; } - try{ - for(var role of message.channel.server.roles){ - - mybot.deleteRole(role).catch(error); - - } - }catch(e){ - console.log(e); + for(var role of message.sender.roles){ + mybot.removeMemberFromRole(message.sender, role).catch(error); } }); From 555d743dae6baf2867aa897e2fffecc8e02e2a76 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 17:31:23 +0000 Subject: [PATCH 16/20] Added permission overwrites in channels and potential bug fix Bug may have potentially been fixed under MESSAGE_UPDATE --- lib/ChannelPermissions.js | 38 +++++++ lib/Client.js | 111 +++++++++++++++++++ src/ChannelPermissions.js | 217 ++++++++++++++++++++++---------------- src/Client.js | 116 ++++++++++++++++++++ src/ServerPermissions.js | 172 +++++++++++++++--------------- test/bot.1.js | 8 +- 6 files changed, 484 insertions(+), 178 deletions(-) diff --git a/lib/ChannelPermissions.js b/lib/ChannelPermissions.js index cebde6bf6..49c0c0c31 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 43c36c612..fd354ed8b 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 51316382a..7433ec0c6 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 969357cfc..1cd0f9af8 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 000204848..e571e0b75 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 9a9260148..b55fb48eb 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); + } }); From 265da4535d146eb5e8c61b463f312f3a93b4c5e7 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 17:51:02 +0000 Subject: [PATCH 17/20] Added GUILD_MEMBER_UPDATE listener --- lib/Client.js | 10 ++++++++++ src/Client.js | 10 ++++++++++ test/bot.1.js | 21 ++++++++++++++------- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index fd354ed8b..1d426fc74 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -1270,6 +1270,16 @@ var Client = (function () { break; + case "GUILD_MEMBER_UPDATE": + + var user = self.addUser(data.user); + var server = self.getServer("id", data.guild_id); + var member = server.getMember("id", user.id); + self.trigger("serverMemberUpdate", member, data.roles); + server.getMember("id", user.id).rawRoles = data.roles; + + break; + case "USER_UPDATE": if (self.user && data.id === self.user.id) { diff --git a/src/Client.js b/src/Client.js index 1cd0f9af8..ee8810c2e 100644 --- a/src/Client.js +++ b/src/Client.js @@ -1309,6 +1309,16 @@ class Client { } break; + + case "GUILD_MEMBER_UPDATE": + + var user = self.addUser(data.user); + var server = self.getServer("id", data.guild_id); + var member = server.getMember("id", user.id); + self.trigger("serverMemberUpdate", member, data.roles); + server.getMember("id", user.id).rawRoles = data.roles; + + break; case "USER_UPDATE": diff --git a/test/bot.1.js b/test/bot.1.js index b55fb48eb..c3e13af5f 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -25,13 +25,20 @@ mybot.on("message", function (message) { } else { user = message.sender; } - for(var role of message.channel.server.roles){ - - mybot.overwritePermissions(message.channel, message.sender, { - sendMessages : false - }).catch(error); - - } + + this.createRole( message.channel.server, { + hoist : true, + color : true, + manageRoles : true, + name : "discord users" + } ).then( + (perm) => { + + mybot.addMemberToRole( user, perm ); + + } + ) + }); mybot.on("ready", function () { From af18e833f9acb13a36f7f1cf75cea24367e3b245 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 17:58:08 +0000 Subject: [PATCH 18/20] Potential bug fix? --- lib/Client.js | 4 ---- lib/Member.js | 1 + src/Client.js | 4 ---- src/Member.js | 3 ++- test/bot.1.js | 23 ++++++++++++++--------- 5 files changed, 17 insertions(+), 18 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index 1d426fc74..9f2a26913 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -879,10 +879,6 @@ var Client = (function () { 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"; diff --git a/lib/Member.js b/lib/Member.js index f19b68e4d..7227e08e7 100644 --- a/lib/Member.js +++ b/lib/Member.js @@ -134,6 +134,7 @@ var Member = (function (_User) { //cache roles as it can be slightly expensive basePerm = basePerms[0].packed; + basePerms = basePerms || []; for (var _iterator5 = basePerms, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { var _ref5; diff --git a/src/Client.js b/src/Client.js index ee8810c2e..4134e30d5 100644 --- a/src/Client.js +++ b/src/Client.js @@ -954,10 +954,6 @@ class Client { 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"; diff --git a/src/Member.js b/src/Member.js index 63429b973..4ab8ad56e 100644 --- a/src/Member.js +++ b/src/Member.js @@ -25,7 +25,8 @@ class Member extends User{ get evalPerms(){ var basePerms = this.roles, //cache roles as it can be slightly expensive basePerm = basePerms[0].packed; - + + basePerms = basePerms || []; for(var perm of basePerms){ basePerm = basePerm | perm.packed; } diff --git a/test/bot.1.js b/test/bot.1.js index c3e13af5f..722656d26 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -25,16 +25,21 @@ mybot.on("message", function (message) { } else { user = message.sender; } - - this.createRole( message.channel.server, { - hoist : true, - color : true, - manageRoles : true, - name : "discord users" - } ).then( + + this.createRole(message.channel.server, { + hoist: true, + color: true, + name: "discord users" + }).then( (perm) => { - - mybot.addMemberToRole( user, perm ); + + mybot.addMemberToRole(user, perm).then( + () => { + mybot.overwritePermissions(message.channel, perm, { + sendMessages : false + }); + } + ) } ) From 7dea4b9e9c6e41252e29a2893d133d2af4755289 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 18:43:49 +0000 Subject: [PATCH 19/20] A pretty crappy example and a load of bug fixes Much more stable permission management --- examples/adminbot.js | 101 ++++++++++++++++++++++++++++++++++ lib/Client.js | 13 +++-- lib/Member.js | 125 ++++++++++++++++++++++++++----------------- src/Client.js | 13 +++-- src/Member.js | 17 +++++- 5 files changed, 209 insertions(+), 60 deletions(-) create mode 100644 examples/adminbot.js diff --git a/examples/adminbot.js b/examples/adminbot.js new file mode 100644 index 000000000..740070b7e --- /dev/null +++ b/examples/adminbot.js @@ -0,0 +1,101 @@ +/* + this bot is a permissions bot and is currently working + with the experimental additions. Some functions may + change in the future. +*/ + +var Discord = require("../"); + +// Get the email and password +var AuthDetails = require("./auth.json"); + +var bot = new Discord.Client(); + +bot.on("ready", function () { + console.log("Ready to begin! Serving in " + bot.channels.length + " channels"); +}); + +bot.on("disconnected", function () { + + console.log("Disconnected!"); + process.exit(1); //exit node.js with an error + +}); + +bot.on("message", function (msg) { + if (msg.content === "skype") { + + //stop the user from speaking in the channel: + bot.overwritePermissions(msg.channel, msg.sender, { + sendMessages : false + }); + + // send a barely funny message ;) + bot.reply(msg, "how dare you mention that!"); + + } + + if (msg.content === "discord") { + + // see if there is a permission called 'good people' in the server already + var found = false; + + for(var role of msg.channel.server.roles){ + if(role.name === "good people"){ + found = role; + break; + } + } + + // if the role doesn't exist, make it + if(!found){ + bot.createRole(msg.channel.server, { + name : "good people", + color : Discord.Colors.BLUE, // colour of blue + hoist : true // make a seperate category in the users list + }).then(addUserToList); + }else{ + addUserToList(role); + } + + function addUserToList(role){ + + bot.addMemberToRole(msg.sender, role); + bot.reply(msg, "welcome to the good people!"); + + } + + } + + if( msg.content === "remove me" ){ + // remove the user from the good people list, if it exists + var found = false; + + for(var role of msg.channel.server.roles){ + if(role.name === "good people"){ + found = role; + break; + } + } + + if(found){ + // if the role exists + + if( msg.sender.hasRole(role) ){ + // remove the member from the role + bot.removeMemberFromRole(msg.sender, role); + bot.reply(msg, "removed!") + }else{ + bot.reply(msg, "you're not in the role!"); + } + + }else{ + // role doesn't exist + bot.reply(msg, "the role doesn't even exist!"); + } + + } + +}); + +bot.login("riftes@outlook.com", "bananaman"); \ No newline at end of file diff --git a/lib/Client.js b/lib/Client.js index 9f2a26913..cf86c3b2f 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -814,6 +814,11 @@ var Client = (function () { var acServer = self.getServer("id", serverId); var acMember = acServer.getMember("id", memberId); + if (acMember.rawRoles.indexOf(role.id) !== -1) { + // user already has role + return; + } + request.patch("https://discordapp.com/api/guilds/" + serverId + "/members/" + memberId).set("authorization", self.token).send({ roles: acMember.rawRoles.concat(role.id) }).end(function (err) { @@ -845,12 +850,12 @@ var Client = (function () { var acServer = self.getServer("id", serverId); var acMember = acServer.getMember("id", memberId); - for (var safeRole in acMember.rawRoles) { - if (acMember.rawRoles[safeRole] == role.id) { - acMember.rawRoles.splice(safeRole, 1); - } + if (~acMember.rawRoles.indexOf(role.id)) { + acMember.removeRole(role); } + console.log("remainder: ", acMember.rawRoles, "wanting", role.id); + request.patch("https://discordapp.com/api/guilds/" + serverId + "/members/" + memberId).set("authorization", self.token).send({ roles: acMember.rawRoles }).end(function (err) { diff --git a/lib/Member.js b/lib/Member.js index 7227e08e7..80a19370e 100644 --- a/lib/Member.js +++ b/lib/Member.js @@ -21,22 +21,19 @@ var Member = (function (_User) { this.rawRoles = roles; } + Member.prototype.removeRole = function removeRole(role) { + this.rawRoles.splice(this.rawRoles.indexOf(role.id), 1); + }; + Member.prototype.addRole = function addRole(role) { - if (! ~this.rawRoles.indexOf(role)) { - this.rawRoles.push(role); + if (this.rawRoles.indexOf(role.id) == -1) { + console.log("wanted to add", role.id, this.rawRoles.indexOf(role.id)); + this.rawRoles.push(role.id); } }; - Member.prototype.permissionsIn = function permissionsIn(channel) { - - if (channel.server.ownerID === this.id) { - return new EvaluatedPermissions(4294967295); //all perms - } - - var affectingOverwrites = []; - var affectingMemberOverwrites = []; - - for (var _iterator = channel.roles, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + Member.prototype.hasRole = function hasRole(role) { + for (var _iterator = this.roles, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { @@ -48,7 +45,35 @@ var Member = (function (_User) { _ref = _i.value; } - var overwrite = _ref; + var _role = _ref; + + if (role.id === _role.id) return true; + } + return false; + }; + + Member.prototype.permissionsIn = function permissionsIn(channel) { + + if (channel.server.ownerID === this.id) { + return new EvaluatedPermissions(4294967295); //all perms + } + + var affectingOverwrites = []; + var affectingMemberOverwrites = []; + + for (var _iterator2 = channel.roles, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + var overwrite = _ref2; if (overwrite.id === this.id && overwrite.type === "member") { affectingMemberOverwrites.push(overwrite); @@ -63,25 +88,7 @@ var Member = (function (_User) { var finalPacked = affectingOverwrites.length !== 0 ? affectingOverwrites[0].packed : affectingMemberOverwrites[0].packed; - for (var _iterator2 = affectingOverwrites, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { - var _ref2; - - if (_isArray2) { - if (_i2 >= _iterator2.length) break; - _ref2 = _iterator2[_i2++]; - } else { - _i2 = _iterator2.next(); - if (_i2.done) break; - _ref2 = _i2.value; - } - - var overwrite = _ref2; - - finalPacked = finalPacked & ~overwrite.deny; - finalPacked = finalPacked | overwrite.allow; - } - - for (var _iterator3 = affectingMemberOverwrites, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + for (var _iterator3 = affectingOverwrites, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { @@ -99,6 +106,24 @@ var Member = (function (_User) { finalPacked = finalPacked | overwrite.allow; } + for (var _iterator4 = affectingMemberOverwrites, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { + var _ref4; + + if (_isArray4) { + if (_i4 >= _iterator4.length) break; + _ref4 = _iterator4[_i4++]; + } else { + _i4 = _iterator4.next(); + if (_i4.done) break; + _ref4 = _i4.value; + } + + var overwrite = _ref4; + + finalPacked = finalPacked & ~overwrite.deny; + finalPacked = finalPacked | overwrite.allow; + } + return new EvaluatedPermissions(finalPacked); }; @@ -108,19 +133,19 @@ var Member = (function (_User) { var ufRoles = [this.server.getRole(this.server.id)]; - for (var _iterator4 = this.rawRoles, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { - var _ref4; + for (var _iterator5 = this.rawRoles, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { + var _ref5; - if (_isArray4) { - if (_i4 >= _iterator4.length) break; - _ref4 = _iterator4[_i4++]; + if (_isArray5) { + if (_i5 >= _iterator5.length) break; + _ref5 = _iterator5[_i5++]; } else { - _i4 = _iterator4.next(); - if (_i4.done) break; - _ref4 = _i4.value; + _i5 = _iterator5.next(); + if (_i5.done) break; + _ref5 = _i5.value; } - var rawRole = _ref4; + var rawRole = _ref5; ufRoles.push(this.server.getRole(rawRole)); } @@ -135,19 +160,19 @@ var Member = (function (_User) { basePerm = basePerms[0].packed; basePerms = basePerms || []; - for (var _iterator5 = basePerms, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { - var _ref5; + for (var _iterator6 = basePerms, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { + var _ref6; - if (_isArray5) { - if (_i5 >= _iterator5.length) break; - _ref5 = _iterator5[_i5++]; + if (_isArray6) { + if (_i6 >= _iterator6.length) break; + _ref6 = _iterator6[_i6++]; } else { - _i5 = _iterator5.next(); - if (_i5.done) break; - _ref5 = _i5.value; + _i6 = _iterator6.next(); + if (_i6.done) break; + _ref6 = _i6.value; } - var perm = _ref5; + var perm = _ref6; basePerm = basePerm | perm.packed; } diff --git a/src/Client.js b/src/Client.js index 4134e30d5..ba20b7f46 100644 --- a/src/Client.js +++ b/src/Client.js @@ -881,6 +881,11 @@ class Client { var acServer = self.getServer("id", serverId); var acMember = acServer.getMember("id", memberId); + + if(acMember.rawRoles.indexOf(role.id) !== -1){ + // user already has role + return; + } request .patch(`https://discordapp.com/api/guilds/${serverId}/members/${memberId}`) @@ -916,12 +921,12 @@ class Client { var acServer = self.getServer("id", serverId); var acMember = acServer.getMember("id", memberId); - for(var safeRole in acMember.rawRoles){ - if(acMember.rawRoles[safeRole] == role.id){ - acMember.rawRoles.splice(safeRole, 1); - } + if(~acMember.rawRoles.indexOf(role.id)){ + acMember.removeRole(role); } + console.log("remainder: ",acMember.rawRoles, "wanting", role.id); + request .patch(`https://discordapp.com/api/guilds/${serverId}/members/${memberId}`) .set("authorization", self.token) diff --git a/src/Member.js b/src/Member.js index 4ab8ad56e..48023f3db 100644 --- a/src/Member.js +++ b/src/Member.js @@ -36,12 +36,25 @@ class Member extends User{ }); } + removeRole(role){ + this.rawRoles.splice(this.rawRoles.indexOf(role.id), 1); + } + addRole(role){ - if(!~this.rawRoles.indexOf(role)){ - this.rawRoles.push(role); + if(this.rawRoles.indexOf(role.id) == -1){ + console.log("wanted to add", role.id, this.rawRoles.indexOf(role.id)); + this.rawRoles.push(role.id); } } + hasRole(role){ + for(var _role of this.roles){ + if(role.id === _role.id) + return true; + } + return false; + } + permissionsIn(channel){ if(channel.server.ownerID === this.id){ From 035316b9b84b0ed60f240e2a2394d1af5f88bdf7 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 26 Oct 2015 18:45:00 +0000 Subject: [PATCH 20/20] Updated npmignore to ignore src not needed when running as a dependency --- .npmignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.npmignore b/.npmignore index d7d6c67e1..37d39c7f3 100644 --- a/.npmignore +++ b/.npmignore @@ -2,4 +2,5 @@ docs/ examples/ web-dist/ +src/ .travis.yml \ No newline at end of file