Skip to content

Commit

Permalink
fix(GuildMemberUpdate): cache incoming members & use partials if enab…
Browse files Browse the repository at this point in the history
…led (#4986)

Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
  • Loading branch information
3 people committed Nov 20, 2020
1 parent 8b91ac5 commit 2e940e6
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 26 deletions.
1 change: 1 addition & 0 deletions src/client/actions/ActionsManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class ActionsManager {
this.register(require('./InviteCreate'));
this.register(require('./InviteDelete'));
this.register(require('./GuildMemberRemove'));
this.register(require('./GuildMemberUpdate'));
this.register(require('./GuildBanRemove'));
this.register(require('./GuildRoleCreate'));
this.register(require('./GuildRoleDelete'));
Expand Down
44 changes: 44 additions & 0 deletions src/client/actions/GuildMemberUpdate.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
'use strict';

const Action = require('./Action');
const { Status, Events } = require('../../util/Constants');

class GuildMemberUpdateAction extends Action {
handle(data, shard) {
const { client } = this;
if (data.user.username) {
const user = client.users.cache.get(data.user.id);
if (!user) {
client.users.add(data.user);
} else if (!user.equals(data.user)) {
client.actions.UserUpdate.handle(data.user);
}
}

const guild = client.guilds.cache.get(data.guild_id);
if (guild) {
const member = this.getMember({ user: data.user }, guild);
if (member) {
const old = member._update(data);
/**
* Emitted whenever a guild member changes - i.e. new role, removed role, nickname.
* Also emitted when the user's details (e.g. username) change.
* @event Client#guildMemberUpdate
* @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);
} else {
const newMember = guild.members.add(data);
/**
* Emitted whenever a member becomes available in a large guild.
* @event Client#guildMemberAvailable
* @param {GuildMember} member The member that became available
*/
this.client.emit(Events.GUILD_MEMBER_AVAILABLE, newMember);
}
}
}
}

module.exports = GuildMemberUpdateAction;
28 changes: 2 additions & 26 deletions src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js
Original file line number Diff line number Diff line change
@@ -1,29 +1,5 @@
'use strict';

const { Status, Events } = require('../../../util/Constants');

module.exports = (client, { d: data }, shard) => {
let user = client.users.cache.get(data.user.id);
if (!user && data.user.username) user = client.users.add(data.user);
if (user && data.user && data.user.username) {
if (!user.equals(data.user)) client.actions.UserUpdate.handle(data.user);
}

const guild = client.guilds.cache.get(data.guild_id);
if (guild) {
const member = guild.members.cache.get(data.user.id);
if (member) {
const old = member._update(data);
if (shard.status === Status.READY) {
/**
* Emitted whenever a guild member changes - i.e. new role, removed role, nickname.
* Also emitted when the user's details (e.g. username) change.
* @event Client#guildMemberUpdate
* @param {GuildMember} oldMember The member before the update
* @param {GuildMember} newMember The member after the update
*/
client.emit(Events.GUILD_MEMBER_UPDATE, old, member);
}
}
}
module.exports = (client, packet, shard) => {
client.actions.GuildMemberUpdate.handle(packet.d, shard);
};

0 comments on commit 2e940e6

Please sign in to comment.