Fixed exceptions during message importing
This commit is contained in:
@@ -1,7 +1,9 @@
|
|||||||
using Discord.API;
|
using Discord.API;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@@ -29,8 +31,8 @@ namespace Discord
|
|||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public void Import(Message[] messages)
|
public void Import(Dictionary<long, Message> messages)
|
||||||
=> Import(messages.ToDictionary(x => x.Id));
|
=> base.Import(messages);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MessageEventArgs : EventArgs
|
public class MessageEventArgs : EventArgs
|
||||||
@@ -261,10 +263,23 @@ namespace Discord
|
|||||||
public void ImportMessages(string json)
|
public void ImportMessages(string json)
|
||||||
{
|
{
|
||||||
if (json == null) throw new ArgumentNullException(nameof(json));
|
if (json == null) throw new ArgumentNullException(nameof(json));
|
||||||
|
|
||||||
|
var dic = JArray.Parse(json)
|
||||||
|
.Select(x =>
|
||||||
|
{
|
||||||
|
var msg = new Message(this,
|
||||||
|
x["Id"].Value<long>(),
|
||||||
|
x["ChannelId"].Value<long>(),
|
||||||
|
x["UserId"].Value<long>());
|
||||||
|
|
||||||
var msgs = JsonConvert.DeserializeObject<Message[]>(json);
|
var reader = x.CreateReader();
|
||||||
_messages.Import(msgs);
|
_messageImporter.Populate(reader, msg);
|
||||||
|
return msg;
|
||||||
|
})
|
||||||
|
.ToDictionary(x => x.Id);
|
||||||
|
_messages.Import(dic);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Serializes the message cache for a given channel to JSON.</summary>
|
/// <summary> Serializes the message cache for a given channel to JSON.</summary>
|
||||||
public string ExportMessages(Channel channel)
|
public string ExportMessages(Channel channel)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ namespace Discord
|
|||||||
{
|
{
|
||||||
private readonly DiscordAPIClient _api;
|
private readonly DiscordAPIClient _api;
|
||||||
private readonly Random _rand;
|
private readonly Random _rand;
|
||||||
private readonly JsonSerializer _serializer;
|
private readonly JsonSerializer _socketSerializer, _messageImporter;
|
||||||
private readonly ConcurrentQueue<Message> _pendingMessages;
|
private readonly ConcurrentQueue<Message> _pendingMessages;
|
||||||
private readonly ConcurrentDictionary<long, DiscordWSClient> _voiceClients;
|
private readonly ConcurrentDictionary<long, DiscordWSClient> _voiceClients;
|
||||||
private readonly Dictionary<Type, IService> _services;
|
private readonly Dictionary<Type, IService> _services;
|
||||||
@@ -163,12 +163,14 @@ namespace Discord
|
|||||||
if (Config.UseMessageQueue)
|
if (Config.UseMessageQueue)
|
||||||
_pendingMessages = new ConcurrentQueue<Message>();
|
_pendingMessages = new ConcurrentQueue<Message>();
|
||||||
|
|
||||||
_serializer = new JsonSerializer();
|
_socketSerializer = new JsonSerializer();
|
||||||
_serializer.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
|
_socketSerializer.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
|
||||||
#if TEST_RESPONSES
|
#if TEST_RESPONSES
|
||||||
_serializer.CheckAdditionalContent = true;
|
_serializer.CheckAdditionalContent = true;
|
||||||
_serializer.MissingMemberHandling = MissingMemberHandling.Error;
|
_serializer.MissingMemberHandling = MissingMemberHandling.Error;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
_messageImporter = new JsonSerializer();
|
||||||
}
|
}
|
||||||
internal override VoiceWebSocket CreateVoiceSocket()
|
internal override VoiceWebSocket CreateVoiceSocket()
|
||||||
{
|
{
|
||||||
@@ -311,7 +313,7 @@ namespace Discord
|
|||||||
case "READY": //Resync
|
case "READY": //Resync
|
||||||
{
|
{
|
||||||
base.OnReceivedEvent(e).Wait(); //This cannot be an await, or we'll get later messages before we're ready
|
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 = _users.GetOrAdd(data.User.Id, null);
|
||||||
_privateUser.Update(data.User);
|
_privateUser.Update(data.User);
|
||||||
_privateUser.Global.Update(data.User);
|
_privateUser.Global.Update(data.User);
|
||||||
@@ -336,7 +338,7 @@ namespace Discord
|
|||||||
//Servers
|
//Servers
|
||||||
case "GUILD_CREATE":
|
case "GUILD_CREATE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<GuildCreateEvent>(_serializer);
|
var data = e.Payload.ToObject<GuildCreateEvent>(_socketSerializer);
|
||||||
if (data.Unavailable != true)
|
if (data.Unavailable != true)
|
||||||
{
|
{
|
||||||
var server = _servers.GetOrAdd(data.Id);
|
var server = _servers.GetOrAdd(data.Id);
|
||||||
@@ -350,7 +352,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "GUILD_UPDATE":
|
case "GUILD_UPDATE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<GuildUpdateEvent>(_serializer);
|
var data = e.Payload.ToObject<GuildUpdateEvent>(_socketSerializer);
|
||||||
var server = _servers[data.Id];
|
var server = _servers[data.Id];
|
||||||
if (server != null)
|
if (server != null)
|
||||||
{
|
{
|
||||||
@@ -361,7 +363,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "GUILD_DELETE":
|
case "GUILD_DELETE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<GuildDeleteEvent>(_serializer);
|
var data = e.Payload.ToObject<GuildDeleteEvent>(_socketSerializer);
|
||||||
var server = _servers.TryRemove(data.Id);
|
var server = _servers.TryRemove(data.Id);
|
||||||
if (server != null)
|
if (server != null)
|
||||||
{
|
{
|
||||||
@@ -376,7 +378,7 @@ namespace Discord
|
|||||||
//Channels
|
//Channels
|
||||||
case "CHANNEL_CREATE":
|
case "CHANNEL_CREATE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<ChannelCreateEvent>(_serializer);
|
var data = e.Payload.ToObject<ChannelCreateEvent>(_socketSerializer);
|
||||||
Channel channel;
|
Channel channel;
|
||||||
if (data.IsPrivate)
|
if (data.IsPrivate)
|
||||||
{
|
{
|
||||||
@@ -392,7 +394,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "CHANNEL_UPDATE":
|
case "CHANNEL_UPDATE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<ChannelUpdateEvent>(_serializer);
|
var data = e.Payload.ToObject<ChannelUpdateEvent>(_socketSerializer);
|
||||||
var channel = _channels[data.Id];
|
var channel = _channels[data.Id];
|
||||||
if (channel != null)
|
if (channel != null)
|
||||||
{
|
{
|
||||||
@@ -403,7 +405,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "CHANNEL_DELETE":
|
case "CHANNEL_DELETE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<ChannelDeleteEvent>(_serializer);
|
var data = e.Payload.ToObject<ChannelDeleteEvent>(_socketSerializer);
|
||||||
var channel = _channels.TryRemove(data.Id);
|
var channel = _channels.TryRemove(data.Id);
|
||||||
if (channel != null)
|
if (channel != null)
|
||||||
RaiseChannelDestroyed(channel);
|
RaiseChannelDestroyed(channel);
|
||||||
@@ -413,7 +415,7 @@ namespace Discord
|
|||||||
//Members
|
//Members
|
||||||
case "GUILD_MEMBER_ADD":
|
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);
|
var user = _users.GetOrAdd(data.User.Id, data.GuildId);
|
||||||
user.Update(data);
|
user.Update(data);
|
||||||
if (Config.TrackActivity)
|
if (Config.TrackActivity)
|
||||||
@@ -423,7 +425,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "GUILD_MEMBER_UPDATE":
|
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];
|
var user = _users[data.User.Id, data.GuildId];
|
||||||
if (user != null)
|
if (user != null)
|
||||||
{
|
{
|
||||||
@@ -434,7 +436,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "GUILD_MEMBER_REMOVE":
|
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);
|
var user = _users.TryRemove(data.UserId, data.GuildId);
|
||||||
if (user != null)
|
if (user != null)
|
||||||
RaiseUserLeft(user);
|
RaiseUserLeft(user);
|
||||||
@@ -442,7 +444,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "GUILD_MEMBERS_CHUNK":
|
case "GUILD_MEMBERS_CHUNK":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<MembersChunkEvent>(_serializer);
|
var data = e.Payload.ToObject<MembersChunkEvent>(_socketSerializer);
|
||||||
foreach (var memberData in data.Members)
|
foreach (var memberData in data.Members)
|
||||||
{
|
{
|
||||||
var user = _users.GetOrAdd(memberData.User.Id, memberData.GuildId);
|
var user = _users.GetOrAdd(memberData.User.Id, memberData.GuildId);
|
||||||
@@ -455,7 +457,7 @@ namespace Discord
|
|||||||
//Roles
|
//Roles
|
||||||
case "GUILD_ROLE_CREATE":
|
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);
|
var role = _roles.GetOrAdd(data.Data.Id, data.GuildId);
|
||||||
role.Update(data.Data);
|
role.Update(data.Data);
|
||||||
var server = _servers[data.GuildId];
|
var server = _servers[data.GuildId];
|
||||||
@@ -466,7 +468,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "GUILD_ROLE_UPDATE":
|
case "GUILD_ROLE_UPDATE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<RoleUpdateEvent>(_serializer);
|
var data = e.Payload.ToObject<RoleUpdateEvent>(_socketSerializer);
|
||||||
var role = _roles[data.Data.Id];
|
var role = _roles[data.Data.Id];
|
||||||
if (role != null)
|
if (role != null)
|
||||||
{
|
{
|
||||||
@@ -477,7 +479,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "GUILD_ROLE_DELETE":
|
case "GUILD_ROLE_DELETE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<RoleDeleteEvent>(_serializer);
|
var data = e.Payload.ToObject<RoleDeleteEvent>(_socketSerializer);
|
||||||
var role = _roles.TryRemove(data.RoleId);
|
var role = _roles.TryRemove(data.RoleId);
|
||||||
if (role != null)
|
if (role != null)
|
||||||
{
|
{
|
||||||
@@ -492,7 +494,7 @@ namespace Discord
|
|||||||
//Bans
|
//Bans
|
||||||
case "GUILD_BAN_ADD":
|
case "GUILD_BAN_ADD":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<BanAddEvent>(_serializer);
|
var data = e.Payload.ToObject<BanAddEvent>(_socketSerializer);
|
||||||
var server = _servers[data.GuildId];
|
var server = _servers[data.GuildId];
|
||||||
if (server != null)
|
if (server != null)
|
||||||
{
|
{
|
||||||
@@ -504,7 +506,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "GUILD_BAN_REMOVE":
|
case "GUILD_BAN_REMOVE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<BanRemoveEvent>(_serializer);
|
var data = e.Payload.ToObject<BanRemoveEvent>(_socketSerializer);
|
||||||
var server = _servers[data.GuildId];
|
var server = _servers[data.GuildId];
|
||||||
if (server != null)
|
if (server != null)
|
||||||
{
|
{
|
||||||
@@ -518,7 +520,7 @@ namespace Discord
|
|||||||
//Messages
|
//Messages
|
||||||
case "MESSAGE_CREATE":
|
case "MESSAGE_CREATE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<MessageCreateEvent>(_serializer);
|
var data = e.Payload.ToObject<MessageCreateEvent>(_socketSerializer);
|
||||||
Message msg = null;
|
Message msg = null;
|
||||||
|
|
||||||
bool isAuthor = data.Author.Id == _userId;
|
bool isAuthor = data.Author.Id == _userId;
|
||||||
@@ -545,7 +547,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "MESSAGE_UPDATE":
|
case "MESSAGE_UPDATE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<MessageUpdateEvent>(_serializer);
|
var data = e.Payload.ToObject<MessageUpdateEvent>(_socketSerializer);
|
||||||
var msg = _messages[data.Id];
|
var msg = _messages[data.Id];
|
||||||
if (msg != null)
|
if (msg != null)
|
||||||
{
|
{
|
||||||
@@ -556,7 +558,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "MESSAGE_DELETE":
|
case "MESSAGE_DELETE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<MessageDeleteEvent>(_serializer);
|
var data = e.Payload.ToObject<MessageDeleteEvent>(_socketSerializer);
|
||||||
var msg = _messages.TryRemove(data.Id);
|
var msg = _messages.TryRemove(data.Id);
|
||||||
if (msg != null)
|
if (msg != null)
|
||||||
RaiseMessageDeleted(msg);
|
RaiseMessageDeleted(msg);
|
||||||
@@ -564,7 +566,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "MESSAGE_ACK":
|
case "MESSAGE_ACK":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<MessageAckEvent>(_serializer);
|
var data = e.Payload.ToObject<MessageAckEvent>(_socketSerializer);
|
||||||
var msg = GetMessage(data.MessageId);
|
var msg = GetMessage(data.MessageId);
|
||||||
if (msg != null)
|
if (msg != null)
|
||||||
RaiseMessageReadRemotely(msg);
|
RaiseMessageReadRemotely(msg);
|
||||||
@@ -574,7 +576,7 @@ namespace Discord
|
|||||||
//Statuses
|
//Statuses
|
||||||
case "PRESENCE_UPDATE":
|
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);
|
var user = _users.GetOrAdd(data.User.Id, data.GuildId);
|
||||||
if (user != null)
|
if (user != null)
|
||||||
{
|
{
|
||||||
@@ -585,7 +587,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "TYPING_START":
|
case "TYPING_START":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<TypingStartEvent>(_serializer);
|
var data = e.Payload.ToObject<TypingStartEvent>(_socketSerializer);
|
||||||
var channel = _channels[data.ChannelId];
|
var channel = _channels[data.ChannelId];
|
||||||
if (channel != null)
|
if (channel != null)
|
||||||
{
|
{
|
||||||
@@ -611,7 +613,7 @@ namespace Discord
|
|||||||
//Voice
|
//Voice
|
||||||
case "VOICE_STATE_UPDATE":
|
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];
|
var user = _users[data.UserId, data.GuildId];
|
||||||
if (user != null)
|
if (user != null)
|
||||||
{
|
{
|
||||||
@@ -630,7 +632,7 @@ namespace Discord
|
|||||||
//Settings
|
//Settings
|
||||||
case "USER_UPDATE":
|
case "USER_UPDATE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<UserUpdateEvent>(_serializer);
|
var data = e.Payload.ToObject<UserUpdateEvent>(_socketSerializer);
|
||||||
var user = _globalUsers[data.Id];
|
var user = _globalUsers[data.Id];
|
||||||
if (user != null)
|
if (user != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ namespace Discord
|
|||||||
[JsonProperty]
|
[JsonProperty]
|
||||||
private IEnumerable<long> MentionedUserIds
|
private IEnumerable<long> MentionedUserIds
|
||||||
{
|
{
|
||||||
get { return MentionedUsers.Select(x => x.Id); }
|
get { return MentionedUsers?.Select(x => x.Id); }
|
||||||
set { MentionedUsers = value.Select(x => _client.GetUser(Server, x)).Where(x => x != null); }
|
set { MentionedUsers = value.Select(x => _client.GetUser(Server, x)).Where(x => x != null); }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,7 +133,7 @@ namespace Discord
|
|||||||
[JsonProperty]
|
[JsonProperty]
|
||||||
private IEnumerable<long> MentionedChannelIds
|
private IEnumerable<long> MentionedChannelIds
|
||||||
{
|
{
|
||||||
get { return MentionedChannels.Select(x => x.Id); }
|
get { return MentionedChannels?.Select(x => x.Id); }
|
||||||
set { MentionedChannels = value.Select(x => _client.GetChannel(x)).Where(x => x != null); }
|
set { MentionedChannels = value.Select(x => _client.GetChannel(x)).Where(x => x != null); }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,7 +143,7 @@ namespace Discord
|
|||||||
[JsonProperty]
|
[JsonProperty]
|
||||||
private IEnumerable<long> MentionedRoleIds
|
private IEnumerable<long> MentionedRoleIds
|
||||||
{
|
{
|
||||||
get { return MentionedRoles.Select(x => x.Id); }
|
get { return MentionedRoles?.Select(x => x.Id); }
|
||||||
set { MentionedRoles = value.Select(x => _client.GetRole(x)).Where(x => x != null); }
|
set { MentionedRoles = value.Select(x => _client.GetRole(x)).Where(x => x != null); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"System.Collections": "4.0.11-beta-23516",
|
"System.Collections": "4.0.11-beta-23516",
|
||||||
"System.Collections.Concurrent": "4.0.11-beta-23516",
|
"System.Collections.Concurrent": "4.0.11-beta-23516",
|
||||||
|
"System.Dynamic.Runtime": "4.0.11-beta-23516",
|
||||||
"System.IO.Compression": "4.1.0-beta-23516",
|
"System.IO.Compression": "4.1.0-beta-23516",
|
||||||
"System.Linq": "4.0.1-beta-23516",
|
"System.Linq": "4.0.1-beta-23516",
|
||||||
"System.Net.NameResolution": "4.0.0-beta-23516",
|
"System.Net.NameResolution": "4.0.0-beta-23516",
|
||||||
|
|||||||
Reference in New Issue
Block a user