From df1519a1810866f12e0b259c4e44b30a201780aa Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sun, 23 Aug 2015 19:55:54 +0100 Subject: [PATCH 1/5] added server caching --- src/server.js | 100 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 65 insertions(+), 35 deletions(-) diff --git a/src/server.js b/src/server.js index a64a7114d..63cdf2ae9 100644 --- a/src/server.js +++ b/src/server.js @@ -1,39 +1,69 @@ -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 = data.afk_timeout; - this.afkChannelId = data.afk_channel_id; +class Server { + constructor(data, client) { + 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; - for ( var x in members ) { - var member = members[ x ].user; - this.members.add( new User( member ) ); + for (var member of data.members) { + + // 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)); + + } + + for (var channel of data.channels) { + this.channels.add(client.addChannel(channel)); + } + } + + get iconURL() { + if (!this.icon) + return null; + return `https://discordapp.com/api/guilds/${this.id}/icons/${this.icon}.jpg`; + } + + get afkChannel() { + if (!this.afkChannelId) + return false; + + return this.getChannel("id", this.afkChannelId); + } + + get defaultChannel() { + return this.getChannel("name", "general"); + } + + // get/set + getChannel(key, value) { + for (var channel of this.channels) { + if (channel[key] === value) { + return channel; + } + } + + return null; + } + + getMember(key, value){ + for (var member of this.members) { + if (member[key] === value) { + return member; + } + } + + return null; } } -exports.Server.prototype.getIconURL = function(){ - if(!this.icon) - return false; - return "https://discordapp.com/api/guilds/"+this.id+"/icons/"+this.icon+".jpg"; -} - -exports.Server.prototype.getAFKChannel = function(){ - - if(!this.afkChannelId) - return false; - - return this.channels.filter("id", this.afkChannelId, true); - -} - -exports.Server.prototype.getDefaultChannel = function() { - - return this.channels.filter( "name", "general", true ); - -} +module.exports = Server; \ No newline at end of file From b6506783f399efad677b4908d0e366df1347c72e Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sun, 23 Aug 2015 20:30:47 +0100 Subject: [PATCH 2/5] About to start caching finalised classes --- src/Client.js | 30 ++++++++++++++++++++++++++++++ src/channel.js | 39 ++++++++++++++++----------------------- src/server.js | 4 ++++ 3 files changed, 50 insertions(+), 23 deletions(-) diff --git a/src/Client.js b/src/Client.js index 9b2355969..7cfd38bf6 100644 --- a/src/Client.js +++ b/src/Client.js @@ -1,6 +1,8 @@ //discord.js modules 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"); @@ -151,6 +153,34 @@ class Client { } return this.userCache.get(data.id); } + + //def addChannel + addChannel(data) { + if (!this.channelCache.has(data.id)){ + this.channelCache.set(data.id, new Channel(data, SERVER)); + } + return this.channelCache.get(data.id); + } + + //def addServer + 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 + getUser(key, value){ + for (var userRow of this.userCache) { + var user = userRow[1]; + if (user[key] === value) { + return user; + } + } + + return null; + } //def trySendConnData trySendConnData() { diff --git a/src/channel.js b/src/channel.js index 16a8e4a51..79006f309 100644 --- a/src/channel.js +++ b/src/channel.js @@ -1,28 +1,21 @@ -var List = require("./list.js").List; +class Channel { -exports.Channel = function(name, server, type, id, isPrivate){ - - 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; + constructor(data, server) { + 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... + } + + get client() { + return this.server.client; + } + + equals(object) { + return object.id === this.id; } - this.name = name; - this.server = server; - this.type = type; - this.id = id; - this.isPrivate = isPrivate; - this.messages = new List("id", 5000); } -exports.Channel.equals = function(otherChannel){ - if(otherChannel.id === this.id){ - return true; - } else { - return false; - } -} +module.exports = Channel; \ No newline at end of file diff --git a/src/server.js b/src/server.js index 63cdf2ae9..7dd2733db 100644 --- a/src/server.js +++ b/src/server.js @@ -44,6 +44,10 @@ class Server { return this.getChannel("name", "general"); } + get owner() { + return this.client.getUser("id", this.ownerID); + } + // get/set getChannel(key, value) { for (var channel of this.channels) { From 0f9c1b8dad27a09232f52537cacff3285fb528b2 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sun, 23 Aug 2015 21:19:48 +0100 Subject: [PATCH 3/5] Finished caching --- lib/Client.js | 193 ++++++++++++++++++++++++++++++++++++++++++++++++- lib/channel.js | 50 +++++++------ lib/server.js | 189 +++++++++++++++++++++++++++++++++++++++++------- src/Client.js | 71 ++++++++++++++++-- src/server.js | 4 +- test/bot.js | 10 ++- 6 files changed, 451 insertions(+), 66 deletions(-) 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 From b104cc93b21292d83e058fbf6ff1ecaae952fcff Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sun, 23 Aug 2015 21:21:51 +0100 Subject: [PATCH 4/5] Fixed credentials ;s --- .gitignore | 1 + test/bot.js | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 661f8f613..763414655 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ build/Release # Dependency directory # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git node_modules +test/auth.json diff --git a/test/bot.js b/test/bot.js index 5c9dbeb95..8df078e92 100644 --- a/test/bot.js +++ b/test/bot.js @@ -1,8 +1,8 @@ var Discord = require("../lib/index.js"); - +var Auth = require("./auth.json"); var mybot = new Discord.Client(); -mybot.login("email", "pass", function(err, res){ +mybot.login(Auth.email, Auth.password, function(err, res){ }); From 31a0cba0d1ae00de2ed3ef54e97a8a951fcf7d7e Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sun, 23 Aug 2015 22:12:07 +0100 Subject: [PATCH 5/5] added keepalive --- lib/Client.js | 22 +++++++++++++++++- lib/asd.js | 63 --------------------------------------------------- src/Client.js | 17 ++++++++++++++ 3 files changed, 38 insertions(+), 64 deletions(-) delete mode 100644 lib/asd.js diff --git a/lib/Client.js b/lib/Client.js index 1d665fdc7..97900e44b 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -52,9 +52,16 @@ var Client = (function () { } _createClass(Client, [{ - key: "debug", + key: "sendPacket", + value: function sendPacket(JSONObject) { + if (this.websocket.readyState === 1) { + this.websocket.send(JSON.stringify(JSONObject)); + } + } //def debug + }, { + key: "debug", value: function debug(message) { console.log(message); } @@ -68,6 +75,15 @@ var Client = (function () { value: function off(event, fn) { this.events["delete"](event); } + }, { + key: "keepAlive", + value: function keepAlive() { + this.debug("keep alive triggered"); + this.sendPacket({ + op: 1, + d: Date.now() + }); + } //def trigger }, { @@ -190,6 +206,10 @@ var Client = (function () { self.trigger("ready"); self.debug("cached " + self.serverCache.size + " servers, " + self.channelCache.size + " channels and " + self.userCache.size + " users."); + setInterval(function () { + self.keepAlive.apply(self); + }, data.heartbeat_interval); + break; default: self.debug("received unknown packet"); diff --git a/lib/asd.js b/lib/asd.js deleted file mode 100644 index c74b5e209..000000000 --- a/lib/asd.js +++ /dev/null @@ -1,63 +0,0 @@ -"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 request = require("superagent"); - -var defaultOptions = { - cache_tokens: false -}; - -var Client = (function () { - function Client() { - var options = arguments.length <= 0 || arguments[0] === undefined ? defaultOptions : arguments[0]; - var token = arguments.length <= 1 || arguments[1] === undefined ? undefined : arguments[1]; - - _classCallCheck(this, Client); - - /* - When created, if a token is specified the Client will - try connecting with it. If the token is incorrect, no - further efforts will be made to connect. - */ - this.options = options; - this.token = token; - this.state = 0; - this.websocket = null; - this.events = new Map(); - this.user = null; - /* - State values: - 0 - idle - 1 - logging in - 2 - logged in - 3 - ready - 4 - disconnected - */ - } - - _createClass(Client, [{ - key: "login", - - //def 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]; - - if (this.state === 0 || this.state === 4) { - - this.state = 1; - request.post(); - } - } - }, { - key: "ready", - get: function get() { - return this.state === 3; - } - }]); - - return Client; -})(); \ No newline at end of file diff --git a/src/Client.js b/src/Client.js index a9880cf53..f7b8866f8 100644 --- a/src/Client.js +++ b/src/Client.js @@ -57,6 +57,11 @@ class Client { return this.userCache; } + sendPacket(JSONObject){ + if(this.websocket.readyState === 1){ + this.websocket.send(JSON.stringify(JSONObject)); + } + } //def debug debug(message) { @@ -71,6 +76,14 @@ class Client { this.events.delete(event); } + keepAlive(){ + this.debug("keep alive triggered"); + this.sendPacket({ + op: 1, + d: Date.now() + }); + } + //def trigger trigger(event) { var args = []; @@ -167,6 +180,10 @@ class Client { } self.trigger("ready"); self.debug(`cached ${self.serverCache.size} servers, ${self.channelCache.size} channels and ${self.userCache.size} users.`); + + setInterval(function () { + self.keepAlive.apply(self); + }, data.heartbeat_interval); break; default: