diff options
author | 2018-11-18 03:28:15 +0100 | |
---|---|---|
committer | 2018-11-18 03:28:15 +0100 | |
commit | 0aa910c63ca76fbc2c4329ec6dd3cbb3b4696324 (patch) | |
tree | d1edfc4dc3ea837c3dee0b11b2396d54b21ac56b /bot/cogs/hacktober/halloween_facts.py | |
parent | Hardcoding EAUTH (diff) |
Created an uptime cog. Testing Azure CI deployment.
Diffstat (limited to 'bot/cogs/hacktober/halloween_facts.py')
-rw-r--r-- | bot/cogs/hacktober/halloween_facts.py | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/bot/cogs/hacktober/halloween_facts.py b/bot/cogs/hacktober/halloween_facts.py new file mode 100644 index 00000000..e97c80d2 --- /dev/null +++ b/bot/cogs/hacktober/halloween_facts.py @@ -0,0 +1,75 @@ +import asyncio +import json +import random +from datetime import timedelta +from pathlib import Path + +import discord +from discord.ext import commands + +SPOOKY_EMOJIS = [ + "\N{BAT}", + "\N{DERELICT HOUSE BUILDING}", + "\N{EXTRATERRESTRIAL ALIEN}", + "\N{GHOST}", + "\N{JACK-O-LANTERN}", + "\N{SKULL}", + "\N{SKULL AND CROSSBONES}", + "\N{SPIDER WEB}", +] +PUMPKIN_ORANGE = discord.Color(0xFF7518) +HACKTOBERBOT_CHANNEL_ID = 498804484324196362 +INTERVAL = timedelta(hours=6).total_seconds() + + +class HalloweenFacts: + + def __init__(self, bot): + self.bot = bot + with open(Path("./bot/resources", "halloween_facts.json"), "r") as file: + self.halloween_facts = json.load(file) + self.channel = None + self.last_fact = None + + async def on_ready(self): + self.channel = self.bot.get_channel(HACKTOBERBOT_CHANNEL_ID) + self.bot.loop.create_task(self._fact_publisher_task()) + + async def _fact_publisher_task(self): + """ + A background task that runs forever, sending Halloween facts at random to the Discord channel with id equal to + HACKTOBERFEST_CHANNEL_ID every INTERVAL seconds. + """ + facts = list(enumerate(self.halloween_facts)) + while True: + # Avoid choosing each fact at random to reduce chances of facts being reposted soon. + random.shuffle(facts) + for index, fact in facts: + embed = self._build_embed(index, fact) + await self.channel.send("Your regular serving of random Halloween facts", embed=embed) + self.last_fact = (index, fact) + await asyncio.sleep(INTERVAL) + + @commands.command(name="hallofact", aliases=["hallofacts"], brief="Get the most recent Halloween fact") + async def get_last_fact(self, ctx): + """ + Reply with the most recent Halloween fact. + """ + if ctx.channel != self.channel: + return + index, fact = self.last_fact + embed = self._build_embed(index, fact) + await ctx.send("Halloween fact recap", embed=embed) + + @staticmethod + def _build_embed(index, fact): + """ + Builds a Discord embed from the given fact and its index. + """ + emoji = random.choice(SPOOKY_EMOJIS) + title = f"{emoji} Halloween Fact #{index + 1}" + return discord.Embed(title=title, description=fact, color=PUMPKIN_ORANGE) + + +def setup(bot): + bot.add_cog(HalloweenFacts(bot)) |