From 4e117b85d9a91f72649655d475b5f1a85be82055 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 3 Oct 2015 20:18:49 +0100 Subject: [PATCH] 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); });