diff options
| author | 2020-09-18 23:01:42 +0800 | |
|---|---|---|
| committer | 2020-09-18 23:01:42 +0800 | |
| commit | 636cda284a5a2c2f51a17e87c8b71c0f6edcfb22 (patch) | |
| tree | 3523b6eb11f5d752f9060dfba18dbd68a14ac1b0 /bot/exts/evergreen/conversationstarters.py | |
| parent | Fix typo in casercipher help. (diff) | |
| parent | Merge pull request #442 from python-discord/reddit-command-fix (diff) | |
Merge branch 'master' into caesar-command
Diffstat (limited to '')
| -rw-r--r-- | bot/exts/evergreen/conversationstarters.py | 71 | 
1 files changed, 71 insertions, 0 deletions
| diff --git a/bot/exts/evergreen/conversationstarters.py b/bot/exts/evergreen/conversationstarters.py new file mode 100644 index 00000000..576b8d76 --- /dev/null +++ b/bot/exts/evergreen/conversationstarters.py @@ -0,0 +1,71 @@ +from pathlib import Path + +import yaml +from discord import Color, Embed +from discord.ext import commands + +from bot.constants import WHITELISTED_CHANNELS +from bot.utils.decorators import override_in_channel +from bot.utils.randomization import RandomCycle + +SUGGESTION_FORM = 'https://forms.gle/zw6kkJqv8U43Nfjg9' + +with Path("bot/resources/evergreen/starter.yaml").open("r", encoding="utf8") as f: +    STARTERS = yaml.load(f, Loader=yaml.FullLoader) + +with Path("bot/resources/evergreen/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): +    """Evergreen conversation topics.""" + +    def __init__(self, bot: commands.Bot): +        self.bot = bot + +    @commands.command() +    @override_in_channel(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: commands.Bot) -> None: +    """Conversation starters Cog load.""" +    bot.add_cog(ConvoStarters(bot)) | 
