mirror of
https://github.com/ptitSeb/Serious-Engine
synced 2024-11-28 21:05:53 +01:00
43 lines
1.1 KiB
Python
43 lines
1.1 KiB
Python
|
class Server:
|
||
|
def __init__(self):
|
||
|
self.challenge = 0
|
||
|
self.addr = ("0.0.0.0", 0)
|
||
|
self.port = 25600
|
||
|
self.prejoinactions = 0
|
||
|
self.product = ""
|
||
|
self.params = {}
|
||
|
self.paramsallowed = "port;players;maxplayers;level;gametype;version"
|
||
|
self.visible = False
|
||
|
self.lastheartbeat = time.time()
|
||
|
|
||
|
def join(self):
|
||
|
self.challenge = random.randint(0x00000000, 0x7FFFFFFF)
|
||
|
self.port = self.addr[1] - 1
|
||
|
sendto("\1" + struct.pack("i", self.challenge), addr)
|
||
|
|
||
|
def challengeresponse(self, data):
|
||
|
params = re.findall(";(\w+);([^;]*)", data)
|
||
|
valid = False
|
||
|
for param in params:
|
||
|
key = param[0]
|
||
|
val = param[1]
|
||
|
if(key == "challenge"):
|
||
|
if(val == str(self.challenge)):
|
||
|
valid = True
|
||
|
continue
|
||
|
if(key == "product"):
|
||
|
self.product = val
|
||
|
continue
|
||
|
try:
|
||
|
self.paramsallowed.split(";").index(key)
|
||
|
self.params[key] = val
|
||
|
except:
|
||
|
pass
|
||
|
if(not self.visible):
|
||
|
if(valid):
|
||
|
self.visible = True
|
||
|
else:
|
||
|
self.lastheartbeat = time.time()
|
||
|
|
||
|
def statechanged(self, data):
|
||
|
print("state changed: " + data)
|