diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 020a40967..c28e30b51 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1434,6 +1434,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); @@ -1448,25 +1449,28 @@ namespace Discord.WebSocket return; } - SocketPresence before; + SocketPresence beforePresence; + SocketGlobalUser beforeGlobal; var user = guild.GetUser(data.User.Id); if (user != null) { - before = user.Presence.Clone(); + beforePresence = user.Presence.Clone(); + beforeGlobal = user.GlobalUser.Clone(); user.Update(State, data); } else { - before = new SocketPresence(UserStatus.Offline, null); + beforePresence = new SocketPresence(UserStatus.Offline, null); user = guild.AddOrUpdateUser(data); + beforeGlobal = user.GlobalUser.Clone(); } - await _userPresenceUpdatedEvent.InvokeAsync(guild, user, before, user.Presence).ConfigureAwait(false); - if (data.User.Username.IsSpecified || data.Roles.IsSpecified) + if (data.User.Username.IsSpecified || data.User.Avatar.IsSpecified) { - var before2 = user.Clone(); - await _guildMemberUpdatedEvent.InvokeAsync(before2, user).ConfigureAwait(false); + await _userUpdatedEvent.InvokeAsync(beforeGlobal, user).ConfigureAwait(false); + return; } + await _userPresenceUpdatedEvent.InvokeAsync(guild, user, beforePresence, user.Presence).ConfigureAwait(false); } else { @@ -1474,14 +1478,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.GlobalUser.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..53475e5a2 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs @@ -88,6 +88,7 @@ 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)