diff options
| author | 2022-10-11 15:01:17 +0300 | |
|---|---|---|
| committer | 2022-10-11 15:01:17 +0300 | |
| commit | ffcbf77c27e75215caca7f8dddb74a6a76f18d8b (patch) | |
| tree | 85f638ad947827132816ee85f110a79d0082c86f | |
| parent | Rearrange FilterList class (diff) | |
Add confirmation before filter deletion
| -rw-r--r-- | bot/exts/filtering/_ui/filter_list.py | 29 | ||||
| -rw-r--r-- | bot/exts/filtering/_ui/ui.py | 26 | ||||
| -rw-r--r-- | bot/exts/filtering/filtering.py | 19 |
3 files changed, 39 insertions, 35 deletions
diff --git a/bot/exts/filtering/_ui/filter_list.py b/bot/exts/filtering/_ui/filter_list.py index 55e03ce18..b072e293e 100644 --- a/bot/exts/filtering/_ui/filter_list.py +++ b/bot/exts/filtering/_ui/filter_list.py @@ -4,7 +4,7 @@ from typing import Any, Callable import discord from botcore.site_api import ResponseCodeError -from discord import Embed, Interaction, Member, SelectOption, User +from discord import Embed, Interaction, SelectOption, User from discord.ext.commands import BadArgument from bot.exts.filtering._filter_lists import FilterList, ListType @@ -14,9 +14,6 @@ from bot.exts.filtering._ui.ui import ( ) from bot.exts.filtering._utils import repr_equals, to_serializable -# Amount of seconds to confirm the operation. -DELETION_TIMEOUT = 60 - def settings_converter(loaded_settings: dict, input_data: str) -> dict[str, Any]: """Parse a string representing settings, and validate the setting names.""" @@ -268,27 +265,3 @@ class FilterListEditView(EditBaseView): self.embed, self.confirm_callback ) - - -class DeleteConfirmationView(discord.ui.View): - """A view to confirm the deletion of a filter list.""" - - def __init__(self, author: Member | User, callback: Callable): - super().__init__(timeout=DELETION_TIMEOUT) - self.author = author - self.callback = callback - - async def interaction_check(self, interaction: Interaction) -> bool: - """Only allow interactions from the command invoker.""" - return interaction.user.id == self.author.id - - @discord.ui.button(label="Delete", style=discord.ButtonStyle.red, row=0) - async def confirm(self, interaction: Interaction, button: discord.ui.Button) -> None: - """Invoke the filter list deletion.""" - await interaction.response.edit_message(view=None) - await self.callback() - - @discord.ui.button(label="Cancel", row=0) - async def cancel(self, interaction: Interaction, button: discord.ui.Button) -> None: - """Cancel the filter list deletion.""" - await interaction.response.edit_message(content="🚫 Operation canceled.", view=None) diff --git a/bot/exts/filtering/_ui/ui.py b/bot/exts/filtering/_ui/ui.py index cba151c70..5a60bb21e 100644 --- a/bot/exts/filtering/_ui/ui.py +++ b/bot/exts/filtering/_ui/ui.py @@ -25,6 +25,8 @@ MAX_INLINE_SIZE = 50 EDIT_TIMEOUT = 600 # Number of seconds before timeout of an editing component. COMPONENT_TIMEOUT = 180 +# Amount of seconds to confirm the operation. +DELETION_TIMEOUT = 60 # Max length of modal title MAX_MODAL_TITLE_LENGTH = 45 # Max number of items in a select @@ -421,3 +423,27 @@ class EditBaseView(ABC, discord.ui.View): @abstractmethod def copy(self) -> EditBaseView: """Create a copy of this view.""" + + +class DeleteConfirmationView(discord.ui.View): + """A view to confirm a deletion.""" + + def __init__(self, author: discord.Member | discord.User, callback: Callable): + super().__init__(timeout=DELETION_TIMEOUT) + self.author = author + self.callback = callback + + async def interaction_check(self, interaction: Interaction) -> bool: + """Only allow interactions from the command invoker.""" + return interaction.user.id == self.author.id + + @discord.ui.button(label="Delete", style=discord.ButtonStyle.red, row=0) + async def confirm(self, interaction: Interaction, button: discord.ui.Button) -> None: + """Invoke the filter list deletion.""" + await interaction.response.edit_message(view=None) + await self.callback() + + @discord.ui.button(label="Cancel", row=0) + async def cancel(self, interaction: Interaction, button: discord.ui.Button) -> None: + """Cancel the filter list deletion.""" + await interaction.response.edit_message(content="🚫 Operation canceled.", view=None) diff --git a/bot/exts/filtering/filtering.py b/bot/exts/filtering/filtering.py index 607fbe8bf..6bc665973 100644 --- a/bot/exts/filtering/filtering.py +++ b/bot/exts/filtering/filtering.py @@ -24,10 +24,8 @@ from bot.exts.filtering._settings import ActionSettings from bot.exts.filtering._ui.filter import ( build_filter_repr_dict, description_and_settings_converter, filter_overrides, populate_embed_from_dict ) -from bot.exts.filtering._ui.filter_list import ( - DeleteConfirmationView, FilterListAddView, FilterListEditView, settings_converter -) -from bot.exts.filtering._ui.ui import ArgumentCompletionView +from bot.exts.filtering._ui.filter_list import FilterListAddView, FilterListEditView, settings_converter +from bot.exts.filtering._ui.ui import ArgumentCompletionView, DeleteConfirmationView from bot.exts.filtering._utils import past_tense, starting_value, to_serializable from bot.log import get_logger from bot.pagination import LinePaginator @@ -440,14 +438,21 @@ class Filtering(Cog): @filter.command(name="delete", aliases=("d", "remove")) async def f_delete(self, ctx: Context, filter_id: int) -> None: """Delete the filter specified by its ID.""" + async def delete_list() -> None: + """The actual removal routine.""" + await bot.instance.api_client.delete(f'bot/filter/filters/{filter_id}') + filter_list[list_type].filters.pop(filter_id) + await ctx.reply(f"✅ Deleted filter: {filter_}") + result = self._get_filter_by_id(filter_id) if result is None: await ctx.send(f":x: Could not find a filter with ID `{filter_id}`.") return filter_, filter_list, list_type = result - await bot.instance.api_client.delete(f'bot/filter/filters/{filter_id}') - filter_list[list_type].filters.pop(filter_id) - await ctx.reply(f"✅ Deleted filter: {filter_}") + await ctx.reply( + f"Are you sure you want to delete filter {filter_}?", + view=DeleteConfirmationView(ctx.author, delete_list) + ) @filter.group(aliases=("settings",)) async def setting(self, ctx: Context) -> None: |