From 2de75fd16864d419ef45bf56b91d57c599e0754f Mon Sep 17 00:00:00 2001 From: stijndcl Date: Mon, 29 Aug 2022 00:02:06 +0200 Subject: [PATCH] Use transformer --- didier/cogs/school.py | 10 +++--- didier/data/apis/hydra.py | 4 +-- .../utils/discord/autocompletion/__init__.py | 0 didier/utils/discord/autocompletion/time.py | 31 +++++++++++++++++++ didier/utils/discord/converters/time.py | 20 +++++++++++- 5 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 didier/utils/discord/autocompletion/__init__.py create mode 100644 didier/utils/discord/autocompletion/time.py diff --git a/didier/cogs/school.py b/didier/cogs/school.py index 89e926c..f8a0d1b 100644 --- a/didier/cogs/school.py +++ b/didier/cogs/school.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import date from typing import Optional import discord @@ -12,6 +12,7 @@ from didier.data.apis.hydra import fetch_menu from didier.data.embeds.deadlines import Deadlines from didier.data.embeds.hydra import no_menu_found from didier.exceptions import HTTPException +from didier.utils.discord.converters.time import DateTransformer from didier.utils.discord.flags.school import StudyGuideFlags @@ -37,16 +38,13 @@ class School(commands.Cog): description="Show the menu in the Ghent University restaurants.", aliases=["Eten", "Food"], ) - async def menu(self, ctx: commands.Context, day: Optional[str] = None): + @app_commands.rename(day_dt="date") + async def menu(self, ctx: commands.Context, day_dt: Optional[app_commands.Transform[date, DateTransformer]] = None): """Show the menu in the Ghent University restaurants. Menus are Dutch, as a lot of dishes have very weird translations """ - # TODO time converter (transformer) for [DAY] - # TODO autocompletion for [DAY] async with ctx.typing(): - day_dt = datetime(year=2022, month=8, day=29) - try: menu = await fetch_menu(self.client.http_session, day_dt) embed = menu.to_embed(day_dt=day_dt) diff --git a/didier/data/apis/hydra.py b/didier/data/apis/hydra.py index f570986..620e0df 100644 --- a/didier/data/apis/hydra.py +++ b/didier/data/apis/hydra.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import date from aiohttp import ClientSession @@ -8,7 +8,7 @@ from didier.utils.http.requests import ensure_get __all__ = ["fetch_menu"] -async def fetch_menu(http_session: ClientSession, day_dt: datetime) -> Menu: +async def fetch_menu(http_session: ClientSession, day_dt: date) -> Menu: """Fetch the menu for a given day""" endpoint = f"https://hydra.ugent.be/api/2.0/resto/menu/nl/{day_dt.year}/{day_dt.month}/{day_dt.day}.json" async with ensure_get(http_session, endpoint, log_exceptions=False) as response: diff --git a/didier/utils/discord/autocompletion/__init__.py b/didier/utils/discord/autocompletion/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/didier/utils/discord/autocompletion/time.py b/didier/utils/discord/autocompletion/time.py new file mode 100644 index 0000000..b5003fd --- /dev/null +++ b/didier/utils/discord/autocompletion/time.py @@ -0,0 +1,31 @@ +from discord import app_commands + +__all__ = ["autocomplete_day"] + + +def autocomplete_day(argument: str) -> list[app_commands.Choice]: + """Autocompletion for day-arguments + + This supports relative offsets ("tomorrow") as well as weekdays + """ + argument = argument.lower() + values = [ + "Tomorrow", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Sunday", + "Morgen", + "Overmorgen", + "Maandag", + "Dinsdag", + "Woensdag", + "Donderdag", + "Vrijdag", + "Zaterdag", + "Zondag", + ] + + return [app_commands.Choice(name=value, value=value.lower()) for value in values if argument in value.lower()] diff --git a/didier/utils/discord/converters/time.py b/didier/utils/discord/converters/time.py index c768a51..6fbad9a 100644 --- a/didier/utils/discord/converters/time.py +++ b/didier/utils/discord/converters/time.py @@ -1,9 +1,14 @@ import contextlib +import datetime from datetime import date, timedelta -from typing import Optional +from typing import Optional, Union +import discord +from discord import app_commands from discord.ext.commands import ArgumentParsingError +from overrides import overrides +from didier.utils.discord.autocompletion.time import autocomplete_day from didier.utils.types.datetime import ( forward_to_next_weekday, parse_dm_string, @@ -46,3 +51,16 @@ def date_converter(argument: Optional[str]) -> date: # Unparseable raise ArgumentParsingError(f"Unable to interpret `{original_argument}` as a date.") + + +class DateTransformer(app_commands.Transformer): + """Application commands transformer for dates""" + + async def autocomplete( + self, interaction: discord.Interaction, value: Union[int, float, str] + ) -> list[app_commands.Choice[Union[int, float, str]]]: + return autocomplete_day(str(value)) + + @overrides + async def transform(self, interaction: discord.Interaction, value: str) -> datetime.date: + return date_converter(value)