| @@ -297,7 +297,7 @@ namespace Discord.WebSocket | |||
| client.UserBanned += (user, guild) => _userBannedEvent.InvokeAsync(user, guild); | |||
| client.UserUnbanned += (user, guild) => _userUnbannedEvent.InvokeAsync(user, guild); | |||
| client.UserUpdated += (oldUser, newUser) => _userUpdatedEvent.InvokeAsync(oldUser, newUser); | |||
| client.UserPresenceUpdated += (guild, user, oldPresence, newPresence) => _userPresenceUpdatedEvent.InvokeAsync(guild, user, oldPresence, newPresence); | |||
| client.GuildMemberUpdated += (oldUser, newUser) => _guildMemberUpdatedEvent.InvokeAsync(oldUser, newUser); | |||
| client.UserVoiceStateUpdated += (user, oldVoiceState, newVoiceState) => _userVoiceStateUpdatedEvent.InvokeAsync(user, oldVoiceState, newVoiceState); | |||
| client.CurrentUserUpdated += (oldUser, newUser) => _selfUpdatedEvent.InvokeAsync(oldUser, newUser); | |||
| client.UserIsTyping += (oldUser, newUser) => _userIsTypingEvent.InvokeAsync(oldUser, newUser); | |||
| @@ -185,12 +185,6 @@ namespace Discord.WebSocket | |||
| remove { _guildMemberUpdatedEvent.Remove(value); } | |||
| } | |||
| private readonly AsyncEvent<Func<SocketGuildUser, SocketGuildUser, Task>> _guildMemberUpdatedEvent = new AsyncEvent<Func<SocketGuildUser, SocketGuildUser, Task>>(); | |||
| public event Func<Optional<SocketGuild>, SocketUser, SocketPresence, SocketPresence, Task> UserPresenceUpdated | |||
| { | |||
| add { _userPresenceUpdatedEvent.Add(value); } | |||
| remove { _userPresenceUpdatedEvent.Remove(value); } | |||
| } | |||
| private readonly AsyncEvent<Func<Optional<SocketGuild>, SocketUser, SocketPresence, SocketPresence, Task>> _userPresenceUpdatedEvent = new AsyncEvent<Func<Optional<SocketGuild>, SocketUser, SocketPresence, SocketPresence, Task>>(); | |||
| public event Func<SocketUser, SocketVoiceState, SocketVoiceState, Task> UserVoiceStateUpdated | |||
| { | |||
| add { _userVoiceStateUpdatedEvent.Add(value); } | |||
| @@ -1318,46 +1318,16 @@ namespace Discord.WebSocket | |||
| return; | |||
| } | |||
| SocketPresence beforePresence; | |||
| SocketGlobalUser beforeGlobal; | |||
| var user = guild.GetUser(data.User.Id); | |||
| if (user != null) | |||
| { | |||
| beforePresence = user.Presence.Clone(); | |||
| beforeGlobal = user.GlobalUser.Clone(); | |||
| user.Update(State, data); | |||
| } | |||
| else | |||
| { | |||
| beforePresence = new SocketPresence(UserStatus.Offline, null); | |||
| user = guild.AddOrUpdateUser(data); | |||
| beforeGlobal = user.GlobalUser.Clone(); | |||
| } | |||
| 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); | |||
| if (user == null) | |||
| guild.AddOrUpdateUser(data); | |||
| } | |||
| else | |||
| { | |||
| var channel = State.GetChannel(data.User.Id); | |||
| if (channel != null) | |||
| { | |||
| var user = channel.GetUser(data.User.Id); | |||
| var beforePresence = user.Presence.Clone(); | |||
| var before = user.GlobalUser.Clone(); | |||
| user.Update(State, data); | |||
| await _userPresenceUpdatedEvent.InvokeAsync(Optional.Create<SocketGuild>(), user, beforePresence, user.Presence).ConfigureAwait(false); | |||
| if (data.User.Username.IsSpecified || data.User.Avatar.IsSpecified) | |||
| { | |||
| await _userUpdatedEvent.InvokeAsync(before, user).ConfigureAwait(false); | |||
| } | |||
| } | |||
| } | |||
| var globalUser = State.GetUser(data.User.Id); | |||
| var before = globalUser.Clone(); | |||
| globalUser.Update(State, data); | |||
| await _userUpdatedEvent.InvokeAsync(before, globalUser).ConfigureAwait(false); | |||
| } | |||
| break; | |||
| case "TYPING_START": | |||