]> de.git.xonotic.org Git - xonotic/xonstat.git/commitdiff
Playing around with teamscore display (uses random scores for testing)
authorJan Behrens <zykure@web.de>
Sun, 21 Apr 2013 00:03:17 +0000 (02:03 +0200)
committerJan Behrens <zykure@web.de>
Sun, 21 Apr 2013 00:03:17 +0000 (02:03 +0200)
xonstat/static/css/app.min.css
xonstat/templates/game_info.mako
xonstat/templates/scoreboard.mako
xonstat/views/game.py

index 2168fc1254c76089f99369f76d541620020f6b57..6938bc2a4b00bbd75a653f19f72da71e7039f256 100644 (file)
@@ -1 +1,5 @@
 @font-face{font-family:'XoloniumNormal';src:url('fonts/xolonium-webfont.eot');src:url('fonts/xolonium-webfont.eot?#iefix') format('embedded-opentype'),url('fonts/xolonium-webfont.woff') format('woff'),url('fonts/xolonium-webfont.ttf') format('truetype'),url('fonts/xolonium-webfont.svg#XoloniumNormal') format('svg');font-weight:normal;font-style:normal}body{background:url("img/web_background_4.jpg") no-repeat fixed center center / cover black;background-color:black;color:#d0d0d0;font-family:"XoloniumNormal","Helvetica Neue",Helvetica,Arial,sans-serif}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999}h1{font-size:30px;line-height:36px}h1 small{font-size:18px}h2{font-size:24px;line-height:36px}h2 small{font-size:18px}h3{line-height:27px;font-size:18px}h3 small{font-size:14px}h4,h5,h6{line-height:18px}h4{font-size:14px}h4 small{font-size:12px}h5{font-size:12px}h6{font-size:11px;color:#999;text-transform:uppercase}table{background:#000;background:none repeat scroll 0 0 rgba(0,0,0,0.7);border:1px solid #436688}table th{border:1px solid #436688;background-color:#001021}table td{border:1px solid #436688;font-size:10px}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#222}.table th,.table td{border:1px solid #436688}.table td{vertical-align:middle}.table .tdcenter{text-align:center}.accordion-group{border:1px solid #272525}.accordion-inner{border:0}#statline{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;position:relative;top:-25px}#xonborder{background:#000;background:none repeat scroll 0 0 rgba(0,0,0,0.5);border-radius:15px 15px 15px 15px;margin-bottom:30px;margin-left:0;padding:20px}#title{color:#08c;font-size:30px;margin-bottom:15px;position:relative;text-align:center;text-shadow:2px 2px 3px #333}.indexform{margin:20px 0 20px 0}.indexbox{width:250px}.navbar-brand{margin-left:0;padding-bottom:0;padding-top:10px;text-align:left}.navbar-inverse{background:none repeat scroll 0 0 rgba(0,0,0,0.6)}.navbar-inverse .nav>.active>a,.navbar-inverse .nav>.active>a:hover,.navbar-inverse .nav>.active>a:focus{background:none repeat scroll 0 0 rgba(49,49,49,0.6)}.navbar-inverse .nav>li>a,.navbar-brand{font-family:XoloniumNormal}.search,input[type="search"]{background-color:#606060;border:1px solid #202020;color:#aaa;width:100px}.game{float:left;margin-bottom:30px;min-width:700px;padding:10px 7px}.game a{color:#CCC}.game a:hover{color:#d95f00;text-decoration:none}.game tr{background-color:#000}.game tr.red{background-color:#4d0000}.game tr.blue{background-color:#00004d}.game tr.yellow{background-color:#4d4d00}.game tr.pink{background-color:#4d004d}.game tr:hover{background-color:#222}.teamscores td{background-color:#000;text-align:center;padding:4px;font-size:18px}.teamscores td.red{background-color:#4d0000}.teamscores td.blue{background-color:#00004d}.teamscores td.yellow{background-color:#4d4d00}.teamscores td.pink{background-color:#4d004d}.weapon-nav{height:70px;margin-bottom:20px}.weapon-nav ul{display:block;list-style:none outside none}.weapon-nav li{cursor:pointer;float:left;margin-right:10px}.weapon-nav li:hover{border-bottom:2px solid #001021}.weapon-nav .weapon-active{border-bottom:2px solid #436688}.weapon-nav p{text-align:center}.flot table,.flot td{background-color:black;border:0}#gbtabcontainer{margin-top:10px}#gbtab{font-size:12px}.tabbable p{font-size:14px}.tabs-below .nav-tabs>li>a{border-radius:4px 4px 4px 4px}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{background-color:#111;color:#aaa;border-color:#222}.nav-tabs>li>a{border-radius:4px 4px 4px 4px;text-align:center}.nav-tabs>li>a:hover{background-color:#111;border-color:#333}.nav-tabs{border-bottom:0 solid #000}.table .tdcenter{text-align:center}.game-detail img{float:left;margin-right:10px;margin-bottom:5px}.game img{float:left;margin-right:5px;margin-bottom:5px}.game-detail p,.game h4{float:left}.eloup{color:green}.elodown{color:#be0000}.eloneutral{color:gray}.nostretch{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pagination>li>a,.pagination>li>span{background-color:#111;border-color:#313131;color:#797979}.pagination>li>a:hover,.pagination>li>a:focus,.pagination>.active>a,.pagination>.active>span{background-color:#2b2222}@media(min-width:768px){.navbar-form{float:right}}
+
+.scoreboard-entry { width: 120px; max-width: 120px; overflow: hidden; }
+
+td.teamscore { font-size: 16px; text-align: center; }
index 2de16f56e1f8e0db1e211f409ae240ffb5352284..0bcd541ce865e109884644326e1fd5859deb6894 100644 (file)
@@ -51,7 +51,7 @@ Game Information
 <div class="row">
   <div class="span12 game">
     <h3>Scoreboard</h3>
-    ${scoreboard(game.game_type_cd, pgstats, show_elo, show_latency)}
+    ${scoreboard(game.game_type_cd, pgstats, teams, show_elo, show_latency)}
   </div>
 </div>
 
index 1f4f51f8321bc74f0420b5601cc1dc81152a6456..cfcdfc30ecbdcca3576ad235f68ca1cf9f287f3a 100644 (file)
@@ -1,22 +1,21 @@
-<%def name="scoreboard(game_type_cd, pgstats, show_elo=False, show_latency=False)">
+<%def name="scoreboard(game_type_cd, pgstats, teams=None, show_elo=False, show_latency=False)">
+##teams: { scoreboardpos : ( teamname, teamscore, playercount ) }
 % if teamscores:
 <table class="table table-condensed">
-<!--<thead><tr>
-  <td class="teamscore" colspan="${len(teamscores)}">Teamscores</td>
-</tr></thead>-->
 <tbody><tr class="teamscores">
 % for team,score in sorted(teamscores.items(), key=lambda x:x[1], reverse=True):
-    <td class="${team}">${score}</td>
+    <td class="${team} teamscore" width="${100/len(teamscores)}%">${team.capitalize()} Team: ${score}</td>
 % endfor
   </tr></tbody>
 </table>
 % endif
+
 <table class="table table-hover table-condensed">
   ${scoreboard_header(game_type_cd, pgstats[0])}
   <tbody>
   % for pgstat in pgstats:
   <tr class="${pgstat.team_html_color()}">
-    <td class="player-nick">
+    <td class="nostretch">
       % if pgstat.player_id > 2:
       <a href="${request.route_url("player_info", id=pgstat.player_id)}"
         title="Go to the info page for this player">
       % endif
     </td>
     % if show_latency and pgstat.avg_latency is not None:
-    <td>
+    <td class="scoreboard-entry">
       ${int(round(pgstat.avg_latency))}
     </td>
     % elif show_latency:
-    <td></td>
+    <td class="scoreboard-entry"></td>
     % endif
     ${scoreboard_row(game_type_cd, pgstat)}
     % if game_type_cd != 'cts':
-    <td>${pgstat.score}</td>
+    <td class="scoreboard-entry">${pgstat.score}</td>
     % endif
     % if show_elo:
     % if pgstat.elo_delta is not None:
-    <td>${round(pgstat.elo_delta,2)}</td>
+    <td class="scoreboard-entry">${round(pgstat.elo_delta,2)}</td>
     % else:
-    <td>-</td>
+    <td class="scoreboard-entry">-</td>
     % endif
     % endif
+    ##% if teams:
+    ##% if teams.has_key(pgstat.scoreboardpos):
+    ##<td class="scoreboard-entry teamscore" rowspan="${teams[pgstat.scoreboardpos].playercount}">${teams[pgstat.scoreboardpos].teamscore}</td>
+    ##% endif
+    ##% endif
   </tr>
   % endfor
   </tbody>
@@ -64,6 +68,9 @@
     <th class="suicides">Suicides</th>
     <th class="objectives">Objectives</th>
     <th class="score">Score</th>
+    ##% if teams:
+    ##<th class="teamscore">Teamscore</th>
+    ##% endif
     % if show_elo:
     <th>Elo Change</th>
     % endif
@@ -82,6 +89,9 @@
     <th class="deaths">Deaths</th>
     <th class="suicides">Suicides</th>
     <th class="score">Score</th>
+    ##% if teams:
+    ##<th class="teamscore">Teamscore</th>
+    ##% endif
     % if show_elo:
     <th>Elo Change</th>
     % endif
     <th class="captured">Captured</th>
     <th class="released">Released</th>
     <th class="score">Score</th>
-    % if show_elo:
-    <th>Elo Change</th>
-    % endif
+    ##% if show_elo:
+    ##<th>Elo Change</th>
+    ##% endif
   </tr>
 </thead>
 % endif
     <th class="fck" title="Flag Carrier Kill">FCK</th>
     <th class="returns">Returns</th>
     <th class="score">Score</th>
+    ##% if teams:
+    ##<th class="teamscore">Teamscore</th>
+    ##% endif
     % if show_elo:
     <th>Elo Change</th>
     % endif
     <th class="takes">Takes</th>
     <th class="ticks">Ticks</th>
     <th class="score">Score</th>
+    ##% if teams:
+    ##<th class="teamscore">Teamscore</th>
+    ##% endif
     % if show_elo:
     <th>Elo Change</th>
     % endif
     <th class="deaths">Deaths</th>
     <th class="revivals">Revivals</th>
     <th class="score">Score</th>
+    ##% if teams:
+    ##<th class="teamscore">Teamscore</th>
+    ##% endif
     % if show_elo:
     <th>Elo Change</th>
     % endif
     <th class="pickups">Pickups</th>
     <th class="bctime">BC Time</th>
     <th class="bckills">BC Kills</th>
+    ##% if teams:
+    ##<th class="teamscore">Teamscore</th>
+    ##% endif
     % if show_elo:
     <th>Elo Change</th>
     % endif
     <th class="destroys">Destroys</th>
     <th class="kckills">KC Kills</th>
     <th class="score">Score</th>
+    ##% if teams:
+    ##<th class="teamscore">Teamscore</th>
+    ##% endif
     % if show_elo:
     <th>Elo Change</th>
     % endif
     <th class="goals">Goals</th>
     <th class="faults">Faults</th>
     <th class="score">Score</th>
+    ##% if teams:
+    ##<th class="teamscore">Teamscore</th>
+    ##% endif
     % if show_elo:
     <th>Elo Change</th>
     % endif
 ##### SCOREBOARD ROWS #####
 <%def name="scoreboard_row(game_type_cd, pgstat)">
 % if game_type_cd == 'as':
-<td>${pgstat.kills}</td>
-<td>${pgstat.deaths}</td>
-<td>${pgstat.suicides}</td>
-<td>${pgstat.collects}</td>
+<td class="scoreboard-entry">${pgstat.kills}</td>
+<td class="scoreboard-entry">${pgstat.deaths}</td>
+<td class="scoreboard-entry">${pgstat.suicides}</td>
+<td class="scoreboard-entry">${pgstat.collects}</td>
 % endif
 
 % if game_type_cd in 'ca' 'dm' 'duel' 'rune' 'tdm':
-<td>${pgstat.kills}</td>
-<td>${pgstat.deaths}</td>
-<td>${pgstat.suicides}</td>
+<td class="scoreboard-entry">${pgstat.kills}</td>
+<td class="scoreboard-entry">${pgstat.deaths}</td>
+<td class="scoreboard-entry">${pgstat.suicides}</td>
 % endif
 
 % if game_type_cd == 'cq':
-<td>${pgstat.kills}</td>
-<td>${pgstat.deaths}</td>
-<td>${pgstat.captures}</td>
-<td>${pgstat.drops}</td>
+<td class="scoreboard-entry">${pgstat.kills}</td>
+<td class="scoreboard-entry">${pgstat.deaths}</td>
+<td class="scoreboard-entry">${pgstat.captures}</td>
+<td class="scoreboard-entry">${pgstat.drops}</td>
 % endif
 
 % if game_type_cd == 'cts':
 % if pgstat.fastest is not None:
-<td>${round(float(pgstat.fastest.seconds) + (pgstat.fastest.microseconds/1000000.0), 2)}</td>
+<td class="scoreboard-entry">${round(float(pgstat.fastest.seconds) + (pgstat.fastest.microseconds/1000000.0), 2)}</td>
 % else:
-<td>-</td>
+<td class="scoreboard-entry">-</td>
 % endif
-<td>${pgstat.deaths}</td>
+<td class="scoreboard-entry">${pgstat.deaths}</td>
 % endif
 
 % if game_type_cd == 'ctf':
-<td>${pgstat.kills}</td>
-<td>${pgstat.captures}</td>
-<td>${pgstat.pickups}</td>
-<td>${pgstat.carrier_frags}</td>
-<td>${pgstat.returns}</td>
+<td class="scoreboard-entry">${pgstat.kills}</td>
+<td class="scoreboard-entry">${pgstat.captures}</td>
+<td class="scoreboard-entry">${pgstat.pickups}</td>
+<td class="scoreboard-entry">${pgstat.carrier_frags}</td>
+<td class="scoreboard-entry">${pgstat.returns}</td>
 % endif
 
 % if game_type_cd == 'dom':
-<td>${pgstat.kills}</td>
-<td>${pgstat.deaths}</td>
-<td>${pgstat.pickups}</td>
-<td>${pgstat.drops}</td>
+<td class="scoreboard-entry">${pgstat.kills}</td>
+<td class="scoreboard-entry">${pgstat.deaths}</td>
+<td class="scoreboard-entry">${pgstat.pickups}</td>
+<td class="scoreboard-entry">${pgstat.drops}</td>
 % endif
 
 % if game_type_cd in 'ft' 'freezetag':
-<td>${pgstat.kills}</td>
-<td>${pgstat.deaths}</td>
-<td>${pgstat.revivals}</td>
+<td class="scoreboard-entry">${pgstat.kills}</td>
+<td class="scoreboard-entry">${pgstat.deaths}</td>
+<td class="scoreboard-entry">${pgstat.revivals}</td>
 % endif
 
 % if game_type_cd in 'ka' 'keepaway':
-<td>${pgstat.kills}</td>
-<td>${pgstat.deaths}</td>
-<td>${pgstat.pickups}</td>
+<td class="scoreboard-entry">${pgstat.kills}</td>
+<td class="scoreboard-entry">${pgstat.deaths}</td>
+<td class="scoreboard-entry">${pgstat.pickups}</td>
 
 % if pgstat.time is not None:
-<td>${round(float(pgstat.time.seconds) + (pgstat.time.microseconds/1000000.0), 2)}</td>
+<td class="scoreboard-entry">${round(float(pgstat.time.seconds) + (pgstat.time.microseconds/1000000.0), 2)}</td>
 % else:
-<td>-</td>
+<td class="scoreboard-entry">-</td>
 % endif
 
-<td>${pgstat.fckills}</td>
+<td class="scoreboard-entry">${pgstat.fckills}</td>
 % endif
 
 % if game_type_cd == 'kh':
-<td>${pgstat.kills}</td>
-<td>${pgstat.deaths}</td>
-<td>${pgstat.pickups}</td>
-<td>${pgstat.captures}</td>
-<td>${pgstat.drops}</td>
-<td>${pgstat.pushes}</td>
-<td>${pgstat.destroys}</td>
-<td>${pgstat.carrier_frags}</td>
+<td class="scoreboard-entry">${pgstat.kills}</td>
+<td class="scoreboard-entry">${pgstat.deaths}</td>
+<td class="scoreboard-entry">${pgstat.pickups}</td>
+<td class="scoreboard-entry">${pgstat.captures}</td>
+<td class="scoreboard-entry">${pgstat.drops}</td>
+<td class="scoreboard-entry">${pgstat.pushes}</td>
+<td class="scoreboard-entry">${pgstat.destroys}</td>
+<td class="scoreboard-entry">${pgstat.carrier_frags}</td>
 % endif
 
 % if game_type_cd in 'nb' 'nexball':
-<td>${pgstat.captures}</td>
-<td>${pgstat.drops}</td>
+<td class="scoreboard-entry">${pgstat.captures}</td>
+<td class="scoreboard-entry">${pgstat.drops}</td>
 % endif
 
 % if game_type_cd == 'rc':
-<td>${pgstat.laps}</td>
+<td class="scoreboard-entry">${pgstat.laps}</td>
 
 % if pgstat.fastest is not None:
-<td>${round(float(pgstat.fastest.seconds) + (pgstat.fastest.microseconds/1000000.0), 2)}</td>
+<td class="scoreboard-entry">${round(float(pgstat.fastest.seconds) + (pgstat.fastest.microseconds/1000000.0), 2)}</td>
 % else:
-<td>-</td>
+<td class="scoreboard-entry">-</td>
 % endif
 
 % if pgstat.time is not None:
-<td>${round(float(pgstat.time.seconds) + (pgstat.time.microseconds/1000000.0), 2)}</td>
+<td class="scoreboard-entry">${round(float(pgstat.time.seconds) + (pgstat.time.microseconds/1000000.0), 2)}</td>
 % else:
-<td>-</td>
+<td class="scoreboard-entry">-</td>
 % endif
 % endif
 
index f0fc1ce387e5ae0971d00dde58cfae28058f7c42..019844629f8d165078ad443a57587a15ef6abe2e 100644 (file)
@@ -4,11 +4,14 @@ import re
 import time
 from pyramid.response import Response
 from sqlalchemy import desc, func, over
+from collections import namedtuple
 from webhelpers.paginate import Page, PageURL
 from xonstat.models import *
 from xonstat.util import page_url
 from xonstat.views.helpers import RecentGame, recent_games_q
 
+import random
+
 log = logging.getLogger(__name__)
 
 
@@ -125,6 +128,34 @@ def _game_info_data(request):
                             teamscores[team] = None
         if len(teamscores) == 0:
             teamscores = None
+            
+        ### RANDOM SCORES FOR TESTING
+        teams = ["red","blue","yellow","pink"]
+        random.shuffle(teams)
+        teamscores = {}
+        for k in range(random.randint(2,4)):
+            team = teams[k-1]
+            teamscores[team] = random.randint(-5,150)
+        ### END
+        
+        #TeamInfo = namedtuple('TeamInfo', ['team','scoreboardpos','playercount','teamscore'])
+        #
+        #teams = {}
+        #last_pgs = pgstats[0]
+        #for pgstat in pgstats:
+        #    if pgstat.team != last_pgs.team:
+        #        teams[last_pgs.scoreboardpos] = TeamInfo(
+        #                team=last_pgs.team,
+        #                scoreboardpos=last_pgs.scoreboardpos,
+        #                playercount=pgstat.scoreboardpos-last_pgs.scoreboardpos,
+        #                teamscore=last_pgs.teamscore)
+        #        last_pgs = pgstat
+        #teams[last_pgs.scoreboardpos] = TeamInfo(
+        #        team=last_pgs.team,
+        #        scoreboardpos=last_pgs.scoreboardpos,
+        #        playercount=pgstat.scoreboardpos-last_pgs.scoreboardpos,
+        #        teamscore=last_pgs.teamscore)
+        #print teams
 
         pwstats = {}
         for (pwstat, pgstat, weapon) in DBSession.query(PlayerWeaponStat, PlayerGameStat, Weapon).\
@@ -154,7 +185,7 @@ def _game_info_data(request):
         pgstats = None
         pwstats = None
         captimes = None
-        teamscores = None
+        teams = None
         show_elo = False
         show_latency = False
         raise inst
@@ -166,6 +197,7 @@ def _game_info_data(request):
             'pgstats':pgstats,
             'pwstats':pwstats,
             'captimes':captimes,
+            'teams':teams,
             'teamscores':teamscores,
             'show_elo':show_elo,
             'show_latency':show_latency,