]> de.git.xonotic.org Git - xonotic/xonstat.git/blob - xonstat/views/server.py
575d1b0d5ff102c7603d18caf1fd0948df17e227
[xonotic/xonstat.git] / xonstat / views / server.py
1 import logging\r
2 import sqlalchemy.sql.functions as func\r
3 import sqlalchemy.sql.expression as expr\r
4 import time\r
5 from datetime import datetime, timedelta\r
6 from pyramid.response import Response\r
7 from sqlalchemy import desc\r
8 from webhelpers.paginate import Page, PageURL\r
9 from xonstat.models import *\r
10 from xonstat.util import page_url, html_colors\r
11 \r
12 log = logging.getLogger(__name__)\r
13 \r
14 def _server_index_data(request):\r
15     if request.params.has_key('page'):\r
16         current_page = request.params['page']\r
17     else:\r
18         current_page = 1\r
19 \r
20     try:\r
21         server_q = DBSession.query(Server).\\r
22                 order_by(Server.server_id.desc())\r
23 \r
24         servers = Page(server_q, current_page, items_per_page=10, url=page_url)\r
25 \r
26         \r
27     except Exception as e:\r
28         servers = None\r
29 \r
30     return {'servers':servers, }\r
31 \r
32 \r
33 def server_index(request):\r
34     """\r
35     Provides a list of all the current servers.\r
36     """\r
37     return _server_index_data(request)\r
38 \r
39 \r
40 def _server_info_data(request):\r
41     server_id = request.matchdict['id']\r
42 \r
43     try: \r
44         leaderboard_lifetime = int(\r
45                 request.registry.settings['xonstat.leaderboard_lifetime'])\r
46     except:\r
47         leaderboard_lifetime = 30\r
48 \r
49     leaderboard_count = 10\r
50     recent_games_count = 20\r
51 \r
52     try:\r
53         server = DBSession.query(Server).filter_by(server_id=server_id).one()\r
54 \r
55         # top maps by total times played\r
56         top_maps = DBSession.query(Game.map_id, Map.name, \r
57                 func.count()).\\r
58                 filter(Map.map_id==Game.map_id).\\r
59                 filter(Game.server_id==server.server_id).\\r
60                 filter(Game.create_dt > \r
61                     (datetime.utcnow() - timedelta(days=leaderboard_lifetime))).\\r
62                 order_by(expr.desc(func.count())).\\r
63                 group_by(Game.map_id).\\r
64                 group_by(Map.name).all()[0:leaderboard_count]\r
65 \r
66         # top players by score\r
67         top_scorers = DBSession.query(Player.player_id, Player.nick, \r
68                 func.sum(PlayerGameStat.score)).\\r
69                 filter(Player.player_id == PlayerGameStat.player_id).\\r
70                 filter(Game.game_id == PlayerGameStat.game_id).\\r
71                 filter(Game.server_id == server.server_id).\\r
72                 filter(Player.player_id > 2).\\r
73                 filter(PlayerGameStat.create_dt > \r
74                         (datetime.utcnow() - timedelta(days=leaderboard_lifetime))).\\r
75                 order_by(expr.desc(func.sum(PlayerGameStat.score))).\\r
76                 group_by(Player.nick).\\r
77                 group_by(Player.player_id).all()[0:leaderboard_count]\r
78 \r
79         top_scorers = [(player_id, html_colors(nick), score) \\r
80                 for (player_id, nick, score) in top_scorers]\r
81 \r
82         # top players by playing time\r
83         top_players = DBSession.query(Player.player_id, Player.nick, \r
84                 func.sum(PlayerGameStat.alivetime)).\\r
85                 filter(Player.player_id == PlayerGameStat.player_id).\\r
86                 filter(Game.game_id == PlayerGameStat.game_id).\\r
87                 filter(Game.server_id == server.server_id).\\r
88                 filter(Player.player_id > 2).\\r
89                 filter(PlayerGameStat.create_dt > \r
90                         (datetime.utcnow() - timedelta(days=leaderboard_lifetime))).\\r
91                 order_by(expr.desc(func.sum(PlayerGameStat.alivetime))).\\r
92                 group_by(Player.nick).\\r
93                 group_by(Player.player_id).all()[0:leaderboard_count]\r
94 \r
95         top_players = [(player_id, html_colors(nick), score) \\r
96                 for (player_id, nick, score) in top_players]\r
97 \r
98         # recent games played in descending order\r
99         recent_games = DBSession.query(Game, Server, Map, PlayerGameStat).\\r
100             filter(Game.server_id==Server.server_id).\\r
101             filter(Game.map_id==Map.map_id).\\r
102             filter(PlayerGameStat.game_id==Game.game_id).\\r
103             filter(PlayerGameStat.rank==1).\\r
104             filter(Server.server_id==server.server_id).\\r
105             order_by(expr.desc(Game.start_dt)).all()[0:recent_games_count]\r
106 \r
107     except Exception as e:\r
108         server = None\r
109         recent_games = None\r
110         top_players = None\r
111         raise e\r
112     return {'server':server,\r
113             'recent_games':recent_games,\r
114             'top_players': top_players,\r
115             'top_scorers': top_scorers,\r
116             'top_maps': top_maps,\r
117             }\r
118 \r
119 \r
120 def server_info(request):\r
121     """\r
122     List the stored information about a given server.\r
123     """\r
124     serverinfo_data =  _server_info_data(request)\r
125 \r
126     # FIXME: code clone, should get these from _server_info_data\r
127     leaderboard_count = 10\r
128     recent_games_count = 20\r
129 \r
130     for i in range(leaderboard_count-len(serverinfo_data['top_maps'])):\r
131         serverinfo_data['top_maps'].append(('-', '-', '-'))\r
132 \r
133     for i in range(leaderboard_count-len(serverinfo_data['top_scorers'])):\r
134         serverinfo_data['top_scorers'].append(('-', '-', '-'))\r
135 \r
136     for i in range(leaderboard_count-len(serverinfo_data['top_players'])):\r
137         serverinfo_data['top_players'].append(('-', '-', '-'))\r
138 \r
139     for i in range(recent_games_count-len(serverinfo_data['recent_games'])):\r
140         serverinfo_data['recent_games'].append(('-', '-', '-', '-'))\r
141 \r
142     return serverinfo_data\r
143 \r
144 \r
145 def _server_game_index_data(request):\r
146     server_id = request.matchdict['server_id']\r
147     current_page = request.matchdict['page']\r
148 \r
149     try:\r
150         server = DBSession.query(Server).filter_by(server_id=server_id).one()\r
151 \r
152         games_q = DBSession.query(Game, Server, Map).\\r
153                 filter(Game.server_id == server_id).\\r
154                 filter(Game.server_id == Server.server_id).\\r
155                 filter(Game.map_id == Map.map_id).\\r
156                 order_by(Game.game_id.desc())\r
157 \r
158         games = Page(games_q, current_page, url=page_url)\r
159     except Exception as e:\r
160         server = None\r
161         games = None\r
162         raise e\r
163 \r
164     return {'games':games,\r
165             'server':server}\r
166 \r
167 \r
168 def server_game_index(request):\r
169     """\r
170     List the games played on a given server. Paginated.\r
171     """\r
172     return _server_game_index_data(request)\r