diff --git a/lib/Client/InternalClient.js b/lib/Client/InternalClient.js index ab4ebe3f2..4d26d30fd 100644 --- a/lib/Client/InternalClient.js +++ b/lib/Client/InternalClient.js @@ -543,7 +543,31 @@ var InternalClient = (function () { client.emit("warn", "server was deleted but it was not in the cache"); } break; - + case PacketType.SERVER_UPDATE: + var server = self.servers.get("id", data.id); + if (server && !server.inasync) { + // server exists + server.inasync = true; + data.members = data.members || []; + data.channels = data.channels || []; + var newserver = new Server(data, self); + newserver.members = server.members; + newserver.memberMap = server.memberMap; + newserver.channels = server.channels; + if (newserver.equalsStrict(server)) { + // already the same don't do anything + client.emit("debug", "received server update but server already updated"); + } else { + self.servers.update(server, newserver); + client.emit("serverUpdated", server, newserver); + } + server.inasync = false; + } else if (!server) { + client.emit("warn", "server was updated but it was not in the cache"); + self.servers.add(new Server(data, self)); + client.emit("serverCreated", server); + } + break; } }; }; diff --git a/lib/Constants.js b/lib/Constants.js index 0fe37c11c..55e464a25 100644 --- a/lib/Constants.js +++ b/lib/Constants.js @@ -103,7 +103,9 @@ var PacketType = { MESSAGE_CREATE: "MESSAGE_CREATE", MESSAGE_UPDATE: "MESSAGE_UPDATE", MESSAGE_DELETE: "MESSAGE_DELETE", - SERVER_CREATE: "GUILD_CREATE" + SERVER_CREATE: "GUILD_CREATE", + SERVER_DELETE: "GUILD_DELETE", + SERVER_UPDATE: "GUILD_UPDATE" }; exports.API_ENDPOINT = API; diff --git a/lib/Structures/Message.js b/lib/Structures/Message.js index 3f2055281..86d5a59bd 100644 --- a/lib/Structures/Message.js +++ b/lib/Structures/Message.js @@ -13,7 +13,6 @@ var Message = (function () { this.channel = channel; this.client = client; - console.log("update", data); this.nonce = data.nonce; this.attachments = data.attachments; this.tts = data.tts; diff --git a/lib/Structures/Server.js b/lib/Structures/Server.js index b874672ab..89980ea5b 100644 --- a/lib/Structures/Server.js +++ b/lib/Structures/Server.js @@ -14,6 +14,8 @@ var TextChannel = require("./TextChannel.js"); var VoiceChannel = require("./VoiceChannel.js"); var Role = require("./Role.js"); +var strictKeys = ["region", "ownerID", "name", "id", "icon", "afkTimeout", "afkChannelID"]; + var Server = (function (_Equality) { _inherits(Server, _Equality); @@ -69,6 +71,32 @@ var Server = (function (_Equality) { return this.name; }; + Server.prototype.equalsStrict = function equalsStrict(obj) { + if (obj instanceof Server) { + for (var _iterator = strictKeys, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var key = _ref; + + if (obj[key] !== this[key]) { + return false; + } + } + } else { + return false; + } + return true; + }; + _createClass(Server, [{ key: "iconURL", get: function get() { diff --git a/lib/Util/Cache.js b/lib/Util/Cache.js index 9eb847c04..fbe4c5853 100644 --- a/lib/Util/Cache.js +++ b/lib/Util/Cache.js @@ -69,8 +69,9 @@ var Cache = (function (_Array) { }; Cache.prototype.update = function update(old, data) { - var index = this.get(this.discrim, old); - if (~index) { + var item = this.get(this.discrim, old[this.discrim]); + if (item) { + var index = this.indexOf(item); this[index] = data; return this[index]; } else { @@ -83,7 +84,7 @@ var Cache = (function (_Array) { if (~index) { this.splice(index, 1); } else { - var item = this.get(this.discrim, data.id); + var item = this.get(this.discrim, data[this.discrim]); if (item) { this.splice(this.indexOf(item), 1); } diff --git a/lib/Util/Equality.js b/lib/Util/Equality.js index e568eb9aa..5a75b22d2 100644 --- a/lib/Util/Equality.js +++ b/lib/Util/Equality.js @@ -27,6 +27,11 @@ var Equality = (function () { return false; }; + Equality.prototype.equalsStrict = function equalsStrict(object) { + // override per class type + return; + }; + _createClass(Equality, [{ key: "eqDiscriminator", get: function get() { diff --git a/lib/index.js b/lib/index.js index 1aa9e0483..060a58b62 100644 --- a/lib/index.js +++ b/lib/index.js @@ -8,6 +8,9 @@ var a = new module.exports.Client(); a.on("debug", function (m) { return console.log("[debug]", m); }); +a.on("warn", function (m) { + return console.log("[warn]", m); +}); a.on("message", function (m) { if (m.content === "$$$") a.internal.createServer("H a h").then(function (srv) { @@ -15,6 +18,9 @@ a.on("message", function (m) { a.reply(m, srv); }); }); +a.on("serverUpdated", function (oldsrv, newsrv) { + console.log(oldsrv.name, "v", newsrv.name); +}); a.login(process.env["discordEmail"], process.env["discordPass"])["catch"](function (e) { return console.log(e); diff --git a/src/Client/InternalClient.js b/src/Client/InternalClient.js index f2327bc99..e06fe135c 100644 --- a/src/Client/InternalClient.js +++ b/src/Client/InternalClient.js @@ -561,7 +561,31 @@ class InternalClient { client.emit("warn", "server was deleted but it was not in the cache"); } break; - + case PacketType.SERVER_UPDATE: + var server = self.servers.get("id", data.id); + if(server && !server.inasync){ + // server exists + server.inasync = true; + data.members = data.members || []; + data.channels = data.channels || []; + var newserver = new Server(data, self); + newserver.members = server.members; + newserver.memberMap = server.memberMap; + newserver.channels = server.channels; + if(newserver.equalsStrict(server)){ + // already the same don't do anything + client.emit("debug", "received server update but server already updated"); + }else{ + self.servers.update(server, newserver); + client.emit("serverUpdated", server, newserver); + } + server.inasync = false; + }else if(!server){ + client.emit("warn", "server was updated but it was not in the cache"); + self.servers.add( new Server(data, self) ); + client.emit("serverCreated", server); + } + break; } } } diff --git a/src/Constants.js b/src/Constants.js index d23934524..e7e4b8d20 100644 --- a/src/Constants.js +++ b/src/Constants.js @@ -65,7 +65,9 @@ var PacketType = { MESSAGE_CREATE : "MESSAGE_CREATE", MESSAGE_UPDATE : "MESSAGE_UPDATE", MESSAGE_DELETE : "MESSAGE_DELETE", - SERVER_CREATE : "GUILD_CREATE" + SERVER_CREATE : "GUILD_CREATE", + SERVER_DELETE : "GUILD_DELETE", + SERVER_UPDATE : "GUILD_UPDATE", } exports.API_ENDPOINT = API; diff --git a/src/Structures/Message.js b/src/Structures/Message.js index fc19a9b89..003ccfbe3 100644 --- a/src/Structures/Message.js +++ b/src/Structures/Message.js @@ -7,7 +7,6 @@ class Message{ constructor(data, channel, client){ this.channel = channel; this.client = client; - console.log("update", data); this.nonce = data.nonce; this.attachments = data.attachments; this.tts = data.tts; diff --git a/src/Structures/Server.js b/src/Structures/Server.js index 740893bc7..94f3b3bec 100644 --- a/src/Structures/Server.js +++ b/src/Structures/Server.js @@ -8,6 +8,10 @@ var TextChannel = require("./TextChannel.js"); var VoiceChannel = require("./VoiceChannel.js"); var Role = require("./Role.js"); +var strictKeys = [ + "region", "ownerID", "name", "id", "icon", "afkTimeout", "afkChannelID" +]; + class Server extends Equality { constructor(data, client) { @@ -78,6 +82,19 @@ class Server extends Equality { return this.name; } + equalsStrict(obj){ + if(obj instanceof Server){ + for(var key of strictKeys){ + if(obj[key] !== this[key]){ + return false; + } + } + }else{ + return false; + } + return true; + } + } module.exports = Server; \ No newline at end of file diff --git a/src/Util/Cache.js b/src/Util/Cache.js index d15f27cc2..be537e38b 100644 --- a/src/Util/Cache.js +++ b/src/Util/Cache.js @@ -48,8 +48,9 @@ class Cache extends Array { } update(old, data) { - var index = this.get(this.discrim, old); - if (~index) { + var item = this.get(this.discrim, old[this.discrim]); + if (item) { + var index = this.indexOf(item); this[index] = data; return this[index]; } else { @@ -62,7 +63,7 @@ class Cache extends Array { if (~index) { this.splice(index, 1); } else { - var item = this.get(this.discrim, data.id); + var item = this.get(this.discrim, data[this.discrim]); if (item) { this.splice(this.indexOf(item), 1); } diff --git a/src/Util/Equality.js b/src/Util/Equality.js index 241be1265..97f0ad18a 100644 --- a/src/Util/Equality.js +++ b/src/Util/Equality.js @@ -24,6 +24,11 @@ class Equality{ } return false; } + + equalsStrict(object){ + // override per class type + return; + } } module.exports = Equality; \ No newline at end of file diff --git a/src/index.js b/src/index.js index 2be4cbd29..69bd0e2c8 100644 --- a/src/index.js +++ b/src/index.js @@ -4,6 +4,7 @@ module.exports = { var a = new module.exports.Client(); a.on("debug", (m) => console.log("[debug]",m)); +a.on("warn", (m) => console.log("[warn]", m)); a.on("message", m => { if(m.content === "$$$") @@ -12,5 +13,8 @@ a.on("message", m => { a.reply(m, srv); }); }); +a.on("serverUpdated", (oldsrv, newsrv) => { + console.log(oldsrv.name, "v", newsrv.name); +}); a.login(process.env["discordEmail"], process.env["discordPass"]).catch((e)=>console.log(e)); \ No newline at end of file