aboutsummaryrefslogtreecommitdiffstats
path: root/bot/exts/utilities/conversationstarters.py
diff options
context:
space:
mode:
authorGravatar Janine vN <[email protected]>2021-09-05 00:12:47 -0400
committerGravatar Janine vN <[email protected]>2021-09-05 00:12:47 -0400
commit66c888ad68ad88ba1d39c2ac4824469560b8c29a (patch)
tree706917000c39c3af1fc92c47fd59fe31a63f601a /bot/exts/utilities/conversationstarters.py
parentMove internal eval and rename utils to core (diff)
Move practical functions into utilities folder
Separates out the useful/practical seasonal bot features from the evergreen folder into a "utilities" folder. Adjusts the paths to resources to reflect the folder move.
Diffstat (limited to 'bot/exts/utilities/conversationstarters.py')
-rw-r--r--bot/exts/utilities/conversationstarters.py69
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())