diff options
Diffstat (limited to 'bot/exts/halloween/timeleft.py')
-rw-r--r-- | bot/exts/halloween/timeleft.py | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/bot/exts/halloween/timeleft.py b/bot/exts/halloween/timeleft.py new file mode 100644 index 00000000..295acc89 --- /dev/null +++ b/bot/exts/halloween/timeleft.py @@ -0,0 +1,59 @@ +import logging +from datetime import datetime +from typing import Tuple + +from discord.ext import commands + +log = logging.getLogger(__name__) + + +class TimeLeft(commands.Cog): + """A Cog that tells you how long left until Hacktober is over!""" + + def __init__(self, bot: commands.Bot): + self.bot = bot + + @staticmethod + def in_october() -> bool: + """Return True if the current month is October.""" + return datetime.utcnow().month == 10 + + @staticmethod + def load_date() -> Tuple[int, datetime, datetime]: + """Return of a tuple of the current time and the end and start times of the next October.""" + now = datetime.utcnow() + year = now.year + if now.month > 10: + year += 1 + end = datetime(year, 11, 1, 11, 59, 59) + start = datetime(year, 10, 1) + return now, end, start + + @commands.command() + async def timeleft(self, ctx: commands.Context) -> None: + """ + Calculates the time left until the end of Hacktober. + + Whilst in October, displays the days, hours and minutes left. + Only displays the days left until the beginning and end whilst in a different month + """ + now, end, start = self.load_date() + diff = end - now + days, seconds = diff.days, diff.seconds + if self.in_october(): + minutes = seconds // 60 + hours, minutes = divmod(minutes, 60) + await ctx.send(f"There is currently only {days} days, {hours} hours and {minutes}" + "minutes left until the end of Hacktober.") + else: + start_diff = start - now + start_days = start_diff.days + await ctx.send( + f"It is not currently Hacktober. However, the next one will start in {start_days} days " + f"and will finish in {days} days." + ) + + +def setup(bot: commands.Bot) -> None: + """Cog load.""" + bot.add_cog(TimeLeft(bot)) |