diff options
| author | 2019-10-03 13:17:21 -0400 | |
|---|---|---|
| committer | 2019-10-03 13:17:21 -0400 | |
| commit | 3492e0871d08523755ecc62c3e1559617d5360d4 (patch) | |
| tree | 5faf04a40332161566404e231ad239ecf3c207ad /bot | |
| parent | Fix linter issues (diff) | |
Add task to post daily pride fact
Also, pride facts are posted as embeds now
Diffstat (limited to 'bot')
| -rw-r--r-- | bot/seasons/pride/pride_facts.py | 49 |
1 files changed, 36 insertions, 13 deletions
diff --git a/bot/seasons/pride/pride_facts.py b/bot/seasons/pride/pride_facts.py index 95ca4d24..d2ea0461 100644 --- a/bot/seasons/pride/pride_facts.py +++ b/bot/seasons/pride/pride_facts.py @@ -1,3 +1,4 @@ +import asyncio import json import logging import random @@ -6,10 +7,16 @@ from pathlib import Path from typing import Union import dateutil.parser +import discord from discord.ext import commands +from bot.constants import Channels +from bot.constants import Colours + log = logging.getLogger(__name__) +Sendable = Union[commands.Context, discord.TextChannel] + class PrideFacts(commands.Cog): """Provides a new fact every day during the Pride season!""" @@ -24,39 +31,46 @@ class PrideFacts(commands.Cog): with open(Path("bot/resources/pride/facts.json"), "r", encoding="utf-8") as f: return json.load(f) - async def random_fact(self, ctx: commands.Context) -> None: - """Provides a fact from any valid day.""" + async def send_pride_fact_daily(self) -> None: + """Background task to post the daily pride fact every day.""" + channel = self.bot.get_channel(Channels.seasonalbot_chat) + while True: + await self.send_select_fact(channel, datetime.utcnow()) + await asyncio.sleep(24 * 60 * 60) + + async def send_random_fact(self, ctx: commands.Context) -> None: + """Provides a fact from any previous day, or today.""" now = datetime.utcnow() previous_years_facts = (self.facts[x] for x in self.facts.keys() if int(x) < now.year) current_year_facts = self.facts.get(str(now.year), [])[:now.day] previous_facts = current_year_facts + [x for y in previous_years_facts for x in y] try: - await ctx.send(random.choice(previous_facts)) + await ctx.send(embed=self.make_embed(random.choice(previous_facts))) except IndexError: await ctx.send("No facts available") - async def select_fact(self, ctx: commands.Context, _date: Union[str, datetime]) -> None: - """Provides the fact for the specified day, if valid.""" + async def send_select_fact(self, target: Sendable, _date: Union[str, datetime]) -> None: + """Provides the fact for the specified day, if the day is today, or is in the past.""" now = datetime.utcnow() if isinstance(_date, str): try: date = dateutil.parser.parse(_date, dayfirst=False, yearfirst=False, fuzzy=True) except (ValueError, OverflowError) as err: - await ctx.send(f"Error parsing date: {err}") + await target.send(f"Error parsing date: {err}") return else: date = _date if date.year < now.year or (date.year == now.year and date.day <= now.day): try: - await ctx.send(self.facts[str(date.year)][date.day - 1]) + await target.send(embed=self.make_embed(self.facts[str(date.year)][date.day - 1])) except KeyError: - await ctx.send(f"The year {date.year} is not yet supported") + await target.send(f"The year {date.year} is not yet supported") return except IndexError: - await ctx.send(f"Day {date.day} of {date.year} is not yet support") + await target.send(f"Day {date.day} of {date.year} is not yet support") return else: - await ctx.send("The fact for the selected day is not yet available.") + await target.send("The fact for the selected day is not yet available.") @commands.command(name="pridefact", aliases=["pridefacts"]) async def pridefact(self, ctx: commands.Context) -> None: @@ -70,14 +84,23 @@ class PrideFacts(commands.Cog): """ message_body = ctx.message.content[len(ctx.invoked_with) + 2:] if message_body == "": - await self.select_fact(ctx, datetime.utcnow()) + await self.send_select_fact(ctx, datetime.utcnow()) elif message_body.lower().startswith("rand"): - await self.random_fact(ctx) + await self.send_random_fact(ctx) else: - await self.select_fact(ctx, message_body) + await self.send_select_fact(ctx, message_body) + + def make_embed(self, fact) -> discord.Embed: + """Makes a nice embed for the fact to be sent.""" + return discord.Embed( + colour=Colours.pink, + title="Pride Fact!", + description=fact + ) def setup(bot: commands.Bot) -> None: """Cog loader for pride facts.""" + bot.loop.create_task(PrideFacts(bot).send_pride_fact_daily()) bot.add_cog(PrideFacts(bot)) log.info("Pride facts cog loaded!") |