From 98b64ced73f53d8b03e29e7458609e93d15d90d8 Mon Sep 17 00:00:00 2001 From: RogueException Date: Sat, 24 Oct 2015 22:33:37 -0300 Subject: [PATCH] Fixed several message queue issues. --- src/Discord.Net/DiscordClient.Messages.cs | 63 +++++++++++------------ src/Discord.Net/DiscordClient.cs | 26 ++-------- 2 files changed, 34 insertions(+), 55 deletions(-) diff --git a/src/Discord.Net/DiscordClient.Messages.cs b/src/Discord.Net/DiscordClient.Messages.cs index 79ccd7400..92f36a5fe 100644 --- a/src/Discord.Net/DiscordClient.Messages.cs +++ b/src/Discord.Net/DiscordClient.Messages.cs @@ -10,11 +10,22 @@ namespace Discord { internal sealed class Messages : AsyncCollection { - public Messages(DiscordClient client, object writerLock) + private bool _isEnabled; + + public Messages(DiscordClient client, object writerLock, bool isEnabled) : base(client, writerLock, x => x.OnCached(), x => x.OnUncached()) { } public Message GetOrAdd(string id, string channelId, string userId) - => GetOrAdd(id, () => new Message(_client, id, channelId, userId)); + { + if (_isEnabled) + return GetOrAdd(id, () => new Message(_client, id, channelId, userId)); + else + { + var msg = new Message(_client, id, channelId, userId); + msg.Cache(); //Creates references to channel/server + return msg; + } + } } public class MessageEventArgs : EventArgs @@ -103,10 +114,7 @@ namespace Discord if (Config.UseMessageQueue) { var nonce = GenerateNonce(); - if (_messages != null) - msg = _messages.GetOrAdd("nonce_" + nonce, channel.Id, _userId); - else - msg = new Message(this, "nonce_" + nonce, channel.Id, _userId); + msg = _messages.GetOrAdd("nonce_" + nonce, channel.Id, _userId); var currentUser = msg.Member; msg.Update(new MessageInfo { @@ -124,10 +132,7 @@ namespace Discord else { var model = await _api.SendMessage(channel.Id, text, userIds, null, isTextToSpeech).ConfigureAwait(false); - if (_messages != null) - msg = _messages.GetOrAdd(model.Id, channel.Id, model.Author.Id); - else - msg = new Message(this, model.Id, channel.Id, _userId); + msg = _messages.GetOrAdd(model.Id, channel.Id, model.Author.Id); msg.Update(model); RaiseMessageSent(msg); } @@ -160,32 +165,29 @@ namespace Discord } /// Deletes the provided message. - public async Task DeleteMessage(Message message) + public Task DeleteMessage(Message message) { if (message == null) throw new ArgumentNullException(nameof(message)); CheckReady(); - try - { - await _api.DeleteMessage(message.Id, message.Channel.Id).ConfigureAwait(false); - _messages.TryRemove(message.Id); - } - catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } - } + return DeleteMessageInternal(message); + } public async Task DeleteMessages(IEnumerable messages) { if (messages == null) throw new ArgumentNullException(nameof(messages)); CheckReady(); foreach (var message in messages) + await DeleteMessageInternal(message); + } + private async Task DeleteMessageInternal(Message message) + { + try { - try - { - await _api.DeleteMessage(message.Id, message.Channel.Id).ConfigureAwait(false); - _messages.TryRemove(message.Id); - } - catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } + await _api.DeleteMessage(message.Id, message.Channel.Id).ConfigureAwait(false); + _messages.TryRemove(message.Id); } + catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } } /// Downloads last count messages from the server, starting at beforeMessageId if it's provided. @@ -204,15 +206,10 @@ namespace Discord return msgs.Select(x => { Message msg = null; - if (_messages != null) - { - if (cache && _messages != null) - msg = _messages.GetOrAdd(x.Id, x.ChannelId, x.Author.Id); - else - msg = _messages[x.Id]; - } - if (msg == null) - msg = new Message(this, x.Id, x.ChannelId, x.Author.Id); + if (cache) + msg = _messages.GetOrAdd(x.Id, x.ChannelId, x.Author.Id); + else + msg = _messages[x.Id] ?? new Message(this, x.Id, x.ChannelId, x.Author.Id); msg.Update(x); if (Config.TrackActivity) { diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index bd9c7fee0..aefe3d85b 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -44,7 +44,7 @@ namespace Discord object cacheLock = new object(); _channels = new Channels(this, cacheLock); _members = new Members(this, cacheLock); - _messages = new Messages(this, cacheLock); + _messages = new Messages(this, cacheLock, Config.MessageCacheLength > 0); _roles = new Roles(this, cacheLock); _servers = new Servers(this, cacheLock); _users = new Users(this, cacheLock); @@ -482,25 +482,9 @@ namespace Discord Message msg = null; bool isAuthor = data.Author.Id == _userId; - bool hasFinishedSending = false; - if (Config.UseMessageQueue && isAuthor && data.Nonce != null) - { - msg = _messages.Remap("nonce" + data.Nonce, data.Id); - if (msg != null) - { - msg.IsQueued = false; - msg.Id = data.Id; - hasFinishedSending = true; - } - } if (msg == null) - { - if (_messages != null) - msg = _messages.GetOrAdd(data.Id, data.ChannelId, data.Author.Id); - else - msg = new Message(this, data.Id, data.ChannelId, data.Author.Id); - } + msg = _messages.GetOrAdd(data.Id, data.ChannelId, data.Author.Id); msg.Update(data); if (Config.TrackActivity) { @@ -513,12 +497,10 @@ namespace Discord } } + RaiseMessageCreated(msg); + if (Config.AckMessages && !isAuthor) await _api.AckMessage(data.Id, data.ChannelId); - - if (hasFinishedSending) - RaiseMessageSent(msg); - RaiseMessageCreated(msg); } break; case "MESSAGE_UPDATE":