aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bot/exts/filtering/_ui/filter_list.py29
-rw-r--r--bot/exts/filtering/_ui/ui.py26
-rw-r--r--bot/exts/filtering/filtering.py19
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: