From b264b617184a188679129706fb6ce7a04b4103d4 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 19:44:08 +0100 Subject: [PATCH] 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)); });