Properly implement UserUpdated for Username or Avatar Changes

This commit is contained in:
Christopher F
2016-10-22 15:15:19 -04:00
parent 1e55d30a65
commit c80f73764c
2 changed files with 28 additions and 12 deletions

View File

@@ -1423,6 +1423,7 @@ namespace Discord.WebSocket
await _gatewayLogger.DebugAsync("Received Dispatch (PRESENCE_UPDATE)").ConfigureAwait(false); await _gatewayLogger.DebugAsync("Received Dispatch (PRESENCE_UPDATE)").ConfigureAwait(false);
var data = (payload as JToken).ToObject<API.Presence>(_serializer); var data = (payload as JToken).ToObject<API.Presence>(_serializer);
if (data.GuildId.IsSpecified) if (data.GuildId.IsSpecified)
{ {
var guild = State.GetGuild(data.GuildId.Value); var guild = State.GetGuild(data.GuildId.Value);
@@ -1437,24 +1438,35 @@ namespace Discord.WebSocket
return; return;
} }
SocketPresence before; SocketPresence beforePresence;
SocketGuildUser beforeGuild;
SocketGlobalUser before;
var user = guild.GetUser(data.User.Id); var user = guild.GetUser(data.User.Id);
if (user != null) if (user != null)
{ {
before = user.Presence.Clone();
beforePresence = user.Presence.Clone();
before = user.GlobalUser.Clone();
beforeGuild = user.Clone();
user.Update(State, data); user.Update(State, data);
} }
else else
{ {
before = new SocketPresence(UserStatus.Offline, null); beforePresence = new SocketPresence(UserStatus.Offline, null);
user = guild.AddOrUpdateUser(data); user = guild.AddOrUpdateUser(data);
before = user.GlobalUser.Clone();
beforeGuild = user.Clone();
} }
await _userPresenceUpdatedEvent.InvokeAsync(guild, user, before, user.Presence).ConfigureAwait(false); await _userPresenceUpdatedEvent.InvokeAsync(guild, user, beforePresence, user.Presence).ConfigureAwait(false);
if (data.User.Username.IsSpecified || data.Roles.IsSpecified || data.Nick.IsSpecified) if (data.Roles.IsSpecified || data.Nick.IsSpecified)
{ {
var before2 = user.Clone(); await _guildMemberUpdatedEvent.InvokeAsync(beforeGuild, user).ConfigureAwait(false);
await _guildMemberUpdatedEvent.InvokeAsync(before2, user).ConfigureAwait(false); }
if (data.User.Username.IsSpecified || data.User.Avatar.IsSpecified)
{
await _userUpdatedEvent.InvokeAsync(before, user).ConfigureAwait(false);
} }
} }
else else
@@ -1463,14 +1475,14 @@ namespace Discord.WebSocket
if (channel != null) if (channel != null)
{ {
var user = channel.GetUser(data.User.Id); 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); user.Update(State, data);
await _userPresenceUpdatedEvent.InvokeAsync(Optional.Create<SocketGuild>(), user, before, user.Presence).ConfigureAwait(false); await _userPresenceUpdatedEvent.InvokeAsync(Optional.Create<SocketGuild>(), user, beforePresence, user.Presence).ConfigureAwait(false);
if (data.User.Username.IsSpecified) if (data.User.Username.IsSpecified || data.User.Avatar.IsSpecified)
{ {
var before2 = user.Clone(); await _userUpdatedEvent.InvokeAsync(before, user).ConfigureAwait(false);
await _userUpdatedEvent.InvokeAsync(before2, user).ConfigureAwait(false);
} }
} }
} }

View File

@@ -92,6 +92,10 @@ namespace Discord.WebSocket
UpdateRoles(model.Roles.Value); UpdateRoles(model.Roles.Value);
if (model.Nick.IsSpecified) if (model.Nick.IsSpecified)
Nickname = model.Nick.Value; 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) private void UpdateRoles(ulong[] roleIds)
{ {