diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index 45a5fb588..9d306692d 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -338,351 +338,357 @@ namespace Discord { try { - await base.OnReceivedEvent(e); + await base.OnReceivedEvent(e); - switch (e.Type) - { - //Global - case "READY": //Resync - { - var data = e.Payload.ToObject(_serializer); - _currentUser = _users.GetOrAdd(data.User.Id); - _currentUser.Update(data.User); - foreach (var model in data.Guilds) + switch (e.Type) + { + //Global + case "READY": //Resync + { + var data = e.Payload.ToObject(_serializer); + _currentUser = _users.GetOrAdd(data.User.Id); + _currentUser.Update(data.User); + foreach (var model in data.Guilds) + { + if (!model.Unavailable) + { + var server = _servers.GetOrAdd(model.Id); + server.Update(model); + } + } + foreach (var model in data.PrivateChannels) + { + var user = _users.GetOrAdd(model.Recipient.Id); + user.Update(model.Recipient); + var channel = _channels.GetOrAdd(model.Id, null, user.Id); + channel.Update(model); + } + } + break; + case "RESUMED": + break; + + //Servers + case "GUILD_CREATE": { + var model = e.Payload.ToObject(_serializer); if (!model.Unavailable) { var server = _servers.GetOrAdd(model.Id); server.Update(model); + RaiseServerCreated(server); } } - foreach (var model in data.PrivateChannels) + break; + case "GUILD_UPDATE": { - var user = _users.GetOrAdd(model.Recipient.Id); - user.Update(model.Recipient); - var channel = _channels.GetOrAdd(model.Id, null, user.Id); - channel.Update(model); + var model = e.Payload.ToObject(_serializer); + var server = _servers[model.Id]; + if (server != null) + { + server.Update(model); + RaiseServerUpdated(server); + } } - } - break; - case "RESUMED": - break; - - //Servers - case "GUILD_CREATE": - { - var model = e.Payload.ToObject(_serializer); - if (!model.Unavailable) + break; + case "GUILD_DELETE": { - var server = _servers.GetOrAdd(model.Id); - server.Update(model); - RaiseServerCreated(server); + var data = e.Payload.ToObject(_serializer); + var server = _servers.TryRemove(data.Id); + if (server != null) + RaiseServerDestroyed(server); } - } - break; - case "GUILD_UPDATE": - { - var model = e.Payload.ToObject(_serializer); - var server = _servers[model.Id]; - if (server != null) + break; + + //Channels + case "CHANNEL_CREATE": { - server.Update(model); - RaiseServerUpdated(server); + var data = e.Payload.ToObject(_serializer); + Channel channel; + if (data.IsPrivate) + { + var user = _users.GetOrAdd(data.Recipient.Id); + user.Update(data.Recipient); + channel = _channels.GetOrAdd(data.Id, null, user.Id); + } + else + channel = _channels.GetOrAdd(data.Id, data.GuildId, null); + channel.Update(data); + RaiseChannelCreated(channel); } - } - break; - case "GUILD_DELETE": - { - var data = e.Payload.ToObject(_serializer); - var server = _servers.TryRemove(data.Id); - if (server != null) - RaiseServerDestroyed(server); - } - break; - - //Channels - case "CHANNEL_CREATE": - { - var data = e.Payload.ToObject(_serializer); - Channel channel; - if (data.IsPrivate) + break; + case "CHANNEL_UPDATE": { - var user = _users.GetOrAdd(data.Recipient.Id); - user.Update(data.Recipient); - channel = _channels.GetOrAdd(data.Id, null, user.Id); + var data = e.Payload.ToObject(_serializer); + var channel = _channels[data.Id]; + if (channel != null) + { + channel.Update(data); + RaiseChannelUpdated(channel); + } } - else - channel = _channels.GetOrAdd(data.Id, data.GuildId, null); - channel.Update(data); - RaiseChannelCreated(channel); - } - break; - case "CHANNEL_UPDATE": - { - var data = e.Payload.ToObject(_serializer); - var channel = _channels[data.Id]; - if (channel != null) + break; + case "CHANNEL_DELETE": { - channel.Update(data); - RaiseChannelUpdated(channel); + var data = e.Payload.ToObject(_serializer); + var channel = _channels.TryRemove(data.Id); + if (channel != null) + RaiseChannelDestroyed(channel); } - } - break; - case "CHANNEL_DELETE": - { - var data = e.Payload.ToObject(_serializer); - var channel = _channels.TryRemove(data.Id); - if (channel != null) - RaiseChannelDestroyed(channel); - } - break; + break; - //Members - case "GUILD_MEMBER_ADD": - { - var data = e.Payload.ToObject(_serializer); - var user = _users.GetOrAdd(data.User.Id); - var member = _members.GetOrAdd(data.User.Id, data.GuildId); - user.Update(data.User); - member.Update(data); - if (_config.TrackActivity) - member.UpdateActivity(); - RaiseUserAdded(member); - } - break; - case "GUILD_MEMBER_UPDATE": - { - var data = e.Payload.ToObject(_serializer); - var member = _members[data.User.Id, data.GuildId]; - if (member != null) + //Members + case "GUILD_MEMBER_ADD": { + var data = e.Payload.ToObject(_serializer); + var user = _users.GetOrAdd(data.User.Id); + var member = _members.GetOrAdd(data.User.Id, data.GuildId); + user.Update(data.User); member.Update(data); - RaiseMemberUpdated(member); + if (_config.TrackActivity) + member.UpdateActivity(); + RaiseUserAdded(member); } - } - break; - case "GUILD_MEMBER_REMOVE": - { - var data = e.Payload.ToObject(_serializer); - var member = _members.TryRemove(data.UserId, data.GuildId); - if (member != null) - RaiseUserRemoved(member); - } - break; + break; + case "GUILD_MEMBER_UPDATE": + { + var data = e.Payload.ToObject(_serializer); + var member = _members[data.User.Id, data.GuildId]; + if (member != null) + { + member.Update(data); + RaiseMemberUpdated(member); + } + } + break; + case "GUILD_MEMBER_REMOVE": + { + var data = e.Payload.ToObject(_serializer); + var member = _members.TryRemove(data.UserId, data.GuildId); + if (member != null) + RaiseUserRemoved(member); + } + break; - //Roles - case "GUILD_ROLE_CREATE": - { - var data = e.Payload.ToObject(_serializer); - var role = _roles.GetOrAdd(data.Data.Id, data.GuildId, false); - role.Update(data.Data); - RaiseRoleUpdated(role); - } - break; - case "GUILD_ROLE_UPDATE": - { - var data = e.Payload.ToObject(_serializer); - var role = _roles[data.Data.Id]; - if (role != null) + //Roles + case "GUILD_ROLE_CREATE": + { + var data = e.Payload.ToObject(_serializer); + var role = _roles.GetOrAdd(data.Data.Id, data.GuildId, false); role.Update(data.Data); - RaiseRoleUpdated(role); - } - break; - case "GUILD_ROLE_DELETE": - { - var data = e.Payload.ToObject(_serializer); - var role = _roles.TryRemove(data.RoleId); - if (role != null) - RaiseRoleDeleted(role); - } - break; - - //Bans - case "GUILD_BAN_ADD": - { - var data = e.Payload.ToObject(_serializer); - var server = _servers[data.GuildId]; - if (server != null) + var server = _servers[data.GuildId]; + if (server != null) + server.AddRole(data.Data.Id); + RaiseRoleUpdated(role); + } + break; + case "GUILD_ROLE_UPDATE": { - server.AddBan(data.User?.Id); - RaiseBanAdded(data.User?.Id, server); + var data = e.Payload.ToObject(_serializer); + var role = _roles[data.Data.Id]; + if (role != null) + role.Update(data.Data); + RaiseRoleUpdated(role); } - } - break; - case "GUILD_BAN_REMOVE": - { - var data = e.Payload.ToObject(_serializer); - var server = _servers[data.GuildId]; - if (server != null && server.RemoveBan(data.User?.Id)) - RaiseBanRemoved(data.User?.Id, server); - } - break; - - //Messages - case "MESSAGE_CREATE": - { - var data = e.Payload.ToObject(_serializer); - Message msg = null; + break; + case "GUILD_ROLE_DELETE": + { + var data = e.Payload.ToObject(_serializer); + var server = _servers[data.GuildId]; + if (server != null) + server.RemoveRole(data.RoleId); + var role = _roles.TryRemove(data.RoleId); + if (role != null) + RaiseRoleDeleted(role); + } + break; - bool wasLocal = _config.UseMessageQueue && data.Author.Id == CurrentUserId && data.Nonce != null; - if (wasLocal) + //Bans + case "GUILD_BAN_ADD": { - msg = _messages.Remap("nonce" + data.Nonce, data.Id); - if (msg != null) + var data = e.Payload.ToObject(_serializer); + var server = _servers[data.GuildId]; + if (server != null) { - msg.IsQueued = false; - msg.Id = data.Id; + server.AddBan(data.User?.Id); + RaiseBanAdded(data.User?.Id, server); } } + break; + case "GUILD_BAN_REMOVE": + { + var data = e.Payload.ToObject(_serializer); + var server = _servers[data.GuildId]; + if (server != null && server.RemoveBan(data.User?.Id)) + RaiseBanRemoved(data.User?.Id, server); + } + break; - if (msg == null) - msg = _messages.GetOrAdd(data.Id, data.ChannelId, data.Author.Id); - msg.Update(data); - if (_config.TrackActivity) + //Messages + case "MESSAGE_CREATE": { - var channel = msg.Channel; - if (channel == null || channel.IsPrivate) + var data = e.Payload.ToObject(_serializer); + Message msg = null; + + bool wasLocal = _config.UseMessageQueue && data.Author.Id == CurrentUserId && data.Nonce != null; + if (wasLocal) { - var user = msg.User; - if (user != null) - user.UpdateActivity(data.Timestamp); + msg = _messages.Remap("nonce" + data.Nonce, data.Id); + if (msg != null) + { + msg.IsQueued = false; + msg.Id = data.Id; + } } - else + + if (msg == null) + msg = _messages.GetOrAdd(data.Id, data.ChannelId, data.Author.Id); + msg.Update(data); + if (_config.TrackActivity) { - var member = msg.Member; - if (member != null) - member.UpdateActivity(data.Timestamp); + var channel = msg.Channel; + if (channel == null || channel.IsPrivate) + { + var user = msg.User; + if (user != null) + user.UpdateActivity(data.Timestamp); + } + else + { + var member = msg.Member; + if (member != null) + member.UpdateActivity(data.Timestamp); + } } + if (wasLocal) + RaiseMessageSent(msg); + RaiseMessageCreated(msg); } - if (wasLocal) - RaiseMessageSent(msg); - RaiseMessageCreated(msg); - } - break; - case "MESSAGE_UPDATE": - { - var data = e.Payload.ToObject(_serializer); - var msg = _messages[data.Id]; - if (msg != null) + break; + case "MESSAGE_UPDATE": { - msg.Update(data); - RaiseMessageUpdated(msg); + var data = e.Payload.ToObject(_serializer); + var msg = _messages[data.Id]; + if (msg != null) + { + msg.Update(data); + RaiseMessageUpdated(msg); + } } - } - break; - case "MESSAGE_DELETE": - { - var data = e.Payload.ToObject(_serializer); - var msg = _messages.TryRemove(data.Id); - if (msg != null) - RaiseMessageDeleted(msg); - } - break; - case "MESSAGE_ACK": - { - var data = e.Payload.ToObject(_serializer); - var msg = GetMessage(data.MessageId); - if (msg != null) - RaiseMessageReadRemotely(msg); - } - break; - - //Statuses - case "PRESENCE_UPDATE": - { - var data = e.Payload.ToObject(_serializer); - var member = _members[data.User.Id, data.GuildId]; - /*if (_config.TrackActivity) + break; + case "MESSAGE_DELETE": { - var user = _users[data.User.Id]; - if (user != null) - user.UpdateActivity(DateTime.UtcNow); - }*/ - if (member != null) + var data = e.Payload.ToObject(_serializer); + var msg = _messages.TryRemove(data.Id); + if (msg != null) + RaiseMessageDeleted(msg); + } + break; + case "MESSAGE_ACK": { - member.Update(data); - RaiseUserPresenceUpdated(member); + var data = e.Payload.ToObject(_serializer); + var msg = GetMessage(data.MessageId); + if (msg != null) + RaiseMessageReadRemotely(msg); } - } - break; - case "TYPING_START": - { - var data = e.Payload.ToObject(_serializer); - var channel = _channels[data.ChannelId]; - var user = _users[data.UserId]; + break; - if (user != null) + //Statuses + case "PRESENCE_UPDATE": { - if (channel != null) - RaiseUserIsTyping(user, channel); + var data = e.Payload.ToObject(_serializer); + var member = _members[data.User.Id, data.GuildId]; + /*if (_config.TrackActivity) + { + var user = _users[data.User.Id]; + if (user != null) + user.UpdateActivity(DateTime.UtcNow); + }*/ + if (member != null) + { + member.Update(data); + RaiseUserPresenceUpdated(member); + } } - if (_config.TrackActivity) + break; + case "TYPING_START": { - if (channel.IsPrivate) + var data = e.Payload.ToObject(_serializer); + var channel = _channels[data.ChannelId]; + var user = _users[data.UserId]; + + if (user != null) { - if (user != null) - user.UpdateActivity(); + if (channel != null) + RaiseUserIsTyping(user, channel); } - else + if (_config.TrackActivity) { - var member = _members[data.UserId, channel.ServerId]; - if (member != null) - member.UpdateActivity(); + if (channel.IsPrivate) + { + if (user != null) + user.UpdateActivity(); + } + else + { + var member = _members[data.UserId, channel.ServerId]; + if (member != null) + member.UpdateActivity(); + } } } - } - break; + break; - //Voice - case "VOICE_STATE_UPDATE": - { - var data = e.Payload.ToObject(_serializer); - var member = _members[data.UserId, data.GuildId]; - /*if (_config.TrackActivity) + //Voice + case "VOICE_STATE_UPDATE": { - var user = _users[data.User.Id]; - if (user != null) - user.UpdateActivity(DateTime.UtcNow); - }*/ - if (member != null) - { - member.Update(data); - if (member.IsSpeaking) + var data = e.Payload.ToObject(_serializer); + var member = _members[data.UserId, data.GuildId]; + /*if (_config.TrackActivity) + { + var user = _users[data.User.Id]; + if (user != null) + user.UpdateActivity(DateTime.UtcNow); + }*/ + if (member != null) { - member.IsSpeaking = false; - RaiseUserIsSpeaking(member, false); + member.Update(data); + if (member.IsSpeaking) + { + member.IsSpeaking = false; + RaiseUserIsSpeaking(member, false); + } + RaiseUserVoiceStateUpdated(member); } - RaiseUserVoiceStateUpdated(member); } - } - break; + break; - //Settings - case "USER_UPDATE": - { - var data = e.Payload.ToObject(_serializer); - var user = _users[data.Id]; - if (user != null) + //Settings + case "USER_UPDATE": { - user.Update(data); - RaiseUserUpdated(user); + var data = e.Payload.ToObject(_serializer); + var user = _users[data.Id]; + if (user != null) + { + user.Update(data); + RaiseUserUpdated(user); + } } - } - break; - case "USER_SETTINGS_UPDATE": - { - //TODO: Process this - } - break; + break; + case "USER_SETTINGS_UPDATE": + { + //TODO: Process this + } + break; - //Internal (handled in DiscordSimpleClient) - case "VOICE_SERVER_UPDATE": - break; + //Internal (handled in DiscordSimpleClient) + case "VOICE_SERVER_UPDATE": + break; - //Others - default: - RaiseOnLog(LogMessageSeverity.Warning, LogMessageSource.DataWebSocket, $"Unknown message type: {e.Type}"); - break; + //Others + default: + RaiseOnLog(LogMessageSeverity.Warning, LogMessageSource.DataWebSocket, $"Unknown message type: {e.Type}"); + break; } } catch (Exception ex)