mirror of
https://github.com/PluralKit/PluralKit.git
synced 2026-02-04 13:06:50 +00:00
Merge 21a63a43cc into da4c05d4ed
This commit is contained in:
commit
2bdcc1d3c0
6 changed files with 65 additions and 3 deletions
|
|
@ -32,6 +32,16 @@ public class MessageDeleted: IEventHandler<MessageDeleteEvent>, IEventHandler<Me
|
|||
async Task Inner()
|
||||
{
|
||||
await Task.Delay(MessageDeleteDelay);
|
||||
|
||||
var message = await _repo.GetMessage(evt.Id);
|
||||
if (message == null) return;
|
||||
|
||||
if (message.Member.HasValue)
|
||||
{
|
||||
var memberFull = await _repo.GetMember(message.Member.Value);
|
||||
await _repo.UpdateMemberForDeletedMessage(message.Member.Value, memberFull.MessageCount);
|
||||
}
|
||||
|
||||
await _repo.DeleteMessage(evt.Id);
|
||||
}
|
||||
|
||||
|
|
@ -53,6 +63,27 @@ public class MessageDeleted: IEventHandler<MessageDeleteEvent>, IEventHandler<Me
|
|||
_logger.Information("Bulk deleting {Count} messages in channel {Channel}",
|
||||
evt.Ids.Length, evt.ChannelId);
|
||||
await _repo.DeleteMessagesBulk(evt.Ids);
|
||||
|
||||
// get all the messages from the database
|
||||
var messages = await _repo.GetMessagesBulk(evt.Ids);
|
||||
|
||||
// make a dictionary of every member id associated with a message and how many messages it's associated with
|
||||
var memberMessageCounts = new Dictionary<MemberId, int>();
|
||||
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());
|
||||
|
|
|
|||
|
|
@ -141,8 +141,6 @@ public class ReactionAdded: IEventHandler<MessageReactionAddEvent>
|
|||
{
|
||||
// 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)
|
||||
|
|
|
|||
7
PluralKit.Core/Database/Migrations/49.sql
Normal file
7
PluralKit.Core/Database/Migrations/49.sql
Normal file
|
|
@ -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;
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -26,6 +26,9 @@ public partial class ModelRepository
|
|||
public Task<PKMessage?> GetMessage(ulong id)
|
||||
=> _db.QueryFirst<PKMessage?>(new Query("messages").Where("mid", id), messages: true);
|
||||
|
||||
public Task<IEnumerable<PKMessage>> GetMessagesBulk(IReadOnlyCollection<ulong> ids)
|
||||
=> _db.Query<PKMessage>(new Query("messages").WhereIn("mid", ids.Select(id => (long)id).ToArray()));
|
||||
|
||||
public async Task<FullMessage?> GetFullMessage(ulong id)
|
||||
{
|
||||
var rawMessage = await GetMessage(id);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue