110 lines
4.4 KiB
Python
110 lines
4.4 KiB
Python
"""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"<t:{int(gametime_today.timestamp())}:t>", 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)
|