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