aboutsummaryrefslogtreecommitdiffstats
path: root/bot/cogs
diff options
context:
space:
mode:
Diffstat (limited to 'bot/cogs')
-rw-r--r--bot/cogs/monstersurvey.py177
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))