From 5d86814415824e54093d11a150b70e71427e8214 Mon Sep 17 00:00:00 2001 From: rladenson Date: Sun, 24 Nov 2024 22:09:05 -0700 Subject: [PATCH 1/3] fix: remove unused database functions --- PluralKit.Core/Database/Migrations/49.sql | 7 +++++++ PluralKit.Core/Database/Utils/DatabaseMigrator.cs | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 PluralKit.Core/Database/Migrations/49.sql diff --git a/PluralKit.Core/Database/Migrations/49.sql b/PluralKit.Core/Database/Migrations/49.sql new file mode 100644 index 00000000..51b4bda8 --- /dev/null +++ b/PluralKit.Core/Database/Migrations/49.sql @@ -0,0 +1,7 @@ +-- database version 47 +-- remove unused functions + +drop function trg_msgcount_decrement cascade; +drop function trg_msgcount_increment cascade; + +update info set schema_version = 49; diff --git a/PluralKit.Core/Database/Utils/DatabaseMigrator.cs b/PluralKit.Core/Database/Utils/DatabaseMigrator.cs index 0aea679a..4e212d46 100644 --- a/PluralKit.Core/Database/Utils/DatabaseMigrator.cs +++ b/PluralKit.Core/Database/Utils/DatabaseMigrator.cs @@ -9,7 +9,7 @@ namespace PluralKit.Core; internal class DatabaseMigrator { private const string RootPath = "PluralKit.Core.Database"; // "resource path" root for SQL files - private const int TargetSchemaVersion = 48; + private const int TargetSchemaVersion = 49; private readonly ILogger _logger; public DatabaseMigrator(ILogger logger) From 71dd59b57dd174bce8142b9c716da7492dabe37a Mon Sep 17 00:00:00 2001 From: rladenson Date: Mon, 25 Nov 2024 02:06:27 -0700 Subject: [PATCH 2/3] feat: decrement message counts when messages deleted --- PluralKit.Bot/Handlers/MessageDeleted.cs | 10 ++++++++ PluralKit.Bot/Handlers/ReactionAdded.cs | 2 -- .../Repository/ModelRepository.Member.cs | 23 +++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/PluralKit.Bot/Handlers/MessageDeleted.cs b/PluralKit.Bot/Handlers/MessageDeleted.cs index 408c363d..65bf06a6 100644 --- a/PluralKit.Bot/Handlers/MessageDeleted.cs +++ b/PluralKit.Bot/Handlers/MessageDeleted.cs @@ -32,6 +32,16 @@ public class MessageDeleted: IEventHandler, IEventHandler { // Message was deleted by something/someone else before we got to it } - - await _repo.DeleteMessage(evt.MessageId); } private async ValueTask HandleCommandDeleteReaction(MessageReactionAddEvent evt, ulong? authorId, bool isDM) diff --git a/PluralKit.Core/Database/Repository/ModelRepository.Member.cs b/PluralKit.Core/Database/Repository/ModelRepository.Member.cs index 8a45d0e6..16a59909 100644 --- a/PluralKit.Core/Database/Repository/ModelRepository.Member.cs +++ b/PluralKit.Core/Database/Repository/ModelRepository.Member.cs @@ -110,4 +110,27 @@ public partial class ModelRepository await _db.ExecuteQuery(query); } + + public async Task UpdateMemberForDeletedMessage(MemberId id, int msgCount) + { + if (msgCount <= 0) return; + + var query = new Query("members") + .When(msgCount > 1, + // when there are plenty of messages + q => q.AsUpdate(new + { + message_count = new UnsafeLiteral("message_count - 1") + }), + // when this is the only message (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"), + last_message_timestamp = new UnsafeLiteral("null") + }) + ) + .Where("id", id); + + await _db.ExecuteQuery(query); + } } \ No newline at end of file From 21a63a43cca0a61d402561b2323d97647ce09273 Mon Sep 17 00:00:00 2001 From: rladenson Date: Mon, 25 Nov 2024 02:09:40 -0700 Subject: [PATCH 3/3] 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);