aboutsummaryrefslogtreecommitdiffstats
path: root/bot/exts/halloween/timeleft.py
diff options
context:
space:
mode:
Diffstat (limited to 'bot/exts/halloween/timeleft.py')
-rw-r--r--bot/exts/halloween/timeleft.py59
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))