Fire Message events and enable GetMessage even if cache is disabled. Add Message.User null checks.

This commit is contained in:
RogueException
2016-01-07 02:29:03 -04:00
parent e600cdc999
commit cea8708dfb
3 changed files with 36 additions and 44 deletions

View File

@@ -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 msg = channel.GetMessage(data.Id, data.Author.Id);
var channel = GetChannel(data.ChannelId); msg.Update(data);
if (channel != null) if (Config.LogEvents)
{ Logger.Info($"Message Update: {channel.Server?.Name ?? "[Private]"}/{channel.Name}");
var msg = channel.GetMessage(data.Id); OnMessageUpdated(msg);
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.");
} }
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 msg = channel.RemoveMessage(data.Id);
var channel = GetChannel(data.ChannelId); if (Config.LogEvents)
if (channel != null) Logger.Info($"Message Deleted: {channel.Server?.Name ?? "[Private]"}/{channel.Name}");
{ OnMessageDeleted(msg);
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.");
} }
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)

View File

@@ -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); if (_messages.TryRemove(id, out msg))
return 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) if (Client.Config.MessageCacheSize > 0)
throw new InvalidOperationException("Unable to retrieve a message when the message cache is disabled."); {
Message result;
Message result; if (_messages.TryGetValue(id, out result))
_messages.TryGetValue(id, out result); return 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)
{ {

View File

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