Use transformer

pull/128/head
stijndcl 2022-08-29 00:02:06 +02:00
parent e1af53cf44
commit 2de75fd168
5 changed files with 56 additions and 9 deletions

View File

@ -1,4 +1,4 @@
from datetime import datetime from datetime import date
from typing import Optional from typing import Optional
import discord 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.deadlines import Deadlines
from didier.data.embeds.hydra import no_menu_found from didier.data.embeds.hydra import no_menu_found
from didier.exceptions import HTTPException from didier.exceptions import HTTPException
from didier.utils.discord.converters.time import DateTransformer
from didier.utils.discord.flags.school import StudyGuideFlags 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.", description="Show the menu in the Ghent University restaurants.",
aliases=["Eten", "Food"], 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. """Show the menu in the Ghent University restaurants.
Menus are Dutch, as a lot of dishes have very weird translations 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(): async with ctx.typing():
day_dt = datetime(year=2022, month=8, day=29)
try: try:
menu = await fetch_menu(self.client.http_session, day_dt) menu = await fetch_menu(self.client.http_session, day_dt)
embed = menu.to_embed(day_dt=day_dt) embed = menu.to_embed(day_dt=day_dt)

View File

@ -1,4 +1,4 @@
from datetime import datetime from datetime import date
from aiohttp import ClientSession from aiohttp import ClientSession
@ -8,7 +8,7 @@ from didier.utils.http.requests import ensure_get
__all__ = ["fetch_menu"] __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""" """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" 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: async with ensure_get(http_session, endpoint, log_exceptions=False) as response:

View File

@ -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()]

View File

@ -1,9 +1,14 @@
import contextlib import contextlib
import datetime
from datetime import date, timedelta 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 discord.ext.commands import ArgumentParsingError
from overrides import overrides
from didier.utils.discord.autocompletion.time import autocomplete_day
from didier.utils.types.datetime import ( from didier.utils.types.datetime import (
forward_to_next_weekday, forward_to_next_weekday,
parse_dm_string, parse_dm_string,
@ -46,3 +51,16 @@ def date_converter(argument: Optional[str]) -> date:
# Unparseable # Unparseable
raise ArgumentParsingError(f"Unable to interpret `{original_argument}` as a date.") 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)