diff --git a/PluralKit.Bot/Handlers/MessageDeleted.cs b/PluralKit.Bot/Handlers/MessageDeleted.cs index 408c363d..10788ebd 100644 --- a/PluralKit.Bot/Handlers/MessageDeleted.cs +++ b/PluralKit.Bot/Handlers/MessageDeleted.cs @@ -32,6 +32,16 @@ public class MessageDeleted: IEventHandler, 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.Bot/Handlers/ReactionAdded.cs b/PluralKit.Bot/Handlers/ReactionAdded.cs index 5caa7d6f..738e6d6b 100644 --- a/PluralKit.Bot/Handlers/ReactionAdded.cs +++ b/PluralKit.Bot/Handlers/ReactionAdded.cs @@ -141,8 +141,6 @@ public class ReactionAdded: 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/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/Repository/ModelRepository.Member.cs b/PluralKit.Core/Database/Repository/ModelRepository.Member.cs index 8a45d0e6..b3fa498a 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, int numberToDecrement = 1) + { + if (msgCount <= 0) return; + + var query = new Query("members") + .When(msgCount > numberToDecrement, + // when message count is higher than number we're removing + q => q.AsUpdate(new + { + message_count = new UnsafeLiteral($"message_count - {numberToDecrement}") + }), + // 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 = 0, + last_message_timestamp = new UnsafeLiteral("null") + }) + ) + .Where("id", id); + + await _db.ExecuteQuery(query); + } } \ No newline at end of file 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); 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)