From f2e3be0bade467d72ea092d9d1ca1c212a146a7b Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 24 Aug 2015 23:05:13 +0100 Subject: [PATCH] Added full user tracking --- lib/Client.js | 24 ++++++++++++++++++++++++ lib/user.js | 5 +++++ src/Client.js | 24 ++++++++++++++++++++++++ src/user.js | 4 ++++ test/bot.js | 3 +++ 5 files changed, 60 insertions(+) diff --git a/lib/Client.js b/lib/Client.js index 8293d5955..47bdd24f6 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -481,6 +481,30 @@ var Client = (function () { break; + case "PRESENCE_UPDATE": + + var userInCache = self.getUser("id", data.user.id); + + if (userInCache) { + //user exists + var presenceUser = new User(data.user); + if (presenceUser.equalsStrict(userInCache)) { + //they're exactly the same, an actual presence update + self.trigger("presence", { + user: userInCache, + status: data.status, + server: self.getServer("id", data.guild_id), + gameId: data.game_id + }); + } else { + //one of their details changed. + self.trigger("userUpdate", userInCache, presenceUser); + self.userCache[self.userCache.indexOf(userInCache)] = presenceUser; + } + } + + break; + default: self.debug("received unknown packet"); self.trigger("unknown", dat); diff --git a/lib/user.js b/lib/user.js index e4b6e682c..2f363dd1e 100644 --- a/lib/user.js +++ b/lib/user.js @@ -37,6 +37,11 @@ var User = (function () { value: function equals(object) { return object.id === this.id; } + }, { + key: "equalsStrict", + value: function equalsStrict(object) { + return object.id === this.id && object.avatar === this.avatar && object.username === this.username && object.discriminator === this.discriminator; + } }, { key: "avatarURL", get: function get() { diff --git a/src/Client.js b/src/Client.js index 34e411d11..fafb277d9 100644 --- a/src/Client.js +++ b/src/Client.js @@ -393,6 +393,30 @@ class Client { } break; + + case "PRESENCE_UPDATE": + + var userInCache = self.getUser("id", data.user.id); + + if(userInCache){ + //user exists + var presenceUser = new User(data.user); + if(presenceUser.equalsStrict(userInCache)){ + //they're exactly the same, an actual presence update + self.trigger("presence", { + user : userInCache, + status : data.status, + server : self.getServer("id", data.guild_id), + gameId : data.game_id + }); + }else{ + //one of their details changed. + self.trigger("userUpdate", userInCache, presenceUser); + self.userCache[self.userCache.indexOf(userInCache)] = presenceUser; + } + } + + break; default: self.debug("received unknown packet"); diff --git a/src/user.js b/src/user.js index b69896534..375ec7c60 100644 --- a/src/user.js +++ b/src/user.js @@ -30,6 +30,10 @@ class User{ equals(object){ return object.id === this.id; } + + equalsStrict(object){ + return object.id === this.id && object.avatar === this.avatar && object.username === this.username && object.discriminator === this.discriminator; + } } module.exports = User; \ No newline at end of file diff --git a/test/bot.js b/test/bot.js index 747e19fe0..c78244192 100644 --- a/test/bot.js +++ b/test/bot.js @@ -31,4 +31,7 @@ mybot.on("serverNewMember", function(user){ }); mybot.on("serverRemoveMember", function(user){ console.log("left user", user.username); +}); +mybot.on("userUpdate", function(oldUser, newUser){ + console.log(oldUser, "vs", newUser); }); \ No newline at end of file