5 from pyramid.response import Response
6 from sqlalchemy import desc, func, over
7 from collections import namedtuple
8 from webhelpers.paginate import Page, PageURL
9 from xonstat.models import *
10 from xonstat.util import page_url
11 from xonstat.views.helpers import RecentGame, recent_games_q
15 log = logging.getLogger(__name__)
19 def _game_index_data(request):
21 game_type_descr = None
23 if request.params.has_key('game_type_cd'):
24 game_type_cd = request.params['game_type_cd']
26 game_type_descr = DBSession.query(GameType.descr).\
27 filter(GameType.game_type_cd == game_type_cd).\
29 except Exception as e:
32 if request.params.has_key('page'):
33 current_page = request.params['page']
38 rgs_q = recent_games_q(game_type_cd=game_type_cd)
40 games = Page(rgs_q, current_page, items_per_page=10, url=page_url)
42 # replace the items in the canned pagination class with more rich ones
43 games.items = [RecentGame(row) for row in games.items]
46 for game in games.items:
47 pgstats[game.game_id] = DBSession.query(PlayerGameStat).\
48 filter(PlayerGameStat.game_id == game.game_id).\
49 order_by(PlayerGameStat.scoreboardpos).\
50 order_by(PlayerGameStat.score).all()
52 except Exception as e:
56 game_type_descr = None
58 return {'games':games,
60 'game_type_cd':game_type_cd,
61 'game_type_descr':game_type_descr,
65 def game_index(request):
67 Provides a list of current games, with the associated game stats.
68 These games are ordered by game_id, with the most current ones first.
71 return _game_index_data(request)
74 def game_index_json(request):
76 Provides a list of current games, with the associated game stats.
77 These games are ordered by game_id, with the most current ones first.
80 return [{'status':'not implemented'}]
83 def _game_info_data(request):
84 game_id = request.matchdict['id']
86 if request.params.has_key('show_elo'):
91 if request.params.has_key('show_latency'):
99 (game, server, map, gametype) = DBSession.query(Game, Server, Map, GameType).\
100 filter(Game.game_id == game_id).\
101 filter(Game.server_id == Server.server_id).\
102 filter(Game.map_id == Map.map_id).\
103 filter(Game.game_type_cd == GameType.game_type_cd).one()
105 pgstats = DBSession.query(PlayerGameStat).\
106 filter(PlayerGameStat.game_id == game_id).\
107 order_by(PlayerGameStat.scoreboardpos).\
108 order_by(PlayerGameStat.score).\
112 if game.game_type_cd == 'ctf':
113 for pgstat in pgstats:
114 if pgstat.fastest is not None:
115 captimes.append(pgstat)
117 captimes = sorted(captimes, key=lambda x:x.fastest)
120 for pgstat in pgstats:
121 if pgstat.team in [5,14,13,10]:
122 team = pgstat.team_html_color()
123 if pgstat.teamscore is not None:
124 if not teamscores.has_key(team):
125 teamscores[team] = pgstat.teamscore
127 if teamscores[team] != pgstat.teamscore: # this should not happen!
128 teamscores[team] = None
129 if len(teamscores) == 0:
132 ### RANDOM SCORES FOR TESTING
133 teams = ["red","blue","yellow","pink"]
134 random.shuffle(teams)
136 for k in range(random.randint(2,4)):
138 teamscores[team] = random.randint(-5,150)
141 #TeamInfo = namedtuple('TeamInfo', ['team','scoreboardpos','playercount','teamscore'])
144 #last_pgs = pgstats[0]
145 #for pgstat in pgstats:
146 # if pgstat.team != last_pgs.team:
147 # teams[last_pgs.scoreboardpos] = TeamInfo(
148 # team=last_pgs.team,
149 # scoreboardpos=last_pgs.scoreboardpos,
150 # playercount=pgstat.scoreboardpos-last_pgs.scoreboardpos,
151 # teamscore=last_pgs.teamscore)
153 #teams[last_pgs.scoreboardpos] = TeamInfo(
154 # team=last_pgs.team,
155 # scoreboardpos=last_pgs.scoreboardpos,
156 # playercount=pgstat.scoreboardpos-last_pgs.scoreboardpos,
157 # teamscore=last_pgs.teamscore)
161 for (pwstat, pgstat, weapon) in DBSession.query(PlayerWeaponStat, PlayerGameStat, Weapon).\
162 filter(PlayerWeaponStat.game_id == game_id).\
163 filter(PlayerWeaponStat.weapon_cd == Weapon.weapon_cd).\
164 filter(PlayerWeaponStat.player_game_stat_id == \
165 PlayerGameStat.player_game_stat_id).\
166 order_by(PlayerGameStat.scoreboardpos).\
167 order_by(PlayerGameStat.score).\
168 order_by(Weapon.descr).\
170 if pgstat.player_game_stat_id not in pwstats:
171 pwstats[pgstat.player_game_stat_id] = []
173 # NOTE adding pgstat to position 6 in order to display nick.
174 # You have to use a slice [0:5] to pass to the accuracy
176 pwstats[pgstat.player_game_stat_id].append((weapon.descr,
177 weapon.weapon_cd, pwstat.actual, pwstat.max,
178 pwstat.hit, pwstat.fired, pgstat))
180 except Exception as inst:
201 'teamscores':teamscores,
203 'show_latency':show_latency,
207 def game_info(request):
209 List the game stats (scoreboard) for a particular game. Paginated.
211 return _game_info_data(request)
214 def game_info_json(request):
216 List the game stats (scoreboard) for a particular game. Paginated. JSON.
218 return [{'status':'not implemented'}]
221 def _rank_index_data(request):
222 if request.params.has_key('page'):
223 current_page = request.params['page']
227 game_type_cd = request.matchdict['game_type_cd']
229 ranks_q = DBSession.query(PlayerRank).\
230 filter(PlayerRank.game_type_cd==game_type_cd).\
231 order_by(PlayerRank.rank)
233 ranks = Page(ranks_q, current_page, url=page_url)
240 'game_type_cd':game_type_cd,
244 def rank_index(request):
246 Provide a list of gametype ranks, paginated.
248 return _rank_index_data(request)
251 def rank_index_json(request):
253 Provide a list of gametype ranks, paginated. JSON.
255 return [{'status':'not implemented'}]
258 def game_finder_data(request):
259 if request.params.has_key('page'):
260 current_page = request.params['page']
266 server_id, map_id, player_id = None, None, None
267 range_start, range_end, game_type_cd = None, None, None
268 game_type_descr = None
270 # these become WHERE clauses when present
271 if request.params.has_key('server_id'):
272 server_id = request.params['server_id']
273 query['server_id'] = server_id
275 if request.params.has_key('map_id'):
276 map_id = request.params['map_id']
277 query['map_id'] = map_id
279 if request.params.has_key('player_id'):
280 player_id = request.params['player_id']
281 query['player_id'] = player_id
283 if request.params.has_key('range_start'):
284 range_start = request.params['range_start']
285 query['range_start'] = range_start
287 if request.params.has_key('range_end'):
288 range_end = request.params['range_end']
289 query['range_end'] = range_end
291 if request.params.has_key('type'):
292 game_type_cd = request.params['type']
293 query['type'] = game_type_cd
295 game_type_descr = DBSession.query(GameType.descr).\
296 filter(GameType.game_type_cd == game_type_cd).\
298 except Exception as e:
301 rgs_q = recent_games_q(server_id=server_id, map_id=map_id,
302 player_id=player_id, game_type_cd=game_type_cd)
304 recent_games = Page(rgs_q, current_page, url=page_url)
306 recent_games.items = [RecentGame(row) for row in recent_games.items]
309 'recent_games':recent_games,
311 'game_type_cd':game_type_cd,
314 def game_finder(request):
316 Provide a list of recent games with an advanced filter.
318 return game_finder_data(request)