config.add_route("player_info_json", "/player/{id:\d+}.json")
config.add_view(player_info_json, route_name="player_info_json", renderer="jsonp")
- config.add_route("player_elo_info_text", "/elo/{hashkey}")
+ config.add_route("player_elo_info_text", "/player/{hashkey}/elo.txt")
config.add_view(player_elo_info_text, route_name="player_elo_info_text", renderer="player_elo_info_text.mako")
- config.add_route("player_elo_info_json", "/elo/{hashkey}.json") ## FIXME - doesn't seem to work?
+ config.add_route("player_elo_info_json", "/player/{hashkey}/elo.json") ## FIXME - doesn't seem to work?
config.add_view(player_elo_info_json, route_name="player_elo_info_json", renderer="jsonp")
config.add_route("player_accuracy", "/player/{id:\d+}/accuracy")
--- /dev/null
+<%def name="accuracy_graph(recent_weapons)">
+### hitscan weapon data is available
+% if 'nex' in recent_weapons or 'rifle' in recent_weapons or 'minstanex' in recent_weapons or 'uzi' in recent_weapons or 'shotgun' in recent_weapons:
+<div class="row">
+ <div class="span12">
+ <h3>Accuracy</h3>
+
+ <div id="acc-graph" class="flot" style="width:95%; height:200px;">
+ </div>
+
+ <div class="weapon-nav accuracy-nav">
+ <ul>
+ % for weapon in ['nex', 'rifle', 'minstanex', 'uzi', 'shotgun']:
+ % if weapon in recent_weapons:
+ <li>
+ ### the nex is underscored first by default (until user selection)
+ % if weapon == 'nex':
+ <div class="acc-weap weapon-active">
+ % else:
+ <div class="acc-weap">
+ % endif
+ <span class="sprite sprite-${weapon}"></span>
+ <p><small>${weapon}</small></p>
+ <a href="${request.route_url('player_accuracy', id=player.player_id, _query={'weapon':weapon})}" title="Show ${weapon} accuracy"></a>
+ </div>
+ </li>
+ % endif
+ % endfor
+ </ul>
+ </div>
+
+ </div> <!-- END SPAN12 -->
+</div> <!-- END ROW -->
+% endif
+</%def>
<%inherit file="base.mako"/>
<%namespace name="nav" file="nav.mako" />
<%namespace file="accuracy.mako" import="accuracy" />
+<%namespace file="accuracy_graph.mako" import="accuracy_graph" />
<%block name="navigation">
${nav.nav('players')}
</div>
-% if 'nex' in recent_weapons or 'rifle' in recent_weapons or 'minstanex' in recent_weapons or 'uzi' in recent_weapons or 'shotgun' in recent_weapons:
-<div class="row">
- <div class="span12">
- <h3>Accuracy</h3>
- <div id="acc-graph" class="flot" style="width:95%; height:200px;">
- </div>
-
- <div class="weapon-nav accuracy-nav">
- <ul>
- % if 'nex' in recent_weapons:
- <li>
- <div class="acc-weap weapon-active">
- <span class="sprite sprite-nex"></span>
- <p><small>Nex</small></p>
- <a href="${request.route_url('player_accuracy', id=player.player_id, _query={'weapon':'nex'})}" title="Show nex accuracy"></a>
- </div>
- </li>
- % endif
-
- % if 'rifle' in recent_weapons:
- <li>
- <div class="acc-weap">
- <span class="sprite sprite-rifle"></span>
- <p><small>Rifle</small></p>
- <a href="${request.route_url('player_accuracy', id=player.player_id, _query={'weapon':'rifle'})}" title="Show rifle accuracy"></a>
- </div>
- </li>
- % endif
-
- % if 'minstanex' in recent_weapons:
- <li>
- <div class="acc-weap">
- <span class="sprite sprite-minstanex"></span>
- <p><small>Minstanex</small></p>
- <a href="${request.route_url('player_accuracy', id=player.player_id, _query={'weapon':'minstanex'})}" title="Show minstanex accuracy"></a>
- </div>
- </li>
- % endif
-
- % if 'uzi' in recent_weapons:
- <li>
- <div class="acc-weap">
- <span class="sprite sprite-uzi"></span>
- <p><small>Uzi</small></p>
- <a href="${request.route_url('player_accuracy', id=player.player_id, _query={'weapon':'uzi'})}" title="Show uzi accuracy"></a>
- </div>
- </li>
- % endif
-
- % if 'shotgun' in recent_weapons:
- <li>
- <div class="acc-weap">
- <span class="sprite sprite-shotgun"></span>
- <p><small>Shotgun</small></p>
- <a href="${request.route_url('player_accuracy', id=player.player_id, _query={'weapon':'shotgun'})}" title="Show shotgun accuracy"></a>
- </div>
- </li>
- % endif
- </ul>
- </div>
-
- </div>
-</div>
-% endif
-
+### ACCURACY GRAPH
+${accuracy_graph(recent_weapons)}
% if 'rocketlauncher' in recent_weapons or 'grenadelauncher' in recent_weapons or 'electro' in recent_weapons or 'crylink' in recent_weapons or 'laser' in recent_weapons:
<div class="row">
from collections import OrderedDict
from pyramid.response import Response
from sqlalchemy import desc, func, over
-from collections import namedtuple
from webhelpers.paginate import Page, PageURL
from xonstat.models import *
from xonstat.util import page_url
from xonstat.views.helpers import RecentGame, recent_games_q
-import random
log = logging.getLogger(__name__)
-# DEPRECATED
-def _game_index_data(request):
- game_type_cd = None
- game_type_descr = None
-
- if request.params.has_key('game_type_cd'):
- game_type_cd = request.params['game_type_cd']
- try:
- game_type_descr = DBSession.query(GameType.descr).\
- filter(GameType.game_type_cd == game_type_cd).\
- one()[0]
- except Exception as e:
- game_type_cd = None
-
- if request.params.has_key('page'):
- current_page = request.params['page']
- else:
- current_page = 1
-
- try:
- rgs_q = recent_games_q(game_type_cd=game_type_cd)
-
- games = Page(rgs_q, current_page, items_per_page=10, url=page_url)
-
- # replace the items in the canned pagination class with more rich ones
- games.items = [RecentGame(row) for row in games.items]
-
- pgstats = {}
- for game in games.items:
- pgstats[game.game_id] = DBSession.query(PlayerGameStat).\
- filter(PlayerGameStat.game_id == game.game_id).\
- order_by(PlayerGameStat.scoreboardpos).\
- order_by(PlayerGameStat.score).all()
-
- except Exception as e:
- games = None
- pgstats = None
- game_type_cd = None
- game_type_descr = None
-
- return {'games':games,
- 'pgstats':pgstats,
- 'game_type_cd':game_type_cd,
- 'game_type_descr':game_type_descr,
- }
-
-
-def game_index(request):
- """
- Provides a list of current games, with the associated game stats.
- These games are ordered by game_id, with the most current ones first.
- Paginated.
- """
- return _game_index_data(request)
-
-
-def game_index_json(request):
- """
- Provides a list of current games, with the associated game stats.
- These games are ordered by game_id, with the most current ones first.
- Paginated. JSON.
- """
- return [{'status':'not implemented'}]
-
-
def _game_info_data(request):
game_id = request.matchdict['id']
captimes.append(pgstat)
captimes = sorted(captimes, key=lambda x:x.fastest)
- teamscores = {}
- for pgstat in pgstats:
- if pgstat.team in [5,14,13,10]:
- team = pgstat.team_html_color()
- if pgstat.teamscore is not None:
- if not teamscores.has_key(team):
- teamscores[team] = pgstat.teamscore
- else:
- if teamscores[team] != pgstat.teamscore: # this should not happen!
- teamscores[team] = None
- if len(teamscores) == 0:
- teamscores = None
-
- ### RANDOM SCORES FOR TESTING
- teams = ["red","blue","yellow","pink"]
- random.shuffle(teams)
- teamscores = {}
- for k in range(random.randint(2,4)):
- team = teams[k-1]
- teamscores[team] = random.randint(-5,150)
- ### END
-
- #TeamInfo = namedtuple('TeamInfo', ['team','scoreboardpos','playercount','teamscore'])
- #
- #teams = {}
- #last_pgs = pgstats[0]
- #for pgstat in pgstats:
- # if pgstat.team != last_pgs.team:
- # teams[last_pgs.scoreboardpos] = TeamInfo(
- # team=last_pgs.team,
- # scoreboardpos=last_pgs.scoreboardpos,
- # playercount=pgstat.scoreboardpos-last_pgs.scoreboardpos,
- # teamscore=last_pgs.teamscore)
- # last_pgs = pgstat
- #teams[last_pgs.scoreboardpos] = TeamInfo(
- # team=last_pgs.team,
- # scoreboardpos=last_pgs.scoreboardpos,
- # playercount=pgstat.scoreboardpos-last_pgs.scoreboardpos,
- # teamscore=last_pgs.teamscore)
- #print teams
-
pwstats = {}
for (pwstat, pgstat, weapon) in DBSession.query(PlayerWeaponStat, PlayerGameStat, Weapon).\
filter(PlayerWeaponStat.game_id == game_id).\
tgstats = None
pwstats = None
captimes = None
- teams = None
show_elo = False
show_latency = False
stats_by_team = None
'tgstats':tgstats,
'pwstats':pwstats,
'captimes':captimes,
- 'teams':teams,
- 'teamscores':teamscores,
'show_elo':show_elo,
'show_latency':show_latency,
'stats_by_team':stats_by_team,