From bd16fa02c2ccbd37f0fc921c92761830f8b57fbf Mon Sep 17 00:00:00 2001 From: Ant Zucaro Date: Tue, 24 Apr 2012 21:10:49 -0400 Subject: [PATCH] Clean up the graph, make a new JSON view for accuracy data. --- xonstat/__init__.py | 4 ++++ xonstat/views/__init__.py | 1 + xonstat/views/player.py | 39 ++++++++++++++++++++++++++++++++++----- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/xonstat/__init__.py b/xonstat/__init__.py index 25b93bb..b1f08d2 100755 --- a/xonstat/__init__.py +++ b/xonstat/__init__.py @@ -50,6 +50,10 @@ def main(global_config, **settings): config.add_view(player_info, route_name="player_info", renderer="player_info.mako") + config.add_route("player_accuracy", "/player/{id:\d+}/accuracy") + config.add_view(player_accuracy, route_name="player_accuracy", + renderer="json") + # GAME ROUTES config.add_route("game_index", "/games") config.add_view(game_index, route_name="game_index", diff --git a/xonstat/views/__init__.py b/xonstat/views/__init__.py index 87c5e76..06ab55a 100755 --- a/xonstat/views/__init__.py +++ b/xonstat/views/__init__.py @@ -1,5 +1,6 @@ from xonstat.views.submission import stats_submit from xonstat.views.player import player_index, player_info, player_game_index +from xonstat.views.player import player_accuracy from xonstat.views.game import game_index, game_info, rank_index from xonstat.views.map import map_info, map_index from xonstat.views.server import server_info, server_game_index, server_index diff --git a/xonstat/views/player.py b/xonstat/views/player.py index 1a0d78f..1f06b47 100755 --- a/xonstat/views/player.py +++ b/xonstat/views/player.py @@ -133,21 +133,27 @@ def get_accuracy_stats(player_id, weapon_cd, games): # Determine the raw accuracy (hit, fired) numbers for $games games # This is then enumerated to create parameters for a flot graph - raw_accs = DBSession.query(PlayerWeaponStat.hit, PlayerWeaponStat.fired).\ + raw_accs = DBSession.query(PlayerWeaponStat.game_id, + PlayerWeaponStat.hit, PlayerWeaponStat.fired).\ filter(PlayerWeaponStat.player_id == player_id).\ filter(PlayerWeaponStat.weapon_cd == weapon_cd).\ - order_by(PlayerWeaponStat.create_dt).\ + order_by(PlayerWeaponStat.game_id.desc()).\ limit(games).\ all() + # they come out in opposite order, so flip them in the right direction + raw_accs.reverse() + + games = [] accs = [] for i in range(len(raw_accs)): - accs.append((i, round(float(raw_accs[i][0])/raw_accs[i][1]*100, 2))) + games.append((i, raw_accs[i][0])) + accs.append((i, round(float(raw_accs[i][1])/raw_accs[i][2]*100, 2))) except: accs = 0 avg = 0 - return (avg, accs) + return (games, avg, accs) def player_info(request): @@ -186,7 +192,7 @@ def player_info(request): # data for the accuracy graph, which is converted into a JSON array for # usage by flot - (avg, accs) = get_accuracy_stats(player_id, 'nex', 20) + (games, avg, accs) = get_accuracy_stats(player_id, 'nex', 20) avg = json.dumps(avg) accs = json.dumps(accs) @@ -258,3 +264,26 @@ def player_game_index(request): return {'player_id':player_id, 'games':games, 'pgstats':pgstats} + +def player_accuracy(request): + """ + Provides a JSON response representing the accuracy for the given weapon. + + Parameters: + weapon = which weapon to display accuracy for. Valid values are 'nex', + 'shotgun', 'uzi', and 'minstanex'. + games = over how many games to display accuracy. Can be up to 50. + """ + player_id = request.matchdict['id'] + allowed_weapons = ['nex', 'shotgun', 'uzi', 'minstanex'] + weapon_cd = 'nex' + games = 20 + + if request.params.has_key('weapon'): + if request.params['weapon'] in allowed_weapons: + weapon_cd = request.params['weapon'] + + (games, avg, accs) = get_accuracy_stats(player_id, weapon_cd, games) + + return {'weapon':weapon_cd, 'games':games, 'avg':avg, 'accs':accs} + -- 2.39.2