Browse Source

Fixed exceptions during message importing

tags/docs-0.9
RogueException 9 years ago
parent
commit
ced88fefa3
4 changed files with 53 additions and 35 deletions
  1. +20
    -5
      src/Discord.Net/DiscordClient.Messages.cs
  2. +29
    -27
      src/Discord.Net/DiscordClient.cs
  3. +3
    -3
      src/Discord.Net/Models/Message.cs
  4. +1
    -0
      src/Discord.Net/project.json

+ 20
- 5
src/Discord.Net/DiscordClient.Messages.cs View File

@@ -1,7 +1,9 @@
using Discord.API;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
@@ -29,8 +31,8 @@ namespace Discord
return msg;
}
}
public void Import(Message[] messages)
=> Import(messages.ToDictionary(x => x.Id));
public void Import(Dictionary<long, Message> messages)
=> base.Import(messages);
}

public class MessageEventArgs : EventArgs
@@ -261,10 +263,23 @@ namespace Discord
public void ImportMessages(string json)
{
if (json == null) throw new ArgumentNullException(nameof(json));

var msgs = JsonConvert.DeserializeObject<Message[]>(json);
_messages.Import(msgs);
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 reader = x.CreateReader();
_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>
public string ExportMessages(Channel channel)
{


+ 29
- 27
src/Discord.Net/DiscordClient.cs View File

@@ -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)
{


+ 3
- 3
src/Discord.Net/Models/Message.cs View File

@@ -123,7 +123,7 @@ namespace Discord
[JsonProperty]
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); }
}

@@ -133,7 +133,7 @@ namespace Discord
[JsonProperty]
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); }
}

@@ -143,7 +143,7 @@ namespace Discord
[JsonProperty]
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); }
}



+ 1
- 0
src/Discord.Net/project.json View File

@@ -44,6 +44,7 @@
"dependencies": {
"System.Collections": "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.Linq": "4.0.1-beta-23516",
"System.Net.NameResolution": "4.0.0-beta-23516",


Loading…
Cancel
Save