From 0b179c87f17680d1e3b975b1b15a00516f110121 Mon Sep 17 00:00:00 2001 From: ckohen Date: Sat, 29 May 2021 07:28:41 -0700 Subject: [PATCH] cleanup(Client): guard emitting GMU and PU on user updates (#5655) --- src/client/actions/GuildMemberUpdate.js | 2 +- src/client/actions/PresenceUpdate.js | 2 +- src/structures/GuildMember.js | 23 +++++++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/client/actions/GuildMemberUpdate.js b/src/client/actions/GuildMemberUpdate.js index 53ca4818b..20edfc7b2 100644 --- a/src/client/actions/GuildMemberUpdate.js +++ b/src/client/actions/GuildMemberUpdate.js @@ -27,7 +27,7 @@ class GuildMemberUpdateAction extends Action { * @param {GuildMember} oldMember The member before the update * @param {GuildMember} newMember The member after the update */ - if (shard.status === Status.READY) client.emit(Events.GUILD_MEMBER_UPDATE, old, member); + if (shard.status === Status.READY && !member.equals(old)) client.emit(Events.GUILD_MEMBER_UPDATE, old, member); } else { const newMember = guild.members.add(data); /** diff --git a/src/client/actions/PresenceUpdate.js b/src/client/actions/PresenceUpdate.js index 69b79eb78..fd38c3cda 100644 --- a/src/client/actions/PresenceUpdate.js +++ b/src/client/actions/PresenceUpdate.js @@ -28,7 +28,7 @@ class PresenceUpdateAction extends Action { this.client.emit(Events.GUILD_MEMBER_AVAILABLE, member); } guild.presences.add(Object.assign(data, { guild })); - if (member && this.client.listenerCount(Events.PRESENCE_UPDATE)) { + if (member && this.client.listenerCount(Events.PRESENCE_UPDATE) && !member.presence.equals(oldPresence)) { /** * Emitted whenever a guild member's presence (e.g. status, activity) is changed. * @event Client#presenceUpdate diff --git a/src/structures/GuildMember.js b/src/structures/GuildMember.js index 53c33e387..c7e316bed 100644 --- a/src/structures/GuildMember.js +++ b/src/structures/GuildMember.js @@ -346,6 +346,29 @@ class GuildMember extends Base { return this.guild.members.fetch({ user: this.id, cache: true, force }); } + /** + * Whether this guild member equals another guild member. It compares all properties, so for most + * comparison it is advisable to just compare `member.id === member2.id` as it is significantly faster + * and is often what most users need. + * @param {GuildMember} member The member to compare with + * @returns {boolean} + */ + equals(member) { + return ( + member instanceof this.constructor && + this.id === member.id && + this.partial === member.partial && + this.guild.id === member.guild.id && + this.joinedTimestamp === member.joinedTimestamp && + this.lastMessageID === member.lastMessageID && + this.lastMessageChannelID === member.lastMessageChannelID && + this.nickname === member.nickname && + this.pending === member.pending && + (this._roles === member._roles || + (this._roles.length === member._roles.length && this._roles.every((role, i) => role === member._roles[i]))) + ); + } + /** * When concatenated with a string, this automatically returns the user's mention instead of the GuildMember object. * @returns {string}