]> de.git.xonotic.org Git - xonotic/xonstat.git/blob - xonstat/views/player.py
Show player elo on the player info page.
[xonotic/xonstat.git] / xonstat / views / player.py
1 import datetime\r
2 import logging\r
3 import re\r
4 import sqlalchemy as sa\r
5 import time\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
12 \r
13 log = logging.getLogger(__name__)\r
14 \r
15 \r
16 def player_index(request):\r
17     """\r
18     Provides a list of all the current players. \r
19     """\r
20     if 'page' in request.matchdict:\r
21         current_page = int(request.matchdict['page'])\r
22     else:\r
23         current_page = 1\r
24 \r
25     try:\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
31 \r
32         players = Page(player_q, current_page, items_per_page=10, url=page_url)\r
33 \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
37 \r
38         pages_to_link = range(current_page+1, last_linked_page+1)\r
39 \r
40     except Exception as e:\r
41         players = None\r
42         raise e\r
43 \r
44     return {'players':players,\r
45             'pages_to_link':pages_to_link,\r
46             }\r
47 \r
48 \r
49 def player_info(request):\r
50     """\r
51     Provides detailed information on a specific player\r
52     """\r
53     player_id = int(request.matchdict['id'])\r
54     if player_id <= 2:\r
55         player_id = -1;\r
56 \r
57     try:\r
58         player = DBSession.query(Player).filter_by(player_id=player_id).\\r
59                 filter(Player.active_ind == True).one()\r
60 \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
64 \r
65         elos_display = []\r
66         for elo in elos:\r
67             if elo.games > 32:\r
68                 str = "{0} ({1})"\r
69             else:\r
70                 str = "{0}* ({1})"\r
71 \r
72             elos_display.append(str.format(round(elo.elo, 3),\r
73                 elo.game_type_cd))\r
74 \r
75         weapon_stats = DBSession.query("descr", "weapon_cd", "actual_total", \r
76                 "max_total", "hit_total", "fired_total", "frags_total").\\r
77                 from_statement(\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
85                     "order by descr"\r
86                 ).params(player_id=player_id).all()\r
87 \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
94 \r
95         game_stats = {}\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
114                 from_statement(\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
128 \r
129         for (key,value) in game_stats.items():\r
130             if value == None:\r
131                 game_stats[key] = '-'\r
132 \r
133     except Exception as e:\r
134         player = None\r
135         elos_display = None\r
136         weapon_stats = None\r
137         game_stats = None\r
138         recent_games = None\r
139 \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
145 \r
146 \r
147 def player_game_index(request):\r
148     """\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
152     """\r
153     player_id = request.matchdict['player_id']\r
154 \r
155     if 'page' in request.matchdict:\r
156         current_page = request.matchdict['page']\r
157     else:\r
158         current_page = 1\r
159 \r
160     try:\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
167 \r
168         games = Page(games_q, current_page, url=page_url)\r
169 \r
170         pgstats = {}\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
176 \r
177     except Exception as e:\r
178         player = None\r
179         games = None\r
180 \r
181     return {'player_id':player_id,\r
182             'games':games,\r
183             'pgstats':pgstats}\r