diff --git a/lib/Client/InternalClient.js b/lib/Client/InternalClient.js index d066965cd..27a059d8f 100644 --- a/lib/Client/InternalClient.js +++ b/lib/Client/InternalClient.js @@ -385,7 +385,7 @@ var InternalClient = (function () { }; InternalClient.prototype.sendWS = function sendWS(object) { - this.websocket.send(JSON.stringify(object)); + if (this.websocket) this.websocket.send(JSON.stringify(object)); }; InternalClient.prototype.createWS = function createWS(url) { @@ -726,6 +726,77 @@ var InternalClient = (function () { client.emit("warn", "server member updated but server doesn't exist in cache"); } break; + case PacketType.PRESENCE_UPDATE: + + var user = self.users.get("id", data.user.id); + + if (user) { + + data.user.username = data.user.username || user.username; + data.user.id = data.user.id || user.id; + data.user.avatar = data.user.avatar || user.avatar; + data.user.discriminator = data.user.discriminator || user.discriminator; + + var presenceUser = new User(data.user, client); + + if (presenceUser.equalsStrict(user)) { + // a real presence update + client.emit("presence", user, data.status, data.game_id); + user.status = data.status; + user.gameID = data.game_id; + } else { + // a name change or avatar change + client.emit("userUpdate", user, presenceUser); + self.users.update(user, presenceUser); + } + } else { + client.emit("warn", "presence update but user not in cache"); + } + + break; + case PacketType.TYPING: + + var user = self.users.get("id", data.user_id); + var channel = self.channels.get("id", data.channel_id); + + if (user && channel) { + + user.typing.since = Date.now(); + user.typing.channel = channel; + client.emit("userTypingStart", user, channel); + + setTimeout(function () { + if (Date.now() - user.typing.since > 5990) { + // they haven't typed since + user.typing.since = null; + user.typing.channel = null; + client.emit("userTypingStop", user, channel); + } + }, 6000); + } else { + client.emit("warn", "user typing but user or channel not existant in cache"); + } + break; + case PacketType.SERVER_BAN_ADD: + var user = self.users.get("id", data.user.id); + var server = self.servers.get("id", data.guild_id); + + if (user && server) { + client.emit("userBanned", user, server); + } else { + client.emit("warn", "user banned but user/server not in cache."); + } + break; + case PacketType.SERVER_BAN_REMOVE: + var user = self.users.get("id", data.user.id); + var server = self.servers.get("id", data.guild_id); + + if (user && server) { + client.emit("userUnbanned", user, server); + } else { + client.emit("warn", "user unbanned but user/server not in cache."); + } + break; } }; }; diff --git a/lib/Constants.js b/lib/Constants.js index f4ed01fce..9b1c9b37a 100644 --- a/lib/Constants.js +++ b/lib/Constants.js @@ -114,7 +114,11 @@ var PacketType = { SERVER_ROLE_UPDATE: "GUILD_ROLE_UPDATE", SERVER_MEMBER_ADD: "GUILD_MEMBER_ADD", SERVER_MEMBER_REMOVE: "GUILD_MEMBER_REMOVE", - SERVER_MEMBER_UPDATE: "GUILD_MEMBER_UPDATE" + SERVER_MEMBER_UPDATE: "GUILD_MEMBER_UPDATE", + PRESENCE_UPDATE: "PRESENCE_UPDATE", + TYPING: "TYPING_START", + SERVER_BAN_ADD: "GUILD_BAN_ADD", + SERVER_BAN_REMOVE: "GUILD_BAN_REMOVE" }; exports.API_ENDPOINT = API; diff --git a/lib/Structures/User.js b/lib/Structures/User.js index 5137a21b8..3815089ee 100644 --- a/lib/Structures/User.js +++ b/lib/Structures/User.js @@ -23,6 +23,10 @@ var User = (function (_Equality) { this.avatar = data.avatar; this.status = data.status || "offline"; this.gameID = data.game_id || null; + this.typing = { + since: null, + channel: null + }; } User.prototype.mention = function mention() { @@ -33,6 +37,10 @@ var User = (function (_Equality) { return this.mention(); }; + User.prototype.equalsStrict = function equalsStrict(obj) { + if (obj instanceof User) return this.id === obj.id && this.username === obj.username && this.discriminator === obj.discriminator && this.avatar === obj.avatar && this.status === obj.status && this.gameID === obj.gameID;else return false; + }; + _createClass(User, [{ key: "avatarURL", get: function get() { diff --git a/lib/index.js b/lib/index.js index 68e9c0fd8..bf031a273 100644 --- a/lib/index.js +++ b/lib/index.js @@ -15,8 +15,11 @@ a.on("warn", function (m) { a.on("message", function (m) { if (m.content === "$$$") a.reply(m, "I have you cached as being " + m.author.status); }); -a.on("serverMemberRemoved", function (r, s) { - console.log(r, s); +a.on("userTypingStart", function (user, chan) { + console.log(user.username + " typing"); +}); +a.on("userTypingStop", function (user, chan) { + console.log(user.username + " stopped typing"); }); a.login(process.env["discordEmail"], process.env["discordPass"])["catch"](function (e) { diff --git a/src/Client/InternalClient.js b/src/Client/InternalClient.js index 707464a7d..22c7f248d 100644 --- a/src/Client/InternalClient.js +++ b/src/Client/InternalClient.js @@ -415,7 +415,8 @@ class InternalClient { } sendWS(object) { - this.websocket.send(JSON.stringify(object)); + if(this.websocket) + this.websocket.send(JSON.stringify(object)); } createWS(url) { @@ -751,6 +752,80 @@ class InternalClient { client.emit("warn", "server member updated but server doesn't exist in cache"); } break; + case PacketType.PRESENCE_UPDATE: + + var user = self.users.get("id", data.user.id); + + if(user){ + + data.user.username = data.user.username || user.username; + data.user.id = data.user.id || user.id; + data.user.avatar = data.user.avatar || user.avatar; + data.user.discriminator = data.user.discriminator || user.discriminator; + + var presenceUser = new User(data.user, client); + + if(presenceUser.equalsStrict(user)){ + // a real presence update + client.emit("presence", user, data.status, data.game_id); + user.status = data.status; + user.gameID = data.game_id; + + }else{ + // a name change or avatar change + client.emit("userUpdate", user, presenceUser); + self.users.update(user, presenceUser); + } + + }else{ + client.emit("warn", "presence update but user not in cache"); + } + + break; + case PacketType.TYPING: + + var user = self.users.get("id", data.user_id); + var channel = self.channels.get("id", data.channel_id); + + if(user && channel){ + + user.typing.since = Date.now(); + user.typing.channel = channel; + client.emit("userTypingStart", user, channel); + + setTimeout( () => { + if(Date.now() - user.typing.since > 5990){ + // they haven't typed since + user.typing.since = null; + user.typing.channel = null; + client.emit("userTypingStop", user, channel); + } + }, 6000); + + }else{ + client.emit("warn", "user typing but user or channel not existant in cache"); + } + break; + case PacketType.SERVER_BAN_ADD: + var user = self.users.get("id", data.user.id); + var server = self.servers.get("id", data.guild_id); + + if(user && server){ + client.emit("userBanned", user, server); + }else{ + client.emit("warn", "user banned but user/server not in cache."); + } + break; + case PacketType.SERVER_BAN_REMOVE: + var user = self.users.get("id", data.user.id); + var server = self.servers.get("id", data.guild_id); + + if(user && server){ + client.emit("userUnbanned", user, server); + }else{ + client.emit("warn", "user unbanned but user/server not in cache."); + } + break; } } } diff --git a/src/Constants.js b/src/Constants.js index 993ba1510..caf061250 100644 --- a/src/Constants.js +++ b/src/Constants.js @@ -76,7 +76,11 @@ var PacketType = { SERVER_ROLE_UPDATE : "GUILD_ROLE_UPDATE", SERVER_MEMBER_ADD : "GUILD_MEMBER_ADD", SERVER_MEMBER_REMOVE : "GUILD_MEMBER_REMOVE", - SERVER_MEMBER_UPDATE : "GUILD_MEMBER_UPDATE" + SERVER_MEMBER_UPDATE : "GUILD_MEMBER_UPDATE", + PRESENCE_UPDATE : "PRESENCE_UPDATE", + TYPING : "TYPING_START", + SERVER_BAN_ADD : "GUILD_BAN_ADD", + SERVER_BAN_REMOVE : "GUILD_BAN_REMOVE" } exports.API_ENDPOINT = API; diff --git a/src/Structures/User.js b/src/Structures/User.js index a0b31abef..a36bbca4b 100644 --- a/src/Structures/User.js +++ b/src/Structures/User.js @@ -13,6 +13,10 @@ class User extends Equality{ this.avatar = data.avatar; this.status = data.status || "offline"; this.gameID = data.game_id || null; + this.typing = { + since : null, + channel : null + }; } get avatarURL(){ @@ -30,6 +34,20 @@ class User extends Equality{ toString(){ return this.mention(); } + + equalsStrict(obj){ + if(obj instanceof User) + return ( + this.id === obj.id && + this.username === obj.username && + this.discriminator === obj.discriminator && + this.avatar === obj.avatar && + this.status === obj.status && + this.gameID === obj.gameID + ); + else + return false; + } } module.exports = User; \ No newline at end of file diff --git a/src/index.js b/src/index.js index bce04d8b4..ff4709eb5 100644 --- a/src/index.js +++ b/src/index.js @@ -10,8 +10,12 @@ a.on("message", m => { if(m.content === "$$$") a.reply(m, "I have you cached as being " + m.author.status); }); -a.on("serverMemberRemoved", (r, s) => { - console.log(r, s); +a.on("userTypingStart", (user, chan) => { + console.log(user.username + " typing"); +}); +a.on("userTypingStop", (user, chan) => { + console.log(user.username + " stopped typing"); }); + a.login(process.env["discordEmail"], process.env["discordPass"]).catch((e)=>console.log(e)); \ No newline at end of file