diff options
Diffstat (limited to '')
| -rw-r--r-- | bot/exts/filtering/_filters/domain.py | 17 | ||||
| -rw-r--r-- | bot/exts/filtering/_ui.py | 8 | 
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  |