diff --git a/internal_stats_server.py b/internal_stats_server.py new file mode 100644 index 0000000..7ff45b2 --- /dev/null +++ b/internal_stats_server.py @@ -0,0 +1,85 @@ +from twisted.web import server, resource +from twisted.internet import reactor +from twisted.internet.error import ReactorAlreadyRunning +from multiprocessing.managers import BaseManager +import time +import datetime + +class GameSpyServerDatabase(BaseManager): + pass + +GameSpyServerDatabase.register("get_server_list") + +class StatsPage(resource.Resource): + isLeaf = True + + def __init__(self, stats): + self.stats = stats + + def render_GET(self, request): + # TODO: Make this easier to modify later + + server_list = stats.get_server_list() + + output = "" + output += "" + output += "" + output += "" + output += "" + + if server_list != None: + for game in server_list: + if len(server_list[game]) == 0: + continue + + output += "" + output += "" + output += "" % (len(server_list[game])) + output += "" + + output += "
Game ID# Players
" + game + "
%d
" + + output += "
" + output += "Last updated: %s
" % (stats.get_last_update_time()) + output += "" + + return output + +class InternalStatsServer(object): + def __init__(self): + self.last_update = 0 + self.next_update = 0 + self.server_list = None + self.seconds_per_update = 60 # The number of seconds to wait before updating the server list + + def start(self): + manager_address = ("127.0.0.1", 27500) + manager_password = "" + self.server_manager = GameSpyServerDatabase(address = manager_address, authkey= manager_password) + self.server_manager.connect() + + site = server.Site(StatsPage(self)) + reactor.listenTCP(9001, site) + + try: + if reactor.running == False: + reactor.run(installSignalHandlers=0) + except ReactorAlreadyRunning: + pass + + def get_server_list(self): + if self.next_update == 0 or self.next_update - time.time() <= 0: + self.last_update = time.time() + self.next_update = time.time() + self.seconds_per_update + self.server_list = self.server_manager.get_server_list()._getvalue() + + print self.server_list + + return self.server_list + + def get_last_update_time(self): + return str(datetime.datetime.fromtimestamp(self.last_update)) + +if __name__ == "__main__": + stats = InternalStatsServer() + stats.start() diff --git a/master_server.py b/master_server.py index 4c1a17b..ded9545 100644 --- a/master_server.py +++ b/master_server.py @@ -6,6 +6,7 @@ from gamespy_qr_server import GameSpyQRServer from gamespy_server_browser_server import GameSpyServerBrowserServer from gamespy_gamestats_server import GameSpyGamestatsServer from nintendo_nas_server import NintendoNasServer +from internal_stats_server import InternalStatsServer import gamespy.gs_database as gs_database @@ -43,6 +44,10 @@ def start_nas_server(): nas_server = NintendoNasServer() nas_server.start() +def start_stats_server(): + stats_server = InternalStatsServer() + stats_server.start() + if __name__ == "__main__": # Let database initialize before starting any servers. # This fixes any conflicts where two servers find an uninitialized database at the same time and both try to @@ -72,3 +77,6 @@ if __name__ == "__main__": nas_server_thread = threading.Thread(target=start_nas_server) nas_server_thread.start() + +# stats_server_thread = threading.Thread(target=start_stats_server) +# stats_server_thread.start()