diff options
Diffstat (limited to 'bot/exts/utilities/conversationstarters.py')
-rw-r--r-- | bot/exts/utilities/conversationstarters.py | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/bot/exts/utilities/conversationstarters.py b/bot/exts/utilities/conversationstarters.py new file mode 100644 index 00000000..dd537022 --- /dev/null +++ b/bot/exts/utilities/conversationstarters.py @@ -0,0 +1,69 @@ +from pathlib import Path + +import yaml +from discord import Color, Embed +from discord.ext import commands + +from bot.bot import Bot +from bot.constants import WHITELISTED_CHANNELS +from bot.utils.decorators import whitelist_override +from bot.utils.randomization import RandomCycle + +SUGGESTION_FORM = "https://forms.gle/zw6kkJqv8U43Nfjg9" + +with Path("bot/resources/utilities/starter.yaml").open("r", encoding="utf8") as f: + STARTERS = yaml.load(f, Loader=yaml.FullLoader) + +with Path("bot/resources/utilities/py_topics.yaml").open("r", encoding="utf8") as f: + # First ID is #python-general and the rest are top to bottom categories of Topical Chat/Help. + PY_TOPICS = yaml.load(f, Loader=yaml.FullLoader) + + # Removing `None` from lists of topics, if not a list, it is changed to an empty one. + PY_TOPICS = {k: [i for i in v if i] if isinstance(v, list) else [] for k, v in PY_TOPICS.items()} + + # All the allowed channels that the ".topic" command is allowed to be executed in. + ALL_ALLOWED_CHANNELS = list(PY_TOPICS.keys()) + list(WHITELISTED_CHANNELS) + +# Putting all topics into one dictionary and shuffling lists to reduce same-topic repetitions. +ALL_TOPICS = {"default": STARTERS, **PY_TOPICS} +TOPICS = { + channel: RandomCycle(topics or ["No topics found for this channel."]) + for channel, topics in ALL_TOPICS.items() +} + + +class ConvoStarters(commands.Cog): + """General conversation topics.""" + + @commands.command() + @whitelist_override(channels=ALL_ALLOWED_CHANNELS) + async def topic(self, ctx: commands.Context) -> None: + """ + Responds with a random topic to start a conversation. + + If in a Python channel, a python-related topic will be given. + + Otherwise, a random conversation topic will be received by the user. + """ + # No matter what, the form will be shown. + embed = Embed(description=f"Suggest more topics [here]({SUGGESTION_FORM})!", color=Color.blurple()) + + try: + # Fetching topics. + channel_topics = TOPICS[ctx.channel.id] + + # If the channel isn't Python-related. + except KeyError: + embed.title = f"**{next(TOPICS['default'])}**" + + # If the channel ID doesn't have any topics. + else: + embed.title = f"**{next(channel_topics)}**" + + finally: + await ctx.send(embed=embed) + + +def setup(bot: Bot) -> None: + """Load the ConvoStarters cog.""" + bot.add_cog(ConvoStarters()) |