diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index 6b826be50..afa728c5f 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -858,45 +858,33 @@ namespace Discord break; case "MESSAGE_UPDATE": { - if (Config.MessageCacheSize > 0) + var data = e.Payload.ToObject(_serializer); + var channel = GetChannel(data.ChannelId); + if (channel != null) { - var data = e.Payload.ToObject(_serializer); - var channel = GetChannel(data.ChannelId); - if (channel != null) - { - var msg = channel.GetMessage(data.Id); - if (msg != null) - { - msg.Update(data); - if (Config.LogEvents) - Logger.Info($"Message Update: {channel.Server?.Name ?? "[Private]"}/{channel.Name}"); - OnMessageUpdated(msg); - } - } - else - Logger.Warning("MESSAGE_UPDATE referenced an unknown channel."); + var msg = channel.GetMessage(data.Id, data.Author.Id); + msg.Update(data); + if (Config.LogEvents) + Logger.Info($"Message Update: {channel.Server?.Name ?? "[Private]"}/{channel.Name}"); + OnMessageUpdated(msg); } + else + Logger.Warning("MESSAGE_UPDATE referenced an unknown channel."); } break; case "MESSAGE_DELETE": { - if (Config.MessageCacheSize > 0) + var data = e.Payload.ToObject(_serializer); + var channel = GetChannel(data.ChannelId); + if (channel != null) { - var data = e.Payload.ToObject(_serializer); - var channel = GetChannel(data.ChannelId); - if (channel != null) - { - var msg = channel.RemoveMessage(data.Id); - if (msg != null) - { - if (Config.LogEvents) - Logger.Info($"Message Deleted: {channel.Server?.Name ?? "[Private]"}/{channel.Name}"); - OnMessageDeleted(msg); - } - } - else - Logger.Warning("MESSAGE_DELETE referenced an unknown channel."); + var msg = channel.RemoveMessage(data.Id); + if (Config.LogEvents) + Logger.Info($"Message Deleted: {channel.Server?.Name ?? "[Private]"}/{channel.Name}"); + OnMessageDeleted(msg); } + else + Logger.Warning("MESSAGE_DELETE referenced an unknown channel."); } break; case "MESSAGE_ACK": @@ -907,7 +895,7 @@ namespace Discord var channel = GetChannel(data.ChannelId); if (channel != null) { - var msg = channel.GetMessage(data.MessageId); + var msg = channel.GetMessage(data.MessageId, null); if (msg != null) { if (Config.LogEvents) diff --git a/src/Discord.Net/Models/Channel.cs b/src/Discord.Net/Models/Channel.cs index 99e23ca67..d6453f056 100644 --- a/src/Discord.Net/Models/Channel.cs +++ b/src/Discord.Net/Models/Channel.cs @@ -263,21 +263,25 @@ namespace Discord if (Client.Config.MessageCacheSize > 0) { Message msg; - _messages.TryRemove(id, out msg); - return msg; + if (_messages.TryRemove(id, out msg)) + return msg; } - return null; + return new Message(id, this, null); } public Message GetMessage(ulong id) + => GetMessage(id, null); + internal Message GetMessage(ulong id, ulong? userId) { - if (Client.Config.MessageCacheSize <= 0) - throw new InvalidOperationException("Unable to retrieve a message when the message cache is disabled."); - - Message result; - _messages.TryGetValue(id, out result); - return result; + if (Client.Config.MessageCacheSize > 0) + { + Message result; + if (_messages.TryGetValue(id, out result)) + return result; + } + return new Message(id, this, userId != null ? GetUser(userId.Value) : null); } + public async Task DownloadMessages(int limit = 100, ulong? relativeMessageId = null, RelativeDirection relativeDir = RelativeDirection.Before, bool useCache = true) { diff --git a/src/Discord.Net/Models/Message.cs b/src/Discord.Net/Models/Message.cs index 4aff9688a..799137ebb 100644 --- a/src/Discord.Net/Models/Message.cs +++ b/src/Discord.Net/Models/Message.cs @@ -206,7 +206,7 @@ namespace Discord /// Returns the server containing the channel this message was sent to. public Server Server => Channel.Server; /// Returns if this message was sent from the logged-in accounts. - public bool IsAuthor => User.Id == Client.CurrentUser?.Id; + public bool IsAuthor => User != null && User.Id == Client.CurrentUser?.Id; internal Message(ulong id, Channel channel, User user) { @@ -279,7 +279,7 @@ namespace Discord } if (model.IsMentioningEveryone != null) { - if (model.IsMentioningEveryone.Value && User.GetPermissions(channel).MentionEveryone) + if (model.IsMentioningEveryone.Value && User != null && User.GetPermissions(channel).MentionEveryone) MentionedRoles = new Role[] { Server.EveryoneRole }; else MentionedRoles = new Role[0]; @@ -360,6 +360,6 @@ namespace Discord public override bool Equals(object obj) => obj is Message && (obj as Message).Id == Id; public override int GetHashCode() => unchecked(Id.GetHashCode() + 9979); - public override string ToString() => $"{User}: {RawText}"; + public override string ToString() => $"{User?.Name ?? "Unknown User"}: {RawText}"; } }