From 8ddc427d69d384477e85d2510d201655c3d0d0c4 Mon Sep 17 00:00:00 2001 From: polaris Date: Thu, 4 Sep 2014 21:30:10 -0400 Subject: [PATCH] Handle non-statechanged heartbeats --- gamespy_qr_server.py | 118 +++++++++++++++++++++++-------------------- 1 file changed, 63 insertions(+), 55 deletions(-) diff --git a/gamespy_qr_server.py b/gamespy_qr_server.py index 6f433ba..bbfbb06 100644 --- a/gamespy_qr_server.py +++ b/gamespy_qr_server.py @@ -52,6 +52,7 @@ class GameSpyQRServer(object): self.challenge = "" self.secretkey = "" # Parse gslist.cfg later self.sent_challenge = False + self.heartbeat_data = None self.address = address self.console = 0 self.playerid = 0 @@ -66,16 +67,19 @@ class GameSpyQRServer(object): # Generate a dictionary "secret_key_list" containing the secret game keys associated with their game IDs. # The dictionary key will be the game's ID, and the value will be the secret key. self.secret_key_list = gs_utils.generate_secret_keys("gslist.cfg") - #self.log(logging.DEBUG, address, "Generated list of secret game keys...") + #self.log(logging.DEBUG, address, session_id, "Generated list of secret game keys...") GameSpyServerDatabase.register("update_server_list") GameSpyServerDatabase.register("delete_server") - def log(self, level, address, message): + def log(self, level, address, session_id, message): if address == None: logger.log(level, "%s", message) else: - logger.log(level, "[%s:%d] %s", address[0], address[1], message) + if session_id != None: + logger.log(level, "[%s:%d %08x] %s", address[0], address[1], session_id, message) + else: + logger.log(level, "[%s:%d] %s", address[0], address[1], message) def start(self): try: @@ -124,6 +128,26 @@ class GameSpyQRServer(object): threading.Thread(target=self.write_queue_send, args=(data, address)).start() self.write_queue.task_done() + def update_server_list(self, session_id, k): + if "statechanged" in k and k['statechanged'] == "2": # Close server + self.server_manager.delete_server(k['gamename'] , session_id) + + if session_id in self.sessions: + del self.sessions[session_id] + + else: + # dwc_mtype controls what kind of server query we're looking for. + # dwc_mtype = 0 is used when looking for a matchmaking game. + # dwc_mtype = 1 is unknown. + # dwc_mtype = 2 is used when hosting a friends only game (possibly other uses too). + # dwc_mtype = 3 is used when looking for a friends only game (possibly other uses too). + + # Some memory could be saved by clearing out any unwanted fields from k before sending. + self.server_manager.update_server_list(k['gamename'], session_id, k, self.sessions[session_id].console)._getvalue() + + if session_id in self.sessions: + self.sessions[session_id].gamename = k['gamename'] + def handle_packet(self, socket, recv_data, address): # Tetris DS overlay 10 @ 02144184 - Handle responses back to server # Tetris DS overlay 10 @ 02144184 - Handle responses back to server @@ -207,6 +231,7 @@ class GameSpyQRServer(object): # Open source version of GameSpy found here: https://github.com/sfcspanky/Openspy-Core/tree/master/qr # Use as reference. + session_id = None if recv_data[0] != '\x09': # Don't add a session if the client is trying to check if the game is available or not session_id = struct.unpack("