Fixed several message queue issues.
This commit is contained in:
@@ -10,11 +10,22 @@ namespace Discord
|
|||||||
{
|
{
|
||||||
internal sealed class Messages : AsyncCollection<Message>
|
internal sealed class Messages : AsyncCollection<Message>
|
||||||
{
|
{
|
||||||
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()) { }
|
: base(client, writerLock, x => x.OnCached(), x => x.OnUncached()) { }
|
||||||
|
|
||||||
public Message GetOrAdd(string id, string channelId, string userId)
|
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
|
public class MessageEventArgs : EventArgs
|
||||||
@@ -103,10 +114,7 @@ namespace Discord
|
|||||||
if (Config.UseMessageQueue)
|
if (Config.UseMessageQueue)
|
||||||
{
|
{
|
||||||
var nonce = GenerateNonce();
|
var nonce = GenerateNonce();
|
||||||
if (_messages != null)
|
msg = _messages.GetOrAdd("nonce_" + nonce, channel.Id, _userId);
|
||||||
msg = _messages.GetOrAdd("nonce_" + nonce, channel.Id, _userId);
|
|
||||||
else
|
|
||||||
msg = new Message(this, "nonce_" + nonce, channel.Id, _userId);
|
|
||||||
var currentUser = msg.Member;
|
var currentUser = msg.Member;
|
||||||
msg.Update(new MessageInfo
|
msg.Update(new MessageInfo
|
||||||
{
|
{
|
||||||
@@ -124,10 +132,7 @@ namespace Discord
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
var model = await _api.SendMessage(channel.Id, text, userIds, null, isTextToSpeech).ConfigureAwait(false);
|
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);
|
||||||
msg = _messages.GetOrAdd(model.Id, channel.Id, model.Author.Id);
|
|
||||||
else
|
|
||||||
msg = new Message(this, model.Id, channel.Id, _userId);
|
|
||||||
msg.Update(model);
|
msg.Update(model);
|
||||||
RaiseMessageSent(msg);
|
RaiseMessageSent(msg);
|
||||||
}
|
}
|
||||||
@@ -160,32 +165,29 @@ namespace Discord
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Deletes the provided message. </summary>
|
/// <summary> Deletes the provided message. </summary>
|
||||||
public async Task DeleteMessage(Message message)
|
public Task DeleteMessage(Message message)
|
||||||
{
|
{
|
||||||
if (message == null) throw new ArgumentNullException(nameof(message));
|
if (message == null) throw new ArgumentNullException(nameof(message));
|
||||||
CheckReady();
|
CheckReady();
|
||||||
|
|
||||||
try
|
return DeleteMessageInternal(message);
|
||||||
{
|
}
|
||||||
await _api.DeleteMessage(message.Id, message.Channel.Id).ConfigureAwait(false);
|
|
||||||
_messages.TryRemove(message.Id);
|
|
||||||
}
|
|
||||||
catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { }
|
|
||||||
}
|
|
||||||
public async Task DeleteMessages(IEnumerable<Message> messages)
|
public async Task DeleteMessages(IEnumerable<Message> messages)
|
||||||
{
|
{
|
||||||
if (messages == null) throw new ArgumentNullException(nameof(messages));
|
if (messages == null) throw new ArgumentNullException(nameof(messages));
|
||||||
CheckReady();
|
CheckReady();
|
||||||
|
|
||||||
foreach (var message in messages)
|
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);
|
||||||
await _api.DeleteMessage(message.Id, message.Channel.Id).ConfigureAwait(false);
|
|
||||||
_messages.TryRemove(message.Id);
|
|
||||||
}
|
|
||||||
catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { }
|
|
||||||
}
|
}
|
||||||
|
catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Downloads last count messages from the server, starting at beforeMessageId if it's provided. </summary>
|
/// <summary> Downloads last count messages from the server, starting at beforeMessageId if it's provided. </summary>
|
||||||
@@ -204,15 +206,10 @@ namespace Discord
|
|||||||
return msgs.Select(x =>
|
return msgs.Select(x =>
|
||||||
{
|
{
|
||||||
Message msg = null;
|
Message msg = null;
|
||||||
if (_messages != null)
|
if (cache)
|
||||||
{
|
msg = _messages.GetOrAdd(x.Id, x.ChannelId, x.Author.Id);
|
||||||
if (cache && _messages != null)
|
else
|
||||||
msg = _messages.GetOrAdd(x.Id, x.ChannelId, x.Author.Id);
|
msg = _messages[x.Id] ?? new Message(this, 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);
|
|
||||||
msg.Update(x);
|
msg.Update(x);
|
||||||
if (Config.TrackActivity)
|
if (Config.TrackActivity)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ namespace Discord
|
|||||||
object cacheLock = new object();
|
object cacheLock = new object();
|
||||||
_channels = new Channels(this, cacheLock);
|
_channels = new Channels(this, cacheLock);
|
||||||
_members = new Members(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);
|
_roles = new Roles(this, cacheLock);
|
||||||
_servers = new Servers(this, cacheLock);
|
_servers = new Servers(this, cacheLock);
|
||||||
_users = new Users(this, cacheLock);
|
_users = new Users(this, cacheLock);
|
||||||
@@ -482,25 +482,9 @@ namespace Discord
|
|||||||
Message msg = null;
|
Message msg = null;
|
||||||
|
|
||||||
bool isAuthor = data.Author.Id == _userId;
|
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 (msg == null)
|
||||||
{
|
msg = _messages.GetOrAdd(data.Id, data.ChannelId, data.Author.Id);
|
||||||
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.Update(data);
|
msg.Update(data);
|
||||||
if (Config.TrackActivity)
|
if (Config.TrackActivity)
|
||||||
{
|
{
|
||||||
@@ -513,12 +497,10 @@ namespace Discord
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RaiseMessageCreated(msg);
|
||||||
|
|
||||||
if (Config.AckMessages && !isAuthor)
|
if (Config.AckMessages && !isAuthor)
|
||||||
await _api.AckMessage(data.Id, data.ChannelId);
|
await _api.AckMessage(data.Id, data.ChannelId);
|
||||||
|
|
||||||
if (hasFinishedSending)
|
|
||||||
RaiseMessageSent(msg);
|
|
||||||
RaiseMessageCreated(msg);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "MESSAGE_UPDATE":
|
case "MESSAGE_UPDATE":
|
||||||
|
|||||||
Reference in New Issue
Block a user