@@ -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}"; | |||||
} | } | ||||
} | } |