diff --git a/PluralKit.Bot/CommandSystem/Context.cs b/PluralKit.Bot/CommandSystem/Context.cs index ec790b16..db1b6975 100644 --- a/PluralKit.Bot/CommandSystem/Context.cs +++ b/PluralKit.Bot/CommandSystem/Context.cs @@ -104,7 +104,7 @@ namespace PluralKit.Bot { // Sensitive information that might want to be deleted by :x: reaction is typically in an embed format (member cards, for example) // This may need to be changed at some point but works well enough for now - await _commandMessageService.RegisterMessage(msg.Id, Author.Id); + await _commandMessageService.RegisterMessage(msg.Id, msg.ChannelId, Author.Id); } return msg; diff --git a/PluralKit.Bot/Commands/Message.cs b/PluralKit.Bot/Commands/Message.cs index 1dfbcf59..af177f01 100644 --- a/PluralKit.Bot/Commands/Message.cs +++ b/PluralKit.Bot/Commands/Message.cs @@ -127,10 +127,21 @@ namespace PluralKit.Bot throw new PKSyntaxError($"Could not parse {ctx.PeekArgument().AsCode()} as a message ID or link."); } - var message = await _db.Execute(c => _repo.GetMessage(c, messageId.Value)); - if (message == null) throw Errors.MessageNotFound(messageId.Value); + var isDelete = ctx.Match("delete") || ctx.MatchFlag("delete"); - if (ctx.Match("delete") || ctx.MatchFlag("delete")) + var message = await _db.Execute(c => _repo.GetMessage(c, messageId.Value)); + if (message == null) + { + if (isDelete) + { + await DeleteCommandMessage(ctx, messageId.Value); + return; + } + else + throw Errors.MessageNotFound(messageId.Value); + } + + if (isDelete) { if (message.System.Id != ctx.System.Id) throw new PKError("You can only delete your own messages."); @@ -154,5 +165,22 @@ namespace PluralKit.Bot await ctx.Reply(embed: await _embeds.CreateMessageInfoEmbed(message)); } + + private async Task DeleteCommandMessage(Context ctx, ulong messageId) + { + var message = await _db.Execute(conn => _repo.GetCommandMessage(conn, messageId)); + if (message == null) + throw Errors.MessageNotFound(messageId); + + if (message.AuthorId != ctx.Author.Id) + throw new PKError("You can only delete command messages queried by this account."); + + await ctx.Rest.DeleteMessage(message.ChannelId, message.MessageId); + + if (ctx.Guild != null) + await ctx.Rest.DeleteMessage(ctx.Message); + else + await ctx.Rest.CreateReaction(ctx.Message.ChannelId, ctx.Message.Id, new() { Name = Emojis.Success }); + } } } \ No newline at end of file diff --git a/PluralKit.Bot/Services/CommandMessageService.cs b/PluralKit.Bot/Services/CommandMessageService.cs index f07994ed..fc205d50 100644 --- a/PluralKit.Bot/Services/CommandMessageService.cs +++ b/PluralKit.Bot/Services/CommandMessageService.cs @@ -25,10 +25,10 @@ namespace PluralKit.Bot _logger = logger.ForContext(); } - public async Task RegisterMessage(ulong messageId, ulong authorId) + public async Task RegisterMessage(ulong messageId, ulong channelId, ulong authorId) { - _logger.Debug("Registering command response {MessageId} from author {AuthorId}", messageId, authorId); - await _db.Execute(conn => _repo.SaveCommandMessage(conn, messageId, authorId)); + _logger.Debug("Registering command response {MessageId} from author {AuthorId} in {ChannelId}", messageId, authorId, channelId); + await _db.Execute(conn => _repo.SaveCommandMessage(conn, messageId, channelId, authorId)); } public async Task GetCommandMessage(IPKConnection conn, ulong messageId) diff --git a/PluralKit.Core/Database/Migrations/17.sql b/PluralKit.Core/Database/Migrations/17.sql new file mode 100644 index 00000000..f856f9b6 --- /dev/null +++ b/PluralKit.Core/Database/Migrations/17.sql @@ -0,0 +1,8 @@ +-- schema version 17: 2021-09-26 -- +-- add channel_id to command message table + +alter table command_messages add column channel_id bigint; +update command_messages set channel_id = 0; +alter table command_messages alter column channel_id set not null; + +update info set schema_version = 17; \ No newline at end of file diff --git a/PluralKit.Core/Database/Repository/ModelRepository.CommandMessage.cs b/PluralKit.Core/Database/Repository/ModelRepository.CommandMessage.cs index 602c5684..91344561 100644 --- a/PluralKit.Core/Database/Repository/ModelRepository.CommandMessage.cs +++ b/PluralKit.Core/Database/Repository/ModelRepository.CommandMessage.cs @@ -6,9 +6,9 @@ namespace PluralKit.Core { public partial class ModelRepository { - public Task SaveCommandMessage(IPKConnection conn, ulong messageId, ulong authorId) => - conn.QueryAsync("insert into command_messages (message_id, author_id) values (@Message, @Author)", - new { Message = messageId, Author = authorId }); + public Task SaveCommandMessage(IPKConnection conn, ulong messageId, ulong channelId, ulong authorId) => + conn.QueryAsync("insert into command_messages (message_id, channel_id, author_id) values (@Message, @Channel, @Author)", + new { Message = messageId, Channel = channelId, Author = authorId }); public Task GetCommandMessage(IPKConnection conn, ulong messageId) => conn.QuerySingleOrDefaultAsync("select * from command_messages where message_id = @Message", @@ -23,5 +23,6 @@ namespace PluralKit.Core { public ulong AuthorId { get; set; } public ulong MessageId { get; set; } + public ulong ChannelId { get; set; } } } \ No newline at end of file diff --git a/PluralKit.Core/Database/Utils/DatabaseMigrator.cs b/PluralKit.Core/Database/Utils/DatabaseMigrator.cs index d174812f..a5055568 100644 --- a/PluralKit.Core/Database/Utils/DatabaseMigrator.cs +++ b/PluralKit.Core/Database/Utils/DatabaseMigrator.cs @@ -12,7 +12,7 @@ namespace PluralKit.Core internal class DatabaseMigrator { private const string RootPath = "PluralKit.Core.Database"; // "resource path" root for SQL files - private const int TargetSchemaVersion = 16; + private const int TargetSchemaVersion = 17; private readonly ILogger _logger; public DatabaseMigrator(ILogger logger)