aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar mbaruh <[email protected]>2022-11-04 16:24:00 +0200
committerGravatar mbaruh <[email protected]>2022-11-04 16:24:00 +0200
commit5cecb3be45dbd2488c75f12b0f587ddf0db0b767 (patch)
treef9aec1c7268171ac07b92a68f9677cac5986ab4a
parentFilter match now shows all triggers instead of messages (diff)
Edit description on filter add/edit, bug fixes
`process_content` was changed to `process_input` to also edit the description when necessary. Fixes unhandled filter_type being None on filter add/edit. Moves the missing filter type warning to a more appropriate location to not trigger during filter add/edit.
-rw-r--r--bot/exts/filtering/_filter_lists/filter_list.py13
-rw-r--r--bot/exts/filtering/_filter_lists/unique.py3
-rw-r--r--bot/exts/filtering/_filters/domain.py8
-rw-r--r--bot/exts/filtering/_filters/extension.py8
-rw-r--r--bot/exts/filtering/_filters/filter.py6
-rw-r--r--bot/exts/filtering/_filters/invite.py12
-rw-r--r--bot/exts/filtering/_filters/token.py8
-rw-r--r--bot/exts/filtering/_ui/filter.py9
-rw-r--r--bot/exts/filtering/filtering.py7
9 files changed, 45 insertions, 29 deletions
diff --git a/bot/exts/filtering/_filter_lists/filter_list.py b/bot/exts/filtering/_filter_lists/filter_list.py
index f3761fbf9..9ae45bfaf 100644
--- a/bot/exts/filtering/_filter_lists/filter_list.py
+++ b/bot/exts/filtering/_filter_lists/filter_list.py
@@ -152,6 +152,8 @@ class FilterList(dict[ListType, AtomicList], typing.Generic[T], FieldRequiring):
# Names must be unique across all filter lists.
name = FieldRequiring.MUST_SET_UNIQUE
+ _already_warned = set()
+
def add_list(self, list_data: dict) -> AtomicList:
"""Add a new type of list (such as a whitelist or a blacklist) this filter list."""
actions, validations = create_settings(list_data["settings"], keep_empty=True)
@@ -192,11 +194,14 @@ class FilterList(dict[ListType, AtomicList], typing.Generic[T], FieldRequiring):
def _create_filter(self, filter_data: dict, defaults: Defaults) -> T | None:
"""Create a filter from the given data."""
try:
- filter_type = self.get_filter_type(filter_data["content"])
+ content = filter_data["content"]
+ filter_type = self.get_filter_type(content)
if filter_type:
return filter_type(filter_data, defaults)
- else:
- return None
+ elif content not in self._already_warned:
+ log.warn(f"A filter named {content} was supplied, but no matching implementation found.")
+ self._already_warned.add(content)
+ return None
except TypeError as e:
log.warning(e)
@@ -240,8 +245,6 @@ class UniquesListBase(FilterList[UniqueFilter]):
Each unique filter subscribes to a subset of events to respond to.
"""
- _already_warned = set()
-
def __init__(self, filtering_cog: 'Filtering'):
super().__init__()
self.filtering_cog = filtering_cog
diff --git a/bot/exts/filtering/_filter_lists/unique.py b/bot/exts/filtering/_filter_lists/unique.py
index 2cc1b78b2..fdf22e3b6 100644
--- a/bot/exts/filtering/_filter_lists/unique.py
+++ b/bot/exts/filtering/_filter_lists/unique.py
@@ -24,9 +24,6 @@ class UniquesList(UniquesListBase):
try:
return unique_filter_types[content]
except KeyError:
- if content not in self._already_warned:
- log.warn(f"A unique filter named {content} was supplied, but no matching implementation found.")
- self._already_warned.add(content)
return None
async def actions_for(
diff --git a/bot/exts/filtering/_filters/domain.py b/bot/exts/filtering/_filters/domain.py
index 4cc3a6f5a..7c229fdcb 100644
--- a/bot/exts/filtering/_filters/domain.py
+++ b/bot/exts/filtering/_filters/domain.py
@@ -50,13 +50,13 @@ class DomainFilter(Filter):
return False
@classmethod
- async def process_content(cls, content: str) -> str:
+ async def process_input(cls, content: str, description: str) -> tuple[str, str]:
"""
- Process the content into a form which will work with the filtering.
+ Process the content and description into a form which will work with the filtering.
- A ValueError should be raised if the content can't be used.
+ A BadArgument should be raised if the content can't be used.
"""
match = URL_RE.fullmatch(content)
if not match or not match.group(1):
raise BadArgument(f"`{content}` is not a URL.")
- return match.group(1)
+ return match.group(1), description
diff --git a/bot/exts/filtering/_filters/extension.py b/bot/exts/filtering/_filters/extension.py
index f3f64532f..97eddc406 100644
--- a/bot/exts/filtering/_filters/extension.py
+++ b/bot/exts/filtering/_filters/extension.py
@@ -16,12 +16,12 @@ class ExtensionFilter(Filter):
return self.content in ctx.content
@classmethod
- async def process_content(cls, content: str) -> str:
+ async def process_input(cls, content: str, description: str) -> tuple[str, str]:
"""
- Process the content into a form which will work with the filtering.
+ Process the content and description into a form which will work with the filtering.
- A ValueError should be raised if the content can't be used.
+ A BadArgument should be raised if the content can't be used.
"""
if not content.startswith("."):
content = f".{content}"
- return content
+ return content, description
diff --git a/bot/exts/filtering/_filters/filter.py b/bot/exts/filtering/_filters/filter.py
index 4ae7ec45f..45b571b54 100644
--- a/bot/exts/filtering/_filters/filter.py
+++ b/bot/exts/filtering/_filters/filter.py
@@ -65,13 +65,13 @@ class Filter(FieldRequiring):
return True, None
@classmethod
- async def process_content(cls, content: str) -> str:
+ async def process_input(cls, content: str, description: str) -> tuple[str, str]:
"""
- Process the content into a form which will work with the filtering.
+ Process the content and description into a form which will work with the filtering.
A BadArgument should be raised if the content can't be used.
"""
- return content
+ return content, description
def __str__(self) -> str:
"""A string representation of the filter."""
diff --git a/bot/exts/filtering/_filters/invite.py b/bot/exts/filtering/_filters/invite.py
index e8f3e9851..f68adbb23 100644
--- a/bot/exts/filtering/_filters/invite.py
+++ b/bot/exts/filtering/_filters/invite.py
@@ -25,11 +25,11 @@ class InviteFilter(Filter):
return self.content in ctx.content
@classmethod
- async def process_content(cls, content: str) -> str:
+ async def process_input(cls, content: str, description: str) -> tuple[str, str]:
"""
- Process the content into a form which will work with the filtering.
+ Process the content and description into a form which will work with the filtering.
- A ValueError should be raised if the content can't be used.
+ A BadArgument should be raised if the content can't be used.
"""
match = DISCORD_INVITE.fullmatch(content)
if not match or not match.group("invite"):
@@ -41,4 +41,8 @@ class InviteFilter(Filter):
raise BadArgument(f"`{invite_code}` is not a valid Discord invite code.")
if not invite.guild:
raise BadArgument("Did you just try to add a group DM?")
- return str(invite.guild.id)
+
+ guild_name = invite.guild.name if hasattr(invite.guild, "name") else ""
+ if guild_name.lower() not in description.lower():
+ description = " - ".join(part for part in (f'Guild "{guild_name}"', description) if part)
+ return str(invite.guild.id), description
diff --git a/bot/exts/filtering/_filters/token.py b/bot/exts/filtering/_filters/token.py
index f61d38846..3cd9b909d 100644
--- a/bot/exts/filtering/_filters/token.py
+++ b/bot/exts/filtering/_filters/token.py
@@ -22,14 +22,14 @@ class TokenFilter(Filter):
return False
@classmethod
- async def process_content(cls, content: str) -> str:
+ async def process_input(cls, content: str, description: str) -> tuple[str, str]:
"""
- Process the content into a form which will work with the filtering.
+ Process the content and description into a form which will work with the filtering.
- A ValueError should be raised if the content can't be used.
+ A BadArgument should be raised if the content can't be used.
"""
try:
re.compile(content)
except re.error as e:
raise BadArgument(str(e))
- return content
+ return content, description
diff --git a/bot/exts/filtering/_ui/filter.py b/bot/exts/filtering/_ui/filter.py
index 37584e9fd..e41c663c5 100644
--- a/bot/exts/filtering/_ui/filter.py
+++ b/bot/exts/filtering/_ui/filter.py
@@ -255,7 +255,16 @@ class FilterEditView(EditBaseView):
"""
if content is not None or description is not None:
if content is not None:
+ filter_type = self.filter_list.get_filter_type(content)
+ if not filter_type:
+ if isinstance(interaction_or_msg, discord.Message):
+ send_method = interaction_or_msg.channel.send
+ else:
+ send_method = interaction_or_msg.response.send_message
+ await send_method(f":x: Could not find a filter type appropriate for `{content}`.")
+ return
self.content = content
+ self.filter_type = filter_type
else:
content = self.content # If there's no content or description, use the existing values.
if description is self._REMOVE:
diff --git a/bot/exts/filtering/filtering.py b/bot/exts/filtering/filtering.py
index bd1345bc0..a204e53f3 100644
--- a/bot/exts/filtering/filtering.py
+++ b/bot/exts/filtering/filtering.py
@@ -857,6 +857,9 @@ class Filtering(Cog):
) -> None:
"""Add a filter to the database."""
filter_type = filter_list.get_filter_type(content)
+ if not filter_type:
+ await ctx.reply(f":x: Could not find a filter type appropriate for `{content}`.")
+ return
description, settings, filter_settings = description_and_settings_converter(
filter_list,
list_type,
@@ -937,7 +940,7 @@ class Filtering(Cog):
if not valid:
raise BadArgument(f"Error while validating filter-specific settings: {error_msg}")
- content = await filter_type.process_content(content)
+ content, description = await filter_type.process_input(content, description)
list_id = filter_list[list_type].id
description = description or None
@@ -971,7 +974,7 @@ class Filtering(Cog):
raise BadArgument(f"Error while validating filter-specific settings: {error_msg}")
if content != filter_.content:
- content = await filter_type.process_content(content)
+ content, description = await filter_type.process_input(content, description)
# If the setting is not in `settings`, the override was either removed, or there wasn't one in the first place.
for current_settings in (filter_.actions, filter_.validations):