Delete PluralKit posts by reaction

Add a 🗑 reaction to posts like system cards and member lists that deletes the message when the command author reacts
This commit is contained in:
xBelladonna 2019-06-15 16:32:38 +09:30
parent 15ccc4e27a
commit d5e36d7f81
4 changed files with 46 additions and 7 deletions

View file

@ -164,6 +164,16 @@ class CommandContext:
except asyncio.TimeoutError: except asyncio.TimeoutError:
raise CommandError("Timed out - try again.") raise CommandError("Timed out - try again.")
async def delete_by_react(self, user: Union[discord.Member, discord.User], message: discord.Message):
try:
await message.add_reaction("🗑") # Wastebasket
reaction, _ = await self.client.wait_for("reaction_add", check=lambda r, u: u.id == user.id and r.emoji in ["🗑"],
timeout=60 * 10) # 10 minute timeout
return reaction.emoji == "🗑"
except asyncio.TimeoutError:
# Delete the reaction if the user doesn't react within the timeout period
await message.remove_reaction("🗑", self.client.user)
import pluralkit.bot.commands.api_commands import pluralkit.bot.commands.api_commands
import pluralkit.bot.commands.import_commands import pluralkit.bot.commands.import_commands

View file

@ -51,7 +51,10 @@ async def specific_member_root(ctx: CommandContext):
async def member_info(ctx: CommandContext, member: Member): async def member_info(ctx: CommandContext, member: Member):
await ctx.reply(embed=await pluralkit.bot.embeds.member_card(ctx.conn, member)) msg = await ctx.reply(embed=await pluralkit.bot.embeds.member_card(ctx.conn, member))
if await ctx.delete_by_react(ctx.message.author, msg):
await msg.delete()
await ctx.message.delete()
async def new_member(ctx: CommandContext): async def new_member(ctx: CommandContext):

View file

@ -15,4 +15,7 @@ async def message_info(ctx: CommandContext):
raise CommandError( raise CommandError(
"Message with ID '{}' not found. Are you sure it's a message proxied by PluralKit?".format(mid)) "Message with ID '{}' not found. Are you sure it's a message proxied by PluralKit?".format(mid))
await ctx.reply(embed=await embeds.message_card(ctx.client, message)) msg = await ctx.reply(embed=await embeds.message_card(ctx.client, message))
if await ctx.delete_by_react(ctx.message.author, msg):
await msg.delete()
await ctx.message.delete()

View file

@ -74,8 +74,11 @@ async def specified_system_root(ctx: CommandContext):
async def system_info(ctx: CommandContext, system: System): async def system_info(ctx: CommandContext, system: System):
this_system = await ctx.get_system() this_system = await ctx.get_system()
await ctx.reply(embed=await pluralkit.bot.embeds.system_card(ctx.conn, ctx.client, system, this_system and this_system.id == system.id)) msg = await ctx.reply(embed=await pluralkit.bot.embeds.system_card(ctx.conn, ctx.client, system, this_system and this_system.id == system.id))
if await ctx.delete_by_react(ctx.message.author, msg):
await msg.delete()
await ctx.message.delete()
async def system_new(ctx: CommandContext): async def system_new(ctx: CommandContext):
new_name = ctx.remaining() or None new_name = ctx.remaining() or None
@ -265,7 +268,11 @@ async def system_fronthistory(ctx: CommandContext, system: System):
embed = embeds.status("\n".join(lines) or "(none)") embed = embeds.status("\n".join(lines) or "(none)")
embed.title = "Past switches" embed.title = "Past switches"
await ctx.reply(embed=embed) msg = await ctx.reply(embed=embed)
if await ctx.delete_by_react(ctx.message.author, msg):
await msg.delete()
await ctx.message.delete()
async def system_delete(ctx: CommandContext): async def system_delete(ctx: CommandContext):
@ -362,7 +369,11 @@ async def system_frontpercent(ctx: CommandContext, system: System):
embed.set_footer(text="Since {} ({} ago)".format(ctx.format_time(span_start), embed.set_footer(text="Since {} ({} ago)".format(ctx.format_time(span_start),
display_relative(span_start))) display_relative(span_start)))
await ctx.reply(embed=embed) msg = await ctx.reply(embed=embed)
if await ctx.delete_by_react(ctx.message.author, msg):
await msg.delete()
await ctx.message.delete()
async def system_list(ctx: CommandContext, system: System): async def system_list(ctx: CommandContext, system: System):
# TODO: refactor this # TODO: refactor this
@ -372,7 +383,10 @@ async def system_list(ctx: CommandContext, system: System):
page_size = 8 page_size = 8
if len(all_members) <= page_size: if len(all_members) <= page_size:
# If we have less than 8 members, don't bother paginating # If we have less than 8 members, don't bother paginating
await ctx.reply(embed=embeds.member_list_full(system, all_members, 0, page_size)) msg = await ctx.reply(embed=embeds.member_list_full(system, all_members, 0, page_size))
if await ctx.delete_by_react(ctx.message.author, msg):
await msg.delete()
await ctx.message.delete()
else: else:
current_page = 0 current_page = 0
msg: discord.Message = None msg: discord.Message = None
@ -385,6 +399,9 @@ async def system_list(ctx: CommandContext, system: System):
msg = await ctx.reply(embed=embed) msg = await ctx.reply(embed=embed)
await msg.add_reaction("\u2B05") await msg.add_reaction("\u2B05")
await msg.add_reaction("\u27A1") await msg.add_reaction("\u27A1")
if await ctx.delete_by_react(ctx.message.author, msg):
await msg.delete()
await ctx.message.delete()
else: else:
await msg.edit(embed=embed) await msg.edit(embed=embed)
@ -413,7 +430,10 @@ async def system_list(ctx: CommandContext, system: System):
page_size = 25 page_size = 25
if len(all_members) <= page_size: if len(all_members) <= page_size:
# If we have less than 25 members, don't bother paginating # If we have less than 25 members, don't bother paginating
await ctx.reply(embed=embeds.member_list_short(system, all_members, 0, page_size)) msg = await ctx.reply(embed=embeds.member_list_short(system, all_members, 0, page_size))
if await ctx.delete_by_react(ctx.message.author, msg):
await msg.delete()
await ctx.message.delete()
else: else:
current_page = 0 current_page = 0
msg: discord.Message = None msg: discord.Message = None
@ -425,6 +445,9 @@ async def system_list(ctx: CommandContext, system: System):
msg = await ctx.reply(embed=embed) msg = await ctx.reply(embed=embed)
await msg.add_reaction("\u2B05") await msg.add_reaction("\u2B05")
await msg.add_reaction("\u27A1") await msg.add_reaction("\u27A1")
if await ctx.delete_by_react(ctx.message.author, msg):
await msg.delete()
await ctx.message.delete()
else: else:
await msg.edit(embed=embed) await msg.edit(embed=embed)