Fix Discord merging webhook messages with same username

Closes #33.
This commit is contained in:
spiral
2021-08-03 13:44:22 -04:00
parent c691adf8c9
commit 25f96dd920
3 changed files with 102 additions and 6 deletions

View File

@@ -1,6 +1,7 @@
#nullable enable
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using Myriad.Types;
@@ -13,14 +14,58 @@ namespace PluralKit.Bot
public void AddMessage(Message msg)
{
_cache[msg.ChannelId] = new CachedMessage(msg.Id, msg.ReferencedMessage.Value?.Id);
var previous = GetLastMessage(msg.ChannelId);
_cache[msg.ChannelId] = new CachedMessage(msg.Id, msg.ReferencedMessage.Value?.Id, previous?.Id);
}
public CachedMessage? GetLastMessage(ulong channel)
{
return _cache.TryGetValue(channel, out var message) ? message : null;
}
public void HandleMessageDeletion(ulong channel, ulong message)
{
var storedMessage = GetLastMessage(channel);
if (storedMessage == null)
return;
if (message == storedMessage.Id)
if (storedMessage.Previous != null)
_cache[channel] = new CachedMessage(storedMessage.Previous.Value, null, null);
else
_cache.Remove(channel);
else if (message == storedMessage.Previous)
_cache[channel] = new CachedMessage(storedMessage.Id, storedMessage.ReferencedMessage, null);
}
public void HandleMessageDeletion(ulong channel, List<ulong> messages)
{
var storedMessage = GetLastMessage(channel);
if (storedMessage == null)
return;
if (!(messages.Contains(storedMessage.Id) || (storedMessage.Previous != null && messages.Contains(storedMessage.Previous.Value))))
// none of the deleted messages are relevant to the cache
return;
ulong? newLastMessage = null;
if (messages.Contains(storedMessage.Id))
newLastMessage = storedMessage.Previous;
if (storedMessage.Previous != null && messages.Contains(storedMessage.Previous.Value))
if (newLastMessage == storedMessage.Previous)
newLastMessage = null;
else
{
_cache[channel] = new CachedMessage(storedMessage.Id, storedMessage.ReferencedMessage, null);
return;
}
if (newLastMessage == null)
_cache.Remove(channel);
}
}
public record CachedMessage(ulong Id, ulong? ReferencedMessage);
public record CachedMessage(ulong Id, ulong? ReferencedMessage, ulong? Previous);
}