From: Ant Zucaro Date: Thu, 3 Nov 2011 16:37:13 +0000 (-0400) Subject: Add a server leaderboard of sorts. X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=c61e136e41ff7452499d0e1d068fea9da1f75c4f;p=xonotic%2Fxonstat.git Add a server leaderboard of sorts. --- diff --git a/xonstat/templates/server_info.mako b/xonstat/templates/server_info.mako index d01296b..6ce7b58 100755 --- a/xonstat/templates/server_info.mako +++ b/xonstat/templates/server_info.mako @@ -18,12 +18,113 @@ IP Address: ${server.ip_addr}
Revision: ${server.revision}
Created: ${server.create_dt.strftime('%m/%d/%Y at %I:%M %p')}
-% if recent_games: + +##### RECENT GAMES #####

Recent Games

-% for (game, theserver, map) in recent_games: - #${game.game_id}: ${map.name} -
-% endfor -More games played on ${server.name}... -% endif + + + + + + + + + + + + % for (game, srv, map, pgstat) in recent_games: + % if game != '-': + + + + + + + % else: + ${pgstat.nick_html_colors()} + % endif + + % else: + + + + + + + + % endif + % endfor + +
Game #TypeMapTimeWinner
${game.game_id}${game.game_type_cd}${map.name}${game.start_dt.strftime('%m/%d/%Y %H:%M')} + % if pgstat.player_id > 2: + ${pgstat.nick_html_colors()}
-----
+ + +##### 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 MAPS ##### +
+

Most Active Maps

+ + + + + + + + + + <% i = 1 %> + % for (map_id, name, count) in top_maps: + + + % if map_id != '-': + + % else: + + % endif + + + <% i = i+1 %> + % endfor + +
#Map# Games
${i}${name}${name}${count}
+
+ % endif diff --git a/xonstat/views/server.py b/xonstat/views/server.py index e0dce91..0a2dac7 100755 --- a/xonstat/views/server.py +++ b/xonstat/views/server.py @@ -1,11 +1,14 @@ -import datetime import logging +import sqlalchemy.sql.functions as func +import sqlalchemy.sql.expression as expr import time +from datetime import datetime, timedelta +from pyramid.config import get_current_registry from pyramid.response import Response from sqlalchemy import desc from webhelpers.paginate import Page, PageURL from xonstat.models import * -from xonstat.util import page_url +from xonstat.util import page_url, html_colors log = logging.getLogger(__name__) @@ -36,19 +39,76 @@ def server_info(request): List the stored information about a given server. """ server_id = request.matchdict['id'] + + # get settings specific to this view + settings = get_current_registry().settings + try: + leaderboard_lifetime = int( + settings['xonstat.leaderboard_lifetime']) + except: + leaderboard_lifetime = 30 + + leaderboard_count = 10 + recent_games_count = 20 + try: server = DBSession.query(Server).filter_by(server_id=server_id).one() - recent_games = DBSession.query(Game, Server, Map).\ - filter(Game.server_id == server_id).\ - filter(Game.server_id == Server.server_id).\ - filter(Game.map_id == Map.map_id).\ - order_by(Game.game_id.desc())[0:10] + + # top maps by total times played + top_maps = DBSession.query(Game.map_id, Map.name, + func.count()).\ + filter(Map.map_id==Game.map_id).\ + filter(Game.server_id==server.server_id).\ + filter(Game.create_dt > + (datetime.now() - timedelta(days=leaderboard_lifetime))).\ + order_by(expr.desc(func.count())).\ + group_by(Game.map_id).\ + group_by(Map.name).all()[0:10] + + for i in range(leaderboard_count-len(top_maps)): + top_maps.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.server_id == server.server_id).\ + filter(Player.player_id > 2).\ + filter(PlayerGameStat.create_dt > + (datetime.now() - 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(('-', '-', '-')) + + # recent games played in descending order + recent_games = DBSession.query(Game, Server, Map, PlayerGameStat).\ + filter(Game.server_id==Server.server_id).\ + filter(Game.map_id==Map.map_id).\ + filter(PlayerGameStat.game_id==Game.game_id).\ + filter(PlayerGameStat.rank==1).\ + filter(Server.server_id==server.server_id).\ + 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(('-', '-', '-', '-')) except Exception as e: server = None recent_games = None + top_players = None + raise e return {'server':server, - 'recent_games':recent_games} + 'recent_games':recent_games, + 'top_players': top_players, + 'top_maps': top_maps, + } def server_game_index(request):