]> de.git.xonotic.org Git - xonotic/xonstat.git/blob - xonstat/views/main.py
If there are no recent games, do not show the section.
[xonotic/xonstat.git] / xonstat / views / main.py
1 import logging
2 import sqlalchemy.sql.functions as func
3 import sqlalchemy.sql.expression as expr
4 from datetime import datetime, timedelta
5 from pyramid.response import Response
6 from xonstat.models import *
7 from xonstat.util import *
8 from xonstat.views.helpers import RecentGame, recent_games_q
9
10
11 log = logging.getLogger(__name__)
12
13
14 def _main_index_data(request):
15     try:
16         leaderboard_lifetime = int(
17                 request.registry.settings['xonstat.leaderboard_lifetime'])
18     except:
19         leaderboard_lifetime = 30
20
21     leaderboard_count = 10
22     recent_games_count = 20
23
24     # top ranked duelers
25     duel_ranks = DBSession.query(PlayerRank.player_id, PlayerRank.nick, 
26             PlayerRank.elo).\
27             filter(PlayerRank.game_type_cd=='duel').\
28             order_by(PlayerRank.rank).\
29             limit(leaderboard_count).all()
30
31     duel_ranks = [(player_id, html_colors(nick), elo) \
32             for (player_id, nick, elo) in duel_ranks]
33
34     # top ranked CTF-ers
35     ctf_ranks = DBSession.query(PlayerRank.player_id, PlayerRank.nick, 
36             PlayerRank.elo).\
37             filter(PlayerRank.game_type_cd=='ctf').\
38             order_by(PlayerRank.rank).\
39             limit(leaderboard_count).all()
40
41     ctf_ranks = [(player_id, html_colors(nick), elo) \
42             for (player_id, nick, elo) in ctf_ranks]
43
44     # top ranked DM-ers
45     dm_ranks = DBSession.query(PlayerRank.player_id, PlayerRank.nick, 
46             PlayerRank.elo).\
47             filter(PlayerRank.game_type_cd=='dm').\
48             order_by(PlayerRank.rank).\
49             limit(leaderboard_count).all()
50
51     dm_ranks = [(player_id, html_colors(nick), elo) \
52             for (player_id, nick, elo) in dm_ranks]
53
54     right_now = datetime.utcnow()
55     back_then = datetime.utcnow() - timedelta(days=leaderboard_lifetime)
56
57     # top players by playing time
58     top_players = DBSession.query(Player.player_id, Player.nick, 
59             func.sum(PlayerGameStat.alivetime)).\
60             filter(Player.player_id == PlayerGameStat.player_id).\
61             filter(Player.player_id > 2).\
62             filter(expr.between(PlayerGameStat.create_dt, back_then, right_now)).\
63             order_by(expr.desc(func.sum(PlayerGameStat.alivetime))).\
64             group_by(Player.nick).\
65             group_by(Player.player_id).limit(leaderboard_count).all()
66
67     top_players = [(player_id, html_colors(nick), score) \
68             for (player_id, nick, score) in top_players]
69
70     # top servers by number of total players played
71     top_servers = DBSession.query(Server.server_id, Server.name, 
72             func.count()).\
73             filter(Game.server_id==Server.server_id).\
74             filter(expr.between(Game.create_dt, back_then, right_now)).\
75             order_by(expr.desc(func.count(Game.game_id))).\
76             group_by(Server.server_id).\
77             group_by(Server.name).limit(leaderboard_count).all()
78
79     # top maps by total times played
80     top_maps = DBSession.query(Game.map_id, Map.name, 
81             func.count()).\
82             filter(Map.map_id==Game.map_id).\
83             filter(expr.between(Game.create_dt, back_then, right_now)).\
84             order_by(expr.desc(func.count())).\
85             group_by(Game.map_id).\
86             group_by(Map.name).limit(leaderboard_count).all()
87
88     # recent games played in descending order
89     rgs = recent_games_q(cutoff=back_then).limit(recent_games_count).all()
90     recent_games = [RecentGame(row) for row in rgs]
91
92     return {'top_players':top_players,
93             'top_servers':top_servers,
94             'top_maps':top_maps,
95             'recent_games':recent_games,
96             'duel_ranks':duel_ranks,
97             'ctf_ranks':ctf_ranks,
98             'dm_ranks':dm_ranks,
99             }
100
101
102 def main_index(request):
103     """
104     Display the main page information.
105     """
106     mainindex_data =  _main_index_data(request)
107
108     # FIXME: code clone, should get these from _main_index_data
109     leaderboard_count = 10
110     recent_games_count = 20
111
112     for i in range(leaderboard_count-len(mainindex_data['duel_ranks'])):
113         mainindex_data['duel_ranks'].append(('-', '-', '-'))
114
115     for i in range(leaderboard_count-len(mainindex_data['ctf_ranks'])):
116         mainindex_data['ctf_ranks'].append(('-', '-', '-'))
117
118     for i in range(leaderboard_count-len(mainindex_data['dm_ranks'])):
119         mainindex_data['dm_ranks'].append(('-', '-', '-'))
120
121     for i in range(leaderboard_count-len(mainindex_data['top_players'])):
122         mainindex_data['top_players'].append(('-', '-', '-'))
123
124     for i in range(leaderboard_count-len(mainindex_data['top_servers'])):
125         mainindex_data['top_servers'].append(('-', '-', '-'))
126
127     for i in range(leaderboard_count-len(mainindex_data['top_maps'])):
128         mainindex_data['top_maps'].append(('-', '-', '-'))
129
130     return mainindex_data
131
132
133 def main_index_json(request):
134     """
135     JSON output of the main page information.
136     """
137     return [{'status':'not implemented'}]