+
+
+def player_hashkey_info_data(request):
+ hashkey = request.matchdict['hashkey']
+ try:
+ player = DBSession.query(Player).\
+ filter(Player.player_id == Hashkey.player_id).\
+ filter(Player.active_ind == True).\
+ filter(Hashkey.hashkey == hashkey).one()
+
+ games_played = get_games_played(player.player_id)
+ overall_stats = get_overall_stats(player.player_id)
+ fav_maps = get_fav_maps(player.player_id)
+ elos = get_elos(player.player_id)
+ ranks = get_ranks(player.player_id)
+
+ except Exception as e:
+ raise pyramid.httpexceptions.HTTPNotFound
+
+ return {'player':player,
+ 'hashkey':hashkey,
+ 'games_played':games_played,
+ 'overall_stats':overall_stats,
+ 'fav_maps':fav_maps,
+ 'elos':elos,
+ 'ranks':ranks,
+ }
+
+
+def player_hashkey_info_json(request):
+ """
+ Provides detailed information on a specific player. JSON.
+ """
+
+ # All player_info fields are converted into JSON-formattable dictionaries
+ player_info = player_hashkey_info_data(request)
+
+ player = player_info['player'].to_dict()
+
+ games_played = {}
+ for game in player_info['games_played']:
+ games_played[game.game_type_cd] = to_json(game)
+
+ overall_stats = {}
+ for gt,stats in player_info['overall_stats'].items():
+ overall_stats[gt] = to_json(stats)
+
+ elos = {}
+ for gt,elo in player_info['elos'].items():
+ elos[gt] = to_json(elo.to_dict())
+
+ ranks = {}
+ for gt,rank in player_info['ranks'].items():
+ ranks[gt] = to_json(rank)
+
+ fav_maps = {}
+ for gt,mapinfo in player_info['fav_maps'].items():
+ fav_maps[gt] = to_json(mapinfo)
+
+ return [{
+ 'version': 1,
+ 'player': player,
+ 'games_played': games_played,
+ 'overall_stats': overall_stats,
+ 'fav_maps': fav_maps,
+ 'elos': elos,
+ 'ranks': ranks,
+ }]
+
+
+def player_hashkey_info_text(request):
+ """
+ Provides detailed information on a specific player. Plain text.
+ """
+ # UTC epoch
+ now = timegm(datetime.datetime.utcnow().timetuple())
+
+ # All player_info fields are converted into JSON-formattable dictionaries
+ player_info = player_hashkey_info_data(request)
+
+ # gather all of the data up into aggregate structures
+ player = player_info['player']
+ games_played = player_info['games_played']
+ overall_stats = player_info['overall_stats']
+ elos = player_info['elos']
+ ranks = player_info['ranks']
+ fav_maps = player_info['fav_maps']
+
+ # one-offs for things needing conversion for text/plain
+ player_joined = timegm(player.create_dt.timetuple())
+ alivetime = int(datetime_seconds(overall_stats['overall'].total_playing_time))
+
+ # this is a plain text response, if we don't do this here then
+ # Pyramid will assume html
+ request.response.content_type = 'text/plain'
+
+ return {
+ 'version': 1,
+ 'now': now,
+ 'player': player,
+ 'hashkey': player_info['hashkey'],
+ 'player_joined': player_joined,
+ 'games_played': games_played,
+ 'overall_stats': overall_stats,
+ 'alivetime': alivetime,
+ 'fav_maps': fav_maps,
+ 'elos': elos,
+ 'ranks': ranks,
+ }
+
+
+def player_elo_info_data(request):
+ """
+ Provides elo information on a specific player. Raw data is returned.
+ """
+ hashkey = request.matchdict['hashkey']
+ try:
+ player = DBSession.query(Player).\
+ filter(Player.player_id == Hashkey.player_id).\
+ filter(Player.active_ind == True).\
+ filter(Hashkey.hashkey == hashkey).one()
+
+ elos = get_elos(player.player_id)
+
+ except Exception as e:
+ log.debug(e)
+ raise pyramid.httpexceptions.HTTPNotFound
+
+ return {'elos':elos}
+
+
+def player_elo_info_json(request):
+ """
+ Provides elo information on a specific player. JSON.
+ """
+ elo_info = player_elo_info_data(request)
+
+ elos = {}
+ for gt, elo in elo_info['elos'].items():
+ elos[gt] = to_json(elo.to_dict())
+
+ return [{
+ 'version': 1,
+ 'elos': elos,
+ }]
+
+def player_captimes_data(request):
+ player_id = int(request.matchdict['id'])
+ if player_id <= 2:
+ player_id = -1;
+
+ #player_captimes = DBSession.query(PlayerCaptime).\
+ # filter(PlayerCaptime.player_id==player_id).\
+ # order_by(PlayerCaptime.fastest_cap).\
+ # all()
+
+ PlayerCaptimes = namedtuple('PlayerCaptimes', ['fastest_cap', 'create_dt', 'create_dt_epoch', 'create_dt_fuzzy',
+ 'player_id', 'game_id', 'map_id', 'map_name', 'server_id', 'server_name'])
+
+ dbquery = DBSession.query('fastest_cap', 'create_dt', 'player_id', 'game_id', 'map_id',
+ 'map_name', 'server_id', 'server_name').\
+ from_statement(
+ "SELECT ct.fastest_cap, "
+ "ct.create_dt, "
+ "ct.player_id, "
+ "ct.game_id, "
+ "ct.map_id, "
+ "m.name map_name, "
+ "g.server_id, "
+ "s.name server_name "
+ "FROM player_map_captimes ct, "
+ "games g, "
+ "maps m, "
+ "servers s "
+ "WHERE ct.player_id = :player_id "
+ "AND g.game_id = ct.game_id "
+ "AND g.server_id = s.server_id "
+ "AND m.map_id = ct.map_id "
+ #"ORDER BY ct.fastest_cap "
+ "ORDER BY ct.create_dt desc"
+ ).params(player_id=player_id).all()
+
+ player = DBSession.query(Player).filter_by(player_id=player_id).one()
+
+ player_captimes = []
+ for row in dbquery:
+ player_captimes.append(PlayerCaptimes(
+ fastest_cap=row.fastest_cap,
+ create_dt=row.create_dt,
+ create_dt_epoch=timegm(row.create_dt.timetuple()),
+ create_dt_fuzzy=pretty_date(row.create_dt),
+ player_id=row.player_id,
+ game_id=row.game_id,
+ map_id=row.map_id,
+ map_name=row.map_name,
+ server_id=row.server_id,
+ server_name=row.server_name,
+ ))
+
+ return {
+ 'captimes':player_captimes,
+ 'player_id':player_id,
+ 'player_url':request.route_url('player_info', id=player_id),
+ 'player':player,
+ }
+
+def player_captimes(request):
+ return player_captimes_data(request)
+
+def player_captimes_json(request):
+ return player_captimes_data(request)