aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bot/exts/filtering/_filters/domain.py17
-rw-r--r--bot/exts/filtering/_ui.py8
2 files changed, 16 insertions, 9 deletions
diff --git a/bot/exts/filtering/_filters/domain.py b/bot/exts/filtering/_filters/domain.py
index 00a9a886f..eed2b6721 100644
--- a/bot/exts/filtering/_filters/domain.py
+++ b/bot/exts/filtering/_filters/domain.py
@@ -1,5 +1,6 @@
import re
from typing import ClassVar, Optional
+from urllib.parse import urlparse
import tldextract
from pydantic import BaseModel
@@ -14,11 +15,11 @@ class ExtraDomainSettings(BaseModel):
"""Extra settings for how domains should be matched in a message."""
exact_description: ClassVar[str] = (
- "A boolean. If True, will match the filter content exactly, and won't trigger for subdomains and subpaths."
+ "A boolean. If True, will will only trigger for subdomains and subpaths, and not for the domain itself."
)
- # whether to match the filter content exactly, or to trigger for subdomains and subpaths as well.
- exact: Optional[bool] = False
+ # Whether to trigger only for subdomains and subpaths, and not the specified domain itself.
+ subdomains: Optional[bool] = False
class DomainFilter(Filter):
@@ -26,7 +27,7 @@ class DomainFilter(Filter):
A filter which looks for a specific domain given by URL.
The schema (http, https) does not need to be included in the filter.
- Will also match subdomains unless set otherwise.
+ Will also match subdomains.
"""
name = "domain"
@@ -37,10 +38,14 @@ class DomainFilter(Filter):
domain = tldextract.extract(self.content).registered_domain
for found_url in ctx.content:
- if self.content in found_url and tldextract.extract(found_url).registered_domain == domain:
+ extract = tldextract.extract(found_url)
+ if self.content in found_url and extract.registered_domain == domain:
+ if self.extra_fields.subdomains:
+ if not extract.subdomain and not urlparse(f"https://{found_url}").path:
+ return False
ctx.matches.append(self.content)
ctx.notification_domain = self.content
- return not self.extra_fields.exact or self.content == found_url
+ return True
return False
@classmethod
diff --git a/bot/exts/filtering/_ui.py b/bot/exts/filtering/_ui.py
index 12d1f213d..ec2051083 100644
--- a/bot/exts/filtering/_ui.py
+++ b/bot/exts/filtering/_ui.py
@@ -433,7 +433,9 @@ class SettingsEditView(discord.ui.View):
)
self.add_item(add_select)
- override_names = list(settings_overrides) + list(filter_settings_overrides)
+ override_names = (
+ list(settings_overrides) + [f"{filter_list.name}/{setting}" for setting in filter_settings_overrides]
+ )
remove_select = CustomCallbackSelect(
self._remove_override,
placeholder="Select an override to remove",
@@ -568,13 +570,13 @@ class SettingsEditView(discord.ui.View):
# Find the right dictionary to update.
if "/" in setting_name:
filter_name, setting_name = setting_name.split("/", maxsplit=1)
- dict_to_edit = self.filter_settings_overrides[filter_name]
+ dict_to_edit = self.filter_settings_overrides
else:
dict_to_edit = self.settings_overrides
# Update the setting override value or remove it
if setting_value is not self._REMOVE:
dict_to_edit[setting_name] = setting_value
- else:
+ elif setting_name in dict_to_edit:
del dict_to_edit[setting_name]
# This is inefficient, but otherwise the selects go insane if the user attempts to edit the same setting