diff --git a/src/Discord.Net/MessageQueue.cs b/src/Discord.Net/MessageQueue.cs index 7128f504d..59885d809 100644 --- a/src/Discord.Net/MessageQueue.cs +++ b/src/Discord.Net/MessageQueue.cs @@ -30,11 +30,11 @@ namespace Discord.Net private readonly Random _nonceRand; private readonly RestClient _rest; private readonly Logger _logger; - private readonly ConcurrentQueue _pendingSends; + private readonly ConcurrentQueue _pendingSends; private readonly ConcurrentQueue _pendingEdits; private readonly ConcurrentQueue _pendingDeletes; - private readonly ConcurrentDictionary _pendingSendsByNonce; - private readonly ConcurrentQueue _pendingTasks; + private readonly ConcurrentDictionary _pendingSendsByNonce; + //private readonly ConcurrentQueue _pendingTasks; private int _nextWarning; private int _count; @@ -47,11 +47,11 @@ namespace Discord.Net _logger = logger; _nonceRand = new Random(); - _pendingSends = new ConcurrentQueue(); + _pendingSends = new ConcurrentQueue(); _pendingEdits = new ConcurrentQueue(); _pendingDeletes = new ConcurrentQueue(); - _pendingSendsByNonce = new ConcurrentDictionary(); - _pendingTasks = new ConcurrentQueue(); + _pendingSendsByNonce = new ConcurrentDictionary(); + //_pendingTasks = new ConcurrentQueue(); } internal Message QueueSend(Channel channel, string text, bool isTTS) @@ -60,11 +60,11 @@ namespace Discord.Net msg.RawText = text; msg.Text = msg.Resolve(text); msg.Nonce = GenerateNonce(); - if (_pendingSendsByNonce.TryAdd(msg.Nonce, msg)) + if (_pendingSendsByNonce.TryAdd(msg.Nonce, text)) { msg.State = MessageState.Queued; IncrementCount(); - _pendingSends.Enqueue(msg.Nonce); + _pendingSends.Enqueue(msg); } else msg.State = MessageState.Failed; @@ -72,12 +72,15 @@ namespace Discord.Net } internal void QueueEdit(Message msg, string text) { + string msgText = msg.RawText; + if (msg.State == MessageState.Queued && _pendingSendsByNonce.TryUpdate(msg.Nonce, msgText, text)) + return; IncrementCount(); _pendingEdits.Enqueue(new MessageEdit(msg, text)); } internal void QueueDelete(Message msg) { - Message ignored; + string ignored; if (msg.State == MessageState.Queued && _pendingSendsByNonce.TryRemove(msg.Nonce, out ignored)) { //Successfully stopped the message from being sent in the first place @@ -95,7 +98,7 @@ namespace Discord.Net RunSendQueue(cancelToken), RunEditQueue(cancelToken), RunDeleteQueue(cancelToken), - RunTaskQueue(cancelToken) + //RunTaskQueue(cancelToken) }; } private Task RunSendQueue(CancellationToken cancelToken) @@ -107,12 +110,16 @@ namespace Discord.Net { while (!cancelToken.IsCancellationRequested) { - int nonce; - while (_pendingSends.TryDequeue(out nonce)) + Message msg; + while (_pendingSends.TryDequeue(out msg)) { - Message msg; - if (_pendingSendsByNonce.TryRemove(nonce, out msg)) //If it was delete from queue, this will fail + string text; + if (_pendingSendsByNonce.TryRemove(msg.Nonce, out text)) //If it was delete from queue, this will fail + { + msg.RawText = text; + msg.Text = msg.Resolve(text); await Send(msg).ConfigureAwait(false); + } } await Task.Delay((int)Discord.DiscordConfig.MessageQueueInterval).ConfigureAwait(false); @@ -135,7 +142,7 @@ namespace Discord.Net { _pendingEdits.TryDequeue(out edit); if (edit.Message.State == MessageState.Normal) - await Edit(edit.Message, edit.NewText); + await Edit(edit.Message, edit.NewText).ConfigureAwait(false); } await Task.Delay((int)Discord.DiscordConfig.MessageQueueInterval).ConfigureAwait(false); @@ -158,7 +165,7 @@ namespace Discord.Net { _pendingDeletes.TryDequeue(out msg); if (msg.State == MessageState.Normal) - _pendingTasks.Enqueue(Delete(msg)); + await Delete(msg).ConfigureAwait(false); } await Task.Delay((int)Discord.DiscordConfig.MessageQueueInterval).ConfigureAwait(false); @@ -167,7 +174,7 @@ namespace Discord.Net catch (OperationCanceledException) { } })); } - private Task RunTaskQueue(CancellationToken cancelToken) + /*private Task RunTaskQueue(CancellationToken cancelToken) { return Task.Run(async () => { @@ -190,7 +197,7 @@ namespace Discord.Net await task.ConfigureAwait(false); } }); - } + }*/ internal async Task Send(Message msg) { @@ -263,14 +270,13 @@ namespace Discord.Net /// Clears all queued message sends/edits/deletes. public void Clear() { - int nonce; - while (_pendingSends.TryDequeue(out nonce)) { } - + Message msg; MessageEdit edit; - while (_pendingEdits.TryDequeue(out edit)) { } - Message msg; + while (_pendingSends.TryDequeue(out msg)) { } + while (_pendingEdits.TryDequeue(out edit)) { } while (_pendingDeletes.TryDequeue(out msg)) { } + _pendingSendsByNonce.Clear(); } private int GenerateNonce()