From 8f4e6e34d5bf40d4265dce70acac905d16cdcf9f Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 21:35:28 +0100 Subject: [PATCH] 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**")); });