From 08eff6693971ed57f96f32b8b41e3969ff0cd325 Mon Sep 17 00:00:00 2001 From: Amish Shah Date: Fri, 10 Aug 2018 16:46:14 +0100 Subject: [PATCH] Make presences track users and guilds, emit them in presenceUpdate --- .../packets/handlers/PresenceUpdate.js | 14 ++++++-------- src/client/websocket/packets/handlers/Ready.js | 2 +- src/stores/ClientPresenceStore.js | 2 ++ src/structures/Guild.js | 2 +- src/structures/GuildMember.js | 2 +- src/structures/Presence.js | 18 ++++++++++++++++++ test/voice.js | 5 +++-- 7 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/client/websocket/packets/handlers/PresenceUpdate.js b/src/client/websocket/packets/handlers/PresenceUpdate.js index cb6935a9a..d223c278a 100644 --- a/src/client/websocket/packets/handlers/PresenceUpdate.js +++ b/src/client/websocket/packets/handlers/PresenceUpdate.js @@ -23,6 +23,8 @@ class PresenceUpdateHandler extends AbstractHandler { } if (guild) { + let oldPresence = guild.presences.get(user.id); + if (oldPresence) oldPresence = oldPresence._clone(); let member = guild.members.get(user.id); if (!member && data.status !== 'offline') { member = guild.members.add({ @@ -35,17 +37,13 @@ class PresenceUpdateHandler extends AbstractHandler { } if (member) { if (client.listenerCount(Events.PRESENCE_UPDATE) === 0) { - guild.presences.add(data); + guild.presences.add(Object.assign(data, { guild: this })); return; } - const oldMember = member._clone(); - if (member.presence) { - oldMember.frozenPresence = member.presence._clone(); - } - guild.presences.add(data); - client.emit(Events.PRESENCE_UPDATE, oldMember, member); + guild.presences.add(Object.assign(data, { guild: this })); + client.emit(Events.PRESENCE_UPDATE, oldPresence, member.presence); } else { - guild.presences.add(data); + guild.presences.add(Object.assign(data, { guild: this })); } } } diff --git a/src/client/websocket/packets/handlers/Ready.js b/src/client/websocket/packets/handlers/Ready.js index 0e48e5586..59b872d90 100644 --- a/src/client/websocket/packets/handlers/Ready.js +++ b/src/client/websocket/packets/handlers/Ready.js @@ -9,6 +9,7 @@ class ReadyHandler extends AbstractHandler { client.ws.heartbeat(); + client.presences.clientPresence.userID = data.user.id; if (!ClientUser) ClientUser = require('../../../../structures/ClientUser'); const clientUser = new ClientUser(client, data.user); client.user = clientUser; @@ -17,7 +18,6 @@ class ReadyHandler extends AbstractHandler { for (const guild of data.guilds) client.guilds.add(guild); for (const privateDM of data.private_channels) client.channels.add(privateDM); - for (const presence of data.presences || []) client.presences.add(presence); if (!client.users.has('1')) { client.users.add({ diff --git a/src/stores/ClientPresenceStore.js b/src/stores/ClientPresenceStore.js index 94d48d4a4..8e6336d6c 100644 --- a/src/stores/ClientPresenceStore.js +++ b/src/stores/ClientPresenceStore.js @@ -16,6 +16,8 @@ class ClientPresenceStore extends PresenceStore { afk: false, since: null, activity: null, + user: { id: null }, + guild_id: null, }); } diff --git a/src/structures/Guild.js b/src/structures/Guild.js index bfb09d9f5..423083e93 100644 --- a/src/structures/Guild.js +++ b/src/structures/Guild.js @@ -226,7 +226,7 @@ class Guild extends Base { if (data.presences) { for (const presence of data.presences) { - this.presences.add(presence); + this.presences.add(Object.assign(presence, { guild: this })); } } diff --git a/src/structures/GuildMember.js b/src/structures/GuildMember.js index 8048481d5..8a314c086 100644 --- a/src/structures/GuildMember.js +++ b/src/structures/GuildMember.js @@ -114,7 +114,7 @@ class GuildMember extends Base { * @readonly */ get presence() { - return this.frozenPresence || this.guild.presences.get(this.id) || new Presence(this.client); + return this.guild.presences.get(this.id) || new Presence(this.client); } /** diff --git a/src/structures/Presence.js b/src/structures/Presence.js index 3a93af628..13d3ff972 100644 --- a/src/structures/Presence.js +++ b/src/structures/Presence.js @@ -14,9 +14,27 @@ const { ActivityTypes, ActivityFlags } = require('../util/Constants'); class Presence { constructor(client, data = {}) { Object.defineProperty(this, 'client', { value: client }); + this.userID = data.user.id; + this.guild = data.guild; this.patch(data); } + /** + * The user of this presence + * @type {User} + */ + get user() { + return this.client.users.get(this.userID); + } + + /** + * The member of this presence + * @type {GuildMember} + */ + get member() { + return this.guild.members.get(this.userID); + } + patch(data) { /** * The status of the presence: diff --git a/test/voice.js b/test/voice.js index d516f21a4..b4eac0128 100644 --- a/test/voice.js +++ b/test/voice.js @@ -29,8 +29,9 @@ var count = 0; process.on('unhandledRejection', console.log); -client.on('voiceStateUpdate', (a, b) => { - console.log(a ? a.channelID : null, b ? b.channelID : null, b.member.user.username); +client.on('presenceUpdate', (a, b) => { + if (b.userID !== '66564597481480192') return; + console.log(a ? a.status : null, b.status, b.user.username); }); client.on('message', m => {