|
|
@@ -14,7 +14,7 @@ namespace Discord |
|
|
|
{ |
|
|
|
private readonly DiscordAPIClient _api; |
|
|
|
private readonly Random _rand; |
|
|
|
private readonly JsonSerializer _serializer; |
|
|
|
private readonly JsonSerializer _socketSerializer, _messageImporter; |
|
|
|
private readonly ConcurrentQueue<Message> _pendingMessages; |
|
|
|
private readonly ConcurrentDictionary<long, DiscordWSClient> _voiceClients; |
|
|
|
private readonly Dictionary<Type, IService> _services; |
|
|
@@ -163,12 +163,14 @@ namespace Discord |
|
|
|
if (Config.UseMessageQueue) |
|
|
|
_pendingMessages = new ConcurrentQueue<Message>(); |
|
|
|
|
|
|
|
_serializer = new JsonSerializer(); |
|
|
|
_serializer.DateTimeZoneHandling = DateTimeZoneHandling.Utc; |
|
|
|
_socketSerializer = new JsonSerializer(); |
|
|
|
_socketSerializer.DateTimeZoneHandling = DateTimeZoneHandling.Utc; |
|
|
|
#if TEST_RESPONSES |
|
|
|
_serializer.CheckAdditionalContent = true; |
|
|
|
_serializer.MissingMemberHandling = MissingMemberHandling.Error; |
|
|
|
#endif |
|
|
|
|
|
|
|
_messageImporter = new JsonSerializer(); |
|
|
|
} |
|
|
|
internal override VoiceWebSocket CreateVoiceSocket() |
|
|
|
{ |
|
|
@@ -311,7 +313,7 @@ namespace Discord |
|
|
|
case "READY": //Resync |
|
|
|
{ |
|
|
|
base.OnReceivedEvent(e).Wait(); //This cannot be an await, or we'll get later messages before we're ready |
|
|
|
var data = e.Payload.ToObject<ReadyEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<ReadyEvent>(_socketSerializer); |
|
|
|
_privateUser = _users.GetOrAdd(data.User.Id, null); |
|
|
|
_privateUser.Update(data.User); |
|
|
|
_privateUser.Global.Update(data.User); |
|
|
@@ -336,7 +338,7 @@ namespace Discord |
|
|
|
//Servers |
|
|
|
case "GUILD_CREATE": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<GuildCreateEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<GuildCreateEvent>(_socketSerializer); |
|
|
|
if (data.Unavailable != true) |
|
|
|
{ |
|
|
|
var server = _servers.GetOrAdd(data.Id); |
|
|
@@ -350,7 +352,7 @@ namespace Discord |
|
|
|
break; |
|
|
|
case "GUILD_UPDATE": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<GuildUpdateEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<GuildUpdateEvent>(_socketSerializer); |
|
|
|
var server = _servers[data.Id]; |
|
|
|
if (server != null) |
|
|
|
{ |
|
|
@@ -361,7 +363,7 @@ namespace Discord |
|
|
|
break; |
|
|
|
case "GUILD_DELETE": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<GuildDeleteEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<GuildDeleteEvent>(_socketSerializer); |
|
|
|
var server = _servers.TryRemove(data.Id); |
|
|
|
if (server != null) |
|
|
|
{ |
|
|
@@ -376,7 +378,7 @@ namespace Discord |
|
|
|
//Channels |
|
|
|
case "CHANNEL_CREATE": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<ChannelCreateEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<ChannelCreateEvent>(_socketSerializer); |
|
|
|
Channel channel; |
|
|
|
if (data.IsPrivate) |
|
|
|
{ |
|
|
@@ -392,7 +394,7 @@ namespace Discord |
|
|
|
break; |
|
|
|
case "CHANNEL_UPDATE": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<ChannelUpdateEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<ChannelUpdateEvent>(_socketSerializer); |
|
|
|
var channel = _channels[data.Id]; |
|
|
|
if (channel != null) |
|
|
|
{ |
|
|
@@ -403,7 +405,7 @@ namespace Discord |
|
|
|
break; |
|
|
|
case "CHANNEL_DELETE": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<ChannelDeleteEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<ChannelDeleteEvent>(_socketSerializer); |
|
|
|
var channel = _channels.TryRemove(data.Id); |
|
|
|
if (channel != null) |
|
|
|
RaiseChannelDestroyed(channel); |
|
|
@@ -413,7 +415,7 @@ namespace Discord |
|
|
|
//Members |
|
|
|
case "GUILD_MEMBER_ADD": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<MemberAddEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<MemberAddEvent>(_socketSerializer); |
|
|
|
var user = _users.GetOrAdd(data.User.Id, data.GuildId); |
|
|
|
user.Update(data); |
|
|
|
if (Config.TrackActivity) |
|
|
@@ -423,7 +425,7 @@ namespace Discord |
|
|
|
break; |
|
|
|
case "GUILD_MEMBER_UPDATE": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<MemberUpdateEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<MemberUpdateEvent>(_socketSerializer); |
|
|
|
var user = _users[data.User.Id, data.GuildId]; |
|
|
|
if (user != null) |
|
|
|
{ |
|
|
@@ -434,7 +436,7 @@ namespace Discord |
|
|
|
break; |
|
|
|
case "GUILD_MEMBER_REMOVE": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<MemberRemoveEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<MemberRemoveEvent>(_socketSerializer); |
|
|
|
var user = _users.TryRemove(data.UserId, data.GuildId); |
|
|
|
if (user != null) |
|
|
|
RaiseUserLeft(user); |
|
|
@@ -442,7 +444,7 @@ namespace Discord |
|
|
|
break; |
|
|
|
case "GUILD_MEMBERS_CHUNK": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<MembersChunkEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<MembersChunkEvent>(_socketSerializer); |
|
|
|
foreach (var memberData in data.Members) |
|
|
|
{ |
|
|
|
var user = _users.GetOrAdd(memberData.User.Id, memberData.GuildId); |
|
|
@@ -455,7 +457,7 @@ namespace Discord |
|
|
|
//Roles |
|
|
|
case "GUILD_ROLE_CREATE": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<RoleCreateEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<RoleCreateEvent>(_socketSerializer); |
|
|
|
var role = _roles.GetOrAdd(data.Data.Id, data.GuildId); |
|
|
|
role.Update(data.Data); |
|
|
|
var server = _servers[data.GuildId]; |
|
|
@@ -466,7 +468,7 @@ namespace Discord |
|
|
|
break; |
|
|
|
case "GUILD_ROLE_UPDATE": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<RoleUpdateEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<RoleUpdateEvent>(_socketSerializer); |
|
|
|
var role = _roles[data.Data.Id]; |
|
|
|
if (role != null) |
|
|
|
{ |
|
|
@@ -477,7 +479,7 @@ namespace Discord |
|
|
|
break; |
|
|
|
case "GUILD_ROLE_DELETE": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<RoleDeleteEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<RoleDeleteEvent>(_socketSerializer); |
|
|
|
var role = _roles.TryRemove(data.RoleId); |
|
|
|
if (role != null) |
|
|
|
{ |
|
|
@@ -492,7 +494,7 @@ namespace Discord |
|
|
|
//Bans |
|
|
|
case "GUILD_BAN_ADD": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<BanAddEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<BanAddEvent>(_socketSerializer); |
|
|
|
var server = _servers[data.GuildId]; |
|
|
|
if (server != null) |
|
|
|
{ |
|
|
@@ -504,7 +506,7 @@ namespace Discord |
|
|
|
break; |
|
|
|
case "GUILD_BAN_REMOVE": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<BanRemoveEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<BanRemoveEvent>(_socketSerializer); |
|
|
|
var server = _servers[data.GuildId]; |
|
|
|
if (server != null) |
|
|
|
{ |
|
|
@@ -518,7 +520,7 @@ namespace Discord |
|
|
|
//Messages |
|
|
|
case "MESSAGE_CREATE": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<MessageCreateEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<MessageCreateEvent>(_socketSerializer); |
|
|
|
Message msg = null; |
|
|
|
|
|
|
|
bool isAuthor = data.Author.Id == _userId; |
|
|
@@ -545,7 +547,7 @@ namespace Discord |
|
|
|
break; |
|
|
|
case "MESSAGE_UPDATE": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<MessageUpdateEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<MessageUpdateEvent>(_socketSerializer); |
|
|
|
var msg = _messages[data.Id]; |
|
|
|
if (msg != null) |
|
|
|
{ |
|
|
@@ -556,7 +558,7 @@ namespace Discord |
|
|
|
break; |
|
|
|
case "MESSAGE_DELETE": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<MessageDeleteEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<MessageDeleteEvent>(_socketSerializer); |
|
|
|
var msg = _messages.TryRemove(data.Id); |
|
|
|
if (msg != null) |
|
|
|
RaiseMessageDeleted(msg); |
|
|
@@ -564,7 +566,7 @@ namespace Discord |
|
|
|
break; |
|
|
|
case "MESSAGE_ACK": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<MessageAckEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<MessageAckEvent>(_socketSerializer); |
|
|
|
var msg = GetMessage(data.MessageId); |
|
|
|
if (msg != null) |
|
|
|
RaiseMessageReadRemotely(msg); |
|
|
@@ -574,7 +576,7 @@ namespace Discord |
|
|
|
//Statuses |
|
|
|
case "PRESENCE_UPDATE": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<PresenceUpdateEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<PresenceUpdateEvent>(_socketSerializer); |
|
|
|
var user = _users.GetOrAdd(data.User.Id, data.GuildId); |
|
|
|
if (user != null) |
|
|
|
{ |
|
|
@@ -585,7 +587,7 @@ namespace Discord |
|
|
|
break; |
|
|
|
case "TYPING_START": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<TypingStartEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<TypingStartEvent>(_socketSerializer); |
|
|
|
var channel = _channels[data.ChannelId]; |
|
|
|
if (channel != null) |
|
|
|
{ |
|
|
@@ -611,7 +613,7 @@ namespace Discord |
|
|
|
//Voice |
|
|
|
case "VOICE_STATE_UPDATE": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<MemberVoiceStateUpdateEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<MemberVoiceStateUpdateEvent>(_socketSerializer); |
|
|
|
var user = _users[data.UserId, data.GuildId]; |
|
|
|
if (user != null) |
|
|
|
{ |
|
|
@@ -630,7 +632,7 @@ namespace Discord |
|
|
|
//Settings |
|
|
|
case "USER_UPDATE": |
|
|
|
{ |
|
|
|
var data = e.Payload.ToObject<UserUpdateEvent>(_serializer); |
|
|
|
var data = e.Payload.ToObject<UserUpdateEvent>(_socketSerializer); |
|
|
|
var user = _globalUsers[data.Id]; |
|
|
|
if (user != null) |
|
|
|
{ |
|
|
|