forked from Almamu/nintendo_dwc_emulator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
internal_stats_server.py
85 lines (64 loc) · 2.51 KB
/
internal_stats_server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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 = self.stats.get_server_list()
output = "<html>"
output += "<table border='1'>"
output += "<tr>"
output += "<td>Game ID</td><td># Players</td>"
output += "</tr>"
if server_list != None:
for game in server_list:
if not server_list[game]:
continue
output += "<tr>"
output += "<td>" + game + "</td>"
output += "<td><center>%d</center></td>" % (len(server_list[game]))
output += "</tr>"
output += "</table>"
output += "<br>"
output += "<i>Last updated: %s</i><br>" % (self.stats.get_last_update_time())
output += "</html>"
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()