aboutsummaryrefslogtreecommitdiffstats
path: root/bot/exts
diff options
context:
space:
mode:
Diffstat (limited to 'bot/exts')
-rw-r--r--bot/exts/pride/pride_leader.py104
1 files changed, 104 insertions, 0 deletions
diff --git a/bot/exts/pride/pride_leader.py b/bot/exts/pride/pride_leader.py
new file mode 100644
index 00000000..631fca4b
--- /dev/null
+++ b/bot/exts/pride/pride_leader.py
@@ -0,0 +1,104 @@
+import json
+import logging
+import random
+from pathlib import Path
+from typing import Optional
+
+import discord
+from discord.ext import commands
+from fuzzywuzzy import fuzz
+
+from bot.constants import Colours
+
+log = logging.getLogger(__name__)
+
+PRIDE_LEADERS_RESOURCE = Path("bot/resources/pride/prideleader.json")
+MINIMUM_FUZZ_RATIO = 40
+
+
+class PrideLeader(commands.Cog):
+ """Gives information about Pride Leaders."""
+
+ def __init__(self, bot: commands.Bot):
+ self.bot = bot
+
+ with PRIDE_LEADERS_RESOURCE.open(encoding="utf8") as data:
+ self.pride = json.load(data)
+
+ def name_verifier(self, leader_name: str) -> Optional[str]:
+ """Verify leader name whether it is present in resources or not."""
+ leader_name = leader_name.title()
+ if leader_name in self.pride:
+ return leader_name
+ log.trace(f"Got a Invalid pride leader: {leader_name}")
+
+ def invalid_embed_generate(self, pride_leader: str) -> discord.Embed:
+ """Generates Invalid Embed."""
+ embed = discord.Embed(
+ color=Colours.soft_red
+ )
+ valid_names = []
+ pride_leader = pride_leader.title()
+ for name in self.pride:
+ if fuzz.ratio(pride_leader, name) >= MINIMUM_FUZZ_RATIO:
+ valid_names.append(name)
+
+ if not valid_names:
+ valid_names = ", ".join(self.pride)
+ error_msg = "Sorry your input didn't match any stored name, here is a list of available names:"
+ else:
+ valid_names = "\n".join(valid_names)
+ error_msg = "Did you mean?"
+
+ embed.description = f"{error_msg}\n```{valid_names}```"
+ return embed
+
+ def embed_builder(self, leader_name: str) -> discord.Embed:
+ """Generate an Embed with information about a pride leader."""
+ embed = discord.Embed(
+ title=leader_name,
+ description=self.pride[leader_name]["About"],
+ color=Colours.blue
+ )
+ embed.add_field(
+ name="Known for",
+ value=self.pride[leader_name]["Known for"],
+ inline=False
+ )
+ embed.add_field(
+ name="D.O.B and Birth place",
+ value=self.pride[leader_name]["Born"],
+ inline=False
+ )
+ embed.add_field(
+ name="Awards and honors",
+ value=self.pride[leader_name]["Awards"],
+ inline=False
+ )
+ embed.set_thumbnail(url=self.pride[leader_name]["url"])
+ return embed
+
+ @commands.command(aliases=("pl", "prideleader"))
+ async def pride_leader(self, ctx: commands.Context, *, pride_leader_name: Optional[str]) -> None:
+ """
+ Information about a Pride Leader.
+
+ Returns information about the specified pride leader
+ and if there is no pride leader given, return a random pride leader.
+ """
+ if not pride_leader_name:
+ leader = random.choice([name for name in self.pride])
+ else:
+ leader = self.name_verifier(pride_leader_name)
+ if not leader:
+ embed = self.invalid_embed_generate(pride_leader_name)
+ await ctx.send(embed=embed)
+ return
+
+ embed = self.embed_builder(leader)
+ await ctx.send(embed=embed)
+
+
+def setup(bot: commands.Bot) -> None:
+ """Loads Pride leader cog."""
+ bot.add_cog(PrideLeader(bot))