diff options
| author | 2023-04-11 16:34:18 +0100 | |
|---|---|---|
| committer | 2023-04-11 16:55:15 +0100 | |
| commit | 2a3ed04cad3dd917d1573a9c8448d6d5e8f99723 (patch) | |
| tree | d156f9d7c8dbdc89642e161105766cd3644b931f | |
| parent | Add a git-blame-ignore-revs file (diff) | |
Use commands.Converter subclass for d.py converters
This is required as | is not supported between a function and NoneType
Diffstat (limited to '')
| -rw-r--r-- | bot/exts/filtering/_filter_lists/__init__.py | 4 | ||||
| -rw-r--r-- | bot/exts/filtering/_filter_lists/filter_list.py | 16 | ||||
| -rw-r--r-- | bot/exts/filtering/_settings_types/validations/bypass_roles.py | 4 | ||||
| -rw-r--r-- | bot/exts/filtering/_ui/ui.py | 8 | ||||
| -rw-r--r-- | bot/exts/filtering/filtering.py | 19 | 
5 files changed, 28 insertions, 23 deletions
| diff --git a/bot/exts/filtering/_filter_lists/__init__.py b/bot/exts/filtering/_filter_lists/__init__.py index 82e0452f9..1273e5588 100644 --- a/bot/exts/filtering/_filter_lists/__init__.py +++ b/bot/exts/filtering/_filter_lists/__init__.py @@ -1,9 +1,9 @@  from os.path import dirname -from bot.exts.filtering._filter_lists.filter_list import FilterList, ListType, list_type_converter +from bot.exts.filtering._filter_lists.filter_list import FilterList, ListType, ListTypeConverter  from bot.exts.filtering._utils import subclasses_in_package  filter_list_types = subclasses_in_package(dirname(__file__), f"{__name__}.", FilterList)  filter_list_types = {filter_list.name: filter_list for filter_list in filter_list_types} -__all__ = [filter_list_types, FilterList, ListType, list_type_converter] +__all__ = [filter_list_types, FilterList, ListType, ListTypeConverter] diff --git a/bot/exts/filtering/_filter_lists/filter_list.py b/bot/exts/filtering/_filter_lists/filter_list.py index 3fdc4fb20..e5b6b2a65 100644 --- a/bot/exts/filtering/_filter_lists/filter_list.py +++ b/bot/exts/filtering/_filter_lists/filter_list.py @@ -9,7 +9,7 @@ from functools import reduce  from typing import Any  import arrow -from discord.ext.commands import BadArgument +from discord.ext.commands import BadArgument, Context, Converter  from bot.exts.filtering._filter_context import Event, FilterContext  from bot.exts.filtering._filters.filter import Filter, UniqueFilter @@ -37,13 +37,15 @@ aliases = (  ) -def list_type_converter(argument: str) -> ListType: +class ListTypeConverter(Converter):      """A converter to get the appropriate list type.""" -    argument = argument.lower() -    for list_type, list_aliases in aliases: -        if argument in list_aliases or argument in map(past_tense, list_aliases): -            return list_type -    raise BadArgument(f"No matching list type found for {argument!r}.") + +    async def convert(self, ctx: Context, argument: str) -> ListType: +        argument = argument.lower() +        for list_type, list_aliases in aliases: +            if argument in list_aliases or argument in map(past_tense, list_aliases): +                return list_type +        raise BadArgument(f"No matching list type found for {argument!r}.")  # AtomicList and its subclasses must have eq=False, otherwise the dataclass deco will replace the hash function. diff --git a/bot/exts/filtering/_settings_types/validations/bypass_roles.py b/bot/exts/filtering/_settings_types/validations/bypass_roles.py index 7427b10c7..50fb1e650 100644 --- a/bot/exts/filtering/_settings_types/validations/bypass_roles.py +++ b/bot/exts/filtering/_settings_types/validations/bypass_roles.py @@ -1,4 +1,4 @@ -from typing import ClassVar +from typing import ClassVar, Union  from discord import Member @@ -12,7 +12,7 @@ class RoleBypass(ValidationEntry):      name: ClassVar[str] = "bypass_roles"      description: ClassVar[str] = "A list of role IDs or role names. Users with these roles will not trigger the filter." -    bypass_roles: set[int | str] +    bypass_roles: set[Union[int, str]]  # noqa: UP007      def triggers_on(self, ctx: FilterContext) -> bool:          """Return whether the filter should be triggered on this user given their roles.""" diff --git a/bot/exts/filtering/_ui/ui.py b/bot/exts/filtering/_ui/ui.py index b2de71b9c..4e1e61148 100644 --- a/bot/exts/filtering/_ui/ui.py +++ b/bot/exts/filtering/_ui/ui.py @@ -9,7 +9,7 @@ from typing import Any, TypeVar, get_origin  import discord  from discord import Embed, Interaction -from discord.ext.commands import Context +from discord.ext.commands import Context, Converter  from discord.ui.select import MISSING as SELECT_MISSING, SelectOption  from discord.utils import escape_markdown  from pydis_core.site_api import ResponseCodeError @@ -182,7 +182,7 @@ class ArgumentCompletionSelect(discord.ui.Select):          arg_name: str,          options: list[str],          position: int, -        converter: Callable | None = None +        converter: Converter | None = None      ):          super().__init__(              placeholder=f"Select a value for {arg_name!r}", @@ -198,7 +198,7 @@ class ArgumentCompletionSelect(discord.ui.Select):          await interaction.response.defer()          value = interaction.data["values"][0]          if self.converter: -            value = self.converter(value) +            value = await self.converter().convert(self.ctx, value)          args = self.args.copy()  # This makes the view reusable.          args.insert(self.position, value)          log.trace(f"Argument filled with the value {value}. Re-invoking command") @@ -215,7 +215,7 @@ class ArgumentCompletionView(discord.ui.View):          arg_name: str,          options: list[str],          position: int, -        converter: Callable | None = None +        converter: Converter | None = None      ):          super().__init__()          log.trace(f"The {arg_name} argument was designated missing in the invocation {ctx.view.buffer!r}") diff --git a/bot/exts/filtering/filtering.py b/bot/exts/filtering/filtering.py index c3f1060d8..8e7ba7476 100644 --- a/bot/exts/filtering/filtering.py +++ b/bot/exts/filtering/filtering.py @@ -25,7 +25,7 @@ from bot.bot import Bot  from bot.constants import Channels, Guild, MODERATION_ROLES, Roles  from bot.exts.backend.branding._repository import HEADERS, PARAMS  from bot.exts.filtering._filter_context import Event, FilterContext -from bot.exts.filtering._filter_lists import FilterList, ListType, filter_list_types, list_type_converter +from bot.exts.filtering._filter_lists import FilterList, ListType, ListTypeConverter, filter_list_types  from bot.exts.filtering._filter_lists.filter_list import AtomicList  from bot.exts.filtering._filters.filter import Filter, UniqueFilter  from bot.exts.filtering._settings import ActionSettings @@ -414,7 +414,10 @@ class Filtering(Cog):      @filter.command(name="list", aliases=("get",))      async def f_list( -        self, ctx: Context, list_type: list_type_converter | None = None, list_name: str | None = None +        self, +        ctx: Context, +        list_type: ListTypeConverter | None = None, +        list_name: str | None = None,      ) -> None:          """List the contents of a specified list of filters."""          result = await self._resolve_list_type_and_name(ctx, list_type, list_name) @@ -449,7 +452,7 @@ class Filtering(Cog):          self,          ctx: Context,          noui: Literal["noui"] | None, -        list_type: list_type_converter | None, +        list_type: ListTypeConverter | None,          list_name: str | None,          content: str,          *, @@ -727,7 +730,7 @@ class Filtering(Cog):      @filterlist.command(name="describe", aliases=("explain", "manual", "id"))      async def fl_describe( -        self, ctx: Context, list_type: list_type_converter | None = None, list_name: str | None = None +        self, ctx: Context, list_type: ListTypeConverter | None = None, list_name: str | None = None      ) -> None:          """Show a description of the specified filter list, or a list of possible values if no values are provided."""          if not list_type and not list_name: @@ -758,7 +761,7 @@ class Filtering(Cog):      @filterlist.command(name="add", aliases=("a",))      @has_any_role(Roles.admins) -    async def fl_add(self, ctx: Context, list_type: list_type_converter, list_name: str) -> None: +    async def fl_add(self, ctx: Context, list_type: ListTypeConverter, list_name: str) -> None:          """Add a new filter list."""          # Check if there's an implementation.          if list_name.lower() not in filter_list_types: @@ -796,7 +799,7 @@ class Filtering(Cog):          self,          ctx: Context,          noui: Literal["noui"] | None, -        list_type: list_type_converter | None = None, +        list_type: ListTypeConverter | None = None,          list_name: str | None = None,          *,          settings: str | None @@ -839,7 +842,7 @@ class Filtering(Cog):      @filterlist.command(name="delete", aliases=("remove",))      @has_any_role(Roles.admins)      async def fl_delete( -        self, ctx: Context, list_type: list_type_converter | None = None, list_name: str | None = None +        self, ctx: Context, list_type: ListTypeConverter | None = None, list_name: str | None = None      ) -> None:          """Remove the filter list and all of its filters from the database."""          async def delete_list() -> None: @@ -1024,7 +1027,7 @@ class Filtering(Cog):                  await ctx.send(                      "The **list_type** argument is unspecified. Please pick a value from the options below:",                      view=ArgumentCompletionView( -                        ctx, args, "list_type", [option.name for option in ListType], 0, list_type_converter +                        ctx, args, "list_type", [option.name for option in ListType], 0, ListTypeConverter                      )                  )                  return None | 
