From 21a63a43cca0a61d402561b2323d97647ce09273 Mon Sep 17 00:00:00 2001 From: rladenson Date: Mon, 25 Nov 2024 02:09:40 -0700 Subject: [PATCH] feat: decrement message counts on bulk message deletions --- PluralKit.Bot/Handlers/MessageDeleted.cs | 21 +++++++++++++++++++ .../Repository/ModelRepository.Member.cs | 12 +++++------ .../Repository/ModelRepository.Message.cs | 3 +++ 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/PluralKit.Bot/Handlers/MessageDeleted.cs b/PluralKit.Bot/Handlers/MessageDeleted.cs index 65bf06a6..10788ebd 100644 --- a/PluralKit.Bot/Handlers/MessageDeleted.cs +++ b/PluralKit.Bot/Handlers/MessageDeleted.cs @@ -63,6 +63,27 @@ public class MessageDeleted: IEventHandler, IEventHandler(); + foreach (PKMessage msg in messages) + { + if (!msg.Member.HasValue) continue; + if (memberMessageCounts.ContainsKey(msg.Member.Value)) + memberMessageCounts[msg.Member.Value] = memberMessageCounts[msg.Member.Value] + 1; + else + memberMessageCounts[msg.Member.Value] = 1; + } + + // go through each member id in dictionary and decrement that member's message count by appropriate amount + foreach (MemberId member in memberMessageCounts.Keys) + { + await _repo.UpdateMemberForDeletedMessage(member, (await _repo.GetMember(member)).MessageCount, memberMessageCounts[member]); + } + } _lastMessage.HandleMessageDeletion(evt.ChannelId, evt.Ids.ToList()); diff --git a/PluralKit.Core/Database/Repository/ModelRepository.Member.cs b/PluralKit.Core/Database/Repository/ModelRepository.Member.cs index 16a59909..b3fa498a 100644 --- a/PluralKit.Core/Database/Repository/ModelRepository.Member.cs +++ b/PluralKit.Core/Database/Repository/ModelRepository.Member.cs @@ -111,21 +111,21 @@ public partial class ModelRepository await _db.ExecuteQuery(query); } - public async Task UpdateMemberForDeletedMessage(MemberId id, int msgCount) + public async Task UpdateMemberForDeletedMessage(MemberId id, int msgCount, int numberToDecrement = 1) { if (msgCount <= 0) return; var query = new Query("members") - .When(msgCount > 1, - // when there are plenty of messages + .When(msgCount > numberToDecrement, + // when message count is higher than number we're removing q => q.AsUpdate(new { - message_count = new UnsafeLiteral("message_count - 1") + message_count = new UnsafeLiteral($"message_count - {numberToDecrement}") }), - // when this is the only message (if the db for some reason thinks there are no messages we already returned) + // when this is the only/last message(s) (if the db for some reason thinks there are no messages we already returned) q => q.AsUpdate(new { - message_count = new UnsafeLiteral("message_count - 1"), + message_count = 0, last_message_timestamp = new UnsafeLiteral("null") }) ) diff --git a/PluralKit.Core/Database/Repository/ModelRepository.Message.cs b/PluralKit.Core/Database/Repository/ModelRepository.Message.cs index 706e3a13..8a139283 100644 --- a/PluralKit.Core/Database/Repository/ModelRepository.Message.cs +++ b/PluralKit.Core/Database/Repository/ModelRepository.Message.cs @@ -26,6 +26,9 @@ public partial class ModelRepository public Task GetMessage(ulong id) => _db.QueryFirst(new Query("messages").Where("mid", id), messages: true); + public Task> GetMessagesBulk(IReadOnlyCollection ids) + => _db.Query(new Query("messages").WhereIn("mid", ids.Select(id => (long)id).ToArray())); + public async Task GetFullMessage(ulong id) { var rawMessage = await GetMessage(id);