-pyramid
+pyramid>=1.1
SQLAlchemy
transaction
repoze.tm2>=1.0b1
import sqlahelper
from pyramid.config import Configurator
+from pyramid.renderers import JSONP
from sqlalchemy import engine_from_config
from xonstat.models import initialize_db
from xonstat.views import *
config.add_static_view('static', 'xonstat:static')
+ config.add_renderer('jsonp', JSONP(param_name='callback'))
+
# ROOT ROUTE
config.add_route("main_index", "/")
config.add_view(main_index, route_name="main_index", renderer="main_index.mako")
config.add_view(stats_submit, route_name="stats_submit")
# PLAYER ROUTES
- config.add_route("player_game_index", "/player/{player_id:\d+}/games")
- config.add_view(player_game_index, route_name="player_game_index", renderer="player_game_index.mako")
-
- config.add_route("player_index", "/players")
- config.add_view(player_index, route_name="player_index", renderer="player_index.mako")
+ config.add_route("player_game_index", "/player/{player_id:\d+}/games")
+ config.add_route("player_game_index_json", "/player/{player_id:\d+}/games.json")
+ config.add_view(player_game_index, route_name="player_game_index", renderer="player_game_index.mako")
+ config.add_view(player_game_index_json, route_name="player_game_index_json", renderer="jsonp")
- config.add_route("player_info", "/player/{id:\d+}")
- config.add_view(player_info, route_name="player_info", renderer="player_info.mako")
+ config.add_route("player_info", "/player/{id:\d+}")
+ config.add_route("player_info_json", "/player/{id:\d+}.json")
+ config.add_view(player_info, route_name="player_info", renderer="player_info.mako")
+ config.add_view(player_info_json, route_name="player_info_json", renderer="jsonp")
config.add_route("player_accuracy", "/player/{id:\d+}/accuracy")
config.add_route("player_accuracy_json", "/player/{id:\d+}/accuracy.json")
- config.add_view(player_accuracy_json, route_name="player_accuracy", renderer="json")
- config.add_view(player_accuracy_json, route_name="player_accuracy_json", renderer="json")
+ config.add_view(player_accuracy_json, route_name="player_accuracy", renderer="jsonp")
+ config.add_view(player_accuracy_json, route_name="player_accuracy_json", renderer="jsonp")
+
+ config.add_route("player_index", "/players")
+ config.add_route("player_index_json", "/players.json")
+ config.add_view(player_index, route_name="player_index", renderer="player_index.mako")
+ config.add_view(player_index_json, route_name="player_index_json", renderer="jsonp")
config.add_route("player_damage", "/player/{id:\d+}/damage")
config.add_view(player_damage_json, route_name="player_damage",
renderer="json")
# GAME ROUTES
- config.add_route("game_index", "/games")
- config.add_view(game_index, route_name="game_index", renderer="game_index.mako")
+ config.add_route("game_index", "/games")
+ config.add_route("game_index_json", "/games.json")
+ config.add_view(game_index, route_name="game_index", renderer="game_index.mako")
+ config.add_view(game_index_json, route_name="game_index_json", renderer="jsonp")
- config.add_route("game_info", "/game/{id:\d+}")
- config.add_view(game_info, route_name="game_info", renderer="game_info.mako")
+ config.add_route("game_info", "/game/{id:\d+}")
+ config.add_route("game_info_json", "/game/{id:\d+}.json")
+ config.add_view(game_info, route_name="game_info", renderer="game_info.mako")
+ config.add_view(game_info_json, route_name="game_info_json", renderer="jsonp")
- config.add_route("rank_index", "/ranks/{game_type_cd:ctf|dm|tdm|duel}")
- config.add_view(rank_index, route_name="rank_index", renderer="rank_index.mako")
+ config.add_route("rank_index", "/ranks/{game_type_cd:ctf|dm|tdm|duel}")
+ config.add_route("rank_index_json", "/ranks/{game_type_cd:ctf|dm|tdm|duel}.json")
+ config.add_view(rank_index, route_name="rank_index", renderer="rank_index.mako")
+ config.add_view(rank_index_json, route_name="rank_index_json", renderer="jsonp")
# SERVER ROUTES
- config.add_route("server_index", "/servers")
- config.add_view(server_index, route_name="server_index", renderer="server_index.mako")
+ config.add_route("server_index", "/servers")
+ config.add_route("server_index_json", "/servers.json")
+ config.add_view(server_index, route_name="server_index", renderer="server_index.mako")
+ config.add_view(server_index_json, route_name="server_index_json", renderer="jsonp")
- config.add_route("server_game_index", "/server/{server_id:\d+}/games/page/{page:\d+}")
- config.add_view(server_game_index, route_name="server_game_index", renderer="server_game_index.mako")
+ config.add_route("server_game_index", "/server/{server_id:\d+}/games/page/{page:\d+}")
+ config.add_route("server_game_index_json", "/server/{server_id:\d+}/games.json")
+ config.add_view(server_game_index, route_name="server_game_index", renderer="server_game_index.mako")
+ config.add_view(server_game_index_json, route_name="server_game_index_json", renderer="jsonp")
- config.add_route("server_info", "/server/{id:\d+}")
- config.add_view(server_info, route_name="server_info", renderer="server_info.mako")
+ config.add_route("server_info", "/server/{id:\d+}")
+ config.add_route("server_info_json", "/server/{id:\d+}.json")
+ config.add_view(server_info, route_name="server_info", renderer="server_info.mako")
+ config.add_view(server_info_json, route_name="server_info_json", renderer="jsonp")
# MAP ROUTES
config.add_route("map_index", "/maps")
config.add_route("map_index_json", "/maps.json")
config.add_view(map_index, route_name="map_index", renderer="map_index.mako")
- config.add_view(map_index_json, route_name="map_index_json", renderer="json")
+ config.add_view(map_index_json, route_name="map_index_json", renderer="jsonp")
- config.add_route("map_info", "/map/{id:\d+}")
- config.add_view(map_info, route_name="map_info", renderer="map_info.mako")
+ config.add_route("map_info", "/map/{id:\d+}")
+ config.add_route("map_info_json", "/map/{id:\d+}.json")
+ config.add_view(map_info, route_name="map_info", renderer="map_info.mako")
+ config.add_view(map_info_json, route_name="map_info_json", renderer="jsonp")
# SEARCH ROUTES
- config.add_route("search", "search")
- config.add_view(search, route_name="search", renderer="search.mako")
+ config.add_route("search", "search")
+ config.add_route("search_json", "search.json")
+ config.add_view(search, route_name="search", renderer="search.mako")
+ config.add_view(search_json, route_name="search_json", renderer="jsonp")
return config.make_wsgi_app()
def __repr__(self):
return "<Player(%s, %s)>" % (self.player_id, self.nick.encode('utf-8'))
+ def to_dict(self):
+ return {'player_id':self.player_id, 'name':self.nick.encode('utf-8')}
+
class GameType(object):
def __repr__(self):
return "<GameType(%s, %s, %s)>" % (self.game_type_cd, self.descr, self.active_ind)
+ def to_dict(self):
+ return {'game_type_cd':self.game_type_cd, 'name':self.descr, 'active':self.active_ind}
+
class Weapon(object):
def __repr__(self):
return "<Weapon(%s, %s, %s)>" % (self.weapon_cd, self.descr, self.active_ind)
+ def to_dict(self):
+ return {'weapon_cd':self.weapon_cd, 'name':self.descr, 'active':self.active_ind}
+
class Server(object):
def __init__(self, name=None, hashkey=None, ip_addr=None):
def __repr__(self):
return "<Server(%s, %s)>" % (self.server_id, self.name.encode('utf-8'))
+ def to_dict(self):
+ return {'server_id':self.server_id, 'name':self.name.encode('utf-8')}
+
class Map(object):
def __init__(self, name=None):
return "<Map(%s, %s, %s)>" % (self.map_id, self.name, self.version)
def to_dict(self):
- return {'map_id':self.map_id, 'name':self.name}
+ return {'map_id':self.map_id, 'name':self.name, 'version':self.version}
class Game(object):
def __repr__(self):
return "<Game(%s, %s, %s, %s)>" % (self.game_id, self.start_dt, self.game_type_cd, self.server_id)
+ def to_dict(self):
+ return {'game_id':self.game_id, 'start':self.start_dt.strftime('%Y-%m-%dT%H:%M:%SZ'), 'game_type_cd':self.game_type_cd, 'server_id':self.server_id}
+
def fuzzy_date(self):
return pretty_date(self.start_dt)
def __repr__(self):
return "<PlayerGameStat(%s, %s, %s)>" % (self.player_id, self.game_id, self.create_dt)
+ def to_dict(self):
+ return {'player_id':self.player_id, 'game_id':self.game_id, 'create_dt':self.create_dt.strftime('%Y-%m-%dT%H:%M:%SZ')}
+
def nick_stripped(self):
if self.nick is None:
return "Anonymous Player"
def __repr__(self):
return "<Achievement(%s, %s, %s)>" % (self.achievement_cd, self.descr, self.limit)
+ def to_dict(self):
+ return {'achievement_cd':self.achievement_cd, 'name':self.descr, 'limit':self.limit}
+
class PlayerAchievement(object):
def __repr__(self):
return "<PlayerAchievement(%s, %s)>" % (self.player_id, self.achievement_cd)
+ def to_dict(self):
+ return {'player_id':self.player_id, 'achievement_cd':self.achievement_cd}
+
class PlayerWeaponStat(object):
def __repr__(self):
return "<PlayerWeaponStat(%s, %s, %s)>" % (self.player_weapon_stats_id, self.player_id, self.game_id)
+ def to_dict(self):
+ return {'player_weapon_stats_id':self.player_weapon_stats_id, 'player_id':self.player_id, 'game_id':self.game_id}
+
class Hashkey(object):
def __init__(self, player_id=None, hashkey=None):
def __repr__(self):
return "<Hashkey(%s, %s)>" % (self.player_id, self.hashkey)
+ def to_dict(self):
+ return {'player_id':self.player_id, 'hashkey':self.hashkey}
+
class PlayerNick(object):
def __repr__(self):
return "<PlayerNick(%s, %s)>" % (self.player_id, self.stripped_nick)
+ def to_dict(self):
+ return {'player_id':self.player_id, 'name':self.stripped_nick}
+
class PlayerElo(object):
def __init__(self, player_id=None, game_type_cd=None):
def __repr__(self):
return "<PlayerElo(pid=%s, gametype=%s, elo=%s)>" % (self.player_id, self.game_type_cd, self.elo)
+ def to_dict(self):
+ return {'player_id':self.player_id, 'game_type_cd':self.game_type_cd, 'elo':self.elo}
+
class PlayerRank(object):
else:
return html_colors(self.nick)
-
def __repr__(self):
return "<PlayerRank(pid=%s, gametype=%s, rank=%s)>" % (self.player_id, self.game_type_cd, self.rank)
+ def to_dict(self):
+ return {'player_id':self.player_id, 'game_type_cd':self.game_type_cd, 'rank':self.rank}
+
def initialize_db(engine=None):
DBSession.configure(bind=engine)
from xonstat.views.submission import stats_submit
from xonstat.views.player import player_index, player_info, player_game_index
-from xonstat.views.player import player_accuracy_json, player_damage_json
-from xonstat.views.game import game_index, game_info, rank_index
-from xonstat.views.map import map_info, map_index, map_index_json
+from xonstat.views.player import player_accuracy
+from xonstat.views.player import player_index_json, player_info_json,
+from xonstat.views.player import player_game_index_json, player_accuracy_json
+from xonstat.views.player import player_damage_json
+
+from xonstat.views.game import game_index, game_info, rank_index
+from xonstat.views.game import game_index_json, game_info_json, rank_index_json
+
+from xonstat.views.map import map_info, map_index
+from xonstat.views.map import map_info_json, map_index_json
+
from xonstat.views.server import server_info, server_game_index, server_index
+from xonstat.views.server import server_info_json, server_game_index_json
+from xonstat.views.server import server_index_json
+
from xonstat.views.search import search_q, search
-from xonstat.views.main import main_index
+from xonstat.views.search import search_json
+
+from xonstat.views.main import main_index
order_by(PlayerGameStat.rank).\
order_by(PlayerGameStat.score).all()
- return {'games':games,
+ return {'games':games,
'pgstats':pgstats}
return _game_index_data(request)
+def game_index_json(request):
+ """
+ Provides a list of current games, with the associated game stats.
+ These games are ordered by game_id, with the most current ones first.
+ Paginated. JSON.
+ """
+ return [{'status':'not implemented'}]
+
+
def _game_info_data(request):
game_id = request.matchdict['id']
try:
return _game_info_data(request)
+def game_info_json(request):
+ """
+ List the game stats (scoreboard) for a particular game. Paginated. JSON.
+ """
+ return [{'status':'not implemented'}]
+
+
def _rank_index_data(request):
if request.params.has_key('page'):
current_page = request.params['page']
Provide a list of gametype ranks, paginated.
"""
return _rank_index_data(request)
+
+
+def rank_index_json(request):
+ """
+ Provide a list of gametype ranks, paginated. JSON.
+ """
+ return [{'status':'not implemented'}]
mainindex_data['recent_games'].append(('-', '-', '-', '-'))
return mainindex_data
+
+
+def main_index_json(request):
+ """
+ JSON output of the main page information.
+ """
+ return [{'status':'not implemented'}]
def map_index(request):
"""
- Provides a list of all the current maps.
+ Provides a list of all the current maps.
"""
return _map_index_data(request)
"""
Provides a JSON-serialized list of all the current maps.
"""
- view_data = _map_index_data(request)
+ view_data = _map_index_data(request)
maps = [m.to_dict() for m in view_data['maps']]
mapinfo_data['top_servers'].append(('-', '-', '-'))
return mapinfo_data
+
+
+def map_info_json(request):
+ """
+ List the information stored about a given map. JSON.
+ """
+ return [{'status':'not implemented'}]
return _player_index_data(request)
+def player_index_json(request):
+ """
+ Provides a list of all the current players. JSON.
+ """
+ return [{'status':'not implemented'}]
+
+
def _get_games_played(player_id):
"""
Provides a breakdown by gametype of the games played by player_id.
return _player_info_data(request)
+def player_info_json(request):
+ """
+ Provides detailed information on a specific player. JSON.
+ """
+ return [{'status':'not implemented'}]
+
+
def _player_game_index_data(request):
player_id = request.matchdict['player_id']
return _player_game_index_data(request)
+def player_game_index_json(request):
+ """
+ Provides an index of the games in which a particular
+ player was involved. This is ordered by game_id, with
+ the most recent game_ids first. Paginated. JSON.
+ """
+ return [{'status':'not implemented'}]
+
+
def _player_accuracy_data(request):
player_id = request.matchdict['id']
allowed_weapons = ['nex', 'rifle', 'shotgun', 'uzi', 'minstanex']
}
+def player_accuracy(request):
+ """
+ Provides the accuracy for the given weapon. (JSON only)
+ """
+ return _player_accuracy_data(request)
+
+
def player_accuracy_json(request):
"""
Provides a JSON response representing the accuracy for the given weapon.
def search(request):
return _search_data(request)
+
+
+def search_json(request):
+ return [{'status':'not implemented'}]
return _server_index_data(request)
+def server_index_json(request):
+ """
+ Provides a list of all the current servers. JSON.
+ """
+ return [{'status':'not implemented'}]
+
+
def _server_info_data(request):
server_id = request.matchdict['id']
return serverinfo_data
+def server_info_json(request):
+ """
+ List the stored information about a given server. JSON.
+ """
+ return [{'status':'not implemented'}]
+
+
def _server_game_index_data(request):
server_id = request.matchdict['server_id']
current_page = request.matchdict['page']
List the games played on a given server. Paginated.
"""
return _server_game_index_data(request)
+
+
+def server_game_index_json(request):
+ """
+ List the games played on a given server. Paginated. JSON.
+ """
+ return [{'status':'not implemented'}]