diff --git a/PluralKit.Bot/Handlers/ReactionAdded.cs b/PluralKit.Bot/Handlers/ReactionAdded.cs index 5abc5840..57b08dcb 100644 --- a/PluralKit.Bot/Handlers/ReactionAdded.cs +++ b/PluralKit.Bot/Handlers/ReactionAdded.cs @@ -48,12 +48,15 @@ namespace PluralKit.Bot _db.Execute(c => _repo.GetMessage(c, evt.Message.Id)); FullMessage msg; + CommandMessage cmdmsg; switch (evt.Emoji.Name) { // Message deletion case "\u274C": // Red X if ((msg = await GetMessage()) != null) await HandleDeleteReaction(evt, msg); + else if ((cmdmsg = await _db.Execute(conn => _repo.GetCommandMessage(conn, evt.Message.Id))) != null) + await HandleCommandDeleteReaction(evt, cmdmsg); break; case "\u2753": // Red question mark @@ -92,6 +95,25 @@ namespace PluralKit.Bot await _db.Execute(c => _repo.DeleteMessage(c, evt.Message.Id)); } + private async ValueTask HandleCommandDeleteReaction(MessageReactionAddEventArgs evt, CommandMessage msg) + { + if (!evt.Channel.BotHasAllPermissions(Permissions.ManageMessages)) return; + + // Can only delete your own message + if (msg.author_id != evt.User.Id) return; + + try + { + await evt.Message.DeleteAsync(); + } + catch (NotFoundException) + { + // Message was deleted by something/someone else before we got to it + } + + // No need to delete database row here, it'll get deleted by the once-per-minute scheduled task. + } + private async ValueTask HandleQueryReaction(MessageReactionAddEventArgs evt, FullMessage msg) { // Try to DM the user info about the message diff --git a/PluralKit.Core/Database/Migrations/11.sql b/PluralKit.Core/Database/Migrations/11.sql index 77764819..dda320af 100644 --- a/PluralKit.Core/Database/Migrations/11.sql +++ b/PluralKit.Core/Database/Migrations/11.sql @@ -4,7 +4,7 @@ create table command_message ( message_id bigint primary key, - invoker_id bigint not null, + author_id bigint not null, timestamp timestamp not null default now() ); diff --git a/PluralKit.Core/Database/Repository/ModelRepository.CommandMessage.cs b/PluralKit.Core/Database/Repository/ModelRepository.CommandMessage.cs index f10df683..1e38c447 100644 --- a/PluralKit.Core/Database/Repository/ModelRepository.CommandMessage.cs +++ b/PluralKit.Core/Database/Repository/ModelRepository.CommandMessage.cs @@ -9,7 +9,16 @@ namespace PluralKit.Core public partial class ModelRepository { public Task SaveCommandMessage(IPKConnection conn, ulong message_id, ulong author_id) => - conn.QueryAsync("insert into command_message (message_id, invoker_id) values (@Message, @Author)", + conn.QueryAsync("insert into command_message (message_id, author_id) values (@Message, @Author)", new {Message = message_id, Author = author_id }); + + public Task GetCommandMessage(IPKConnection conn, ulong message_id) => + conn.QuerySingleOrDefaultAsync("select message_id, author_id from command_message where message_id = @Message", + new {Message = message_id}); + } + + public class CommandMessage + { + public ulong author_id { get; set; } } } \ No newline at end of file