diff options
Diffstat (limited to 'bot/exts/halloween/monstersurvey.py')
| -rw-r--r-- | bot/exts/halloween/monstersurvey.py | 119 | 
1 files changed, 60 insertions, 59 deletions
| diff --git a/bot/exts/halloween/monstersurvey.py b/bot/exts/halloween/monstersurvey.py index 80196825..96cda11e 100644 --- a/bot/exts/halloween/monstersurvey.py +++ b/bot/exts/halloween/monstersurvey.py @@ -1,6 +1,6 @@  import json  import logging -import os +import pathlib  from discord import Embed  from discord.ext import commands @@ -9,8 +9,8 @@ from discord.ext.commands import Bot, Cog, Context  log = logging.getLogger(__name__)  EMOJIS = { -    'SUCCESS': u'\u2705', -    'ERROR': u'\u274C' +    "SUCCESS": u"\u2705", +    "ERROR": u"\u274C"  } @@ -23,18 +23,15 @@ class MonsterSurvey(Cog):      Users may change their vote, but only their current vote will be counted.      """ -    def __init__(self, bot: Bot): +    def __init__(self):          """Initializes values for the bot to use within the voting commands.""" -        self.bot = bot -        self.registry_location = os.path.join(os.getcwd(), 'bot', 'resources', 'halloween', 'monstersurvey.json') -        with open(self.registry_location, 'r', encoding="utf8") as jason: -            self.voter_registry = json.load(jason) +        self.registry_path = pathlib.Path("bot", "resources", "halloween", "monstersurvey.json") +        self.voter_registry = json.loads(self.registry_path.read_text("utf8"))      def json_write(self) -> None:          """Write voting results to a local JSON file."""          log.info("Saved Monster Survey Results") -        with open(self.registry_location, 'w', encoding="utf8") as jason: -            json.dump(self.voter_registry, jason, indent=2) +        self.registry_path.write_text(json.dumps(self.voter_registry, indent=2))      def cast_vote(self, id: int, monster: str) -> None:          """ @@ -43,54 +40,55 @@ class MonsterSurvey(Cog):          If the user has already voted, their existing vote is removed.          """          vr = self.voter_registry -        for m in vr.keys(): -            if id not in vr[m]['votes'] and m == monster: -                vr[m]['votes'].append(id) +        for m in vr: +            if id not in vr[m]["votes"] and m == monster: +                vr[m]["votes"].append(id)              else: -                if id in vr[m]['votes'] and m != monster: -                    vr[m]['votes'].remove(id) +                if id in vr[m]["votes"] and m != monster: +                    vr[m]["votes"].remove(id)      def get_name_by_leaderboard_index(self, n: int) -> str:          """Return the monster at the specified leaderboard index."""          n = n - 1          vr = self.voter_registry -        top = sorted(vr, key=lambda k: len(vr[k]['votes']), reverse=True) +        top = sorted(vr, key=lambda k: len(vr[k]["votes"]), reverse=True)          name = top[n] if n >= 0 else None          return name      @commands.group( -        name='monster', -        aliases=('mon',) +        name="monster", +        aliases=("mon",)      )      async def monster_group(self, ctx: Context) -> None:          """The base voting command. If nothing is called, then it will return an embed."""          if ctx.invoked_subcommand is None:              async with ctx.typing():                  default_embed = Embed( -                    title='Monster Voting', +                    title="Monster Voting",                      color=0xFF6800, -                    description='Vote for your favorite monster!' +                    description="Vote for your favorite monster!"                  )                  default_embed.add_field( -                    name='.monster show monster_name(optional)', -                    value='Show a specific monster. If none is listed, it will give you an error with valid choices.', -                    inline=False) +                    name=".monster show monster_name(optional)", +                    value="Show a specific monster. If none is listed, it will give you an error with valid choices.", +                    inline=False +                )                  default_embed.add_field( -                    name='.monster vote monster_name', -                    value='Vote for a specific monster. You get one vote, but can change it at any time.', +                    name=".monster vote monster_name", +                    value="Vote for a specific monster. You get one vote, but can change it at any time.",                      inline=False                  )                  default_embed.add_field( -                    name='.monster leaderboard', -                    value='Which monster has the most votes? This command will tell you.', +                    name=".monster leaderboard", +                    value="Which monster has the most votes? This command will tell you.",                      inline=False                  ) -                default_embed.set_footer(text=f"Monsters choices are: {', '.join(self.voter_registry.keys())}") +                default_embed.set_footer(text=f"Monsters choices are: {', '.join(self.voter_registry)}")              await ctx.send(embed=default_embed)      @monster_group.command( -        name='vote' +        name="vote"      )      async def monster_vote(self, ctx: Context, name: str = None) -> None:          """ @@ -111,37 +109,37 @@ class MonsterSurvey(Cog):                  name = name.lower()              vote_embed = Embed( -                name='Monster Voting', +                name="Monster Voting",                  color=0xFF6800              )              m = self.voter_registry.get(name)              if m is None: -                vote_embed.description = f'You cannot vote for {name} because it\'s not in the running.' +                vote_embed.description = f"You cannot vote for {name} because it's not in the running."                  vote_embed.add_field( -                    name='Use `.monster show {monster_name}` for more information on a specific monster', -                    value='or use `.monster vote {monster}` to cast your vote for said monster.', +                    name="Use `.monster show {monster_name}` for more information on a specific monster", +                    value="or use `.monster vote {monster}` to cast your vote for said monster.",                      inline=False                  )                  vote_embed.add_field( -                    name='You may vote for or show the following monsters:', -                    value=f"{', '.join(self.voter_registry.keys())}" +                    name="You may vote for or show the following monsters:", +                    value=", ".join(self.voter_registry.keys())                  )              else:                  self.cast_vote(ctx.author.id, name)                  vote_embed.add_field( -                    name='Vote successful!', -                    value=f'You have successfully voted for {m["full_name"]}!', +                    name="Vote successful!", +                    value=f"You have successfully voted for {m['full_name']}!",                      inline=False                  ) -                vote_embed.set_thumbnail(url=m['image']) +                vote_embed.set_thumbnail(url=m["image"])                  vote_embed.set_footer(text="Please note that any previous votes have been removed.")                  self.json_write()          await ctx.send(embed=vote_embed)      @monster_group.command( -        name='show' +        name="show"      )      async def monster_show(self, ctx: Context, name: str = None) -> None:          """Shows the named monster. If one is not named, it sends the default voting embed instead.""" @@ -159,41 +157,43 @@ class MonsterSurvey(Cog):              m = self.voter_registry.get(name)              if not m: -                await ctx.send('That monster does not exist.') +                await ctx.send("That monster does not exist.")                  await ctx.invoke(self.monster_vote)                  return -            embed = Embed(title=m['full_name'], color=0xFF6800) -            embed.add_field(name='Summary', value=m['summary']) -            embed.set_image(url=m['image']) -            embed.set_footer(text=f'To vote for this monster, type .monster vote {name}') +            embed = Embed(title=m["full_name"], color=0xFF6800) +            embed.add_field(name="Summary", value=m["summary"]) +            embed.set_image(url=m["image"]) +            embed.set_footer(text=f"To vote for this monster, type .monster vote {name}")          await ctx.send(embed=embed)      @monster_group.command( -        name='leaderboard', -        aliases=('lb',) +        name="leaderboard", +        aliases=("lb",)      )      async def monster_leaderboard(self, ctx: Context) -> None:          """Shows the current standings."""          async with ctx.typing():              vr = self.voter_registry -            top = sorted(vr, key=lambda k: len(vr[k]['votes']), reverse=True) -            total_votes = sum(len(m['votes']) for m in self.voter_registry.values()) +            top = sorted(vr, key=lambda k: len(vr[k]["votes"]), reverse=True) +            total_votes = sum(len(m["votes"]) for m in self.voter_registry.values())              embed = Embed(title="Monster Survey Leader Board", color=0xFF6800)              for rank, m in enumerate(top): -                votes = len(vr[m]['votes']) +                votes = len(vr[m]["votes"])                  percentage = ((votes / total_votes) * 100) if total_votes > 0 else 0 -                embed.add_field(name=f"{rank+1}. {vr[m]['full_name']}", -                                value=( -                                    f"{votes} votes. {percentage:.1f}% of total votes.\n" -                                    f"Vote for this monster by typing " -                                    f"'.monster vote {m}'\n" -                                    f"Get more information on this monster by typing " -                                    f"'.monster show {m}'" -                                ), -                                inline=False) +                embed.add_field( +                    name=f"{rank+1}. {vr[m]['full_name']}", +                    value=( +                        f"{votes} votes. {percentage:.1f}% of total votes.\n" +                        f"Vote for this monster by typing " +                        f"'.monster vote {m}'\n" +                        f"Get more information on this monster by typing " +                        f"'.monster show {m}'" +                    ), +                    inline=False +                )              embed.set_footer(text="You can also vote by their rank number. '.monster vote {number}' ") @@ -201,4 +201,5 @@ class MonsterSurvey(Cog):  def setup(bot: Bot) -> None: -    """Monster survey Cog load.""" +    """Load the Monster Survey Cog.""" +    bot.add_cog(MonsterSurvey()) | 
