diff options
| author | 2018-10-12 00:20:05 -0700 | |
|---|---|---|
| committer | 2018-10-12 00:20:05 -0700 | |
| commit | 886e43a3e78cf34c83db73d8c96c52dbbcc16779 (patch) | |
| tree | ffc41426c562a04a429bf3332a27dbf2636cd8d5 /bot/cogs/monstersurvey.py | |
| parent | Merge branch 'deploy' of https://github.com/dfitzpatrick/hacktoberbot into 31... (diff) | |
Refactor monstersurvey. Added leaderboard and show.
Diffstat (limited to 'bot/cogs/monstersurvey.py')
| -rw-r--r-- | bot/cogs/monstersurvey.py | 177 | 
1 files changed, 90 insertions, 87 deletions
| diff --git a/bot/cogs/monstersurvey.py b/bot/cogs/monstersurvey.py index 46ab2485..67bc9051 100644 --- a/bot/cogs/monstersurvey.py +++ b/bot/cogs/monstersurvey.py @@ -1,104 +1,107 @@ -import logging -import json -from discord.ext import commands  from discord.ext.commands import Bot, Context -import discord  from typing import Optional, Tuple -import aiohttp -from http import HTTPStatus +from discord.ext import commands +from discord import Embed +import discord, logging, json, os  log = logging.getLogger(__name__) -  EMOJIS = { -    'SUCCESS': u"\u2705", -    'ERROR': u"\u274C", +    'SUCCESS': u'\u2705', +    'ERROR': u'\u274C'  } -class MonsterSurvey: - -    def __init__(self, bot: Bot): -        self.bot = Bot -        self._monsters = None -    @property -    def monsters(self) -> dict: -        """Always get the most up to date version""" -        path = '../bot/resources/monstersurvey/monstersurvey.json' -        with open(path, 'r') as f: -            self._monsters = json.load(f) -        return self._monsters +class MonsterServey: -    async def monster_info(self, monster) -> Tuple[Optional[str], Optional[str]]: -        """Gets information relating to each monster. This first checks if there -        are 'summary' and 'image' keys in the json file. If this fails, it will -        attempt to pull summary information from Wikipedia. -        """ -        async def fetch_url(session: aiohttp.ClientSession, url: str) -> dict: -            """Use wikipedia api url calls""" -            response = await session.get(url) -            if response.status == HTTPStatus.OK: -                result = json.loads(await response.text()) -                return next(iter(result['query']['pages'].values())) -        summary_url = "http://en.wikipedia.org/w/api.php" \ -                      "?format=json" \ -                      "&action=query" \ -                      "&prop=extracts" \ -                      "&explaintext&exintro" \ -                      "&redirects=1" \ -                      f"&titles={monster}" -        image_url = "http://en.wikipedia.org/w/api.php" \ -                    "?action=query" \ -                    "&prop=pageimages" \ -                    "&format=json" \ -                    "&piprop=original" \ -                    f"&titles={monster}" -        async with aiohttp.ClientSession() as s: -            summary = self.monsters[monster].get('summary') \ -                or (await fetch_url(s, summary_url)).get('extract') - -            image = self.monsters[monster].get('image') \ -                or (await fetch_url(s, image_url)).get('original', {}).get('source') -            return summary, image - -    @commands.group(name='monster', aliases=('ms',), invoke_without_command=True) +    def __init__(self, bot: Bot): +        self.bot = bot +        self.registry_location = os.path.join(os.getcwd(), 'resources', 'monstersurvey', 'monstersurvey.json') +        with open(self.registry_location, 'r') as jason: +            self.voter_registry = json.load(jason) + +    @commands.group( +        name='monster', +        aliases=['ms'] +    )      async def monster_group(self, ctx: Context): -        pass - -    @monster_group.command(name='vote') +        if ctx.invoked_subcommand is None: +            default_embed = Embed( +                title='Monster Voting', +                color=0xFF6800, +                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, show a brief of all.', +                inline=False) +            default_embed.add_field( +                name='.monster vote monster_name', +                value='Vote for a specific monster. You can vote more than once, but you can only vote for one monster' +                      'at a time.', +                inline=False +            ) +            default_embed.add_field( +                name='.monster leaderboard', +                value='Which monster has the most votes? This command will tell you.', +                inline=False +            ) +            await ctx.send(embed=default_embed) + +    @monster_group.command( +        name='vote' +    )      async def monster_vote(self, ctx: Context, name: Optional[str] = None): -        """Casts a vote for a particular monster, or displays a list of all -        monsters that are available for voting. -        """ -        embed = discord.Embed(name='Vote for your favorite monster') -        if not name: -            for k,v in self.monsters.items(): -                msg = f"`.monster show {k}` for more information\n" \ -                      f"`.monster vote {k}` to cast your vote for this monster." -                embed.add_field(name=f"{k}", value=f"{msg}", inline=False) -        # TODO: Add logic for voting -        await ctx.send(embed=embed) - -    @monster_group.command(name='show') -    async def monster_show(self, ctx: Context, *monster: str): -        """Display a detailed description for the monster, and image.""" -        monster = ' '.join(monster) -        if self.monsters.get(monster, None): -            summary, image = await self.monster_info(monster) -            embed = discord.Embed(name=monster) -            embed.add_field(name=f"About {monster}", value=summary or "No information") -            if image: -                embed.set_image(url=image) -            embed.set_footer(text=f"To vote for {monster}, type `.monster vote {monster}`") -            await ctx.send(embed=embed) -        else: -            await ctx.message.add_reaction(EMOJIS['ERROR']) - - -def setup(bot: Bot): -    bot.add_cog(MonsterSurvey(bot)) +        """Casts a vote for a particular monster, or displays a list of monsters that can be voted for +        if one is not given.""" +        vote_embed = Embed( +            name='Monster Voting', +            color=0xFF6800 +        ) +        if name not in self.voter_registry.keys() and name is not None: +            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.', +                inline=False +            ) +            vote_embed.add_field( +                name='You may vote for the following monsters:', +                value=f"{', '.join(self.voter_registry.keys())}" +            ) +            return await ctx.send(embed=vote_embed) +        if name is None: +            pass +    @monster_group.command(name='show') +    async def monster_show(self, ctx: Context, name: str): +        m = self.voter_registry.get(name) +        if not m: +            # TODO: invoke .monster vote command to display list +            raise commands.BadArgument("Monster does not exist.") + +        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') +    async def monster_leaderboard(self, ctx: Context): +        vr = self.voter_registry +        top = sorted(vr.values(), key=lambda k: len(k['votes']), reverse=True) + +        embed = Embed(title="Leader board", color=0xFF6800) +        total_votes = sum(len(m['votes']) for m in self.voter_registry.values()) +        for rank, m in enumerate(top): +            votes = len(m['votes']) +            percentage = ((votes / total_votes) * 100) if total_votes > 0 else 0 +            embed.add_field(name=f"{rank+1}. {m['full_name']}", +                            value=f"{votes} votes. {percentage:.1f}%" +                                  f" of total votes.", inline=False) +        await ctx.send(embed=embed) +def setup(bot): +    bot.add_cog(MonsterServey(bot)) | 
