| @@ -858,45 +858,33 @@ namespace Discord | |||||
| break; | break; | ||||
| case "MESSAGE_UPDATE": | case "MESSAGE_UPDATE": | ||||
| { | { | ||||
| if (Config.MessageCacheSize > 0) | |||||
| var data = e.Payload.ToObject<MessageUpdateEvent>(_serializer); | |||||
| var channel = GetChannel(data.ChannelId); | |||||
| if (channel != null) | |||||
| { | { | ||||
| var data = e.Payload.ToObject<MessageUpdateEvent>(_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; | break; | ||||
| case "MESSAGE_DELETE": | case "MESSAGE_DELETE": | ||||
| { | { | ||||
| if (Config.MessageCacheSize > 0) | |||||
| var data = e.Payload.ToObject<MessageDeleteEvent>(_serializer); | |||||
| var channel = GetChannel(data.ChannelId); | |||||
| if (channel != null) | |||||
| { | { | ||||
| var data = e.Payload.ToObject<MessageDeleteEvent>(_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; | break; | ||||
| case "MESSAGE_ACK": | case "MESSAGE_ACK": | ||||
| @@ -907,7 +895,7 @@ namespace Discord | |||||
| var channel = GetChannel(data.ChannelId); | var channel = GetChannel(data.ChannelId); | ||||
| if (channel != null) | if (channel != null) | ||||
| { | { | ||||
| var msg = channel.GetMessage(data.MessageId); | |||||
| var msg = channel.GetMessage(data.MessageId, null); | |||||
| if (msg != null) | if (msg != null) | ||||
| { | { | ||||
| if (Config.LogEvents) | if (Config.LogEvents) | ||||
| @@ -263,21 +263,25 @@ namespace Discord | |||||
| if (Client.Config.MessageCacheSize > 0) | if (Client.Config.MessageCacheSize > 0) | ||||
| { | { | ||||
| Message msg; | 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) | 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<Message[]> DownloadMessages(int limit = 100, ulong? relativeMessageId = null, | public async Task<Message[]> DownloadMessages(int limit = 100, ulong? relativeMessageId = null, | ||||
| RelativeDirection relativeDir = RelativeDirection.Before, bool useCache = true) | RelativeDirection relativeDir = RelativeDirection.Before, bool useCache = true) | ||||
| { | { | ||||
| @@ -206,7 +206,7 @@ namespace Discord | |||||
| /// <summary> Returns the server containing the channel this message was sent to. </summary> | /// <summary> Returns the server containing the channel this message was sent to. </summary> | ||||
| public Server Server => Channel.Server; | public Server Server => Channel.Server; | ||||
| /// <summary> Returns if this message was sent from the logged-in accounts. </summary> | /// <summary> Returns if this message was sent from the logged-in accounts. </summary> | ||||
| 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) | internal Message(ulong id, Channel channel, User user) | ||||
| { | { | ||||
| @@ -279,7 +279,7 @@ namespace Discord | |||||
| } | } | ||||
| if (model.IsMentioningEveryone != null) | 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 }; | MentionedRoles = new Role[] { Server.EveryoneRole }; | ||||
| else | else | ||||
| MentionedRoles = new Role[0]; | 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 bool Equals(object obj) => obj is Message && (obj as Message).Id == Id; | ||||
| public override int GetHashCode() => unchecked(Id.GetHashCode() + 9979); | public override int GetHashCode() => unchecked(Id.GetHashCode() + 9979); | ||||
| public override string ToString() => $"{User}: {RawText}"; | |||||
| public override string ToString() => $"{User?.Name ?? "Unknown User"}: {RawText}"; | |||||
| } | } | ||||
| } | } | ||||