Skip to content

Commit 2e940e6

Browse files
SpaceEECkyranetNotSugden
authored
fix(GuildMemberUpdate): cache incoming members & use partials if enabled (#4986)
Co-authored-by: Antonio Román <kyradiscord@gmail.com> Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
1 parent 8b91ac5 commit 2e940e6

File tree

3 files changed

+47
-26
lines changed

3 files changed

+47
-26
lines changed

src/client/actions/ActionsManager.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class ActionsManager {
2020
this.register(require('./InviteCreate'));
2121
this.register(require('./InviteDelete'));
2222
this.register(require('./GuildMemberRemove'));
23+
this.register(require('./GuildMemberUpdate'));
2324
this.register(require('./GuildBanRemove'));
2425
this.register(require('./GuildRoleCreate'));
2526
this.register(require('./GuildRoleDelete'));
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
'use strict';
2+
3+
const Action = require('./Action');
4+
const { Status, Events } = require('../../util/Constants');
5+
6+
class GuildMemberUpdateAction extends Action {
7+
handle(data, shard) {
8+
const { client } = this;
9+
if (data.user.username) {
10+
const user = client.users.cache.get(data.user.id);
11+
if (!user) {
12+
client.users.add(data.user);
13+
} else if (!user.equals(data.user)) {
14+
client.actions.UserUpdate.handle(data.user);
15+
}
16+
}
17+
18+
const guild = client.guilds.cache.get(data.guild_id);
19+
if (guild) {
20+
const member = this.getMember({ user: data.user }, guild);
21+
if (member) {
22+
const old = member._update(data);
23+
/**
24+
* Emitted whenever a guild member changes - i.e. new role, removed role, nickname.
25+
* Also emitted when the user's details (e.g. username) change.
26+
* @event Client#guildMemberUpdate
27+
* @param {GuildMember} oldMember The member before the update
28+
* @param {GuildMember} newMember The member after the update
29+
*/
30+
if (shard.status === Status.READY) client.emit(Events.GUILD_MEMBER_UPDATE, old, member);
31+
} else {
32+
const newMember = guild.members.add(data);
33+
/**
34+
* Emitted whenever a member becomes available in a large guild.
35+
* @event Client#guildMemberAvailable
36+
* @param {GuildMember} member The member that became available
37+
*/
38+
this.client.emit(Events.GUILD_MEMBER_AVAILABLE, newMember);
39+
}
40+
}
41+
}
42+
}
43+
44+
module.exports = GuildMemberUpdateAction;
Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,5 @@
11
'use strict';
22

3-
const { Status, Events } = require('../../../util/Constants');
4-
5-
module.exports = (client, { d: data }, shard) => {
6-
let user = client.users.cache.get(data.user.id);
7-
if (!user && data.user.username) user = client.users.add(data.user);
8-
if (user && data.user && data.user.username) {
9-
if (!user.equals(data.user)) client.actions.UserUpdate.handle(data.user);
10-
}
11-
12-
const guild = client.guilds.cache.get(data.guild_id);
13-
if (guild) {
14-
const member = guild.members.cache.get(data.user.id);
15-
if (member) {
16-
const old = member._update(data);
17-
if (shard.status === Status.READY) {
18-
/**
19-
* Emitted whenever a guild member changes - i.e. new role, removed role, nickname.
20-
* Also emitted when the user's details (e.g. username) change.
21-
* @event Client#guildMemberUpdate
22-
* @param {GuildMember} oldMember The member before the update
23-
* @param {GuildMember} newMember The member after the update
24-
*/
25-
client.emit(Events.GUILD_MEMBER_UPDATE, old, member);
26-
}
27-
}
28-
}
3+
module.exports = (client, packet, shard) => {
4+
client.actions.GuildMemberUpdate.handle(packet.d, shard);
295
};

0 commit comments

Comments
 (0)