diff --git a/lib/Client.js b/lib/Client.js index 58b6e636b..1d665fdc7 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -7,6 +7,8 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var Endpoints = require("./Endpoints.js"); var User = require("./User.js"); +var Server = require("./Server.js"); +var Channel = require("./Channel.js"); //node modules var request = require("superagent"); @@ -56,18 +58,37 @@ var Client = (function () { value: function debug(message) { console.log(message); } + }, { + key: "on", + value: function on(event, fn) { + this.events.set(event, fn); + } + }, { + key: "off", + value: function off(event, fn) { + this.events["delete"](event); + } //def trigger }, { key: "trigger", - value: function trigger(event) {} + value: function trigger(event) { + var args = []; + for (var arg in arguments) { + args.push(arguments[arg]); + } + var evt = this.events.get(event); + if (evt) { + evt.apply(this, args.slice(1)); + } + } //def login }, { key: "login", value: function login() { var email = arguments.length <= 0 || arguments[0] === undefined ? "foo@bar.com" : arguments[0]; - var password = arguments.length <= 1 || arguments[1] === undefined ? "pass1234s" : arguments[1]; + var password = arguments.length <= 1 || arguments[1] === undefined ? "pass1234" : arguments[1]; var callback = arguments.length <= 2 || arguments[2] === undefined ? function () {} : arguments[2]; var self = this; @@ -141,6 +162,34 @@ var Client = (function () { self.user = self.addUser(data.user); + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = data.guilds[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var _server = _step.value; + + self.addServer(_server); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"]) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + self.trigger("ready"); + self.debug("cached " + self.serverCache.size + " servers, " + self.channelCache.size + " channels and " + self.userCache.size + " users."); + break; default: self.debug("received unknown packet"); @@ -161,6 +210,131 @@ var Client = (function () { return this.userCache.get(data.id); } + //def addChannel + }, { + key: "addChannel", + value: function addChannel(data, serverId) { + if (!this.channelCache.has(data.id)) { + this.channelCache.set(data.id, new Channel(data, this.getServer("id", serverId))); + } + return this.channelCache.get(data.id); + } + + //def addServer + }, { + key: "addServer", + value: function addServer(data) { + if (!this.serverCache.has(data.id)) { + this.serverCache.set(data.id, new Server(data, this)); + } + return this.serverCache.get(data.id); + } + + //def getUser + }, { + key: "getUser", + value: function getUser(key, value) { + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = this.userCache[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var row = _step2.value; + + var obj = row[1]; + if (obj[key] === value) { + return obj; + } + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"]) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + return null; + } + + //def getChannel + }, { + key: "getChannel", + value: function getChannel(key, value) { + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = this.channelCache[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var row = _step3.value; + + var obj = row[1]; + if (obj[key] === value) { + return obj; + } + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"]) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + + return null; + } + + //def getServer + }, { + key: "getServer", + value: function getServer(key, value) { + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = this.serverCache[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var row = _step4.value; + + var obj = row[1]; + if (obj[key] === value) { + return obj; + } + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"]) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + return null; + } + //def trySendConnData }, { key: "trySendConnData", @@ -192,6 +366,21 @@ var Client = (function () { get: function get() { return this.state === 3; } + }, { + key: "servers", + get: function get() { + return this.serverCache; + } + }, { + key: "channels", + get: function get() { + return this.channelCache; + } + }, { + key: "users", + get: function get() { + return this.userCache; + } }]); return Client; diff --git a/lib/channel.js b/lib/channel.js index a6c4f5280..679efb5ff 100644 --- a/lib/channel.js +++ b/lib/channel.js @@ -1,31 +1,33 @@ "use strict"; -var List = require("./list.js").List; +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; }; })(); -exports.Channel = function (name, server, type, id, isPrivate) { +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - if (!type) { - //there's no second argument - var channel = name; - name = channel.name; - server = server; - type = channel.type; - id = channel.id; - isPrivate = channel.is_private; +var Channel = (function () { + function Channel(data, server) { + _classCallCheck(this, Channel); + + this.server = server; + this.name = data.name; + this.type = data.type; + this.id = data.id; + //this.isPrivate = isPrivate; //not sure about the implementation of this... } - this.name = name; - this.server = server; - this.type = type; - this.id = id; - this.isPrivate = isPrivate; - this.messages = new List("id", 5000); -}; + _createClass(Channel, [{ + key: "equals", + value: function equals(object) { + return object.id === this.id; + } + }, { + key: "client", + get: function get() { + return this.server.client; + } + }]); -exports.Channel.equals = function (otherChannel) { - if (otherChannel.id === this.id) { - return true; - } else { - return false; - } -}; \ No newline at end of file + return Channel; +})(); + +module.exports = Channel; \ No newline at end of file diff --git a/lib/server.js b/lib/server.js index 77adad245..b9cfbbd7d 100644 --- a/lib/server.js +++ b/lib/server.js @@ -1,37 +1,172 @@ "use strict"; -var User = require("./user.js").User; -var List = require("./list.js").List; -exports.Server = function (data) { - this.region = data.region; - this.ownerID = data.owner_id; - this.name = data.name; - this.id = data.id; - this.members = new Map(); - this.channels = new Map(); - this.icon = data.icon; - this.afkTimeout = afkTimeout; - this.afkChannelId = afkChannelId; +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; }; })(); - for (var x in members) { - var member = members[x].user; - this.members.add(new User(member)); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +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 = new Set(); + this.channels = new Set(); + this.icon = data.icon; + this.afkTimeout = data.afk_timeout; + this.afkChannelId = data.afk_channel_id; + + 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; + + // 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. + this.members.add(client.addUser(member.user)); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"]) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = data.channels[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var channel = _step2.value; + + this.channels.add(client.addChannel(channel, this.id)); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"]) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } } -}; -exports.Server.prototype.getIconURL = function () { - if (!this.icon) return false; - return "https://discordapp.com/api/guilds/" + this.id + "/icons/" + this.icon + ".jpg"; -}; + _createClass(Server, [{ + key: "getChannel", -exports.Server.prototype.getAFKChannel = function () { + // get/set + value: function getChannel(key, value) { + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; - if (!this.afkChannelId) return false; + try { + for (var _iterator3 = this.channels[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var channel = _step3.value; - return this.channels.filter("id", this.afkChannelId, true); -}; + 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; + } + } + } -exports.Server.prototype.getDefaultChannel = function () { + return null; + } + }, { + key: "getMember", + value: function getMember(key, value) { + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; - return this.channels.filter("name", "general", true); -}; \ No newline at end of file + 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: "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); + } + }]); + + return Server; +})(); + +module.exports = Server; \ No newline at end of file diff --git a/src/Client.js b/src/Client.js index 7cfd38bf6..a9880cf53 100644 --- a/src/Client.js +++ b/src/Client.js @@ -44,6 +44,18 @@ class Client { get ready() { return this.state === 3; } + + get servers() { + return this.serverCache; + } + + get channels() { + return this.channelCache; + } + + get users() { + return this.userCache; + } //def debug @@ -51,13 +63,28 @@ class Client { console.log(message); } + on(event, fn){ + this.events.set(event, fn); + } + + off(event, fn){ + this.events.delete(event); + } + //def trigger trigger(event) { - + var args = []; + for(var arg in arguments){ + args.push(arguments[arg]); + } + var evt = this.events.get(event); + if(evt){ + evt.apply(this, args.slice(1)); + } } //def login - login(email = "foo@bar.com", password = "pass1234s", callback = function () { }) { + login(email = "foo@bar.com", password = "pass1234", callback = function () { }) { var self = this; @@ -133,6 +160,13 @@ class Client { self.user = self.addUser( data.user ); + for(var _server of data.guilds){ + + self.addServer(_server); + + } + self.trigger("ready"); + self.debug(`cached ${self.serverCache.size} servers, ${self.channelCache.size} channels and ${self.userCache.size} users.`); break; default: @@ -155,9 +189,9 @@ class Client { } //def addChannel - addChannel(data) { + addChannel(data, serverId) { if (!this.channelCache.has(data.id)){ - this.channelCache.set(data.id, new Channel(data, SERVER)); + this.channelCache.set(data.id, new Channel(data, this.getServer("id", serverId))); } return this.channelCache.get(data.id); } @@ -172,13 +206,34 @@ class Client { //def getUser getUser(key, value){ - for (var userRow of this.userCache) { - var user = userRow[1]; - if (user[key] === value) { - return user; + for (var row of this.userCache) { + var obj = row[1]; + if (obj[key] === value) { + return obj; } } + return null; + } + //def getChannel + getChannel(key, value){ + for (var row of this.channelCache) { + var obj = row[1]; + if (obj[key] === value) { + return obj; + } + } + return null; + } + + //def getServer + getServer(key, value){ + for (var row of this.serverCache) { + var obj = row[1]; + if (obj[key] === value) { + return obj; + } + } return null; } diff --git a/src/server.js b/src/server.js index 7dd2733db..e09cdb805 100644 --- a/src/server.js +++ b/src/server.js @@ -18,12 +18,12 @@ class Server { // get a user from this server's member list, // it will be identical (unless an async change occurred) // to the client's cache. - this.members.add(client.addUser(member)); + this.members.add(client.addUser(member.user)); } for (var channel of data.channels) { - this.channels.add(client.addChannel(channel)); + this.channels.add(client.addChannel(channel, this.id)); } } diff --git a/test/bot.js b/test/bot.js index e392c7ba2..5c9dbeb95 100644 --- a/test/bot.js +++ b/test/bot.js @@ -2,6 +2,10 @@ var Discord = require("../lib/index.js"); var mybot = new Discord.Client(); -mybot.login("riftes@outlook.com", "hydrabotsecure", function(err, res){ - console.log(res); -}); \ No newline at end of file +mybot.login("email", "pass", function(err, res){ + +}); + +mybot.on("ready", function(){ + console.log("Ready!"); +}) \ No newline at end of file