Remove deleted roles from their parent server

This commit is contained in:
RogueException
2015-10-03 14:57:27 -03:00
parent 64fc4667fe
commit 24e8541e8a

View File

@@ -338,351 +338,357 @@ namespace Discord
{ {
try try
{ {
await base.OnReceivedEvent(e); await base.OnReceivedEvent(e);
switch (e.Type) switch (e.Type)
{ {
//Global //Global
case "READY": //Resync case "READY": //Resync
{
var data = e.Payload.ToObject<ReadyEvent>(_serializer);
_currentUser = _users.GetOrAdd(data.User.Id);
_currentUser.Update(data.User);
foreach (var model in data.Guilds)
{ {
var data = e.Payload.ToObject<ReadyEvent>(_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<GuildCreateEvent>(_serializer);
if (!model.Unavailable) if (!model.Unavailable)
{ {
var server = _servers.GetOrAdd(model.Id); var server = _servers.GetOrAdd(model.Id);
server.Update(model); server.Update(model);
RaiseServerCreated(server);
} }
} }
foreach (var model in data.PrivateChannels) break;
case "GUILD_UPDATE":
{ {
var user = _users.GetOrAdd(model.Recipient.Id); var model = e.Payload.ToObject<GuildUpdateEvent>(_serializer);
user.Update(model.Recipient); var server = _servers[model.Id];
var channel = _channels.GetOrAdd(model.Id, null, user.Id); if (server != null)
channel.Update(model); {
server.Update(model);
RaiseServerUpdated(server);
}
} }
} break;
break; case "GUILD_DELETE":
case "RESUMED": {
break; var data = e.Payload.ToObject<GuildDeleteEvent>(_serializer);
var server = _servers.TryRemove(data.Id);
if (server != null)
RaiseServerDestroyed(server);
}
break;
//Servers //Channels
case "GUILD_CREATE": case "CHANNEL_CREATE":
{
var model = e.Payload.ToObject<GuildCreateEvent>(_serializer);
if (!model.Unavailable)
{
var server = _servers.GetOrAdd(model.Id);
server.Update(model);
RaiseServerCreated(server);
}
}
break;
case "GUILD_UPDATE":
{
var model = e.Payload.ToObject<GuildUpdateEvent>(_serializer);
var server = _servers[model.Id];
if (server != null)
{
server.Update(model);
RaiseServerUpdated(server);
}
}
break;
case "GUILD_DELETE":
{
var data = e.Payload.ToObject<GuildDeleteEvent>(_serializer);
var server = _servers.TryRemove(data.Id);
if (server != null)
RaiseServerDestroyed(server);
}
break;
//Channels
case "CHANNEL_CREATE":
{
var data = e.Payload.ToObject<ChannelCreateEvent>(_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 "CHANNEL_UPDATE":
{
var data = e.Payload.ToObject<ChannelUpdateEvent>(_serializer);
var channel = _channels[data.Id];
if (channel != null)
{ {
var data = e.Payload.ToObject<ChannelCreateEvent>(_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); channel.Update(data);
RaiseChannelUpdated(channel); RaiseChannelCreated(channel);
} }
} break;
break; case "CHANNEL_UPDATE":
case "CHANNEL_DELETE":
{
var data = e.Payload.ToObject<ChannelDeleteEvent>(_serializer);
var channel = _channels.TryRemove(data.Id);
if (channel != null)
RaiseChannelDestroyed(channel);
}
break;
//Members
case "GUILD_MEMBER_ADD":
{
var data = e.Payload.ToObject<GuildMemberAddEvent>(_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<GuildMemberUpdateEvent>(_serializer);
var member = _members[data.User.Id, data.GuildId];
if (member != null)
{ {
var data = e.Payload.ToObject<ChannelUpdateEvent>(_serializer);
var channel = _channels[data.Id];
if (channel != null)
{
channel.Update(data);
RaiseChannelUpdated(channel);
}
}
break;
case "CHANNEL_DELETE":
{
var data = e.Payload.ToObject<ChannelDeleteEvent>(_serializer);
var channel = _channels.TryRemove(data.Id);
if (channel != null)
RaiseChannelDestroyed(channel);
}
break;
//Members
case "GUILD_MEMBER_ADD":
{
var data = e.Payload.ToObject<GuildMemberAddEvent>(_serializer);
var user = _users.GetOrAdd(data.User.Id);
var member = _members.GetOrAdd(data.User.Id, data.GuildId);
user.Update(data.User);
member.Update(data); member.Update(data);
RaiseMemberUpdated(member); if (_config.TrackActivity)
member.UpdateActivity();
RaiseUserAdded(member);
} }
} break;
break; case "GUILD_MEMBER_UPDATE":
case "GUILD_MEMBER_REMOVE": {
{ var data = e.Payload.ToObject<GuildMemberUpdateEvent>(_serializer);
var data = e.Payload.ToObject<GuildMemberRemoveEvent>(_serializer); var member = _members[data.User.Id, data.GuildId];
var member = _members.TryRemove(data.UserId, data.GuildId); if (member != null)
if (member != null) {
RaiseUserRemoved(member); member.Update(data);
} RaiseMemberUpdated(member);
break; }
}
break;
case "GUILD_MEMBER_REMOVE":
{
var data = e.Payload.ToObject<GuildMemberRemoveEvent>(_serializer);
var member = _members.TryRemove(data.UserId, data.GuildId);
if (member != null)
RaiseUserRemoved(member);
}
break;
//Roles //Roles
case "GUILD_ROLE_CREATE": case "GUILD_ROLE_CREATE":
{ {
var data = e.Payload.ToObject<GuildRoleCreateEvent>(_serializer); var data = e.Payload.ToObject<GuildRoleCreateEvent>(_serializer);
var role = _roles.GetOrAdd(data.Data.Id, data.GuildId, false); 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<GuildRoleUpdateEvent>(_serializer);
var role = _roles[data.Data.Id];
if (role != null)
role.Update(data.Data); role.Update(data.Data);
RaiseRoleUpdated(role); var server = _servers[data.GuildId];
} if (server != null)
break; server.AddRole(data.Data.Id);
case "GUILD_ROLE_DELETE": RaiseRoleUpdated(role);
{
var data = e.Payload.ToObject<GuildRoleDeleteEvent>(_serializer);
var role = _roles.TryRemove(data.RoleId);
if (role != null)
RaiseRoleDeleted(role);
}
break;
//Bans
case "GUILD_BAN_ADD":
{
var data = e.Payload.ToObject<GuildBanAddEvent>(_serializer);
var server = _servers[data.GuildId];
if (server != null)
{
server.AddBan(data.User?.Id);
RaiseBanAdded(data.User?.Id, server);
} }
} break;
break; case "GUILD_ROLE_UPDATE":
case "GUILD_BAN_REMOVE":
{
var data = e.Payload.ToObject<GuildBanRemoveEvent>(_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<MessageCreateEvent>(_serializer);
Message msg = null;
bool wasLocal = _config.UseMessageQueue && data.Author.Id == CurrentUserId && data.Nonce != null;
if (wasLocal)
{ {
msg = _messages.Remap("nonce" + data.Nonce, data.Id); var data = e.Payload.ToObject<GuildRoleUpdateEvent>(_serializer);
var role = _roles[data.Data.Id];
if (role != null)
role.Update(data.Data);
RaiseRoleUpdated(role);
}
break;
case "GUILD_ROLE_DELETE":
{
var data = e.Payload.ToObject<GuildRoleDeleteEvent>(_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;
//Bans
case "GUILD_BAN_ADD":
{
var data = e.Payload.ToObject<GuildBanAddEvent>(_serializer);
var server = _servers[data.GuildId];
if (server != null)
{
server.AddBan(data.User?.Id);
RaiseBanAdded(data.User?.Id, server);
}
}
break;
case "GUILD_BAN_REMOVE":
{
var data = e.Payload.ToObject<GuildBanRemoveEvent>(_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<MessageCreateEvent>(_serializer);
Message msg = null;
bool wasLocal = _config.UseMessageQueue && data.Author.Id == CurrentUserId && data.Nonce != null;
if (wasLocal)
{
msg = _messages.Remap("nonce" + data.Nonce, data.Id);
if (msg != null)
{
msg.IsQueued = false;
msg.Id = data.Id;
}
}
if (msg == null)
msg = _messages.GetOrAdd(data.Id, data.ChannelId, data.Author.Id);
msg.Update(data);
if (_config.TrackActivity)
{
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);
}
break;
case "MESSAGE_UPDATE":
{
var data = e.Payload.ToObject<MessageUpdateEvent>(_serializer);
var msg = _messages[data.Id];
if (msg != null) if (msg != null)
{ {
msg.IsQueued = false; msg.Update(data);
msg.Id = data.Id; RaiseMessageUpdated(msg);
} }
} }
break;
if (msg == null) case "MESSAGE_DELETE":
msg = _messages.GetOrAdd(data.Id, data.ChannelId, data.Author.Id);
msg.Update(data);
if (_config.TrackActivity)
{ {
var channel = msg.Channel; var data = e.Payload.ToObject<MessageDeleteEvent>(_serializer);
if (channel == null || channel.IsPrivate) var msg = _messages.TryRemove(data.Id);
if (msg != null)
RaiseMessageDeleted(msg);
}
break;
case "MESSAGE_ACK":
{
var data = e.Payload.ToObject<MessageAckEvent>(_serializer);
var msg = GetMessage(data.MessageId);
if (msg != null)
RaiseMessageReadRemotely(msg);
}
break;
//Statuses
case "PRESENCE_UPDATE":
{
var data = e.Payload.ToObject<PresenceUpdateEvent>(_serializer);
var member = _members[data.User.Id, data.GuildId];
/*if (_config.TrackActivity)
{ {
var user = msg.User; var user = _users[data.User.Id];
if (user != null) if (user != null)
user.UpdateActivity(data.Timestamp); user.UpdateActivity(DateTime.UtcNow);
} }*/
else if (member != null)
{ {
var member = msg.Member; member.Update(data);
if (member != null) RaiseUserPresenceUpdated(member);
member.UpdateActivity(data.Timestamp);
} }
} }
if (wasLocal) break;
RaiseMessageSent(msg); case "TYPING_START":
RaiseMessageCreated(msg);
}
break;
case "MESSAGE_UPDATE":
{
var data = e.Payload.ToObject<MessageUpdateEvent>(_serializer);
var msg = _messages[data.Id];
if (msg != null)
{ {
msg.Update(data); var data = e.Payload.ToObject<TypingStartEvent>(_serializer);
RaiseMessageUpdated(msg); var channel = _channels[data.ChannelId];
} var user = _users[data.UserId];
}
break;
case "MESSAGE_DELETE":
{
var data = e.Payload.ToObject<MessageDeleteEvent>(_serializer);
var msg = _messages.TryRemove(data.Id);
if (msg != null)
RaiseMessageDeleted(msg);
}
break;
case "MESSAGE_ACK":
{
var data = e.Payload.ToObject<MessageAckEvent>(_serializer);
var msg = GetMessage(data.MessageId);
if (msg != null)
RaiseMessageReadRemotely(msg);
}
break;
//Statuses
case "PRESENCE_UPDATE":
{
var data = e.Payload.ToObject<PresenceUpdateEvent>(_serializer);
var member = _members[data.User.Id, data.GuildId];
/*if (_config.TrackActivity)
{
var user = _users[data.User.Id];
if (user != null) if (user != null)
user.UpdateActivity(DateTime.UtcNow);
}*/
if (member != null)
{
member.Update(data);
RaiseUserPresenceUpdated(member);
}
}
break;
case "TYPING_START":
{
var data = e.Payload.ToObject<TypingStartEvent>(_serializer);
var channel = _channels[data.ChannelId];
var user = _users[data.UserId];
if (user != null)
{
if (channel != null)
RaiseUserIsTyping(user, channel);
}
if (_config.TrackActivity)
{
if (channel.IsPrivate)
{ {
if (channel != null)
RaiseUserIsTyping(user, channel);
}
if (_config.TrackActivity)
{
if (channel.IsPrivate)
{
if (user != null)
user.UpdateActivity();
}
else
{
var member = _members[data.UserId, channel.ServerId];
if (member != null)
member.UpdateActivity();
}
}
}
break;
//Voice
case "VOICE_STATE_UPDATE":
{
var data = e.Payload.ToObject<VoiceStateUpdateEvent>(_serializer);
var member = _members[data.UserId, data.GuildId];
/*if (_config.TrackActivity)
{
var user = _users[data.User.Id];
if (user != null) if (user != null)
user.UpdateActivity(); user.UpdateActivity(DateTime.UtcNow);
} }*/
else if (member != null)
{ {
var member = _members[data.UserId, channel.ServerId]; member.Update(data);
if (member != null) if (member.IsSpeaking)
member.UpdateActivity(); {
member.IsSpeaking = false;
RaiseUserIsSpeaking(member, false);
}
RaiseUserVoiceStateUpdated(member);
} }
} }
} break;
break;
//Voice //Settings
case "VOICE_STATE_UPDATE": case "USER_UPDATE":
{
var data = e.Payload.ToObject<VoiceStateUpdateEvent>(_serializer);
var member = _members[data.UserId, data.GuildId];
/*if (_config.TrackActivity)
{ {
var user = _users[data.User.Id]; var data = e.Payload.ToObject<UserUpdateEvent>(_serializer);
var user = _users[data.Id];
if (user != null) if (user != null)
user.UpdateActivity(DateTime.UtcNow);
}*/
if (member != null)
{
member.Update(data);
if (member.IsSpeaking)
{ {
member.IsSpeaking = false; user.Update(data);
RaiseUserIsSpeaking(member, false); RaiseUserUpdated(user);
} }
RaiseUserVoiceStateUpdated(member);
} }
} break;
break; case "USER_SETTINGS_UPDATE":
//Settings
case "USER_UPDATE":
{
var data = e.Payload.ToObject<UserUpdateEvent>(_serializer);
var user = _users[data.Id];
if (user != null)
{ {
user.Update(data); //TODO: Process this
RaiseUserUpdated(user);
} }
} break;
break;
case "USER_SETTINGS_UPDATE":
{
//TODO: Process this
}
break;
//Internal (handled in DiscordSimpleClient) //Internal (handled in DiscordSimpleClient)
case "VOICE_SERVER_UPDATE": case "VOICE_SERVER_UPDATE":
break; break;
//Others //Others
default: default:
RaiseOnLog(LogMessageSeverity.Warning, LogMessageSource.DataWebSocket, $"Unknown message type: {e.Type}"); RaiseOnLog(LogMessageSeverity.Warning, LogMessageSource.DataWebSocket, $"Unknown message type: {e.Type}");
break; break;
} }
} }
catch (Exception ex) catch (Exception ex)