]> de.git.xonotic.org Git - xonotic/xonstat.git/blob - xonstat/views/server.py
Add a server leaderboard of sorts.
[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 playing time\r
72         top_players = DBSession.query(Player.player_id, Player.nick, \r
73                 func.sum(PlayerGameStat.alivetime)).\\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.alivetime))).\\r
81                 group_by(Player.nick).\\r
82                 group_by(Player.player_id).all()[0:10]\r
83 \r
84         top_players = [(player_id, html_colors(nick), score) \\r
85                 for (player_id, nick, score) in top_players]\r
86 \r
87         for i in range(leaderboard_count-len(top_players)):\r
88             top_players.append(('-', '-', '-'))\r
89 \r
90         # recent games played in descending order\r
91         recent_games = DBSession.query(Game, Server, Map, PlayerGameStat).\\r
92             filter(Game.server_id==Server.server_id).\\r
93             filter(Game.map_id==Map.map_id).\\r
94             filter(PlayerGameStat.game_id==Game.game_id).\\r
95             filter(PlayerGameStat.rank==1).\\r
96             filter(Server.server_id==server.server_id).\\r
97             order_by(expr.desc(Game.start_dt)).all()[0:recent_games_count]\r
98 \r
99         for i in range(recent_games_count-len(recent_games)):\r
100             recent_games.append(('-', '-', '-', '-'))\r
101 \r
102     except Exception as e:\r
103         server = None\r
104         recent_games = None\r
105         top_players = None\r
106         raise e\r
107     return {'server':server,\r
108             'recent_games':recent_games,\r
109             'top_players': top_players,\r
110             'top_maps': top_maps,\r
111             }\r
112 \r
113 \r
114 def server_game_index(request):\r
115     """\r
116     List the games played on a given server. Paginated.\r
117     """\r
118     server_id = request.matchdict['server_id']\r
119     current_page = request.matchdict['page']\r
120 \r
121     try:\r
122         server = DBSession.query(Server).filter_by(server_id=server_id).one()\r
123 \r
124         games_q = DBSession.query(Game, Server, Map).\\r
125                 filter(Game.server_id == server_id).\\r
126                 filter(Game.server_id == Server.server_id).\\r
127                 filter(Game.map_id == Map.map_id).\\r
128                 order_by(Game.game_id.desc())\r
129 \r
130         games = Page(games_q, current_page, url=page_url)\r
131     except Exception as e:\r
132         server = None\r
133         games = None\r
134         raise e\r
135 \r
136     return {'games':games,\r
137             'server':server}\r