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) {