From 7c266037733ffb4df475dd5e9b49c660ee52c2cc Mon Sep 17 00:00:00 2001 From: Amish Shah Date: Sat, 1 Oct 2016 15:27:49 +0100 Subject: [PATCH] =?UTF-8?q?Fix=20presences=20probably=20=C2=AF\=5F(?= =?UTF-8?q?=E3=83=84)=5F/=C2=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../packets/handlers/PresenceUpdate.js | 34 ++++++++++++++----- src/structures/GuildMember.js | 2 +- src/structures/Presence.js | 1 + src/util/Constants.js | 1 + test/random.js | 5 ++- 5 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/client/websocket/packets/handlers/PresenceUpdate.js b/src/client/websocket/packets/handlers/PresenceUpdate.js index 159b10753..384d6245c 100644 --- a/src/client/websocket/packets/handlers/PresenceUpdate.js +++ b/src/client/websocket/packets/handlers/PresenceUpdate.js @@ -18,6 +18,12 @@ class PresenceUpdateHandler extends AbstractHandler { } } + const oldUser = cloneObject(user); + user.patch(data.user); + if (!user.equals(oldUser)) { + client.emit(Constants.Events.USER_DETAILS_UPDATE, oldUser, user); + } + if (guild) { let member = guild.members.get(user.id); if (!member && data.status !== 'offline') { @@ -29,20 +35,32 @@ class PresenceUpdateHandler extends AbstractHandler { }, false); client.emit(Constants.Events.GUILD_MEMBER_AVAILABLE, guild, member); } - guild._setPresence(user.id, data); + if (member) { + const oldMember = cloneObject(member); + if (member.presence) { + oldMember.frozenPresence = cloneObject(member.presence); + } + guild._setPresence(user.id, data); + client.emit(Constants.Events.PRESENCE_UPDATE, oldMember, member); + } else { + guild._setPresence(user.id, data); + } } - - const oldUser = cloneObject(user); - user.patch(data.user); - client.emit(Constants.Events.PRESENCE_UPDATE, oldUser, user); } } /** - * Emitted whenever a user changes one of their details or starts/stop playing a game + * Emitted whenever a guild member's presence changes, or they change one of their details. * @event Client#presenceUpdate - * @param {User} oldUser The user before the presence update - * @param {User} newUser The user after the presence update + * @param {GuildMember} oldMember The member before the presence update + * @param {GuildMember} newMember The member after the presence update + */ + +/** + * Emitted whenever a user's details (e.g. username) are changed. + * @event Client#userUpdate + * @param {User} oldUser The user before the update + * @param {User} newUser The user after the update */ /** diff --git a/src/structures/GuildMember.js b/src/structures/GuildMember.js index ca96d366c..46bfd6d0f 100644 --- a/src/structures/GuildMember.js +++ b/src/structures/GuildMember.js @@ -107,7 +107,7 @@ class GuildMember { * @readonly */ get presence() { - return this.guild.presences.get(this.id); + return this.frozenPresence || this.guild.presences.get(this.id); } /** diff --git a/src/structures/Presence.js b/src/structures/Presence.js index 27727cfef..242c52389 100644 --- a/src/structures/Presence.js +++ b/src/structures/Presence.js @@ -3,6 +3,7 @@ */ class Presence { constructor(data) { + if (!data) return; /** * The status of the presence: * diff --git a/src/util/Constants.js b/src/util/Constants.js index 9cf3771c9..8fe6816a8 100644 --- a/src/util/Constants.js +++ b/src/util/Constants.js @@ -173,6 +173,7 @@ exports.Events = { MESSAGE_BULK_DELETE: 'messageDeleteBulk', USER_UPDATE: 'userUpdate', PRESENCE_UPDATE: 'presenceUpdate', + USER_DETAILS_UPDATE: 'userUpdate', VOICE_STATE_UPDATE: 'voiceStateUpdate', TYPING_START: 'typingStart', TYPING_STOP: 'typingStop', diff --git a/test/random.js b/test/random.js index fbcb43b47..9ad71b3a4 100644 --- a/test/random.js +++ b/test/random.js @@ -16,9 +16,8 @@ client.on('ready', () => { console.log('ready!'); }); -client.on('presenceUpdate', (o, n) => { - if (o.username.startsWith('hydr')) - console.log(o.username, o.presence.status, n.presence.status); +client.on('userUpdate', (o, n) => { + console.log(o.username, n.username); }); client.on('channelCreate', channel => {