From 6967f5e6493791fd24c06098744583aea8aeae7d Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 19:04:22 +0100 Subject: [PATCH 01/20] Created serverPermissions and roles array --- src/{Permissions.js => ServerPermissions.js} | 4 ++-- src/server.js | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) rename src/{Permissions.js => ServerPermissions.js} (92%) diff --git a/src/Permissions.js b/src/ServerPermissions.js similarity index 92% rename from src/Permissions.js rename to src/ServerPermissions.js index e0dc4d424..6bc64d152 100644 --- a/src/Permissions.js +++ b/src/ServerPermissions.js @@ -1,4 +1,4 @@ -class Permission { +class ServerPermissions { constructor(packedPermissions) { @@ -28,7 +28,7 @@ class Permission { this.voiceMuteMembers = getBit(22); this.voiceDeafenMembers = getBit(23); this.voiceMoveMembers = getBit(24); - this.voiceUseVoiceActivation = getBit(26); + this.voiceUseVoiceActivation = getBit(25); } diff --git a/src/server.js b/src/server.js index d0d56578c..d0bbcdb71 100644 --- a/src/server.js +++ b/src/server.js @@ -10,6 +10,8 @@ class Server { this.icon = data.icon; this.afkTimeout = data.afk_timeout; this.afkChannelId = data.afk_channel_id; + + this.roles = []; if(!data.members){ data.members = [ client.user ]; From b264b617184a188679129706fb6ce7a04b4103d4 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 19:44:08 +0100 Subject: [PATCH 02/20] Servers now manage server-wide permissions Servers now create ServerPermissions objects for roles --- lib/ServerPermissions.js | 54 ++++++++++++++++ lib/server.js | 130 ++++++++++++++++++++++++--------------- src/ServerPermissions.js | 16 +++-- src/server.js | 10 +++ test/bot.1.js | 6 +- 5 files changed, 159 insertions(+), 57 deletions(-) create mode 100644 lib/ServerPermissions.js diff --git a/lib/ServerPermissions.js b/lib/ServerPermissions.js new file mode 100644 index 000000000..9845c3895 --- /dev/null +++ b/lib/ServerPermissions.js @@ -0,0 +1,54 @@ +"use strict"; + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var ServerPermissions = (function () { + function ServerPermissions(data) { + _classCallCheck(this, ServerPermissions); + + var self = this; + + function getBit(x) { + return (self.packed >>> x & 1) === 1; + } + + this.packed = data.permissions; + this.name = data.name; + this.id = data.id; + + this.createInstantInvite = getBit(0); + this.banMembers = getBit(1); + this.kickMembers = getBit(2); + this.manageRoles = getBit(3); + this.manageChannels = getBit(4); + this.manageServer = getBit(5); + this.readMessages = getBit(10); + this.sendMessages = getBit(11); + this.sendTTSMessages = getBit(12); + this.manageMessages = getBit(13); + this.embedLinks = getBit(14); + this.attachFiles = getBit(15); + this.readMessageHistory = getBit(16); + this.mentionEveryone = getBit(17); + + this.voiceConnect = getBit(20); + this.voiceSpeak = getBit(21); + this.voiceMuteMembers = getBit(22); + this.voiceDeafenMembers = getBit(23); + this.voiceMoveMembers = getBit(24); + this.voiceUseVoiceActivation = getBit(25); + } + + _createClass(ServerPermissions, [{ + key: "getBit", + value: function getBit(x) { + return (this.packed >>> x & 1) === 1; + } + }]); + + return ServerPermissions; +})(); + +module.exports = ServerPermissions; \ No newline at end of file diff --git a/lib/server.js b/lib/server.js index c8758d5da..02892cb07 100644 --- a/lib/server.js +++ b/lib/server.js @@ -4,6 +4,8 @@ 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 = require("./ServerPermissions.js"); + var Server = (function () { function Server(data, client) { _classCallCheck(this, Server); @@ -19,25 +21,17 @@ var Server = (function () { this.afkTimeout = data.afk_timeout; this.afkChannelId = data.afk_channel_id; - if (!data.members) { - data.members = [client.user]; - return; - } + this.roles = []; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { - for (var _iterator = data.members[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var member = _step.value; + for (var _iterator = data.roles[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var permissionGroup = _step.value; - // first we cache the user in our Discord Client, - // then we add it to our list. This way when we - // get a user from this server's member list, - // it will be identical (unless an async change occurred) - // to the client's cache. - if (member.user) this.members.push(client.addUser(member.user)); + this.roles.push(new ServerPermissions(permissionGroup)); } } catch (err) { _didIteratorError = true; @@ -53,6 +47,41 @@ var Server = (function () { } } } + + if (!data.members) { + data.members = [client.user]; + return; + } + + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = data.members[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var member = _step2.value; + + // first we cache the user in our Discord Client, + // then we add it to our list. This way when we + // get a user from this server's member list, + // it will be identical (unless an async change occurred) + // to the client's cache. + if (member.user) this.members.push(client.addUser(member.user)); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"]) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } } _createClass(Server, [{ @@ -60,48 +89,16 @@ var Server = (function () { // get/set value: function getChannel(key, value) { - var _iteratorNormalCompletion2 = true; - var _didIteratorError2 = false; - var _iteratorError2 = undefined; - - try { - for (var _iterator2 = this.channels[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - var channel = _step2.value; - - if (channel[key] === value) { - return channel; - } - } - } catch (err) { - _didIteratorError2 = true; - _iteratorError2 = err; - } finally { - try { - if (!_iteratorNormalCompletion2 && _iterator2["return"]) { - _iterator2["return"](); - } - } finally { - if (_didIteratorError2) { - throw _iteratorError2; - } - } - } - - return null; - } - }, { - key: "getMember", - value: function getMember(key, value) { var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { - for (var _iterator3 = this.members[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { - var member = _step3.value; + for (var _iterator3 = this.channels[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var channel = _step3.value; - if (member[key] === value) { - return member; + if (channel[key] === value) { + return channel; } } } catch (err) { @@ -122,6 +119,38 @@ var Server = (function () { return null; } }, { + key: "getMember", + value: function getMember(key, value) { + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = this.members[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var member = _step4.value; + + if (member[key] === value) { + return member; + } + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"]) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + return null; + } + }, { key: "addChannel", value: function addChannel(chann) { if (!this.getChannel("id", chann.id)) { @@ -147,6 +176,11 @@ var Server = (function () { value: function equals(object) { return object.id === this.id; } + }, { + key: "permissionGroups", + get: function get() { + return this.roles; + } }, { key: "iconURL", get: function get() { diff --git a/src/ServerPermissions.js b/src/ServerPermissions.js index 6bc64d152..36bd3a9ca 100644 --- a/src/ServerPermissions.js +++ b/src/ServerPermissions.js @@ -1,12 +1,18 @@ class ServerPermissions { - constructor(packedPermissions) { + constructor(data) { + + var self = this; function getBit(x) { - return ((this.packed >>> x) & 1) === 1; + return ((self.packed >>> x) & 1) === 1; } - this.packed = packedPermissions; + this.packed = data.permissions; + this.name = data.name; + this.id = data.id; + + this.createInstantInvite = getBit(0); this.banMembers = getBit(1); @@ -35,4 +41,6 @@ class ServerPermissions { getBit(x) { return ((this.packed >>> x) & 1) === 1; } -} \ No newline at end of file +} + +module.exports = ServerPermissions; \ No newline at end of file diff --git a/src/server.js b/src/server.js index d0bbcdb71..2269bbafd 100644 --- a/src/server.js +++ b/src/server.js @@ -1,3 +1,5 @@ +var ServerPermissions = require("./ServerPermissions.js"); + class Server { constructor(data, client) { this.client = client; @@ -12,6 +14,10 @@ class Server { this.afkChannelId = data.afk_channel_id; this.roles = []; + + for(var permissionGroup of data.roles){ + this.roles.push( new ServerPermissions(permissionGroup) ); + } if(!data.members){ data.members = [ client.user ]; @@ -30,6 +36,10 @@ class Server { } } + + get permissionGroups(){ + return this.roles; + } get iconURL() { if (!this.icon) diff --git a/test/bot.1.js b/test/bot.1.js index d1eb296a7..b464f1339 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -19,11 +19,7 @@ mybot.on("message", function (message) { // we can go ahead :) - var onlineUsers = 0; - - counter++; - - mybot.playingGame( "Minecraft" ); + mybot.reply(message, "\n\n"+JSON.stringify(message.channel.server.roles)); }); From 8358eadcbd6e815a7af4b1042f662cf205dfa97f Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 19:57:07 +0100 Subject: [PATCH 03/20] User class able to support member extension --- lib/user.js | 2 +- src/Member.js | 3 --- src/user.js | 2 +- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/user.js b/lib/user.js index 5e38e132e..9a3d64c88 100644 --- a/lib/user.js +++ b/lib/user.js @@ -12,7 +12,7 @@ var User = (function () { this.discriminator = data.discriminator; this.id = data.id; this.avatar = data.avatar; - this.status = "offline"; + this.status = data.status || "offline"; } // access using user.avatarURL; diff --git a/src/Member.js b/src/Member.js index 3fa49ebd6..d0ab27774 100644 --- a/src/Member.js +++ b/src/Member.js @@ -4,9 +4,6 @@ class Member extends User{ constructor(data){ super(data); - - - } } \ No newline at end of file diff --git a/src/user.js b/src/user.js index 73eef604f..9686fed27 100644 --- a/src/user.js +++ b/src/user.js @@ -4,7 +4,7 @@ class User{ this.discriminator = data.discriminator; this.id = data.id; this.avatar = data.avatar; - this.status = "offline"; + this.status = data.status || "offline"; } // access using user.avatarURL; From ad286b9081f2e7041cbf13ca0bd9753949bc99fe Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 20:00:44 +0100 Subject: [PATCH 04/20] Updated member class, server now creates members --- lib/Member.js | 18 ++++- lib/server.js | 218 +------------------------------------------------- src/Member.js | 13 ++- src/server.js | 10 ++- 4 files changed, 32 insertions(+), 227 deletions(-) diff --git a/lib/Member.js b/lib/Member.js index 7d7b03f1a..a60a3d2b4 100644 --- a/lib/Member.js +++ b/lib/Member.js @@ -1,5 +1,7 @@ "use strict"; +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -11,11 +13,21 @@ var User = require("./user.js"); var Member = (function (_User) { _inherits(Member, _User); - function Member(data) { + function Member(user, server) { _classCallCheck(this, Member); - _get(Object.getPrototypeOf(Member.prototype), "constructor", this).call(this, data); + _get(Object.getPrototypeOf(Member.prototype), "constructor", this).call(this, user); // should work, we are basically creating a Member that has the same properties as user and a few more + this.server = server; } + _createClass(Member, [{ + key: "roles", + get: function get() { + return []; + } + }]); + return Member; -})(User); \ No newline at end of file +})(User); + +module.exports = Member; \ No newline at end of file diff --git a/lib/server.js b/lib/server.js index 02892cb07..9a390c31f 100644 --- a/lib/server.js +++ b/lib/server.js @@ -1,217 +1 @@ -"use strict"; - -var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var ServerPermissions = require("./ServerPermissions.js"); - -var Server = (function () { - function Server(data, client) { - _classCallCheck(this, Server); - - this.client = client; - this.region = data.region; - this.ownerID = data.owner_id; - this.name = data.name; - this.id = data.id; - this.members = []; - this.channels = []; - this.icon = data.icon; - this.afkTimeout = data.afk_timeout; - this.afkChannelId = data.afk_channel_id; - - this.roles = []; - - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = data.roles[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var permissionGroup = _step.value; - - this.roles.push(new ServerPermissions(permissionGroup)); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator["return"]) { - _iterator["return"](); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - if (!data.members) { - data.members = [client.user]; - return; - } - - var _iteratorNormalCompletion2 = true; - var _didIteratorError2 = false; - var _iteratorError2 = undefined; - - try { - for (var _iterator2 = data.members[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - var member = _step2.value; - - // first we cache the user in our Discord Client, - // then we add it to our list. This way when we - // get a user from this server's member list, - // it will be identical (unless an async change occurred) - // to the client's cache. - if (member.user) this.members.push(client.addUser(member.user)); - } - } catch (err) { - _didIteratorError2 = true; - _iteratorError2 = err; - } finally { - try { - if (!_iteratorNormalCompletion2 && _iterator2["return"]) { - _iterator2["return"](); - } - } finally { - if (_didIteratorError2) { - throw _iteratorError2; - } - } - } - } - - _createClass(Server, [{ - key: "getChannel", - - // get/set - value: function getChannel(key, value) { - var _iteratorNormalCompletion3 = true; - var _didIteratorError3 = false; - var _iteratorError3 = undefined; - - try { - for (var _iterator3 = this.channels[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { - var channel = _step3.value; - - if (channel[key] === value) { - return channel; - } - } - } catch (err) { - _didIteratorError3 = true; - _iteratorError3 = err; - } finally { - try { - if (!_iteratorNormalCompletion3 && _iterator3["return"]) { - _iterator3["return"](); - } - } finally { - if (_didIteratorError3) { - throw _iteratorError3; - } - } - } - - return null; - } - }, { - key: "getMember", - value: function getMember(key, value) { - var _iteratorNormalCompletion4 = true; - var _didIteratorError4 = false; - var _iteratorError4 = undefined; - - try { - for (var _iterator4 = this.members[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { - var member = _step4.value; - - if (member[key] === value) { - return member; - } - } - } catch (err) { - _didIteratorError4 = true; - _iteratorError4 = err; - } finally { - try { - if (!_iteratorNormalCompletion4 && _iterator4["return"]) { - _iterator4["return"](); - } - } finally { - if (_didIteratorError4) { - throw _iteratorError4; - } - } - } - - return null; - } - }, { - key: "addChannel", - value: function addChannel(chann) { - if (!this.getChannel("id", chann.id)) { - this.channels.push(chann); - } - return chann; - } - }, { - key: "addMember", - value: function addMember(member) { - if (!this.getMember("id", member.id)) { - this.members.push(member); - } - return member; - } - }, { - key: "toString", - value: function toString() { - return this.name; - } - }, { - key: "equals", - value: function equals(object) { - return object.id === this.id; - } - }, { - key: "permissionGroups", - get: function get() { - return this.roles; - } - }, { - key: "iconURL", - get: function get() { - if (!this.icon) return null; - return "https://discordapp.com/api/guilds/" + this.id + "/icons/" + this.icon + ".jpg"; - } - }, { - key: "afkChannel", - get: function get() { - if (!this.afkChannelId) return false; - - return this.getChannel("id", this.afkChannelId); - } - }, { - key: "defaultChannel", - get: function get() { - return this.getChannel("name", "general"); - } - }, { - key: "owner", - get: function get() { - return this.client.getUser("id", this.ownerID); - } - }, { - key: "users", - get: function get() { - return this.members; - } - }]); - - return Server; -})(); - -module.exports = Server; \ No newline at end of file +"use strict"; \ No newline at end of file diff --git a/src/Member.js b/src/Member.js index d0ab27774..afa65cc57 100644 --- a/src/Member.js +++ b/src/Member.js @@ -2,8 +2,15 @@ var User = require("./user.js"); class Member extends User{ - constructor(data){ - super(data); + constructor(user, server){ + super(user); // should work, we are basically creating a Member that has the same properties as user and a few more + this.server = server; } -} \ No newline at end of file + get roles(){ + return []; + } + +} + +module.exports = Member; \ No newline at end of file diff --git a/src/server.js b/src/server.js index 2269bbafd..9f0d63f54 100644 --- a/src/server.js +++ b/src/server.js @@ -1,4 +1,5 @@ var ServerPermissions = require("./ServerPermissions.js"); +var Member = require("./Member.js"); class Server { constructor(data, client) { @@ -94,11 +95,12 @@ class Server { return chann; } - addMember(member){ - if (!this.getMember("id", member.id)){ - this.members.push(member); + addMember(user){ + if (!this.getMember("id", user.id)){ + var mem = new Member(user, this); + this.members.push(mem); } - return member; + return mem; } toString(){ From a10f19a7a7feb61977632d59350b95a927ab36be Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 20:01:21 +0100 Subject: [PATCH 05/20] Reformat code --- src/Client.js | 252 +++++++++++++++++++++++++------------------------- 1 file changed, 126 insertions(+), 126 deletions(-) diff --git a/src/Client.js b/src/Client.js index 6dd6c0fd9..470791ffe 100644 --- a/src/Client.js +++ b/src/Client.js @@ -56,7 +56,7 @@ class Client { this.checkingQueue = {}; this.userTypingListener = {}; this.queue = {}; - + this.__idleTime = null; this.__gameId = null; } @@ -399,15 +399,15 @@ class Client { function remove() { request - .del(`${Endpoints.CHANNELS}/${message.channel.id}/messages/${message.id}`) - .set("authorization", self.token) - .end(function (err, res) { - if(err){ - bad(); - }else{ - good(); - } - }); + .del(`${Endpoints.CHANNELS}/${message.channel.id}/messages/${message.id}`) + .set("authorization", self.token) + .end(function (err, res) { + if (err) { + bad(); + } else { + good(); + } + }); } function good() { @@ -420,7 +420,7 @@ class Client { reject(err); } }); - + } updateMessage(message, content, callback = function (err, msg) { }) { @@ -757,7 +757,7 @@ class Client { self.trigger("error", err, e); return; } - + self.trigger("raw", dat); //valid message @@ -1007,46 +1007,46 @@ class Client { } break; - + case "CHANNEL_UPDATE": - + var channelInCache = self.getChannel("id", data.id), serverInCache = self.getServer("id", data.guild_id); - - if(channelInCache && serverInCache){ - + + if (channelInCache && serverInCache) { + var newChann = new Channel(data, serverInCache); newChann.messages = channelInCache.messages; - + self.trigger("channelUpdate", channelInCache, newChann); - - self.channelCache[ self.channelCache.indexOf(channelInCache) ] = newChann; + + self.channelCache[self.channelCache.indexOf(channelInCache)] = newChann; } - + break; - + case "TYPING_START": - + var userInCache = self.getUser("id", data.user_id); var channelInCache = self.getChannel("id", data.channel_id); - - if(!self.userTypingListener[data.user_id] || self.userTypingListener[data.user_id] === -1){ + + if (!self.userTypingListener[data.user_id] || self.userTypingListener[data.user_id] === -1) { self.trigger("startTyping", userInCache, channelInCache); } - + self.userTypingListener[data.user_id] = Date.now(); - - setTimeout(function(){ - if(self.userTypingListener[data.user_id] === -1){ + + setTimeout(function () { + if (self.userTypingListener[data.user_id] === -1) { return; } - if( Date.now() - self.userTypingListener[data.user_id] > 6000 ){ + if (Date.now() - self.userTypingListener[data.user_id] > 6000) { // stopped typing self.trigger("stopTyping", userInCache, channelInCache); self.userTypingListener[data.user_id] = -1; } }, 6000); - + break; default: @@ -1082,45 +1082,45 @@ class Client { } return this.getPMChannel("id", data.id); } - - setTopic(channel, topic, callback = function(err){}){ - + + setTopic(channel, topic, callback = function (err) { }) { + var self = this; - - return new Promise(function(resolve, reject){ - + + return new Promise(function (resolve, reject) { + self.resolveDestination(channel).then(next).catch(error); - - function error(e){ + + function error(e) { callback(e); reject(e); } - - function next(destination){ - + + function next(destination) { + var asChan = self.getChannel("id", destination); - + request .patch(`${Endpoints.CHANNELS}/${destination}`) .set("authorization", self.token) .send({ - name : asChan.name, - position : 0, - topic : topic + name: asChan.name, + position: 0, + topic: topic }) - .end(function(err, res){ - if(err){ + .end(function (err, res) { + if (err) { error(err); - }else{ + } else { asChan.topic = res.body.topic; resolve(); callback(); } - }); + }); } - + }); - + } //def addServer @@ -1129,7 +1129,7 @@ class Client { var self = this; var server = this.getServer("id", data.id); - if(data.unavailable){ + if (data.unavailable) { self.trigger("unavailable", data); self.debug("Server ID " + data.id + " has been marked unavailable by Discord. It was not cached."); return; @@ -1144,8 +1144,8 @@ class Client { } } } - - for(var presence of data.presences){ + + for (var presence of data.presences) { self.getUser("id", presence.user.id).status = presence.status; } @@ -1370,132 +1370,132 @@ class Client { }); }); } - - setStatusIdle(){ + + setStatusIdle() { this.setStatus("idle"); } - - setStatusOnline(){ + + setStatusOnline() { this.setStatus("online"); } - - setStatusActive(){ + + setStatusActive() { this.setStatusOnline(); } - - setStatusHere(){ + + setStatusHere() { this.setStatusOnline(); } - - setStatusAway(){ + + setStatusAway() { this.setStatusIdle(); } - - startTyping(chann, stopTypeTime){ + + startTyping(chann, stopTypeTime) { var self = this; - + this.resolveDestination(chann).then(next); - - function next(channel){ - if(self.typingIntervals[channel]){ + + function next(channel) { + if (self.typingIntervals[channel]) { return; } - - var fn = function(){ + + var fn = function () { request - .post(`${Endpoints.CHANNELS}/${channel}/typing`) - .set("authorization", self.token) - .end(); + .post(`${Endpoints.CHANNELS}/${channel}/typing`) + .set("authorization", self.token) + .end(); }; - + fn(); - + var interval = setInterval(fn, 3000); - + self.typingIntervals[channel] = interval; - - if(stopTypeTime){ - setTimeout(function(){ + + if (stopTypeTime) { + setTimeout(function () { self.stopTyping(channel); }, stopTypeTime); } } } - - stopTyping(chann){ + + stopTyping(chann) { var self = this; - + this.resolveDestination(chann).then(next); - - function next(channel){ - if(!self.typingIntervals[channel]){ + + function next(channel) { + if (!self.typingIntervals[channel]) { return; } - + clearInterval(self.typingIntervals[channel]); - + delete self.typingIntervals[channel]; - + } } - - setStatus(stat){ - + + setStatus(stat) { + var idleTime = (stat === "online" ? null : Date.now()); - + this.__idleTime = idleTime; - + this.websocket.send(JSON.stringify({ - op : 3, - d : { - idle_since : this.__idleTime, - game_id : this.__gameId + op: 3, + d: { + idle_since: this.__idleTime, + game_id: this.__gameId } })); } - - setPlayingGame(id){ - - if( id instanceof String || typeof id === `string` ){ + + setPlayingGame(id) { + + if (id instanceof String || typeof id === `string`) { // working on names var gid = id.trim().toUpperCase(); - + id = null; - - for( var game of gameMap ){ - - if(game.name.trim().toUpperCase() === gid){ - + + for (var game of gameMap) { + + if (game.name.trim().toUpperCase() === gid) { + id = game.id; break; - + } - + } - + } - + this.__gameId = id; - + this.websocket.send(JSON.stringify({ - op : 3, - d : { - idle_since : this.__idleTime, - game_id : this.__gameId + op: 3, + d: { + idle_since: this.__idleTime, + game_id: this.__gameId } })); - + } - - playGame(id){ + + playGame(id) { this.setPlayingGame(id); } - - playingGame(id){ - + + playingGame(id) { + this.setPlayingGame(id); - + } } From 4e117b85d9a91f72649655d475b5f1a85be82055 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 20:18:49 +0100 Subject: [PATCH 06/20] Member role *should* be used properly across the API The Client now SHOULD add roles properly to members, as they leave it up to the Server class. --- lib/Client.js | 10 +- lib/Member.js | 33 +++++- lib/message.js | 2 +- lib/server.js | 286 ++++++++++++++++++++++++++++++++++++++++++++++++- src/Client.js | 12 +-- src/Member.js | 13 ++- src/message.js | 2 +- src/server.js | 28 ++++- test/bot.1.js | 2 +- 9 files changed, 360 insertions(+), 28 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index 526ea0d77..e22cac6c8 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -1031,11 +1031,7 @@ var Client = (function () { var user = self.addUser(data.user); //if for whatever reason it doesn't exist.. - if (! ~server.members.indexOf(user)) { - server.members.push(user); - } - - self.trigger("serverNewMember", user, server); + self.trigger("serverNewMember", server.addMember(user, data.roles), server); } break; @@ -1048,9 +1044,7 @@ var Client = (function () { var user = self.addUser(data.user); //if for whatever reason it doesn't exist.. - if (~server.members.indexOf(user)) { - server.members.splice(server.members.indexOf(user), 1); - } + server.removeMember("id", user.id); self.trigger("serverRemoveMember", user, server); } diff --git a/lib/Member.js b/lib/Member.js index a60a3d2b4..ea9b35a07 100644 --- a/lib/Member.js +++ b/lib/Member.js @@ -13,17 +13,46 @@ var User = require("./user.js"); var Member = (function (_User) { _inherits(Member, _User); - function Member(user, server) { + function Member(user, server, roles) { _classCallCheck(this, Member); _get(Object.getPrototypeOf(Member.prototype), "constructor", this).call(this, user); // should work, we are basically creating a Member that has the same properties as user and a few more this.server = server; + this.rawRoles = roles; } _createClass(Member, [{ key: "roles", get: function get() { - return []; + + var ufRoles = []; + + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = this.rawRoles[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var rawRole = _step.value; + + ufRoles.push(this.server.getRole(rawRole)); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"]) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + return ufRoles; } }]); diff --git a/lib/message.js b/lib/message.js index 3dd4ddcae..2e2ddd69d 100644 --- a/lib/message.js +++ b/lib/message.js @@ -20,7 +20,7 @@ var Message = (function () { this.editedTimestamp = data.edited_timestamp; this.content = data.content.trim(); this.channel = channel; - this.author = author; + this.author = this.channel.server.getMember("id", author.id); this.attachments = data.attachments; } diff --git a/lib/server.js b/lib/server.js index 9a390c31f..440b2a3f3 100644 --- a/lib/server.js +++ b/lib/server.js @@ -1 +1,285 @@ -"use strict"; \ No newline at end of file +"use strict"; + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var ServerPermissions = require("./ServerPermissions.js"); +var Member = require("./Member.js"); + +var Server = (function () { + function Server(data, client) { + _classCallCheck(this, Server); + + this.client = client; + this.region = data.region; + this.ownerID = data.owner_id; + this.name = data.name; + this.id = data.id; + this.members = []; + this.channels = []; + this.icon = data.icon; + this.afkTimeout = data.afk_timeout; + this.afkChannelId = data.afk_channel_id; + + this.roles = []; + + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = data.roles[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var permissionGroup = _step.value; + + this.roles.push(new ServerPermissions(permissionGroup)); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"]) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + if (!data.members) { + data.members = [client.user]; + return; + } + + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = data.members[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var member = _step2.value; + + // first we cache the user in our Discord Client, + // then we add it to our list. This way when we + // get a user from this server's member list, + // it will be identical (unless an async change occurred) + // to the client's cache. + if (member.user) this.addMember(client.addUser(member.user), member.roles); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"]) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + } + + _createClass(Server, [{ + key: "getRole", + + // get/set + + value: function getRole(id) { + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = this.roles[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var role = _step3.value; + + if (role.id === id) { + return role; + } + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"]) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + + return null; + } + }, { + key: "getChannel", + value: function getChannel(key, value) { + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = this.channels[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var channel = _step4.value; + + if (channel[key] === value) { + return channel; + } + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"]) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + return null; + } + }, { + key: "getMember", + value: function getMember(key, value) { + var _iteratorNormalCompletion5 = true; + var _didIteratorError5 = false; + var _iteratorError5 = undefined; + + try { + for (var _iterator5 = this.members[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var member = _step5.value; + + if (member[key] === value) { + return member; + } + } + } catch (err) { + _didIteratorError5 = true; + _iteratorError5 = err; + } finally { + try { + if (!_iteratorNormalCompletion5 && _iterator5["return"]) { + _iterator5["return"](); + } + } finally { + if (_didIteratorError5) { + throw _iteratorError5; + } + } + } + + return null; + } + }, { + key: "removeMember", + value: function removeMember(key, value) { + var _iteratorNormalCompletion6 = true; + var _didIteratorError6 = false; + var _iteratorError6 = undefined; + + try { + for (var _iterator6 = this.members[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { + var member = _step6.value; + + if (member[key] === value) { + this.members.splice(key, 1); + return member; + } + } + } catch (err) { + _didIteratorError6 = true; + _iteratorError6 = err; + } finally { + try { + if (!_iteratorNormalCompletion6 && _iterator6["return"]) { + _iterator6["return"](); + } + } finally { + if (_didIteratorError6) { + throw _iteratorError6; + } + } + } + + return false; + } + }, { + key: "addChannel", + value: function addChannel(chann) { + if (!this.getChannel("id", chann.id)) { + this.channels.push(chann); + } + return chann; + } + }, { + key: "addMember", + value: function addMember(user, roles) { + if (!this.getMember("id", user.id)) { + var mem = new Member(user, this, roles); + this.members.push(mem); + } + return mem; + } + }, { + key: "toString", + value: function toString() { + return this.name; + } + }, { + key: "equals", + value: function equals(object) { + return object.id === this.id; + } + }, { + key: "permissionGroups", + get: function get() { + return this.roles; + } + }, { + key: "iconURL", + get: function get() { + if (!this.icon) return null; + return "https://discordapp.com/api/guilds/" + this.id + "/icons/" + this.icon + ".jpg"; + } + }, { + key: "afkChannel", + get: function get() { + if (!this.afkChannelId) return false; + + return this.getChannel("id", this.afkChannelId); + } + }, { + key: "defaultChannel", + get: function get() { + return this.getChannel("name", "general"); + } + }, { + key: "owner", + get: function get() { + return this.client.getUser("id", this.ownerID); + } + }, { + key: "users", + get: function get() { + return this.members; + } + }]); + + return Server; +})(); + +module.exports = Server; \ No newline at end of file diff --git a/src/Client.js b/src/Client.js index 470791ffe..e8560d457 100644 --- a/src/Client.js +++ b/src/Client.js @@ -938,12 +938,8 @@ class Client { if (server) { var user = self.addUser(data.user); //if for whatever reason it doesn't exist.. - - if (!~server.members.indexOf(user)) { - server.members.push(user); - } - self.trigger("serverNewMember", user, server); + self.trigger("serverNewMember", server.addMember(user, data.roles), server); } break; @@ -956,10 +952,8 @@ class Client { var user = self.addUser(data.user); //if for whatever reason it doesn't exist.. - if (~server.members.indexOf(user)) { - server.members.splice(server.members.indexOf(user), 1); - } - + server.removeMember("id", user.id); + self.trigger("serverRemoveMember", user, server); } diff --git a/src/Member.js b/src/Member.js index afa65cc57..4750b7ada 100644 --- a/src/Member.js +++ b/src/Member.js @@ -2,13 +2,22 @@ var User = require("./user.js"); class Member extends User{ - constructor(user, server){ + constructor(user, server, roles){ super(user); // should work, we are basically creating a Member that has the same properties as user and a few more this.server = server; + this.rawRoles = roles; } get roles(){ - return []; + + var ufRoles = []; + + for(var rawRole of this.rawRoles){ + ufRoles.push( this.server.getRole(rawRole) ); + } + + return ufRoles; + } } diff --git a/src/message.js b/src/message.js index 3462ce88c..1cbc8be7e 100644 --- a/src/message.js +++ b/src/message.js @@ -12,7 +12,7 @@ class Message{ this.editedTimestamp = data.edited_timestamp; this.content = data.content.trim(); this.channel = channel; - this.author = author; + this.author = this.channel.server.getMember("id", author.id); this.attachments = data.attachments; } diff --git a/src/server.js b/src/server.js index 9f0d63f54..7e7a4d09e 100644 --- a/src/server.js +++ b/src/server.js @@ -33,7 +33,7 @@ class Server { // it will be identical (unless an async change occurred) // to the client's cache. if(member.user) - this.members.push(client.addUser(member.user)); + this.addMember(client.addUser(member.user), member.roles); } } @@ -68,6 +68,17 @@ class Server { } // get/set + + getRole(id){ + for (var role of this.roles) { + if (role.id === id) { + return role; + } + } + + return null; + } + getChannel(key, value) { for (var channel of this.channels) { if (channel[key] === value) { @@ -88,6 +99,17 @@ class Server { return null; } + removeMember(key, value){ + for (var member of this.members) { + if (member[key] === value) { + this.members.splice(key, 1); + return member; + } + } + + return false; + } + addChannel(chann) { if (!this.getChannel("id", chann.id)) { this.channels.push(chann); @@ -95,9 +117,9 @@ class Server { return chann; } - addMember(user){ + addMember(user, roles){ if (!this.getMember("id", user.id)){ - var mem = new Member(user, this); + var mem = new Member(user, this, roles); this.members.push(mem); } return mem; diff --git a/test/bot.1.js b/test/bot.1.js index b464f1339..88275fd1b 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -19,7 +19,7 @@ mybot.on("message", function (message) { // we can go ahead :) - mybot.reply(message, "\n\n"+JSON.stringify(message.channel.server.roles)); + mybot.reply(message, message.sender.roles); }); From 3869f584b68911d2adc85959face7d7ec9dd0a7a Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 20:30:53 +0100 Subject: [PATCH 07/20] added toString to ServerPermissions --- lib/ServerPermissions.js | 5 +++++ src/ServerPermissions.js | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/ServerPermissions.js b/lib/ServerPermissions.js index 9845c3895..66411f542 100644 --- a/lib/ServerPermissions.js +++ b/lib/ServerPermissions.js @@ -46,6 +46,11 @@ var ServerPermissions = (function () { value: function getBit(x) { return (this.packed >>> x & 1) === 1; } + }, { + key: "toString", + value: function toString() { + return this.name; + } }]); return ServerPermissions; diff --git a/src/ServerPermissions.js b/src/ServerPermissions.js index 36bd3a9ca..dc0a3c9ce 100644 --- a/src/ServerPermissions.js +++ b/src/ServerPermissions.js @@ -12,8 +12,6 @@ class ServerPermissions { this.name = data.name; this.id = data.id; - - this.createInstantInvite = getBit(0); this.banMembers = getBit(1); this.kickMembers = getBit(2); @@ -41,6 +39,10 @@ class ServerPermissions { getBit(x) { return ((this.packed >>> x) & 1) === 1; } + + toString(){ + return this.name; + } } module.exports = ServerPermissions; \ No newline at end of file From e046467d926a66b357d868a41dc25ec393f92564 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 20:33:36 +0100 Subject: [PATCH 08/20] Added permissions directive --- lib/server.js | 5 +++++ src/server.js | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/lib/server.js b/lib/server.js index 440b2a3f3..c9feaa0a3 100644 --- a/lib/server.js +++ b/lib/server.js @@ -249,6 +249,11 @@ var Server = (function () { get: function get() { return this.roles; } + }, { + key: "permissions", + get: function get() { + return this.roles; + } }, { key: "iconURL", get: function get() { diff --git a/src/server.js b/src/server.js index 7e7a4d09e..d2a1bf411 100644 --- a/src/server.js +++ b/src/server.js @@ -41,6 +41,10 @@ class Server { get permissionGroups(){ return this.roles; } + + get permissions(){ + return this.roles; + } get iconURL() { if (!this.icon) From 6d36977f9433f432b319331d651ec975ae9e2365 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 20:34:24 +0100 Subject: [PATCH 09/20] Preparing Channel class for overwrite capability --- lib/channel.js | 11 +++++++++++ src/channel.js | 9 +++++++++ 2 files changed, 20 insertions(+) diff --git a/lib/channel.js b/lib/channel.js index bb67fcf4f..1edec0f84 100644 --- a/lib/channel.js +++ b/lib/channel.js @@ -14,6 +14,7 @@ var Channel = (function () { this.topic = data.topic; this.id = data.id; this.messages = []; + this.roles = []; //this.isPrivate = isPrivate; //not sure about the implementation of this... } @@ -73,6 +74,16 @@ var Channel = (function () { value: function toString() { return "<#" + this.id + ">"; } + }, { + key: "permissionOverwrites", + get: function get() { + return this.roles; + } + }, { + key: "permissions", + get: function get() { + return this.roles; + } }, { key: "client", get: function get() { diff --git a/src/channel.js b/src/channel.js index a7185e17f..939b01e7c 100644 --- a/src/channel.js +++ b/src/channel.js @@ -7,8 +7,17 @@ class Channel { this.topic = data.topic; this.id = data.id; this.messages = []; + this.roles = []; //this.isPrivate = isPrivate; //not sure about the implementation of this... } + + get permissionOverwrites(){ + return this.roles; + } + + get permissions(){ + return this.roles; + } get client() { return this.server.client; From 6b091128cb01825d0b03a72606da6fbbf1c69151 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 20:36:32 +0100 Subject: [PATCH 10/20] Created ChannelPermissions class --- lib/ChannelPermissions.js | 9 +++++ lib/channel.js | 52 ++++++++++++++++++++------- src/ChannelPermissions.js | 7 ++++ src/channel.js | 75 ++++++++++++++++++++++----------------- 4 files changed, 98 insertions(+), 45 deletions(-) create mode 100644 lib/ChannelPermissions.js create mode 100644 src/ChannelPermissions.js diff --git a/lib/ChannelPermissions.js b/lib/ChannelPermissions.js new file mode 100644 index 000000000..2fcc61792 --- /dev/null +++ b/lib/ChannelPermissions.js @@ -0,0 +1,9 @@ +"use strict"; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var ChannelPermissions = function ChannelPermissions(data) { + _classCallCheck(this, ChannelPermissions); +}; + +module.exports = ChannelPermissions; \ No newline at end of file diff --git a/lib/channel.js b/lib/channel.js index 1edec0f84..cfa397ccd 100644 --- a/lib/channel.js +++ b/lib/channel.js @@ -4,6 +4,8 @@ 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 ChannelPermissions = require("./ChannelPermissions.js"); + var Channel = (function () { function Channel(data, server) { _classCallCheck(this, Channel); @@ -15,7 +17,33 @@ var Channel = (function () { this.id = data.id; this.messages = []; this.roles = []; - //this.isPrivate = isPrivate; //not sure about the implementation of this... + + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = data.permission_overwrites[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var role = _step.value; + + this.roles.push(new ChannelPermissions()); + } + + //this.isPrivate = isPrivate; //not sure about the implementation of this... + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"]) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } } _createClass(Channel, [{ @@ -40,29 +68,29 @@ var Channel = (function () { }, { key: "getMessage", value: function getMessage(key, value) { - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; try { - for (var _iterator = this.messages[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var message = _step.value; + for (var _iterator2 = this.messages[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var message = _step2.value; if (message[key] === value) { return message; } } } catch (err) { - _didIteratorError = true; - _iteratorError = err; + _didIteratorError2 = true; + _iteratorError2 = err; } finally { try { - if (!_iteratorNormalCompletion && _iterator["return"]) { - _iterator["return"](); + if (!_iteratorNormalCompletion2 && _iterator2["return"]) { + _iterator2["return"](); } } finally { - if (_didIteratorError) { - throw _iteratorError; + if (_didIteratorError2) { + throw _iteratorError2; } } } diff --git a/src/ChannelPermissions.js b/src/ChannelPermissions.js new file mode 100644 index 000000000..13e29c02f --- /dev/null +++ b/src/ChannelPermissions.js @@ -0,0 +1,7 @@ +class ChannelPermissions{ + constructor(data){ + + } +} + +module.exports = ChannelPermissions; \ No newline at end of file diff --git a/src/channel.js b/src/channel.js index 939b01e7c..bf9380d28 100644 --- a/src/channel.js +++ b/src/channel.js @@ -1,3 +1,5 @@ +var ChannelPermissions = require("./ChannelPermissions.js"); + class Channel { constructor(data, server) { @@ -8,14 +10,21 @@ class Channel { this.id = data.id; this.messages = []; this.roles = []; + + for (var role of data.permission_overwrites) { + + this.roles.push( new ChannelPermissions() ); + + } + //this.isPrivate = isPrivate; //not sure about the implementation of this... } - - get permissionOverwrites(){ + + get permissionOverwrites() { return this.roles; } - - get permissions(){ + + get permissions() { return this.roles; } @@ -26,42 +35,42 @@ class Channel { equals(object) { return (object && object.id === this.id); } - - addMessage(data){ - - if(this.messages.length > 1000){ - this.messages.splice(0,1); - } - - if(!this.getMessage("id", data.id)){ - this.messages.push(data); - } - - return this.getMessage("id", data.id); - } - - getMessage(key, value){ - for(var message of this.messages){ - if(message[key] === value){ - return message; - } - } - return null; - } - toString(){ + addMessage(data) { + + if (this.messages.length > 1000) { + this.messages.splice(0, 1); + } + + if (!this.getMessage("id", data.id)) { + this.messages.push(data); + } + + return this.getMessage("id", data.id); + } + + getMessage(key, value) { + for (var message of this.messages) { + if (message[key] === value) { + return message; + } + } + return null; + } + + toString() { return "<#" + this.id + ">"; } - - get isPrivate(){ + + get isPrivate() { return false; } - - get users(){ + + get users() { return this.server.members; } - - get members(){ + + get members() { return this.server.members; } } From 2ededd61dde5727ad1ba026352bbe8668347142e Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 20:45:04 +0100 Subject: [PATCH 11/20] ChannelPermissions works generically --- src/ChannelPermissions.js | 8 ++++++++ src/channel.js | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ChannelPermissions.js b/src/ChannelPermissions.js index 13e29c02f..83b562f71 100644 --- a/src/ChannelPermissions.js +++ b/src/ChannelPermissions.js @@ -1,6 +1,14 @@ class ChannelPermissions{ constructor(data){ + this.type = data.type; //either member or role + + this.id = data.id; + + this.deny = data.deny; + + this.allow = data.allow; + } } diff --git a/src/channel.js b/src/channel.js index bf9380d28..64c9f22f0 100644 --- a/src/channel.js +++ b/src/channel.js @@ -13,7 +13,7 @@ class Channel { for (var role of data.permission_overwrites) { - this.roles.push( new ChannelPermissions() ); + this.roles.push( new ChannelPermissions(role) ); } From cd91a384bd7150910d0c0342fc9313151563ed48 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 21:10:43 +0100 Subject: [PATCH 12/20] added getBit to channelpermissions --- src/ChannelPermissions.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ChannelPermissions.js b/src/ChannelPermissions.js index 83b562f71..13f183867 100644 --- a/src/ChannelPermissions.js +++ b/src/ChannelPermissions.js @@ -1,6 +1,10 @@ class ChannelPermissions{ constructor(data){ + function getBit(x) { + return ((this.packed >>> x) & 1) === 1; + } + this.type = data.type; //either member or role this.id = data.id; @@ -10,6 +14,10 @@ class ChannelPermissions{ this.allow = data.allow; } + + getBit(x) { + return ((this.packed >>> x) & 1) === 1; + } } module.exports = ChannelPermissions; \ No newline at end of file From 8f4e6e34d5bf40d4265dce70acac905d16cdcf9f Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 21:35:28 +0100 Subject: [PATCH 13/20] Added full evaluation of SERVERwide permissions --- lib/ChannelPermissions.js | 31 ++++++++++++++++++++++++++--- lib/Member.js | 41 ++++++++++++++++++++++++++++++++++++++- lib/channel.js | 2 +- src/Member.js | 19 +++++++++++++++++- test/bot.1.js | 2 +- 5 files changed, 88 insertions(+), 7 deletions(-) diff --git a/lib/ChannelPermissions.js b/lib/ChannelPermissions.js index 2fcc61792..e47395fd3 100644 --- a/lib/ChannelPermissions.js +++ b/lib/ChannelPermissions.js @@ -1,9 +1,34 @@ "use strict"; +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var ChannelPermissions = function ChannelPermissions(data) { - _classCallCheck(this, ChannelPermissions); -}; +var ChannelPermissions = (function () { + function ChannelPermissions(data) { + _classCallCheck(this, ChannelPermissions); + + function getBit(x) { + return (this.packed >>> x & 1) === 1; + } + + this.type = data.type; //either member or role + + this.id = data.id; + + this.deny = data.deny; + + this.allow = data.allow; + } + + _createClass(ChannelPermissions, [{ + key: "getBit", + value: function getBit(x) { + return (this.packed >>> x & 1) === 1; + } + }]); + + return ChannelPermissions; +})(); module.exports = ChannelPermissions; \ No newline at end of file diff --git a/lib/Member.js b/lib/Member.js index ea9b35a07..093d37d5a 100644 --- a/lib/Member.js +++ b/lib/Member.js @@ -9,6 +9,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var User = require("./user.js"); +var ServerPermissions = require("./ServerPermissions.js"); var Member = (function (_User) { _inherits(Member, _User); @@ -25,8 +26,9 @@ var Member = (function (_User) { key: "roles", get: function get() { - var ufRoles = []; + var ufRoles = [this.server.getRole(this.server.id)]; + console.log(this.rawRoles); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; @@ -54,6 +56,43 @@ var Member = (function (_User) { return ufRoles; } + }, { + key: "evalPerms", + get: function get() { + + var basePerms = this.roles, + //cache roles as it can be slightly expensive + basePerm = basePerms[0].packed; + + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = basePerms[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var perm = _step2.value; + + basePerm = basePerm | perm.packed; + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"]) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + return new ServerPermissions({ + permissions: basePerm + }); + } }]); return Member; diff --git a/lib/channel.js b/lib/channel.js index cfa397ccd..be49484d3 100644 --- a/lib/channel.js +++ b/lib/channel.js @@ -26,7 +26,7 @@ var Channel = (function () { for (var _iterator = data.permission_overwrites[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var role = _step.value; - this.roles.push(new ChannelPermissions()); + this.roles.push(new ChannelPermissions(role)); } //this.isPrivate = isPrivate; //not sure about the implementation of this... diff --git a/src/Member.js b/src/Member.js index 4750b7ada..5db412403 100644 --- a/src/Member.js +++ b/src/Member.js @@ -1,4 +1,5 @@ var User = require("./user.js"); +var ServerPermissions = require("./ServerPermissions.js"); class Member extends User{ @@ -10,8 +11,9 @@ class Member extends User{ get roles(){ - var ufRoles = []; + var ufRoles = [ this.server.getRole(this.server.id) ]; + console.log(this.rawRoles); for(var rawRole of this.rawRoles){ ufRoles.push( this.server.getRole(rawRole) ); } @@ -20,6 +22,21 @@ class Member extends User{ } + get evalPerms(){ + + var basePerms = this.roles, //cache roles as it can be slightly expensive + basePerm = basePerms[0].packed; + + for(var perm of basePerms){ + basePerm = basePerm | perm.packed; + } + + return new ServerPermissions({ + permissions : basePerm + }); + + } + } module.exports = Member; \ No newline at end of file diff --git a/test/bot.1.js b/test/bot.1.js index 88275fd1b..e216f2e4a 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -19,7 +19,7 @@ mybot.on("message", function (message) { // we can go ahead :) - mybot.reply(message, message.sender.roles); + mybot.reply(message, "your evaluated server-wide permissions are " + JSON.stringify(message.sender.evalPerms, null, 4).replace(/true/g, "**true**")); }); From c60fe266574227c1e89b9bd11510a27734df558e Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 22:50:46 +0100 Subject: [PATCH 14/20] Added permissions evaluation! --- lib/ChannelPermissions.js | 39 +++++++++-- lib/EvaluatedPermissions.js | 52 ++++++++++++++ lib/Member.js | 131 +++++++++++++++++++++++++++++++----- lib/channel.js | 2 +- src/ChannelPermissions.js | 39 +++++++++-- src/EvaluatedPermissions.js | 41 +++++++++++ src/Member.js | 37 +++++++++- src/channel.js | 2 +- test/bot.1.js | 2 +- 9 files changed, 313 insertions(+), 32 deletions(-) create mode 100644 lib/EvaluatedPermissions.js create mode 100644 src/EvaluatedPermissions.js diff --git a/lib/ChannelPermissions.js b/lib/ChannelPermissions.js index e47395fd3..b8109644c 100644 --- a/lib/ChannelPermissions.js +++ b/lib/ChannelPermissions.js @@ -5,20 +5,51 @@ 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 ChannelPermissions = (function () { - function ChannelPermissions(data) { + function ChannelPermissions(data, channel) { _classCallCheck(this, ChannelPermissions); + var self = this; + function getBit(x) { - return (this.packed >>> x & 1) === 1; + return (self.packed >>> x & 1) === 1; } this.type = data.type; //either member or role - this.id = data.id; - this.deny = data.deny; + if (this.type === "member") { + this.packed = channel.server.getMember("id", data.id).evalPerms.packed; + } else { + this.packed = channel.server.getRole(data.id).packed; + } + this.packed = this.packed & ~data.deny; + this.packed = this.packed | data.allow; + + this.deny = data.deny; this.allow = data.allow; + + this.createInstantInvite = getBit(0); + //this.banMembers = getBit(1); + //this.kickMembers = getBit(2); + this.managePermissions = getBit(3); + this.manageChannels = getBit(4); + //this.manageServer = getBit(5); + this.readMessages = getBit(10); + this.sendMessages = getBit(11); + this.sendTTSMessages = getBit(12); + this.manageMessages = getBit(13); + this.embedLinks = getBit(14); + this.attachFiles = getBit(15); + this.readMessageHistory = getBit(16); + this.mentionEveryone = getBit(17); + + this.voiceConnect = getBit(20); + this.voiceSpeak = getBit(21); + this.voiceMuteMembers = getBit(22); + this.voiceDeafenMembers = getBit(23); + this.voiceMoveMembers = getBit(24); + this.voiceUseVoiceActivation = getBit(25); } _createClass(ChannelPermissions, [{ diff --git a/lib/EvaluatedPermissions.js b/lib/EvaluatedPermissions.js new file mode 100644 index 000000000..a0795823c --- /dev/null +++ b/lib/EvaluatedPermissions.js @@ -0,0 +1,52 @@ +"use strict"; + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var EvaluatedPermissions = (function () { + function EvaluatedPermissions(data) { + _classCallCheck(this, EvaluatedPermissions); + + var self = this; + + function getBit(x) { + return (self.packed >>> x & 1) === 1; + } + + this.packed = data; + + this.createInstantInvite = getBit(0); + //this.banMembers = getBit(1); + //this.kickMembers = getBit(2); + this.managePermissions = getBit(3); + this.manageChannels = getBit(4); + //this.manageServer = getBit(5); + this.readMessages = getBit(10); + this.sendMessages = getBit(11); + this.sendTTSMessages = getBit(12); + this.manageMessages = getBit(13); + this.embedLinks = getBit(14); + this.attachFiles = getBit(15); + this.readMessageHistory = getBit(16); + this.mentionEveryone = getBit(17); + + this.voiceConnect = getBit(20); + this.voiceSpeak = getBit(21); + this.voiceMuteMembers = getBit(22); + this.voiceDeafenMembers = getBit(23); + this.voiceMoveMembers = getBit(24); + this.voiceUseVoiceActivation = getBit(25); + } + + _createClass(EvaluatedPermissions, [{ + key: "getBit", + value: function getBit(x) { + return (this.packed >>> x & 1) === 1; + } + }]); + + return EvaluatedPermissions; +})(); + +module.exports = EvaluatedPermissions; \ No newline at end of file diff --git a/lib/Member.js b/lib/Member.js index 093d37d5a..a4be7c50b 100644 --- a/lib/Member.js +++ b/lib/Member.js @@ -10,6 +10,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" var User = require("./user.js"); var ServerPermissions = require("./ServerPermissions.js"); +var EvaluatedPermissions = require("./EvaluatedPermissions.js"); var Member = (function (_User) { _inherits(Member, _User); @@ -23,21 +24,25 @@ var Member = (function (_User) { } _createClass(Member, [{ - key: "roles", - get: function get() { + key: "permissionsIn", + value: function permissionsIn(channel) { - var ufRoles = [this.server.getRole(this.server.id)]; + var affectingOverwrites = []; + var affectingMemberOverwrites = []; - console.log(this.rawRoles); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { - for (var _iterator = this.rawRoles[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var rawRole = _step.value; + for (var _iterator = channel.roles[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var overwrite = _step.value; - ufRoles.push(this.server.getRole(rawRole)); + if (overwrite.id === this.id && overwrite.type === "member") { + affectingMemberOverwrites.push(overwrite); + } else if (this.rawRoles.indexOf(overwrite.id) !== -1) { + affectingOverwrites.push(overwrite); + } } } catch (err) { _didIteratorError = true; @@ -54,25 +59,22 @@ var Member = (function (_User) { } } - return ufRoles; - } - }, { - key: "evalPerms", - get: function get() { + if (affectingOverwrites.length === 0) { + return new EvaluatedPermissions(this.evalPerms.packed); + } - var basePerms = this.roles, - //cache roles as it can be slightly expensive - basePerm = basePerms[0].packed; + var finalPacked = affectingOverwrites[0].packed; var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { - for (var _iterator2 = basePerms[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - var perm = _step2.value; + for (var _iterator2 = affectingOverwrites[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var overwrite = _step2.value; - basePerm = basePerm | perm.packed; + finalPacked = finalPacked & ~overwrite.deny; + finalPacked = finalPacked | overwrite.allow; } } catch (err) { _didIteratorError2 = true; @@ -89,6 +91,99 @@ var Member = (function (_User) { } } + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = affectingMemberOverwrites[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var overwrite = _step3.value; + + finalPacked = finalPacked & ~overwrite.deny; + finalPacked = finalPacked | overwrite.allow; + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"]) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + + return new EvaluatedPermissions(finalPacked); + } + }, { + key: "roles", + get: function get() { + + var ufRoles = [this.server.getRole(this.server.id)]; + + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = this.rawRoles[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var rawRole = _step4.value; + + ufRoles.push(this.server.getRole(rawRole)); + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"]) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + return ufRoles; + } + }, { + key: "evalPerms", + get: function get() { + var basePerms = this.roles, + //cache roles as it can be slightly expensive + basePerm = basePerms[0].packed; + + var _iteratorNormalCompletion5 = true; + var _didIteratorError5 = false; + var _iteratorError5 = undefined; + + try { + for (var _iterator5 = basePerms[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var perm = _step5.value; + + basePerm = basePerm | perm.packed; + } + } catch (err) { + _didIteratorError5 = true; + _iteratorError5 = err; + } finally { + try { + if (!_iteratorNormalCompletion5 && _iterator5["return"]) { + _iterator5["return"](); + } + } finally { + if (_didIteratorError5) { + throw _iteratorError5; + } + } + } + return new ServerPermissions({ permissions: basePerm }); diff --git a/lib/channel.js b/lib/channel.js index be49484d3..eee332b0d 100644 --- a/lib/channel.js +++ b/lib/channel.js @@ -26,7 +26,7 @@ var Channel = (function () { for (var _iterator = data.permission_overwrites[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var role = _step.value; - this.roles.push(new ChannelPermissions(role)); + this.roles.push(new ChannelPermissions(role, this)); } //this.isPrivate = isPrivate; //not sure about the implementation of this... diff --git a/src/ChannelPermissions.js b/src/ChannelPermissions.js index 13f183867..aa70ed2a2 100644 --- a/src/ChannelPermissions.js +++ b/src/ChannelPermissions.js @@ -1,18 +1,49 @@ class ChannelPermissions{ - constructor(data){ + constructor(data, channel){ + + var self = this; function getBit(x) { - return ((this.packed >>> x) & 1) === 1; + return ((self.packed >>> x) & 1) === 1; } this.type = data.type; //either member or role - this.id = data.id; - this.deny = data.deny; + if(this.type === "member"){ + this.packed = channel.server.getMember("id", data.id).evalPerms.packed; + }else{ + this.packed = channel.server.getRole(data.id).packed; + } + this.packed = this.packed & ~data.deny; + this.packed = this.packed | data.allow; + + this.deny = data.deny; this.allow = data.allow; + this.createInstantInvite = getBit(0); + //this.banMembers = getBit(1); + //this.kickMembers = getBit(2); + this.managePermissions = getBit(3); + this.manageChannels = getBit(4); + //this.manageServer = getBit(5); + this.readMessages = getBit(10); + this.sendMessages = getBit(11); + this.sendTTSMessages = getBit(12); + this.manageMessages = getBit(13); + this.embedLinks = getBit(14); + this.attachFiles = getBit(15); + this.readMessageHistory = getBit(16); + this.mentionEveryone = getBit(17); + + this.voiceConnect = getBit(20); + this.voiceSpeak = getBit(21); + this.voiceMuteMembers = getBit(22); + this.voiceDeafenMembers = getBit(23); + this.voiceMoveMembers = getBit(24); + this.voiceUseVoiceActivation = getBit(25); + } getBit(x) { diff --git a/src/EvaluatedPermissions.js b/src/EvaluatedPermissions.js new file mode 100644 index 000000000..3c21e7870 --- /dev/null +++ b/src/EvaluatedPermissions.js @@ -0,0 +1,41 @@ +class EvaluatedPermissions{ + constructor(data){ + + var self = this; + + function getBit(x) { + return ((self.packed >>> x) & 1) === 1; + } + + this.packed = data; + + this.createInstantInvite = getBit(0); + //this.banMembers = getBit(1); + //this.kickMembers = getBit(2); + this.managePermissions = getBit(3); + this.manageChannels = getBit(4); + //this.manageServer = getBit(5); + this.readMessages = getBit(10); + this.sendMessages = getBit(11); + this.sendTTSMessages = getBit(12); + this.manageMessages = getBit(13); + this.embedLinks = getBit(14); + this.attachFiles = getBit(15); + this.readMessageHistory = getBit(16); + this.mentionEveryone = getBit(17); + + this.voiceConnect = getBit(20); + this.voiceSpeak = getBit(21); + this.voiceMuteMembers = getBit(22); + this.voiceDeafenMembers = getBit(23); + this.voiceMoveMembers = getBit(24); + this.voiceUseVoiceActivation = getBit(25); + + } + + getBit(x) { + return ((this.packed >>> x) & 1) === 1; + } +} + +module.exports = EvaluatedPermissions; \ No newline at end of file diff --git a/src/Member.js b/src/Member.js index 5db412403..969c5cd43 100644 --- a/src/Member.js +++ b/src/Member.js @@ -1,5 +1,6 @@ var User = require("./user.js"); var ServerPermissions = require("./ServerPermissions.js"); +var EvaluatedPermissions = require("./EvaluatedPermissions.js"); class Member extends User{ @@ -12,8 +13,7 @@ class Member extends User{ get roles(){ var ufRoles = [ this.server.getRole(this.server.id) ]; - - console.log(this.rawRoles); + for(var rawRole of this.rawRoles){ ufRoles.push( this.server.getRole(rawRole) ); } @@ -23,7 +23,6 @@ class Member extends User{ } get evalPerms(){ - var basePerms = this.roles, //cache roles as it can be slightly expensive basePerm = basePerms[0].packed; @@ -34,6 +33,38 @@ class Member extends User{ return new ServerPermissions({ permissions : basePerm }); + } + + permissionsIn(channel){ + + var affectingOverwrites = []; + var affectingMemberOverwrites = []; + + for(var overwrite of channel.roles){ + if(overwrite.id === this.id && overwrite.type === "member"){ + affectingMemberOverwrites.push(overwrite); + }else if( this.rawRoles.indexOf(overwrite.id) !== -1 ){ + affectingOverwrites.push(overwrite); + } + } + + if(affectingOverwrites.length === 0){ + return new EvaluatedPermissions(this.evalPerms.packed); + } + + var finalPacked = affectingOverwrites[0].packed; + + for(var overwrite of affectingOverwrites){ + finalPacked = finalPacked & ~overwrite.deny; + finalPacked = finalPacked | overwrite.allow; + } + + for(var overwrite of affectingMemberOverwrites){ + finalPacked = finalPacked & ~overwrite.deny; + finalPacked = finalPacked | overwrite.allow; + } + + return new EvaluatedPermissions(finalPacked); } diff --git a/src/channel.js b/src/channel.js index 64c9f22f0..81d5c5b28 100644 --- a/src/channel.js +++ b/src/channel.js @@ -13,7 +13,7 @@ class Channel { for (var role of data.permission_overwrites) { - this.roles.push( new ChannelPermissions(role) ); + this.roles.push( new ChannelPermissions(role, this) ); } diff --git a/test/bot.1.js b/test/bot.1.js index e216f2e4a..0f429ebe4 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -19,7 +19,7 @@ mybot.on("message", function (message) { // we can go ahead :) - mybot.reply(message, "your evaluated server-wide permissions are " + JSON.stringify(message.sender.evalPerms, null, 4).replace(/true/g, "**true**")); + mybot.reply(message, "your evaluated permissions in this channel are " + JSON.stringify(message.sender.permissionsIn(message.channel), null, 4).replace(/true/g, "**true**")); }); From 4eacab784d95b7bef7e7de6f048a6660f457c2a1 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 23:13:33 +0100 Subject: [PATCH 15/20] Fixed evaluation and added basic deletion following --- lib/Client.js | 11 +++++++ lib/Member.js | 83 +++++++++++++++++++++++++++++++++------------------ lib/server.js | 75 +++++++++++++++++++++++++++++++++++----------- src/Client.js | 11 +++++++ src/Member.js | 8 +++-- src/server.js | 20 +++++++++++++ test/bot.1.js | 6 ---- 7 files changed, 160 insertions(+), 54 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index e22cac6c8..51454a9bb 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -1134,6 +1134,17 @@ var Client = (function () { break; + case "GUILD_ROLE_DELETE": + + var server = self.getServer("id", data.guild_id); + var role = server.getRole(data.role_id); + + self.trigger("serverRoleDelete", server, role); + + server.removeRole(role.id); + + break; + default: self.debug("received unknown packet"); self.trigger("unknown", dat); diff --git a/lib/Member.js b/lib/Member.js index a4be7c50b..d879355cd 100644 --- a/lib/Member.js +++ b/lib/Member.js @@ -59,22 +59,15 @@ var Member = (function (_User) { } } - if (affectingOverwrites.length === 0) { - return new EvaluatedPermissions(this.evalPerms.packed); - } - - var finalPacked = affectingOverwrites[0].packed; - var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = affectingOverwrites[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - var overwrite = _step2.value; + var perm = _step2.value; - finalPacked = finalPacked & ~overwrite.deny; - finalPacked = finalPacked | overwrite.allow; + console.log("hey", perm.attachFiles); } } catch (err) { _didIteratorError2 = true; @@ -91,12 +84,18 @@ var Member = (function (_User) { } } + if (affectingOverwrites.length === 0 && affectingMemberOverwrites.length === 0) { + return new EvaluatedPermissions(this.evalPerms.packed); + } + + var finalPacked = affectingOverwrites.length !== 0 ? affectingOverwrites[0].packed : affectingMemberOverwrites[0].packed; + var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { - for (var _iterator3 = affectingMemberOverwrites[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + for (var _iterator3 = affectingOverwrites[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var overwrite = _step3.value; finalPacked = finalPacked & ~overwrite.deny; @@ -117,23 +116,16 @@ var Member = (function (_User) { } } - return new EvaluatedPermissions(finalPacked); - } - }, { - key: "roles", - get: function get() { - - var ufRoles = [this.server.getRole(this.server.id)]; - var _iteratorNormalCompletion4 = true; var _didIteratorError4 = false; var _iteratorError4 = undefined; try { - for (var _iterator4 = this.rawRoles[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { - var rawRole = _step4.value; + for (var _iterator4 = affectingMemberOverwrites[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var overwrite = _step4.value; - ufRoles.push(this.server.getRole(rawRole)); + finalPacked = finalPacked & ~overwrite.deny; + finalPacked = finalPacked | overwrite.allow; } } catch (err) { _didIteratorError4 = true; @@ -150,24 +142,23 @@ var Member = (function (_User) { } } - return ufRoles; + return new EvaluatedPermissions(finalPacked); } }, { - key: "evalPerms", + key: "roles", get: function get() { - var basePerms = this.roles, - //cache roles as it can be slightly expensive - basePerm = basePerms[0].packed; + + var ufRoles = [this.server.getRole(this.server.id)]; var _iteratorNormalCompletion5 = true; var _didIteratorError5 = false; var _iteratorError5 = undefined; try { - for (var _iterator5 = basePerms[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { - var perm = _step5.value; + for (var _iterator5 = this.rawRoles[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var rawRole = _step5.value; - basePerm = basePerm | perm.packed; + ufRoles.push(this.server.getRole(rawRole)); } } catch (err) { _didIteratorError5 = true; @@ -184,6 +175,40 @@ var Member = (function (_User) { } } + return ufRoles; + } + }, { + key: "evalPerms", + get: function get() { + var basePerms = this.roles, + //cache roles as it can be slightly expensive + basePerm = basePerms[0].packed; + + var _iteratorNormalCompletion6 = true; + var _didIteratorError6 = false; + var _iteratorError6 = undefined; + + try { + for (var _iterator6 = basePerms[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { + var perm = _step6.value; + + basePerm = basePerm | perm.packed; + } + } catch (err) { + _didIteratorError6 = true; + _iteratorError6 = err; + } finally { + try { + if (!_iteratorNormalCompletion6 && _iterator6["return"]) { + _iterator6["return"](); + } + } finally { + if (_didIteratorError6) { + throw _iteratorError6; + } + } + } + return new ServerPermissions({ permissions: basePerm }); diff --git a/lib/server.js b/lib/server.js index c9feaa0a3..0bdb36612 100644 --- a/lib/server.js +++ b/lib/server.js @@ -121,18 +121,29 @@ var Server = (function () { return null; } }, { - key: "getChannel", - value: function getChannel(key, value) { + key: "updateRole", + value: function updateRole() {} + }, { + key: "removeRole", + value: function removeRole(id) { + for (var roleId in this.roles) { + if (this.roles[roleId].id === id) { + this.roles.splice(roleId, 1); + } + } + var _iteratorNormalCompletion4 = true; var _didIteratorError4 = false; var _iteratorError4 = undefined; try { - for (var _iterator4 = this.channels[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { - var channel = _step4.value; + for (var _iterator4 = this.members[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var member = _step4.value; - if (channel[key] === value) { - return channel; + for (var roleId in member.rawRoles) { + if (member.rawRoles[roleId] === id) { + member.rawRoles.splice(roleId, 1); + } } } } catch (err) { @@ -149,22 +160,20 @@ var Server = (function () { } } } - - return null; } }, { - key: "getMember", - value: function getMember(key, value) { + key: "getChannel", + value: function getChannel(key, value) { var _iteratorNormalCompletion5 = true; var _didIteratorError5 = false; var _iteratorError5 = undefined; try { - for (var _iterator5 = this.members[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { - var member = _step5.value; + for (var _iterator5 = this.channels[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var channel = _step5.value; - if (member[key] === value) { - return member; + if (channel[key] === value) { + return channel; } } } catch (err) { @@ -185,8 +194,8 @@ var Server = (function () { return null; } }, { - key: "removeMember", - value: function removeMember(key, value) { + key: "getMember", + value: function getMember(key, value) { var _iteratorNormalCompletion6 = true; var _didIteratorError6 = false; var _iteratorError6 = undefined; @@ -196,7 +205,6 @@ var Server = (function () { var member = _step6.value; if (member[key] === value) { - this.members.splice(key, 1); return member; } } @@ -215,6 +223,39 @@ var Server = (function () { } } + return null; + } + }, { + key: "removeMember", + value: function removeMember(key, value) { + var _iteratorNormalCompletion7 = true; + var _didIteratorError7 = false; + var _iteratorError7 = undefined; + + try { + for (var _iterator7 = this.members[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { + var member = _step7.value; + + if (member[key] === value) { + this.members.splice(key, 1); + return member; + } + } + } catch (err) { + _didIteratorError7 = true; + _iteratorError7 = err; + } finally { + try { + if (!_iteratorNormalCompletion7 && _iterator7["return"]) { + _iterator7["return"](); + } + } finally { + if (_didIteratorError7) { + throw _iteratorError7; + } + } + } + return false; } }, { diff --git a/src/Client.js b/src/Client.js index e8560d457..20d71f330 100644 --- a/src/Client.js +++ b/src/Client.js @@ -1042,6 +1042,17 @@ class Client { }, 6000); break; + + case "GUILD_ROLE_DELETE": + + var server = self.getServer("id", data.guild_id); + var role = server.getRole(data.role_id); + + self.trigger("serverRoleDelete", server, role); + + server.removeRole(role.id); + + break; default: self.debug("received unknown packet"); diff --git a/src/Member.js b/src/Member.js index 969c5cd43..e5cc946f1 100644 --- a/src/Member.js +++ b/src/Member.js @@ -48,11 +48,15 @@ class Member extends User{ } } - if(affectingOverwrites.length === 0){ + for(var perm of affectingOverwrites){ + console.log("hey", perm.attachFiles); + } + + if(affectingOverwrites.length === 0 && affectingMemberOverwrites.length === 0){ return new EvaluatedPermissions(this.evalPerms.packed); } - var finalPacked = affectingOverwrites[0].packed; + var finalPacked = (affectingOverwrites.length !== 0 ? affectingOverwrites[0].packed : affectingMemberOverwrites[0].packed); for(var overwrite of affectingOverwrites){ finalPacked = finalPacked & ~overwrite.deny; diff --git a/src/server.js b/src/server.js index d2a1bf411..6ae83ad58 100644 --- a/src/server.js +++ b/src/server.js @@ -83,6 +83,26 @@ class Server { return null; } + updateRole(){ + + } + + removeRole(id){ + for (var roleId in this.roles) { + if (this.roles[roleId].id === id) { + this.roles.splice(roleId, 1); + } + } + + for(var member of this.members){ + for(var roleId in member.rawRoles){ + if(member.rawRoles[roleId] === id){ + member.rawRoles.splice(roleId, 1); + } + } + } + } + getChannel(key, value) { for (var channel of this.channels) { if (channel[key] === value) { diff --git a/test/bot.1.js b/test/bot.1.js index 0f429ebe4..0d21c7af2 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -9,10 +9,6 @@ counter = 1; mybot.on("message", function (message) { console.log("Everyone mentioned? " + message.everyoneMentioned); - if (mybot.user.equals(message.sender)) { - return; - } - if (message.content !== "$$$") { return; } @@ -44,8 +40,6 @@ mybot.on("unknown", function(info){ mybot.on("channelUpdate", function(oldChan, newChan){ - console.log(oldChan.topic + " vs " + newChan.topic); - }); mybot.on("startTyping", function(user, channel){ From 0b020f92642e27842820f686640d65b0a8d55c9e Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 23:33:00 +0100 Subject: [PATCH 16/20] Fixed some stuff so much I don't even remember --- lib/EvaluatedPermissions.js | 3 +++ lib/Member.js | 4 ++++ lib/channel.js | 12 ++++++++++++ src/EvaluatedPermissions.js | 3 +++ src/Member.js | 4 ++++ src/channel.js | 12 ++++++++++++ test/bot.1.js | 13 +++++++++++-- 7 files changed, 49 insertions(+), 2 deletions(-) diff --git a/lib/EvaluatedPermissions.js b/lib/EvaluatedPermissions.js index a0795823c..4c56d9e64 100644 --- a/lib/EvaluatedPermissions.js +++ b/lib/EvaluatedPermissions.js @@ -11,6 +11,9 @@ var EvaluatedPermissions = (function () { var self = this; function getBit(x) { + if ((self.packed >>> 3 & 1) === 1) { + return true; + } return (self.packed >>> x & 1) === 1; } diff --git a/lib/Member.js b/lib/Member.js index d879355cd..ba29467db 100644 --- a/lib/Member.js +++ b/lib/Member.js @@ -27,6 +27,10 @@ var Member = (function (_User) { key: "permissionsIn", value: function permissionsIn(channel) { + if (channel.server.ownerID === this.id) { + return new EvaluatedPermissions(4294967295); //all perms + } + var affectingOverwrites = []; var affectingMemberOverwrites = []; diff --git a/lib/channel.js b/lib/channel.js index eee332b0d..fbaa8ce4c 100644 --- a/lib/channel.js +++ b/lib/channel.js @@ -47,6 +47,18 @@ var Channel = (function () { } _createClass(Channel, [{ + key: "permissionsOf", + value: function permissionsOf(member) { + + var mem = this.server.getMember("id", member.id); + + if (mem) { + return mem.permissionsIn(this); + } else { + return null; + } + } + }, { key: "equals", value: function equals(object) { return object && object.id === this.id; diff --git a/src/EvaluatedPermissions.js b/src/EvaluatedPermissions.js index 3c21e7870..ba71f8e85 100644 --- a/src/EvaluatedPermissions.js +++ b/src/EvaluatedPermissions.js @@ -4,6 +4,9 @@ class EvaluatedPermissions{ var self = this; function getBit(x) { + if(((self.packed >>> 3) & 1) === 1){ + return true; + } return ((self.packed >>> x) & 1) === 1; } diff --git a/src/Member.js b/src/Member.js index e5cc946f1..9ac6c644b 100644 --- a/src/Member.js +++ b/src/Member.js @@ -37,6 +37,10 @@ class Member extends User{ permissionsIn(channel){ + if(channel.server.ownerID === this.id){ + return new EvaluatedPermissions(4294967295); //all perms + } + var affectingOverwrites = []; var affectingMemberOverwrites = []; diff --git a/src/channel.js b/src/channel.js index 81d5c5b28..6e3b2ef99 100644 --- a/src/channel.js +++ b/src/channel.js @@ -32,6 +32,18 @@ class Channel { return this.server.client; } + permissionsOf(member){ + + var mem = this.server.getMember("id", member.id); + + if(mem){ + return mem.permissionsIn(this); + }else{ + return null; + } + + } + equals(object) { return (object && object.id === this.id); } diff --git a/test/bot.1.js b/test/bot.1.js index 0d21c7af2..19caf0151 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -9,13 +9,22 @@ counter = 1; mybot.on("message", function (message) { console.log("Everyone mentioned? " + message.everyoneMentioned); - if (message.content !== "$$$") { + if (message.content.substr(0,3) !== "$$$") { return; } // we can go ahead :) - mybot.reply(message, "your evaluated permissions in this channel are " + JSON.stringify(message.sender.permissionsIn(message.channel), null, 4).replace(/true/g, "**true**")); + var user; + if(message.mentions.length > 0){ + user = message.mentions[0]; + }else{ + user = message.sender; + } + + console.log("the ID is ", user.id); + + mybot.reply(message, user + "'s evaluated permissions in this channel are " + JSON.stringify(message.channel.permissionsOf(user), null, 4).replace(/true/g, "**true**")); }); From aed7d3c1c2cbd71c7b6ae111c080a5cdeeabb295 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 23:40:29 +0100 Subject: [PATCH 17/20] began to work on update listening --- lib/ServerPermissions.js | 9 ++++++++- lib/server.js | 13 ++++++++++++- src/ServerPermissions.js | 6 ++++-- src/server.js | 13 ++++++++++++- 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/lib/ServerPermissions.js b/lib/ServerPermissions.js index 66411f542..b96249b9d 100644 --- a/lib/ServerPermissions.js +++ b/lib/ServerPermissions.js @@ -18,7 +18,6 @@ var ServerPermissions = (function () { this.name = data.name; this.id = data.id; - this.createInstantInvite = getBit(0); this.banMembers = getBit(1); this.kickMembers = getBit(2); this.manageRoles = getBit(3); @@ -51,6 +50,14 @@ var ServerPermissions = (function () { value: function toString() { return this.name; } + }, { + key: "createInstantInvite", + get: function get() { + return this.getBit(0); + }, + set: function set(val) { + this.setBit(0, val); + } }]); return ServerPermissions; diff --git a/lib/server.js b/lib/server.js index 0bdb36612..cd6fddaad 100644 --- a/lib/server.js +++ b/lib/server.js @@ -122,7 +122,18 @@ var Server = (function () { } }, { key: "updateRole", - value: function updateRole() {} + value: function updateRole(data) { + + var oldRole = this.getRole(data.id); + + if (oldRole) { + + oldRole.packed = data.permissions; + oldRole.name = data.name; + } else { + return false; + } + } }, { key: "removeRole", value: function removeRole(id) { diff --git a/src/ServerPermissions.js b/src/ServerPermissions.js index dc0a3c9ce..7d4babd32 100644 --- a/src/ServerPermissions.js +++ b/src/ServerPermissions.js @@ -11,8 +11,7 @@ class ServerPermissions { this.packed = data.permissions; this.name = data.name; this.id = data.id; - - this.createInstantInvite = getBit(0); + this.banMembers = getBit(1); this.kickMembers = getBit(2); this.manageRoles = getBit(3); @@ -35,6 +34,9 @@ class ServerPermissions { this.voiceUseVoiceActivation = getBit(25); } + + get createInstantInvite(){return this.getBit(0);} + set createInstantInvite(val){this.setBit(0, val);} getBit(x) { return ((this.packed >>> x) & 1) === 1; diff --git a/src/server.js b/src/server.js index 6ae83ad58..92bbd970f 100644 --- a/src/server.js +++ b/src/server.js @@ -83,7 +83,18 @@ class Server { return null; } - updateRole(){ + updateRole(data){ + + var oldRole = this.getRole(data.id); + + if(oldRole){ + + oldRole.packed = data.permissions; + oldRole.name = data.name; + + }else{ + return false; + } } From 780369b90a3842de07061bec5013fac9162ed04d Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 23:50:21 +0100 Subject: [PATCH 18/20] Moved permissions to get/set the grind was unreal --- lib/ChannelPermissions.js | 161 +++++++++++++++++++++++++++----- lib/EvaluatedPermissions.js | 161 +++++++++++++++++++++++++++----- lib/ServerPermissions.js | 178 +++++++++++++++++++++++++++++++----- src/ChannelPermissions.js | 77 +++++++++++----- src/EvaluatedPermissions.js | 92 +++++++++++++------ src/ServerPermissions.js | 82 ++++++++++++----- 6 files changed, 613 insertions(+), 138 deletions(-) diff --git a/lib/ChannelPermissions.js b/lib/ChannelPermissions.js index b8109644c..bbc8545db 100644 --- a/lib/ChannelPermissions.js +++ b/lib/ChannelPermissions.js @@ -28,28 +28,6 @@ var ChannelPermissions = (function () { this.deny = data.deny; this.allow = data.allow; - - this.createInstantInvite = getBit(0); - //this.banMembers = getBit(1); - //this.kickMembers = getBit(2); - this.managePermissions = getBit(3); - this.manageChannels = getBit(4); - //this.manageServer = getBit(5); - this.readMessages = getBit(10); - this.sendMessages = getBit(11); - this.sendTTSMessages = getBit(12); - this.manageMessages = getBit(13); - this.embedLinks = getBit(14); - this.attachFiles = getBit(15); - this.readMessageHistory = getBit(16); - this.mentionEveryone = getBit(17); - - this.voiceConnect = getBit(20); - this.voiceSpeak = getBit(21); - this.voiceMuteMembers = getBit(22); - this.voiceDeafenMembers = getBit(23); - this.voiceMoveMembers = getBit(24); - this.voiceUseVoiceActivation = getBit(25); } _createClass(ChannelPermissions, [{ @@ -57,6 +35,145 @@ var ChannelPermissions = (function () { value: function getBit(x) { return (this.packed >>> x & 1) === 1; } + }, { + key: "setBit", + value: function setBit() {} + }, { + key: "createInstantInvite", + get: function get() { + return this.getBit(0); + }, + set: function set(val) { + this.setBit(0, val); + } + }, { + key: "manageRoles", + get: function get() { + return this.getBit(3); + }, + set: function set(val) { + this.setBit(3, val); + } + }, { + key: "manageChannels", + get: function get() { + return this.getBit(4); + }, + set: function set(val) { + this.setBit(4, val); + } + }, { + key: "readMessages", + get: function get() { + return this.getBit(10); + }, + set: function set(val) { + this.setBit(10, val); + } + }, { + key: "sendMessages", + get: function get() { + return this.getBit(11); + }, + set: function set(val) { + this.setBit(11, val); + } + }, { + key: "sendTTSMessages", + get: function get() { + return this.getBit(12); + }, + set: function set(val) { + this.setBit(12, val); + } + }, { + key: "manageMessages", + get: function get() { + return this.getBit(13); + }, + set: function set(val) { + this.setBit(13, val); + } + }, { + key: "embedLinks", + get: function get() { + return this.getBit(14); + }, + set: function set(val) { + this.setBit(14, val); + } + }, { + key: "attachFiles", + get: function get() { + return this.getBit(15); + }, + set: function set(val) { + this.setBit(15, val); + } + }, { + key: "readMessageHistory", + get: function get() { + return this.getBit(16); + }, + set: function set(val) { + this.setBit(16, val); + } + }, { + key: "mentionEveryone", + get: function get() { + return this.getBit(17); + }, + set: function set(val) { + this.setBit(17, val); + } + }, { + key: "voiceConnect", + get: function get() { + return this.getBit(20); + }, + set: function set(val) { + this.setBit(20, val); + } + }, { + key: "voiceSpeak", + get: function get() { + return this.getBit(21); + }, + set: function set(val) { + this.setBit(21, val); + } + }, { + key: "voiceMuteMembers", + get: function get() { + return this.getBit(22); + }, + set: function set(val) { + this.setBit(22, val); + } + }, { + key: "voiceDeafenMembers", + get: function get() { + return this.getBit(23); + }, + set: function set(val) { + this.setBit(23, val); + } + }, { + key: "voiceMoveMembers", + get: function get() { + return this.getBit(24); + }, + set: function set(val) { + this.setBit(24, val); + } + }, { + key: "voiceUseVoiceActivation", + get: function get() { + return this.getBit(25); + }, + set: function set(val) { + this.setBit(25, val); + } }]); return ChannelPermissions; diff --git a/lib/EvaluatedPermissions.js b/lib/EvaluatedPermissions.js index 4c56d9e64..b441500cf 100644 --- a/lib/EvaluatedPermissions.js +++ b/lib/EvaluatedPermissions.js @@ -18,28 +18,6 @@ var EvaluatedPermissions = (function () { } this.packed = data; - - this.createInstantInvite = getBit(0); - //this.banMembers = getBit(1); - //this.kickMembers = getBit(2); - this.managePermissions = getBit(3); - this.manageChannels = getBit(4); - //this.manageServer = getBit(5); - this.readMessages = getBit(10); - this.sendMessages = getBit(11); - this.sendTTSMessages = getBit(12); - this.manageMessages = getBit(13); - this.embedLinks = getBit(14); - this.attachFiles = getBit(15); - this.readMessageHistory = getBit(16); - this.mentionEveryone = getBit(17); - - this.voiceConnect = getBit(20); - this.voiceSpeak = getBit(21); - this.voiceMuteMembers = getBit(22); - this.voiceDeafenMembers = getBit(23); - this.voiceMoveMembers = getBit(24); - this.voiceUseVoiceActivation = getBit(25); } _createClass(EvaluatedPermissions, [{ @@ -47,6 +25,145 @@ var EvaluatedPermissions = (function () { value: function getBit(x) { return (this.packed >>> x & 1) === 1; } + }, { + key: "setBit", + value: function setBit() {} + }, { + key: "createInstantInvite", + get: function get() { + return this.getBit(0); + }, + set: function set(val) { + this.setBit(0, val); + } + }, { + key: "manageRoles", + get: function get() { + return this.getBit(3); + }, + set: function set(val) { + this.setBit(3, val); + } + }, { + key: "manageChannels", + get: function get() { + return this.getBit(4); + }, + set: function set(val) { + this.setBit(4, val); + } + }, { + key: "readMessages", + get: function get() { + return this.getBit(10); + }, + set: function set(val) { + this.setBit(10, val); + } + }, { + key: "sendMessages", + get: function get() { + return this.getBit(11); + }, + set: function set(val) { + this.setBit(11, val); + } + }, { + key: "sendTTSMessages", + get: function get() { + return this.getBit(12); + }, + set: function set(val) { + this.setBit(12, val); + } + }, { + key: "manageMessages", + get: function get() { + return this.getBit(13); + }, + set: function set(val) { + this.setBit(13, val); + } + }, { + key: "embedLinks", + get: function get() { + return this.getBit(14); + }, + set: function set(val) { + this.setBit(14, val); + } + }, { + key: "attachFiles", + get: function get() { + return this.getBit(15); + }, + set: function set(val) { + this.setBit(15, val); + } + }, { + key: "readMessageHistory", + get: function get() { + return this.getBit(16); + }, + set: function set(val) { + this.setBit(16, val); + } + }, { + key: "mentionEveryone", + get: function get() { + return this.getBit(17); + }, + set: function set(val) { + this.setBit(17, val); + } + }, { + key: "voiceConnect", + get: function get() { + return this.getBit(20); + }, + set: function set(val) { + this.setBit(20, val); + } + }, { + key: "voiceSpeak", + get: function get() { + return this.getBit(21); + }, + set: function set(val) { + this.setBit(21, val); + } + }, { + key: "voiceMuteMembers", + get: function get() { + return this.getBit(22); + }, + set: function set(val) { + this.setBit(22, val); + } + }, { + key: "voiceDeafenMembers", + get: function get() { + return this.getBit(23); + }, + set: function set(val) { + this.setBit(23, val); + } + }, { + key: "voiceMoveMembers", + get: function get() { + return this.getBit(24); + }, + set: function set(val) { + this.setBit(24, val); + } + }, { + key: "voiceUseVoiceActivation", + get: function get() { + return this.getBit(25); + }, + set: function set(val) { + this.setBit(25, val); + } }]); return EvaluatedPermissions; diff --git a/lib/ServerPermissions.js b/lib/ServerPermissions.js index b96249b9d..73148ca06 100644 --- a/lib/ServerPermissions.js +++ b/lib/ServerPermissions.js @@ -17,27 +17,6 @@ var ServerPermissions = (function () { this.packed = data.permissions; this.name = data.name; this.id = data.id; - - this.banMembers = getBit(1); - this.kickMembers = getBit(2); - this.manageRoles = getBit(3); - this.manageChannels = getBit(4); - this.manageServer = getBit(5); - this.readMessages = getBit(10); - this.sendMessages = getBit(11); - this.sendTTSMessages = getBit(12); - this.manageMessages = getBit(13); - this.embedLinks = getBit(14); - this.attachFiles = getBit(15); - this.readMessageHistory = getBit(16); - this.mentionEveryone = getBit(17); - - this.voiceConnect = getBit(20); - this.voiceSpeak = getBit(21); - this.voiceMuteMembers = getBit(22); - this.voiceDeafenMembers = getBit(23); - this.voiceMoveMembers = getBit(24); - this.voiceUseVoiceActivation = getBit(25); } _createClass(ServerPermissions, [{ @@ -45,6 +24,11 @@ var ServerPermissions = (function () { value: function getBit(x) { return (this.packed >>> x & 1) === 1; } + }, { + key: "setBit", + value: function setBit() { + //dummy function for now + } }, { key: "toString", value: function toString() { @@ -58,6 +42,158 @@ var ServerPermissions = (function () { set: function set(val) { this.setBit(0, val); } + }, { + key: "banMembers", + get: function get() { + return this.getBit(1); + }, + set: function set(val) { + this.setBit(1, val); + } + }, { + key: "kickMembers", + get: function get() { + return this.getBit(2); + }, + set: function set(val) { + this.setBit(2, val); + } + }, { + key: "manageRoles", + get: function get() { + return this.getBit(3); + }, + set: function set(val) { + this.setBit(3, val); + } + }, { + key: "manageChannels", + get: function get() { + return this.getBit(4); + }, + set: function set(val) { + this.setBit(4, val); + } + }, { + key: "manageServer", + get: function get() { + return this.getBit(5); + }, + set: function set(val) { + this.setBit(5, val); + } + }, { + key: "readMessages", + get: function get() { + return this.getBit(10); + }, + set: function set(val) { + this.setBit(10, val); + } + }, { + key: "sendMessages", + get: function get() { + return this.getBit(11); + }, + set: function set(val) { + this.setBit(11, val); + } + }, { + key: "sendTTSMessages", + get: function get() { + return this.getBit(12); + }, + set: function set(val) { + this.setBit(12, val); + } + }, { + key: "manageMessages", + get: function get() { + return this.getBit(13); + }, + set: function set(val) { + this.setBit(13, val); + } + }, { + key: "embedLinks", + get: function get() { + return this.getBit(14); + }, + set: function set(val) { + this.setBit(14, val); + } + }, { + key: "attachFiles", + get: function get() { + return this.getBit(15); + }, + set: function set(val) { + this.setBit(15, val); + } + }, { + key: "readMessageHistory", + get: function get() { + return this.getBit(16); + }, + set: function set(val) { + this.setBit(16, val); + } + }, { + key: "mentionEveryone", + get: function get() { + return this.getBit(17); + }, + set: function set(val) { + this.setBit(17, val); + } + }, { + key: "voiceConnect", + get: function get() { + return this.getBit(20); + }, + set: function set(val) { + this.setBit(20, val); + } + }, { + key: "voiceSpeak", + get: function get() { + return this.getBit(21); + }, + set: function set(val) { + this.setBit(21, val); + } + }, { + key: "voiceMuteMembers", + get: function get() { + return this.getBit(22); + }, + set: function set(val) { + this.setBit(22, val); + } + }, { + key: "voiceDeafenMembers", + get: function get() { + return this.getBit(23); + }, + set: function set(val) { + this.setBit(23, val); + } + }, { + key: "voiceMoveMembers", + get: function get() { + return this.getBit(24); + }, + set: function set(val) { + this.setBit(24, val); + } + }, { + key: "voiceUseVoiceActivation", + get: function get() { + return this.getBit(25); + }, + set: function set(val) { + this.setBit(25, val); + } }]); return ServerPermissions; diff --git a/src/ChannelPermissions.js b/src/ChannelPermissions.js index aa70ed2a2..9d6dce2e4 100644 --- a/src/ChannelPermissions.js +++ b/src/ChannelPermissions.js @@ -22,33 +22,66 @@ class ChannelPermissions{ this.deny = data.deny; this.allow = data.allow; - this.createInstantInvite = getBit(0); - //this.banMembers = getBit(1); - //this.kickMembers = getBit(2); - this.managePermissions = getBit(3); - this.manageChannels = getBit(4); - //this.manageServer = getBit(5); - this.readMessages = getBit(10); - this.sendMessages = getBit(11); - this.sendTTSMessages = getBit(12); - this.manageMessages = getBit(13); - this.embedLinks = getBit(14); - this.attachFiles = getBit(15); - this.readMessageHistory = getBit(16); - this.mentionEveryone = getBit(17); - - this.voiceConnect = getBit(20); - this.voiceSpeak = getBit(21); - this.voiceMuteMembers = getBit(22); - this.voiceDeafenMembers = getBit(23); - this.voiceMoveMembers = getBit(24); - this.voiceUseVoiceActivation = getBit(25); - } + 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) { return ((this.packed >>> x) & 1) === 1; } + + setBit() { + + } } module.exports = ChannelPermissions; \ No newline at end of file diff --git a/src/EvaluatedPermissions.js b/src/EvaluatedPermissions.js index ba71f8e85..5fef65fe9 100644 --- a/src/EvaluatedPermissions.js +++ b/src/EvaluatedPermissions.js @@ -1,44 +1,76 @@ -class EvaluatedPermissions{ - constructor(data){ - +class EvaluatedPermissions { + constructor(data) { + var self = this; - + function getBit(x) { - if(((self.packed >>> 3) & 1) === 1){ + if (((self.packed >>> 3) & 1) === 1) { return true; } return ((self.packed >>> x) & 1) === 1; } - + this.packed = data; - - this.createInstantInvite = getBit(0); - //this.banMembers = getBit(1); - //this.kickMembers = getBit(2); - this.managePermissions = getBit(3); - this.manageChannels = getBit(4); - //this.manageServer = getBit(5); - this.readMessages = getBit(10); - this.sendMessages = getBit(11); - this.sendTTSMessages = getBit(12); - this.manageMessages = getBit(13); - this.embedLinks = getBit(14); - this.attachFiles = getBit(15); - this.readMessageHistory = getBit(16); - this.mentionEveryone = getBit(17); - - this.voiceConnect = getBit(20); - this.voiceSpeak = getBit(21); - this.voiceMuteMembers = getBit(22); - this.voiceDeafenMembers = getBit(23); - this.voiceMoveMembers = getBit(24); - this.voiceUseVoiceActivation = getBit(25); - } - + + 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) { return ((this.packed >>> x) & 1) === 1; } + + setBit() { + + } } module.exports = EvaluatedPermissions; \ No newline at end of file diff --git a/src/ServerPermissions.js b/src/ServerPermissions.js index 7d4babd32..b3fd848ae 100644 --- a/src/ServerPermissions.js +++ b/src/ServerPermissions.js @@ -12,36 +12,76 @@ class ServerPermissions { this.name = data.name; this.id = data.id; - this.banMembers = getBit(1); - this.kickMembers = getBit(2); - this.manageRoles = getBit(3); - this.manageChannels = getBit(4); - this.manageServer = getBit(5); - this.readMessages = getBit(10); - this.sendMessages = getBit(11); - this.sendTTSMessages = getBit(12); - this.manageMessages = getBit(13); - this.embedLinks = getBit(14); - this.attachFiles = getBit(15); - this.readMessageHistory = getBit(16); - this.mentionEveryone = getBit(17); - - this.voiceConnect = getBit(20); - this.voiceSpeak = getBit(21); - this.voiceMuteMembers = getBit(22); - this.voiceDeafenMembers = getBit(23); - this.voiceMoveMembers = getBit(24); - this.voiceUseVoiceActivation = getBit(25); - } 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) { return ((this.packed >>> x) & 1) === 1; } + setBit(){ + //dummy function for now + } + toString(){ return this.name; } From b130b2400b218b93cb4627ea83baa5efca928d9c Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sun, 4 Oct 2015 00:00:30 +0100 Subject: [PATCH 19/20] updated indexing --- lib/Client.js | 10 ++++++++++ lib/server.js | 6 ++++-- src/Client.js | 10 ++++++++++ src/server.js | 7 +++++-- test/bot.1.js | 6 +++++- 5 files changed, 34 insertions(+), 5 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index 51454a9bb..b4f54294a 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -1145,6 +1145,16 @@ var Client = (function () { break; + case "GUILD_ROLE_UPDATE": + + var server = self.getServer("id", data.guild_id); + var role = server.getRole(data.role.id); + var newRole = server.updateRole(data.role); + + self.trigger("serverRoleUpdate", server, role, newRole); + + break; + default: self.debug("received unknown packet"); self.trigger("unknown", dat); diff --git a/lib/server.js b/lib/server.js index cd6fddaad..9921a457c 100644 --- a/lib/server.js +++ b/lib/server.js @@ -128,8 +128,10 @@ var Server = (function () { if (oldRole) { - oldRole.packed = data.permissions; - oldRole.name = data.name; + var index = this.roles.indexOf(oldRole); + this.roles[index] = new ServerPermissions(permissionGroup); + + return this.roles[index]; } else { return false; } diff --git a/src/Client.js b/src/Client.js index 20d71f330..bede31c3e 100644 --- a/src/Client.js +++ b/src/Client.js @@ -1053,6 +1053,16 @@ class Client { server.removeRole(role.id); break; + + case "GUILD_ROLE_UPDATE": + + var server = self.getServer("id", data.guild_id); + var role = server.getRole(data.role.id); + var newRole = server.updateRole(data.role); + + self.trigger("serverRoleUpdate", server, role, newRole); + + break; default: self.debug("received unknown packet"); diff --git a/src/server.js b/src/server.js index 92bbd970f..cd9342c0f 100644 --- a/src/server.js +++ b/src/server.js @@ -89,8 +89,11 @@ class Server { if(oldRole){ - oldRole.packed = data.permissions; - oldRole.name = data.name; + var index = this.roles.indexOf(oldRole); + this.roles[index] = new ServerPermissions(permissionGroup); + + + return this.roles[index]; }else{ return false; diff --git a/test/bot.1.js b/test/bot.1.js index 19caf0151..0aabfdb6c 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -24,7 +24,11 @@ mybot.on("message", function (message) { console.log("the ID is ", user.id); - mybot.reply(message, user + "'s evaluated permissions in this channel are " + JSON.stringify(message.channel.permissionsOf(user), null, 4).replace(/true/g, "**true**")); + for(key in message.channel.permissionsOf(user)){ + console.log(key); + } + + mybot.reply(message, user + "'s evaluated permissions in this channel are " + message.channel.permissionsOf(user).attachFiles); }); From 154300dfbd6cb0ba6e52bcde78cdacb46df20c6e Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sun, 4 Oct 2015 00:23:19 +0100 Subject: [PATCH 20/20] Minor test, works --- lib/server.js | 2 +- src/server.js | 2 +- test/bot.1.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/server.js b/lib/server.js index 9921a457c..871e30928 100644 --- a/lib/server.js +++ b/lib/server.js @@ -129,7 +129,7 @@ var Server = (function () { if (oldRole) { var index = this.roles.indexOf(oldRole); - this.roles[index] = new ServerPermissions(permissionGroup); + this.roles[index] = new ServerPermissions(data); return this.roles[index]; } else { diff --git a/src/server.js b/src/server.js index cd9342c0f..458afa5e2 100644 --- a/src/server.js +++ b/src/server.js @@ -90,7 +90,7 @@ class Server { if(oldRole){ var index = this.roles.indexOf(oldRole); - this.roles[index] = new ServerPermissions(permissionGroup); + this.roles[index] = new ServerPermissions(data); return this.roles[index]; diff --git a/test/bot.1.js b/test/bot.1.js index 0aabfdb6c..9f324f719 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -28,7 +28,7 @@ mybot.on("message", function (message) { console.log(key); } - mybot.reply(message, user + "'s evaluated permissions in this channel are " + message.channel.permissionsOf(user).attachFiles); + mybot.reply(message, user + "'s evaluated permissions in this channel are " + message.channel.permissionsOf(user).sendTTSMessages); });