From fdb04149aabea373e1f9b9570da0e5e66f6ac9da Mon Sep 17 00:00:00 2001 From: imcompiling Date: Fri, 31 May 2024 15:20:59 -0400 Subject: [PATCH] Define the /time at command. --- cogs/commands/time.py | 83 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 75 insertions(+), 8 deletions(-) diff --git a/cogs/commands/time.py b/cogs/commands/time.py index 9e8c7a3..cb3ddef 100644 --- a/cogs/commands/time.py +++ b/cogs/commands/time.py @@ -1,6 +1,6 @@ """Contains commands for time commands.""" -from datetime import UTC, datetime +from datetime import MAXYEAR, MINYEAR, UTC, datetime import nextcord from nextcord.ext import commands @@ -15,20 +15,87 @@ class TimeCog(commands.Cog, name="Time Commands"): async def time(self, interaction: nextcord.Interaction) -> None: """Parent slash command. Never called.""" - @time.subcommand(description="1") - async def at(self, interaction: nextcord.Interaction) -> None: - pass + @time.subcommand( + description="Get a discord timestamp of the given game time. If date information is left blank, uses current day." # noqa: E501 + ) + async def at( # noqa: PLR0913 + self, + interaction: nextcord.Interaction, + hour: int = nextcord.SlashOption( + description="The hour you want a timestamp of. Given in gametime/UTC.", + min_value=0, + max_value=23, + required=True, + ), + minute: int = nextcord.SlashOption( + description="The minute you want a timestamp of. Given in gametime/UTC.", + min_value=0, + max_value=59, + required=True, + ), + year: int = nextcord.SlashOption( + description="Year to make timestamp of.", required=False, min_value=MINYEAR, max_value=MAXYEAR + ), + month: int = nextcord.SlashOption( + description="Month to make timestamp of.", required=False, min_value=1, max_value=12 + ), + day: int = nextcord.SlashOption( + description="Day to make timestamp of.", required=False, min_value=1, max_value=31 + ), + ephemeral: bool = nextcord.SlashOption( # noqa: FBT001 + description="Whether the replying message will be public or not.", required=False, default=True + ), + ) -> None: + """ + Replies with a discord timestamp of given UTC time. - @time.subcommand(description="1") - async def at_gametime(self, interaction: nextcord.Interaction) -> None: - pass + Args: + interaction (nextcord.Interaction): Interaction with the command. + hour (int): The hour in UTC to make the timestamp of.. + minute (int): The minute in UTC to make the timestamp of.. + year (int): The year to make the timestamp of. + month (int): The month to make the timestamp of. + day (int): The day to make the timestamp of. + ephemeral (bool): Whether the response is ephemeral or not. + """ + gametime_today: datetime = datetime.now(tz=UTC).replace(hour=hour, minute=minute) + + if year is not None: + gametime_today = gametime_today.replace(year=year) + + if month is not None and day is not None: + try: + gametime_today = gametime_today.replace(month=month, day=day) + except ValueError: + await interaction.response.send_message(f"Day {day} is out of range for month {month}.", ephemeral=True) + return + else: + if month is not None: + try: + gametime_today = gametime_today.replace(month=month) + except ValueError: + await interaction.response.send_message( + f"Today ({gametime_today.day}) is out of range for month {month}.", ephemeral=True + ) + return + + if day is not None: + try: + gametime_today = gametime_today.replace(day=day) + except ValueError: + await interaction.response.send_message( + f"Day {day} is out of range for this month {gametime_today.month}.", ephemeral=True + ) + return + + await interaction.response.send_message(content=f"", ephemeral=ephemeral) @time.subcommand(description="Get the current time in game.") async def gametime( self, interaction: nextcord.Interaction, ephemeral: bool = nextcord.SlashOption( # noqa: FBT001 - required=False, default=True, description="Whether the replying message will be public or not." + description="Whether the replying message will be public or not.", required=False, default=True ), ) -> None: """