From 1e55d30a65fecc2a6142cc39a039bd933851ec82 Mon Sep 17 00:00:00 2001 From: Christopher F Date: Sat, 22 Oct 2016 13:24:46 -0400 Subject: [PATCH 1/4] Raise GuildMemberUpdated when a Nickname is modified --- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 5cb228506..6f925e60a 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1451,7 +1451,7 @@ namespace Discord.WebSocket } await _userPresenceUpdatedEvent.InvokeAsync(guild, user, before, user.Presence).ConfigureAwait(false); - if (data.User.Username.IsSpecified || data.Roles.IsSpecified) + if (data.User.Username.IsSpecified || data.Roles.IsSpecified || data.Nick.IsSpecified) { var before2 = user.Clone(); await _guildMemberUpdatedEvent.InvokeAsync(before2, user).ConfigureAwait(false); From c80f73764c6423e7841de594832f909c02cb7182 Mon Sep 17 00:00:00 2001 From: Christopher F Date: Sat, 22 Oct 2016 15:15:19 -0400 Subject: [PATCH 2/4] Properly implement UserUpdated for Username or Avatar Changes --- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 36 ++++++++++++++-------- .../Entities/Users/SocketGuildUser.cs | 4 +++ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 6f925e60a..bad00d006 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1423,6 +1423,7 @@ namespace Discord.WebSocket await _gatewayLogger.DebugAsync("Received Dispatch (PRESENCE_UPDATE)").ConfigureAwait(false); var data = (payload as JToken).ToObject(_serializer); + if (data.GuildId.IsSpecified) { var guild = State.GetGuild(data.GuildId.Value); @@ -1437,24 +1438,35 @@ namespace Discord.WebSocket return; } - SocketPresence before; + SocketPresence beforePresence; + SocketGuildUser beforeGuild; + SocketGlobalUser before; var user = guild.GetUser(data.User.Id); if (user != null) { - before = user.Presence.Clone(); + + beforePresence = user.Presence.Clone(); + before = user.GlobalUser.Clone(); + beforeGuild = user.Clone(); user.Update(State, data); } else { - before = new SocketPresence(UserStatus.Offline, null); + beforePresence = new SocketPresence(UserStatus.Offline, null); user = guild.AddOrUpdateUser(data); + before = user.GlobalUser.Clone(); + beforeGuild = user.Clone(); + } + + await _userPresenceUpdatedEvent.InvokeAsync(guild, user, beforePresence, user.Presence).ConfigureAwait(false); + if (data.Roles.IsSpecified || data.Nick.IsSpecified) + { + await _guildMemberUpdatedEvent.InvokeAsync(beforeGuild, user).ConfigureAwait(false); } - await _userPresenceUpdatedEvent.InvokeAsync(guild, user, before, user.Presence).ConfigureAwait(false); - if (data.User.Username.IsSpecified || data.Roles.IsSpecified || data.Nick.IsSpecified) + if (data.User.Username.IsSpecified || data.User.Avatar.IsSpecified) { - var before2 = user.Clone(); - await _guildMemberUpdatedEvent.InvokeAsync(before2, user).ConfigureAwait(false); + await _userUpdatedEvent.InvokeAsync(before, user).ConfigureAwait(false); } } else @@ -1463,14 +1475,14 @@ namespace Discord.WebSocket if (channel != null) { var user = channel.GetUser(data.User.Id); - var before = user.Presence.Clone(); + var beforePresence = user.Presence.Clone(); + var before = user.Clone(); user.Update(State, data); - await _userPresenceUpdatedEvent.InvokeAsync(Optional.Create(), user, before, user.Presence).ConfigureAwait(false); - if (data.User.Username.IsSpecified) + await _userPresenceUpdatedEvent.InvokeAsync(Optional.Create(), user, beforePresence, user.Presence).ConfigureAwait(false); + if (data.User.Username.IsSpecified || data.User.Avatar.IsSpecified) { - var before2 = user.Clone(); - await _userUpdatedEvent.InvokeAsync(before2, user).ConfigureAwait(false); + await _userUpdatedEvent.InvokeAsync(before, user).ConfigureAwait(false); } } } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs index 3ef45d230..b6804f89f 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs @@ -92,6 +92,10 @@ namespace Discord.WebSocket UpdateRoles(model.Roles.Value); if (model.Nick.IsSpecified) Nickname = model.Nick.Value; + if (model.User.Username.IsSpecified) + GlobalUser.Username = model.User.Username.Value; + if (model.User.Avatar.IsSpecified) + GlobalUser.AvatarId = model.User.Avatar.Value; } private void UpdateRoles(ulong[] roleIds) { From deafa3d755c10802728ff82f0512132fe6117f0f Mon Sep 17 00:00:00 2001 From: Christopher F Date: Sat, 22 Oct 2016 15:22:35 -0400 Subject: [PATCH 3/4] save your work before committing *facepalm* --- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index bad00d006..06ed64c8a 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1440,13 +1440,13 @@ namespace Discord.WebSocket SocketPresence beforePresence; SocketGuildUser beforeGuild; - SocketGlobalUser before; + SocketGlobalUser beforeGlobal; var user = guild.GetUser(data.User.Id); if (user != null) { beforePresence = user.Presence.Clone(); - before = user.GlobalUser.Clone(); + beforeGlobal = user.GlobalUser.Clone(); beforeGuild = user.Clone(); user.Update(State, data); } @@ -1454,7 +1454,7 @@ namespace Discord.WebSocket { beforePresence = new SocketPresence(UserStatus.Offline, null); user = guild.AddOrUpdateUser(data); - before = user.GlobalUser.Clone(); + beforeGlobal = user.GlobalUser.Clone(); beforeGuild = user.Clone(); } @@ -1466,7 +1466,7 @@ namespace Discord.WebSocket if (data.User.Username.IsSpecified || data.User.Avatar.IsSpecified) { - await _userUpdatedEvent.InvokeAsync(before, user).ConfigureAwait(false); + await _userUpdatedEvent.InvokeAsync(beforeGlobal, user).ConfigureAwait(false); } } else @@ -1476,7 +1476,7 @@ namespace Discord.WebSocket { var user = channel.GetUser(data.User.Id); var beforePresence = user.Presence.Clone(); - var before = user.Clone(); + var before = user.GlobalUser.Clone(); user.Update(State, data); await _userPresenceUpdatedEvent.InvokeAsync(Optional.Create(), user, beforePresence, user.Presence).ConfigureAwait(false); From 8db026c0fe962e9f70c88628e4ddd3d456684dbb Mon Sep 17 00:00:00 2001 From: Christopher F Date: Sat, 3 Dec 2016 21:11:47 -0500 Subject: [PATCH 4/4] Make changes per feedback, remove invocations of GuildMemberUpdated Nickname changes/role changes are no longer sent over PRESENCE_UPDATE, making it obsolete to check for changes there. --- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 12 ++---------- src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs | 5 +---- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 06ed64c8a..0d58d6222 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1439,15 +1439,12 @@ namespace Discord.WebSocket } SocketPresence beforePresence; - SocketGuildUser beforeGuild; SocketGlobalUser beforeGlobal; var user = guild.GetUser(data.User.Id); if (user != null) { - beforePresence = user.Presence.Clone(); beforeGlobal = user.GlobalUser.Clone(); - beforeGuild = user.Clone(); user.Update(State, data); } else @@ -1455,19 +1452,14 @@ namespace Discord.WebSocket beforePresence = new SocketPresence(UserStatus.Offline, null); user = guild.AddOrUpdateUser(data); beforeGlobal = user.GlobalUser.Clone(); - beforeGuild = user.Clone(); - } - - await _userPresenceUpdatedEvent.InvokeAsync(guild, user, beforePresence, user.Presence).ConfigureAwait(false); - if (data.Roles.IsSpecified || data.Nick.IsSpecified) - { - await _guildMemberUpdatedEvent.InvokeAsync(beforeGuild, user).ConfigureAwait(false); } if (data.User.Username.IsSpecified || data.User.Avatar.IsSpecified) { await _userUpdatedEvent.InvokeAsync(beforeGlobal, user).ConfigureAwait(false); + return; } + await _userPresenceUpdatedEvent.InvokeAsync(guild, user, beforePresence, user.Presence).ConfigureAwait(false); } else { diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs index b6804f89f..53475e5a2 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs @@ -88,14 +88,11 @@ namespace Discord.WebSocket internal override void Update(ClientState state, PresenceModel model) { base.Update(state, model); + GlobalUser.Update(state, model.User); if (model.Roles.IsSpecified) UpdateRoles(model.Roles.Value); if (model.Nick.IsSpecified) Nickname = model.Nick.Value; - if (model.User.Username.IsSpecified) - GlobalUser.Username = model.User.Username.Value; - if (model.User.Avatar.IsSpecified) - GlobalUser.AvatarId = model.User.Avatar.Value; } private void UpdateRoles(ulong[] roleIds) {