2021-08-27 11:03:47 -04:00
|
|
|
#nullable enable
|
2021-05-03 10:29:22 +02:00
|
|
|
using System.Collections.Concurrent;
|
2020-02-12 14:21:48 +01:00
|
|
|
|
2021-03-22 07:07:33 +00:00
|
|
|
using Myriad.Types;
|
|
|
|
|
2021-11-26 21:10:56 -05:00
|
|
|
namespace PluralKit.Bot;
|
|
|
|
|
|
|
|
public class LastMessageCacheService
|
2020-02-12 14:21:48 +01:00
|
|
|
{
|
2021-11-26 21:10:56 -05:00
|
|
|
private readonly IDictionary<ulong, CacheEntry> _cache = new ConcurrentDictionary<ulong, CacheEntry>();
|
|
|
|
|
|
|
|
public void AddMessage(Message msg)
|
2020-02-12 14:21:48 +01:00
|
|
|
{
|
2021-11-26 21:10:56 -05:00
|
|
|
var previous = GetLastMessage(msg.ChannelId);
|
|
|
|
var current = ToCachedMessage(msg);
|
|
|
|
_cache[msg.ChannelId] = new CacheEntry(current, previous?.Current);
|
|
|
|
}
|
2021-08-03 13:44:22 -04:00
|
|
|
|
2021-11-26 21:10:56 -05:00
|
|
|
private CachedMessage ToCachedMessage(Message msg) =>
|
|
|
|
new(msg.Id, msg.ReferencedMessage.Value?.Id, msg.Author.Username);
|
2021-08-03 13:44:22 -04:00
|
|
|
|
2021-11-26 21:10:56 -05:00
|
|
|
public CacheEntry? GetLastMessage(ulong channel) =>
|
|
|
|
_cache.TryGetValue(channel, out var message) ? message : null;
|
|
|
|
|
|
|
|
public void HandleMessageDeletion(ulong channel, ulong message)
|
|
|
|
{
|
|
|
|
var storedMessage = GetLastMessage(channel);
|
|
|
|
if (storedMessage == null)
|
|
|
|
return;
|
2021-08-03 13:44:22 -04:00
|
|
|
|
2021-11-26 21:10:56 -05:00
|
|
|
if (message == storedMessage.Current.Id)
|
|
|
|
if (storedMessage.Previous != null)
|
|
|
|
_cache[channel] = new CacheEntry(storedMessage.Previous, null);
|
|
|
|
else
|
|
|
|
_cache.Remove(channel);
|
|
|
|
else if (message == storedMessage.Previous?.Id)
|
|
|
|
_cache[channel] = new CacheEntry(storedMessage.Current, null);
|
|
|
|
}
|
2021-08-03 13:44:22 -04:00
|
|
|
|
2021-11-26 21:10:56 -05:00
|
|
|
public void HandleMessageDeletion(ulong channel, List<ulong> messages)
|
|
|
|
{
|
|
|
|
var storedMessage = GetLastMessage(channel);
|
|
|
|
if (storedMessage == null)
|
|
|
|
return;
|
2021-08-03 13:44:22 -04:00
|
|
|
|
2021-11-26 21:10:56 -05:00
|
|
|
if (!(messages.Contains(storedMessage.Current.Id) ||
|
|
|
|
storedMessage.Previous != null && messages.Contains(storedMessage.Previous.Id)))
|
|
|
|
// none of the deleted messages are relevant to the cache
|
|
|
|
return;
|
2021-08-03 13:44:22 -04:00
|
|
|
|
2021-11-26 21:10:56 -05:00
|
|
|
ulong? newLastMessage = null;
|
|
|
|
|
|
|
|
if (messages.Contains(storedMessage.Current.Id))
|
|
|
|
newLastMessage = storedMessage.Previous?.Id;
|
|
|
|
|
|
|
|
if (storedMessage.Previous != null && messages.Contains(storedMessage.Previous.Id))
|
|
|
|
if (newLastMessage == storedMessage.Previous?.Id)
|
|
|
|
{
|
|
|
|
newLastMessage = null;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_cache[channel] = new CacheEntry(storedMessage.Current, null);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (newLastMessage == null)
|
|
|
|
_cache.Remove(channel);
|
2020-02-12 14:21:48 +01:00
|
|
|
}
|
2021-11-26 21:10:56 -05:00
|
|
|
}
|
2021-03-22 07:07:33 +00:00
|
|
|
|
2021-11-26 21:10:56 -05:00
|
|
|
public record CacheEntry(CachedMessage Current, CachedMessage? Previous);
|
2021-08-08 21:56:24 +02:00
|
|
|
|
2021-11-26 21:10:56 -05:00
|
|
|
public record CachedMessage(ulong Id, ulong? ReferencedMessage, string AuthorUsername);
|