def multi(request, db): playerselector = dbselectors.get('player', db) playerselector.flags_none() playerselector.weakflags(['games'], True) gameselector = dbselectors.get('game', db) gameselector.flags_none() players = playerselector.multi() pager = web.Pager(request, onpagecount, sorted(players, key=lambda x: -players[x]["games"][-1])) playertable = web.Table( ["Name", "Handle", "Games", "First Game", "Latest Game"]) for handle in pager.list(): player = players[handle] firstgame = gameselector.single(player["games"][0]) latestgame = gameselector.single(player["games"][-1]) with playertable.tr as tr: tr(web.linkif('/player/', player["handle"], player["name"], True)) tr(web.linkif('/player/', player["handle"], player["handle"], True)) tr(len(player["games"])) tr("%s: %s" % ( web.link('/game/', firstgame['id'], "#%d" % firstgame["id"]), timeutils.agohtml(firstgame["time"]) )) tr("%s: %s" % ( web.link('/game/', latestgame['id'], "#%d" % latestgame["id"]), timeutils.agohtml(latestgame["time"]) )) ret = """ <div class="center"> <h2>Players</h2> <div class='display-table'> {playertable} {pages} </div> </div> """.format(playertable=playertable.html(), pages=pager.html()) return web.page(ret, title="Players")
def multi(request, db): mapselector = dbselectors.get('map', db) mapselector.flags_none() mapselector.weakflags(["race"], True) gameselector = dbselectors.get('game', db) gameselector.flags_none() maps = mapselector.multi() pager = web.Pager(request, onpagecount, sorted(maps, key=lambda x: -maps[x]["games"][-1])) maptable = web.Table(["Name", "Games", "First Game", "Latest Game", '<a href="/racemaps">Best Race Time</a>']) for mapname in pager.list(): gmap = maps[mapname] firstgame = gameselector.single(gmap["games"][0]) latestgame = gameselector.single(gmap["games"][-1]) with maptable.tr as tr: tr(web.link('/map/', gmap["name"], gmap["name"], True)) tr(len(gmap["games"])) tr("%s: %s" % ( web.link('/game/', firstgame['id'], "#%d" % firstgame["id"]), timeutils.agohtml(firstgame["time"]) )) tr("%s: %s" % ( web.link('/game/', latestgame['id'], "#%d" % latestgame["id"]), timeutils.agohtml(latestgame["time"]) )) if gmap["toprace"]["time"]: tr("%s by %s" % (timeutils.durstr( gmap["toprace"]["time"] / 1000, dec=True, full=True), web.linkif("/player/", gmap["toprace"]["gameplayer"]["handle"], gmap["toprace"]["gameplayer"]["handle"] or gmap["toprace"]["gameplayer"]["name"]) ) ) else: tr() ret = """ <div class="center"> <h2>Maps</h2> <div class='display-table'> {maptable} {pages} </div> </div> """.format(maptable=maptable.html(), pages=pager.html()) return web.page(ret, title="Maps")
def single(request, db, specific): ret = "" mapselector = dbselectors.get('map', db) mapselector.flags_none() mapselector.weakflags(["race"], True) gmap = mapselector.single(specific) if utils.sok(gmap): # Game List pager = web.Pager(request, onpagecount, reversed(gmap["games"])) recentgames = web.Table( ["ID", "Mode", "Mutators", "Duration", "Played"]) gs = dbselectors.get('game', db) gs.flags_none() for gid in pager.list(): game = gs.single(gid) with recentgames.tr as tr: tr(web.link("/game/", gid, "Game #%d" % gid)) tr(web.link("/mode/", game["mode"], redeclipse(game).modeimg(game["mode"]))) tr(redeclipse(game).mutslist(game, True) or '-') tr(timeutils.durstr(round(game["timeplayed"]))) tr(timeutils.agohtml(game["time"])) # Race Times racetable = web.Table(["Time", "Player", "Handle", "Game", "When"]) for race in gmap["topraces"][:3]: with racetable.tr as tr: tr(timeutils.durstr(race["time"] / 1000, dec=True, full=True)) tr(web.linkif('/player/', race["gameplayer"]["handle"], race["gameplayer"]["name"])) tr(web.linkif('/player/', race["gameplayer"]["handle"], race["gameplayer"]["handle"] or '-')) tr(web.link('/game/', race["game"]["id"], "Game #%d" % race["game"]["id"])) tr(timeutils.agohtml(race["game"]["time"])) racetimes = """ <div class='display-table small-table'> <h3>Top Race Times</h3> %s </div> """ % racetable.html() eracetable = web.Table(["Time", "Player", "Handle", "Game", "When"]) for race in gmap["toperaces"][:3]: with eracetable.tr as tr: tr(timeutils.durstr(race["time"] / 1000, dec=True, full=True)) tr(web.linkif('/player/', race["gameplayer"]["handle"], race["gameplayer"]["name"])) tr(web.linkif('/player/', race["gameplayer"]["handle"], race["gameplayer"]["handle"] or '-')) tr(web.link('/game/', race["game"]["id"], "Game #%d" % race["game"]["id"])) tr(timeutils.agohtml(race["game"]["time"])) eracetimes = """ <div class='display-table small-table'> <h3>Top Endurance Race Times</h3> %s </div> """ % eracetable.html() ret += """ <div class="center"> <h2>{map[name]}</h2> {racetimes} {eracetimes} <div class='display-table'> <h3>Recent Games</h3> {recentgames} {pages} </div> </div> """.format(map=gmap, recentgames=recentgames.html(), racetimes=racetimes if gmap["toprace"]["time"] else '', eracetimes=eracetimes if gmap["toperace"]["time"] else '', pages=pager.html()) else: ret = "<div class='center'><h2>No such map.</h2></div>" return web.page(ret, title="Map %s" % specific)
def single(request, db, specific): gs = dbselectors.get('game', db) gs.flags_none() gs.weakflags(["server", "teams", "affinities", "rounds", "players", "playerdamage", "weapons"], True) ss = dbselectors.get('server', db) ss.flags_none() game = gs.single(specific) ret = "" if utils.sok(game): server = ss.single(game["server"]) # Display the server's desc & version from this game. serverrow = db.execute( """SELECT version,desc,host,port FROM game_servers WHERE game = %d""" % game["id"] ).fetchone() server["version"] = serverrow[0] server["desc"] = cgi.escape(serverrow[1]) or cgi.escape( "%s:%d" % (serverrow[2], serverrow[3])) playerstable = web.Table( ["Name", "Score", "Handle", "Alive", "Frags", "Deaths"], "Players", "display-table") for player in sorted( list(game["players"].values()), key=lambda x: ( redeclipse(game).scorenum(game, x["score"]))): with playerstable.tr as tr: tr(web.linkif('/player/', player["handle"], player["name"])) tr(redeclipse(game).scorestr(game, player["score"])) tr(web.linkif('/player/', player["handle"], player["handle"])) tr(timeutils.durstr(player["timealive"])) tr(player["frags"]) tr(player["deaths"]) teamstable = None teamlist = {} if len(game["teams"]) > 1: teamstable = web.Table( ["Name", "Score"], "Teams", "display-table small-table") # Sort depending on score, counting race times for team in sorted(sorted(game["teams"], key=lambda x: game["teams"][x]["score"] * ( 1 if game["mode"] == redeclipse(game).modes["race"] and (game["mutators"] & redeclipse(game).mutators["timed"]) else -1 )), key=lambda x: game["teams"][x]["score"] == 0): team = game["teams"][team] teamlist[team["team"]] = team with teamstable.tr as tr: tr("%s %s" % ( redeclipse(game).teamimg(team["team"]), cgi.escape(team["name"]) )) tr(redeclipse(game).scorestr(game, team["score"])) ffarounds = web.Table(["Round", "Winner", "Versus"], "Rounds", "display-table small-table") if "ffarounds" in game: donerounds = [] for ffaround in sorted(game["ffarounds"], key=lambda x: x["round"]): if ffaround["round"] in donerounds: continue haswinner = False for ffaround_s in game["ffarounds"]: if (ffaround_s["round"] == ffaround["round"] and ffaround_s["winner"]): haswinner = True break versuslist = [] for ffaround_s in game["ffarounds"]: if (ffaround_s["round"] == ffaround["round"] and not ffaround_s["winner"]): versuslist.append(web.linkif( "/player/", ffaround_s["playerhandle"], game["players"][ffaround_s["player"]]["name"])) with ffarounds.tr as tr: if haswinner and ffaround["winner"]: tr(ffaround["round"]) tr(web.linkif( "/player/", ffaround["playerhandle"], game["players"][ffaround["player"]]["name"])) if versuslist: tr(", ".join(versuslist)) else: tr("<i>AI</i>") elif not haswinner: donerounds.append(ffaround["round"]) if len(versuslist) == 1: tr(ffaround["round"]) tr('<i>AI</i>') tr(", ".join(versuslist)) else: tr(ffaround["round"]) tr('<i>Epic fail!</i>') tr(", ".join(versuslist)) affinitiestable = None if "captures" in game: affinitiestable = web.Table( ["Player", "Capturing Team", "Captured Flag"], "Flag Captures", "display-table" ) for capture in game["captures"]: with affinitiestable.tr as tr: tr(web.linkif('/player/', capture["playerhandle"], game["players"][capture["player"]]["name"])) tr(cgi.escape(teamlist[capture["capturing"]]["name"])) tr(cgi.escape(teamlist[capture["captured"]]["name"])) elif "bombings" in game: affinitiestable = web.Table( ["Player", "Bombing Team", "Bombed Base"], "Base Bombings", "display-table" ) for bombing in game["bombings"]: with affinitiestable.tr as tr: tr(web.linkif('/player/', bombing["playerhandle"], game["players"][bombing["player"]]["name"])) tr(cgi.escape(teamlist[bombing["bombing"]]["name"])) tr(cgi.escape(teamlist[bombing["bombed"]]["name"])) totalwielded = sum([w['timewielded'] for w in list(game['weapons'].values()) if w['timewielded'] is not None]) weaponstable = web.displays.weaponstable(game['weapons'], totalwielded, redeclipse(game).weaponlist, version=game) if game["mode"] == redeclipse(game).modes['race']: weaponstable = None ret = """ <div class="center"> <h2>Game #{game[id]}: {modestr} on {mapstr}</h2> {mutsstr} Duration: {duration}<br> Played: {agohtml}<br> Server: <a href="/server/{server[handle]}">{server[desc]} [{server[version]}] [{server[handle]}]</a> {teams} {players} {affinities} {ffarounds} {weapons} </div> """.format( game=game, modestr=web.link('/mode/', game["mode"], redeclipse(game).modeimg(game["mode"], 32)), mutsstr=("Mutators: %s<br>" % redeclipse(game).mutslist( game, True, True)) if game['mutators'] else '', mapstr=web.link('/map/', game["map"], game["map"]), server=server, agohtml=timeutils.agohtml(game["time"]), duration=timeutils.durstr(game["timeplayed"]), players=playerstable.html(True), teams=teamstable.html(True) if teamstable is not None else "", affinities=affinitiestable.html(True) if affinitiestable is not None else "", ffarounds=ffarounds.html(True) if "ffarounds" in game else "", weapons=weaponstable.html(True) if weaponstable is not None else "", ) else: ret = "<div class='center'><h2>No such game.</h2></div>" return web.page(ret, title="Game %s" % specific)