"""Contains commands for time commands.""" from datetime import MAXYEAR, MINYEAR, UTC, datetime import nextcord from nextcord.ext import commands from dakiny_bot.utils import GUILDS class TimeCog(commands.Cog, name="Time Commands"): """Class holds time commands.""" @nextcord.slash_command(guild_ids=GUILDS) async def time(self, interaction: nextcord.Interaction) -> None: """Parent slash command. Never called.""" @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. 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 description="Whether the replying message will be public or not.", required=False, default=True ), ) -> None: """ Replies with the current time in game. Args: interaction (nextcord.Interaction): Interaction with the command. ephemeral: (bool): Whether the response is ephemeral or not. """ gametime = datetime.now(tz=UTC) await interaction.response.send_message(content=f"{gametime.hour}:{gametime.minute}", ephemeral=ephemeral)