diff options
Diffstat (limited to '')
| -rw-r--r-- | bot/exts/evergreen/minesweeper.py | 28 | ||||
| -rw-r--r-- | bot/exts/evergreen/source.py | 23 | ||||
| -rw-r--r-- | bot/exts/evergreen/space.py | 19 | ||||
| -rw-r--r-- | bot/utils/converters.py | 77 | 
4 files changed, 80 insertions, 67 deletions
| diff --git a/bot/exts/evergreen/minesweeper.py b/bot/exts/evergreen/minesweeper.py index bd28d365..7a31dfde 100644 --- a/bot/exts/evergreen/minesweeper.py +++ b/bot/exts/evergreen/minesweeper.py @@ -8,6 +8,7 @@ from discord.ext import commands  from bot.bot import Bot  from bot.constants import Client +from bot.utils.converters import CoordinateConverter  from bot.utils.exceptions import UserNotPlayingError  from bot.utils.extensions import invoke_help_command @@ -32,33 +33,6 @@ MESSAGE_MAPPING = {  log = logging.getLogger(__name__) -class CoordinateConverter(commands.Converter): -    """Converter for Coordinates.""" - -    async def convert(self, ctx: commands.Context, coordinate: str) -> typing.Tuple[int, int]: -        """Take in a coordinate string and turn it into an (x, y) tuple.""" -        if not 2 <= len(coordinate) <= 3: -            raise commands.BadArgument("Invalid co-ordinate provided.") - -        coordinate = coordinate.lower() -        if coordinate[0].isalpha(): -            digit = coordinate[1:] -            letter = coordinate[0] -        else: -            digit = coordinate[:-1] -            letter = coordinate[-1] - -        if not digit.isdigit(): -            raise commands.BadArgument - -        x = ord(letter) - ord("a") -        y = int(digit) - 1 - -        if (not 0 <= x <= 9) or (not 0 <= y <= 9): -            raise commands.BadArgument -        return x, y - -  GameBoard = typing.List[typing.List[typing.Union[str, int]]] diff --git a/bot/exts/evergreen/source.py b/bot/exts/evergreen/source.py index 685b3111..8fb72143 100644 --- a/bot/exts/evergreen/source.py +++ b/bot/exts/evergreen/source.py @@ -1,32 +1,13 @@  import inspect  from pathlib import Path -from typing import Optional, Tuple, Union +from typing import Optional, Tuple  from discord import Embed  from discord.ext import commands  from bot.bot import Bot  from bot.constants import Source - -SourceType = Union[commands.Command, commands.Cog, str, commands.ExtensionNotLoaded] - - -class SourceConverter(commands.Converter): -    """Convert an argument into a help command, tag, command, or cog.""" - -    async def convert(self, ctx: commands.Context, argument: str) -> SourceType: -        """Convert argument into source object.""" -        cog = ctx.bot.get_cog(argument) -        if cog: -            return cog - -        cmd = ctx.bot.get_command(argument) -        if cmd: -            return cmd - -        raise commands.BadArgument( -            f"Unable to convert `{argument}` to valid command or Cog." -        ) +from bot.utils.converters import SourceConverter, SourceType  class BotSource(commands.Cog): diff --git a/bot/exts/evergreen/space.py b/bot/exts/evergreen/space.py index 7d83dbfb..77b63946 100644 --- a/bot/exts/evergreen/space.py +++ b/bot/exts/evergreen/space.py @@ -1,15 +1,16 @@  import logging  import random  from datetime import date, datetime -from typing import Any, Dict, Optional, Union +from typing import Any, Dict, Optional  from urllib.parse import urlencode  from discord import Embed  from discord.ext import tasks -from discord.ext.commands import BadArgument, Cog, Context, Converter, group +from discord.ext.commands import Cog, Context, group  from bot.bot import Bot  from bot.constants import Tokens +from bot.utils.converters import DateConverter  from bot.utils.extensions import invoke_help_command  logger = logging.getLogger(__name__) @@ -21,20 +22,6 @@ NASA_EPIC_BASE_URL = "https://epic.gsfc.nasa.gov"  APOD_MIN_DATE = date(1995, 6, 16) -class DateConverter(Converter): -    """Parse SOL or earth date (in format YYYY-MM-DD) into `int` or `datetime`. When invalid input, raise error.""" - -    async def convert(self, ctx: Context, argument: str) -> Union[int, datetime]: -        """Parse date (SOL or earth) into `datetime` or `int`. When invalid value, raise error.""" -        if argument.isdigit(): -            return int(argument) -        try: -            date = datetime.strptime(argument, "%Y-%m-%d") -        except ValueError: -            raise BadArgument(f"Can't convert `{argument}` to `datetime` in format `YYYY-MM-DD` or `int` in SOL.") -        return date - -  class Space(Cog):      """Space Cog contains commands, that show images, facts or other information about space.""" diff --git a/bot/utils/converters.py b/bot/utils/converters.py index 228714c9..98607087 100644 --- a/bot/utils/converters.py +++ b/bot/utils/converters.py @@ -1,11 +1,15 @@ +from datetime import datetime +from typing import Tuple, Union +  import discord -from discord.ext.commands.converter import MessageConverter +from discord.ext import commands -class WrappedMessageConverter(MessageConverter): +class WrappedMessageConverter(commands.MessageConverter):      """A converter that handles embed-suppressed links like <http://example.com>.""" -    async def convert(self, ctx: discord.ext.commands.Context, argument: str) -> discord.Message: +    @staticmethod +    async def convert(ctx: commands.Context, argument: str) -> discord.Message:          """Wrap the commands.MessageConverter to handle <> delimited message links."""          # It's possible to wrap a message in [<>] as well, and it's supported because its easy          if argument.startswith("[") and argument.endswith("]"): @@ -14,3 +18,70 @@ class WrappedMessageConverter(MessageConverter):              argument = argument[1:-1]          return await super().convert(ctx, argument) + + +class CoordinateConverter(commands.Converter): +    """Converter for Coordinates.""" + +    @staticmethod +    async def convert(ctx: commands.Context, coordinate: str) -> Tuple[int, int]: +        """Take in a coordinate string and turn it into an (x, y) tuple.""" +        if len(coordinate) not in (2, 3): +            raise commands.BadArgument("Invalid co-ordinate provided.") + +        coordinate = coordinate.lower() +        if coordinate[0].isalpha(): +            digit = coordinate[1:] +            letter = coordinate[0] +        else: +            digit = coordinate[:-1] +            letter = coordinate[-1] + +        if not digit.isdigit(): +            raise commands.BadArgument + +        x = ord(letter) - ord("a") +        y = int(digit) - 1 + +        if (not 0 <= x <= 9) or (not 0 <= y <= 9): +            raise commands.BadArgument +        return x, y + + +SourceType = Union[commands.Command, commands.Cog] + + +class SourceConverter(commands.Converter): +    """Convert an argument into a command or cog.""" + +    @staticmethod +    async def convert(ctx: commands.Context, argument: str) -> SourceType: +        """Convert argument into source object.""" +        cog = ctx.bot.get_cog(argument) +        if cog: +            return cog + +        cmd = ctx.bot.get_command(argument) +        if cmd: +            return cmd + +        raise commands.BadArgument( +            f"Unable to convert `{argument}` to valid command or Cog." +        ) + + +class DateConverter(commands.Converter): +    """Parse SOL or earth date (in format YYYY-MM-DD) into `int` or `datetime`. When invalid input, raise error.""" + +    @staticmethod +    async def convert(ctx: commands.Context, argument: str) -> Union[int, datetime]: +        """Parse date (SOL or earth) into `datetime` or `int`. When invalid value, raise error.""" +        if argument.isdigit(): +            return int(argument) +        try: +            date = datetime.strptime(argument, "%Y-%m-%d") +        except ValueError: +            raise commands.BadArgument( +                f"Can't convert `{argument}` to `datetime` in format `YYYY-MM-DD` or `int` in SOL." +            ) +        return date | 
