diff options
Diffstat (limited to 'bot/exts')
| -rw-r--r-- | bot/exts/pride/pride_leader.py | 104 |
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)) |