dragon-bot/app/quake.py
2018-07-01 11:54:41 -07:00

152 lines
5.1 KiB
Python

import requests
import discord
import help_methods
def parse_message(message):
"""
parse_message(message)
Handles the message and looks for a plaer name.
"""
if len(message.content.split()) == 1:
return help_methods.get_help_message('quake')
# Return the player's name
name = message.content.split()[1]
if len(message.content.split()) > 1:
name = '%20'.join(message.content.split()[1:])
return get_stats(player=name)
def get_stats(player):
"""
get_stats(player)
Makes the request to stats.quake.com and returns an embed object with a
bunch of data about the player
"""
base_url = 'https://stats.quake.com/api/v2/'
player_endpoint = "Player/Stats?name={}".format(player)
try:
request = requests.get("{}{}".format(base_url, player_endpoint)).json()
return create_embed(stats=request)
except Exception:
return discord.Embed(
description="404, Player not found",
color=discord.Color.dark_red(),
type="rich"
)
def create_embed(stats):
"""
create_embed(stats)
Expects a json blob to be passed in and then builds the embed
object
"""
# Parse the json and pull out the numbers we want
champ_name, play_time = get_favorite_champion(stats)
fav_weapon, fav_weapon_kills = get_favorite_weapon(stats)
kd_ratio = get_kd(stats)
embed = discord.Embed(
description="**All Time account statistics**",
color=discord.Color.dark_red(),
type="rich"
)
embed.set_author(
name="\nShowing stats for {}".format(stats['name']),
icon_url="https://stats.quake.com/icons/{}.png".format(stats['playerLoadOut']['iconId'])
)
embed.add_field(name="Current level:", value=stats['playerLevelState']['level'])
embed.add_field(name="Total XP:", value=stats['playerLevelState']['exp'])
embed.add_field(name="K/D:", value=kd_ratio)
embed.add_field(name="\u200b", value='\u200b', inline=False)
embed.add_field(name="Favorite Champion:", value=champ_name)
embed.add_field(name="Total Playtime:", value="~{} hours".format(play_time))
embed.add_field(name="\u200b", value='\u200b', inline=False)
embed.add_field(name="Favorite Weapon:", value=fav_weapon)
embed.add_field(name="Num of kills with it:", value=fav_weapon_kills)
embed.set_footer(text="Stats pulled from https://stats.quake.com", icon_url='https://stats.quake.com/icons/profile_icon_cbt_participant.png')
return embed
def get_favorite_champion(blob):
"""
get_favorite_champion(blob)
Takes one argument, a large json data set from the stats API and parses it
to figure out who the players favorite champion is. Stores all the data
in a temp dictionary, play_times, then grabs the max value from it
"""
play_times = {}
all_champions = blob['playerProfileStats']['champions']
for champion in all_champions:
for game_mode in blob['playerProfileStats']['champions'][champion]['gameModes']:
if champion in play_times:
play_times[champion] += blob['playerProfileStats']['champions'][champion]['gameModes'][game_mode]['timePlayed']
else:
play_times[champion] = blob['playerProfileStats']['champions'][champion]['gameModes'][game_mode]['timePlayed']
champion_play_time = max(play_times.values()) # maximum value
champion_name = [k for k, v in play_times.items() if v == champion_play_time][0] # getting all keys containing the `maximum`
# Convert play_time from miliseconds to hours
champion_play_time = round(float(champion_play_time)/(1000*60*60), 2)
return(champion_name, champion_play_time)
def get_favorite_weapon(blob):
"""
get_favorite_weapon(blob)
Takes one argument, a large json data set from the stats API and parses it
to figure out what the players favorite weapon is. Stores all the data
in a temp dictionary, weapon_stats, then grabs the max value from it
"""
weapon_stats = {}
all_champions = blob['playerProfileStats']['champions']
for champion in all_champions:
for weapon in blob['playerProfileStats']['champions'][champion]['damageStatusList']:
if weapon in weapon_stats:
weapon_stats[weapon] += blob['playerProfileStats']['champions'][champion]['damageStatusList'][weapon]['kills']
else:
weapon_stats[weapon] = blob['playerProfileStats']['champions'][champion]['damageStatusList'][weapon]['kills']
total_kills = max(weapon_stats.values()) # maximum value
weapon_name = [k for k, v in weapon_stats.items() if v == total_kills][0] # getting all keys containing the `maximum`
return(weapon_name, total_kills)
def get_kd(blob):
"""
get_kd(blob)
Takes one argument, a large json data set from the stats API and parses it
to figure the players total K/D ratio
"""
total_kills = 0
total_deaths = 0
all_champions = blob['playerProfileStats']['champions']
for champion in all_champions:
for game_mode in blob['playerProfileStats']['champions'][champion]['gameModes']:
total_kills += blob['playerProfileStats']['champions'][champion]['gameModes'][game_mode]['kills']
total_deaths += blob['playerProfileStats']['champions'][champion]['gameModes'][game_mode]['deaths']
return round(float(total_kills/total_deaths), 2)