Add handling command reactions

and, uhh, rename invoker_id to author_id
This commit is contained in:
dev-kittens 2020-10-18 00:59:36 -05:00
parent 05cc30279a
commit 56bb5e975f
No known key found for this signature in database
GPG Key ID: 00C26F208D3FCCAB
3 changed files with 33 additions and 2 deletions

View File

@ -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

View File

@ -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()
);

View File

@ -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<CommandMessage> GetCommandMessage(IPKConnection conn, ulong message_id) =>
conn.QuerySingleOrDefaultAsync<CommandMessage>("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; }
}
}