From bbea85dae89f75aa2dd79527708aea87c31dbb4e Mon Sep 17 00:00:00 2001 From: Ant Zucaro Date: Thu, 8 Dec 2011 15:56:55 -0500 Subject: [PATCH] Add a "leaderboard"-like view to the map info page. --- xonstat/templates/map_info.mako | 137 +++++++++++++++++++++++++++++++- xonstat/views/map.py | 88 +++++++++++++++++++- 2 files changed, 220 insertions(+), 5 deletions(-) diff --git a/xonstat/templates/map_info.mako b/xonstat/templates/map_info.mako index d6a4965..c454e0c 100755 --- a/xonstat/templates/map_info.mako +++ b/xonstat/templates/map_info.mako @@ -13,7 +13,138 @@ ${parent.title()}

Sorry, that map wasn't found!

% else: -

Map Detail

-ID: ${gmap.map_id}
-Name: ${gmap.name}
+

Map Detail - ${gmap.name}

+ +##### RECENT GAMES ##### +

Recent Games

+ + + + + + + + + + + % for (game, srv, map, pgstat) in recent_games: + % if game != '-': + + + + + + % else: + ${pgstat.nick_html_colors()|n} + % endif + + % else: + + + + + + + % endif + % endfor + +
Game #TypeTimeWinner
${game.game_id}${game.game_type_cd}${game.start_dt.strftime('%m/%d/%Y %H:%M')} + % if pgstat.player_id > 2: + ${pgstat.nick_html_colors()|n}
----
+ + +##### TOP SCORERS ##### +
+

Top Scoring Players

+ + + + + + + + + + <% i = 1 %> + % for (score_player_id, score_nick, score_value) in top_scorers: + + + % if score_player_id != '-': + + % else: + + % endif + + + <% i = i+1 %> + % endfor + +
#NickScore
${i}${score_nick|n}${score_nick}${score_value}
+
+ + +##### TOP PLAYERS ##### +
+

Most Active Players

+ + + + + + + + + + <% i = 1 %> + % for (player_id, nick, alivetime) in top_players: + + + % if player_id != '-': + + % else: + + % endif + + + <% i = i+1 %> + % endfor + +
#NickPlaying Time
${i}${nick|n}${nick}${alivetime}
+
+ + +##### TOP SERVERS ##### +
+

Most Active Servers

+ + + + + + + + + + <% i = 1 %> + % for (server_id, name, times_played) in top_servers: + + + + + + <% i = i+1 %> + % endfor + +
#NameTimes Played
${i}${name}${times_played}
+
+ + % endif diff --git a/xonstat/views/map.py b/xonstat/views/map.py index 659f04f..fff321f 100755 --- a/xonstat/views/map.py +++ b/xonstat/views/map.py @@ -1,4 +1,7 @@ import logging +import sqlalchemy.sql.functions as func +import sqlalchemy.sql.expression as expr +from datetime import datetime, timedelta from pyramid.response import Response from sqlalchemy import desc from webhelpers.paginate import Page, PageURL @@ -34,8 +37,89 @@ def map_info(request): List the information stored about a given map. """ map_id = request.matchdict['id'] + + try: + leaderboard_lifetime = int( + request.registry.settings['xonstat.leaderboard_lifetime']) + except: + leaderboard_lifetime = 30 + + leaderboard_count = 10 + recent_games_count = 20 + try: gmap = DBSession.query(Map).filter_by(map_id=map_id).one() - except: + + # recent games on this map + recent_games = DBSession.query(Game, Server, Map, PlayerGameStat).\ + filter(Game.server_id==Server.server_id).\ + filter(Game.map_id==Map.map_id).\ + filter(Game.map_id==map_id).\ + filter(PlayerGameStat.game_id==Game.game_id).\ + filter(PlayerGameStat.rank==1).\ + order_by(expr.desc(Game.start_dt)).all()[0:recent_games_count] + + for i in range(recent_games_count-len(recent_games)): + recent_games.append(('-', '-', '-', '-')) + + + # top players by score + top_scorers = DBSession.query(Player.player_id, Player.nick, + func.sum(PlayerGameStat.score)).\ + filter(Player.player_id == PlayerGameStat.player_id).\ + filter(Game.game_id == PlayerGameStat.game_id).\ + filter(Game.map_id == map_id).\ + filter(Player.player_id > 2).\ + filter(PlayerGameStat.create_dt > + (datetime.utcnow() - timedelta(days=leaderboard_lifetime))).\ + order_by(expr.desc(func.sum(PlayerGameStat.score))).\ + group_by(Player.nick).\ + group_by(Player.player_id).all()[0:10] + + top_scorers = [(player_id, html_colors(nick), score) \ + for (player_id, nick, score) in top_scorers] + + for i in range(leaderboard_count-len(top_scorers)): + top_scorers.append(('-', '-', '-')) + + # top players by playing time + top_players = DBSession.query(Player.player_id, Player.nick, + func.sum(PlayerGameStat.alivetime)).\ + filter(Player.player_id == PlayerGameStat.player_id).\ + filter(Game.game_id == PlayerGameStat.game_id).\ + filter(Game.map_id == map_id).\ + filter(Player.player_id > 2).\ + filter(PlayerGameStat.create_dt > + (datetime.utcnow() - timedelta(days=leaderboard_lifetime))).\ + order_by(expr.desc(func.sum(PlayerGameStat.alivetime))).\ + group_by(Player.nick).\ + group_by(Player.player_id).all()[0:10] + + top_players = [(player_id, html_colors(nick), score) \ + for (player_id, nick, score) in top_players] + + for i in range(leaderboard_count-len(top_players)): + top_players.append(('-', '-', '-')) + + # top servers using/playing this map + top_servers = DBSession.query(Server.server_id, Server.name, + func.count(Game.game_id)).\ + filter(Game.server_id == Server.server_id).\ + filter(Game.map_id == map_id).\ + filter(Game.create_dt > + (datetime.utcnow() - timedelta(days=leaderboard_lifetime))).\ + order_by(expr.desc(func.count(Game.game_id))).\ + group_by(Server.name).\ + group_by(Server.server_id).all()[0:10] + + for i in range(leaderboard_count-len(top_servers)): + top_servers.append(('-', '-', '-')) + + except Exception as e: gmap = None - return {'gmap':gmap} + return {'gmap':gmap, + 'recent_games':recent_games, + 'top_scorers':top_scorers, + 'top_players':top_players, + 'top_servers':top_servers, + } -- 2.39.2