4 import sqlalchemy as sa
\r
6 from pyramid.response import Response
\r
7 from pyramid.url import current_route_url
\r
8 from sqlalchemy import desc
\r
9 from webhelpers.paginate import Page, PageURL
\r
10 from xonstat.models import *
\r
11 from xonstat.util import page_url
\r
13 log = logging.getLogger(__name__)
\r
16 def player_index(request):
\r
18 Provides a list of all the current players.
\r
20 if 'page' in request.matchdict:
\r
21 current_page = int(request.matchdict['page'])
\r
26 player_q = DBSession.query(Player).\
\r
27 filter(Player.player_id > 2).\
\r
28 filter(Player.active_ind == True).\
\r
29 filter(sa.not_(Player.nick.like('Anonymous Player%'))).\
\r
30 order_by(Player.player_id.desc())
\r
32 players = Page(player_q, current_page, items_per_page=10, url=page_url)
\r
34 last_linked_page = current_page + 4
\r
35 if last_linked_page > players.last_page:
\r
36 last_linked_page = players.last_page
\r
38 pages_to_link = range(current_page+1, last_linked_page+1)
\r
40 except Exception as e:
\r
44 return {'players':players,
\r
45 'pages_to_link':pages_to_link,
\r
49 def player_info(request):
\r
51 Provides detailed information on a specific player
\r
53 player_id = int(request.matchdict['id'])
\r
58 player = DBSession.query(Player).filter_by(player_id=player_id).\
\r
59 filter(Player.active_ind == True).one()
\r
61 elos = DBSession.query(PlayerElo).filter_by(player_id=player_id).\
\r
62 filter(PlayerElo.game_type_cd.in_(['ctf','duel','dm'])).\
\r
63 order_by(PlayerElo.elo.desc()).all()
\r
72 elos_display.append(str.format(round(elo.elo, 3),
\r
75 weapon_stats = DBSession.query("descr", "weapon_cd", "actual_total",
\r
76 "max_total", "hit_total", "fired_total", "frags_total").\
\r
78 "select cw.descr, cw.weapon_cd, sum(actual) actual_total, "
\r
79 "sum(max) max_total, sum(hit) hit_total, "
\r
80 "sum(fired) fired_total, sum(frags) frags_total "
\r
81 "from player_weapon_stats ws, cd_weapon cw "
\r
82 "where ws.weapon_cd = cw.weapon_cd "
\r
83 "and player_id = :player_id "
\r
84 "group by descr, cw.weapon_cd "
\r
86 ).params(player_id=player_id).all()
\r
88 recent_games = DBSession.query(PlayerGameStat, Game, Server, Map).\
\r
89 filter(PlayerGameStat.player_id == player_id).\
\r
90 filter(PlayerGameStat.game_id == Game.game_id).\
\r
91 filter(Game.server_id == Server.server_id).\
\r
92 filter(Game.map_id == Map.map_id).\
\r
93 order_by(Game.game_id.desc())[0:10]
\r
96 (game_stats['avg_rank'], game_stats['total_kills'],
\r
97 game_stats['total_deaths'], game_stats['total_suicides'],
\r
98 game_stats['total_score'], game_stats['total_time'],
\r
99 game_stats['total_held'], game_stats['total_captures'],
\r
100 game_stats['total_pickups'],game_stats['total_drops'],
\r
101 game_stats['total_returns'], game_stats['total_collects'],
\r
102 game_stats['total_destroys'], game_stats['total_dhk'],
\r
103 game_stats['total_pushes'], game_stats['total_pushed'],
\r
104 game_stats['total_carrier_frags'],
\r
105 game_stats['total_alivetime'],
\r
106 game_stats['total_games_played']) = DBSession.\
\r
107 query("avg_rank", "total_kills", "total_deaths",
\r
108 "total_suicides", "total_score", "total_time", "total_held",
\r
109 "total_captures", "total_pickups", "total_drops",
\r
110 "total_returns", "total_collects", "total_destroys",
\r
111 "total_dhk", "total_pushes", "total_pushed",
\r
112 "total_carrier_frags", "total_alivetime",
\r
113 "total_games_played").\
\r
115 "select round(avg(rank)) avg_rank, sum(kills) total_kills, "
\r
116 "sum(deaths) total_deaths, sum(suicides) total_suicides, "
\r
117 "sum(score) total_score, sum(time) total_time, "
\r
118 "sum(held) total_held, sum(captures) total_captures, "
\r
119 "sum(pickups) total_pickups, sum(drops) total_drops, "
\r
120 "sum(returns) total_returns, sum(collects) total_collects, "
\r
121 "sum(destroys) total_destroys, sum(destroys_holding_key) total_dhk, "
\r
122 "sum(pushes) total_pushes, sum(pushed) total_pushed, "
\r
123 "sum(carrier_frags) total_carrier_frags, "
\r
124 "sum(alivetime) total_alivetime, count(*) total_games_played "
\r
125 "from player_game_stats "
\r
126 "where player_id=:player_id"
\r
127 ).params(player_id=player_id).one()
\r
129 for (key,value) in game_stats.items():
\r
131 game_stats[key] = '-'
\r
133 except Exception as e:
\r
135 elos_display = None
\r
136 weapon_stats = None
\r
138 recent_games = None
\r
140 return {'player':player,
\r
141 'elos_display':elos_display,
\r
142 'recent_games':recent_games,
\r
143 'weapon_stats':weapon_stats,
\r
144 'game_stats':game_stats}
\r
147 def player_game_index(request):
\r
149 Provides an index of the games in which a particular
\r
150 player was involved. This is ordered by game_id, with
\r
151 the most recent game_ids first. Paginated.
\r
153 player_id = request.matchdict['player_id']
\r
155 if 'page' in request.matchdict:
\r
156 current_page = request.matchdict['page']
\r
161 games_q = DBSession.query(Game, Server, Map).\
\r
162 filter(PlayerGameStat.game_id == Game.game_id).\
\r
163 filter(PlayerGameStat.player_id == player_id).\
\r
164 filter(Game.server_id == Server.server_id).\
\r
165 filter(Game.map_id == Map.map_id).\
\r
166 order_by(Game.game_id.desc())
\r
168 games = Page(games_q, current_page, url=page_url)
\r
171 for (game, server, map) in games:
\r
172 pgstats[game.game_id] = DBSession.query(PlayerGameStat).\
\r
173 filter(PlayerGameStat.game_id == game.game_id).\
\r
174 order_by(PlayerGameStat.rank).\
\r
175 order_by(PlayerGameStat.score).all()
\r
177 except Exception as e:
\r
181 return {'player_id':player_id,
\r