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
11 log = logging.getLogger(__name__)
14 def _main_index_data(request):
16 leaderboard_lifetime = int(
17 request.registry.settings['xonstat.leaderboard_lifetime'])
19 leaderboard_lifetime = 30
21 leaderboard_count = 10
22 recent_games_count = 20
25 duel_ranks = DBSession.query(PlayerRank.player_id, PlayerRank.nick,
27 filter(PlayerRank.game_type_cd=='duel').\
28 order_by(PlayerRank.rank).\
29 limit(leaderboard_count).all()
31 duel_ranks = [(player_id, html_colors(nick), elo) \
32 for (player_id, nick, elo) in duel_ranks]
35 ctf_ranks = DBSession.query(PlayerRank.player_id, PlayerRank.nick,
37 filter(PlayerRank.game_type_cd=='ctf').\
38 order_by(PlayerRank.rank).\
39 limit(leaderboard_count).all()
41 ctf_ranks = [(player_id, html_colors(nick), elo) \
42 for (player_id, nick, elo) in ctf_ranks]
45 dm_ranks = DBSession.query(PlayerRank.player_id, PlayerRank.nick,
47 filter(PlayerRank.game_type_cd=='dm').\
48 order_by(PlayerRank.rank).\
49 limit(leaderboard_count).all()
51 dm_ranks = [(player_id, html_colors(nick), elo) \
52 for (player_id, nick, elo) in dm_ranks]
54 right_now = datetime.utcnow()
55 back_then = datetime.utcnow() - timedelta(days=leaderboard_lifetime)
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()
67 top_players = [(player_id, html_colors(nick), score) \
68 for (player_id, nick, score) in top_players]
70 # top servers by number of total players played
71 top_servers = DBSession.query(Server.server_id, Server.name,
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()
79 # top maps by total times played
80 top_maps = DBSession.query(Game.map_id, Map.name,
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()
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]
92 return {'top_players':top_players,
93 'top_servers':top_servers,
95 'recent_games':recent_games,
96 'duel_ranks':duel_ranks,
97 'ctf_ranks':ctf_ranks,
102 def main_index(request):
104 Display the main page information.
106 mainindex_data = _main_index_data(request)
108 # FIXME: code clone, should get these from _main_index_data
109 leaderboard_count = 10
110 recent_games_count = 20
112 for i in range(leaderboard_count-len(mainindex_data['duel_ranks'])):
113 mainindex_data['duel_ranks'].append(('-', '-', '-'))
115 for i in range(leaderboard_count-len(mainindex_data['ctf_ranks'])):
116 mainindex_data['ctf_ranks'].append(('-', '-', '-'))
118 for i in range(leaderboard_count-len(mainindex_data['dm_ranks'])):
119 mainindex_data['dm_ranks'].append(('-', '-', '-'))
121 for i in range(leaderboard_count-len(mainindex_data['top_players'])):
122 mainindex_data['top_players'].append(('-', '-', '-'))
124 for i in range(leaderboard_count-len(mainindex_data['top_servers'])):
125 mainindex_data['top_servers'].append(('-', '-', '-'))
127 for i in range(leaderboard_count-len(mainindex_data['top_maps'])):
128 mainindex_data['top_maps'].append(('-', '-', '-'))
130 return mainindex_data
133 def main_index_json(request):
135 JSON output of the main page information.
137 return [{'status':'not implemented'}]