From 174c643d35e557bc87f409829c85149383638b0c Mon Sep 17 00:00:00 2001 From: polaris Date: Tue, 5 Aug 2014 08:32:55 -0400 Subject: [PATCH] More matchmaking bugfix attempts --- gamespy_backend_server.py | 31 +++++++++++++++++++++++-------- gamespy_natneg_server.py | 2 +- gamespy_qr_server.py | 16 +++++++++------- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/gamespy_backend_server.py b/gamespy_backend_server.py index d5ca7b3..c5869c6 100644 --- a/gamespy_backend_server.py +++ b/gamespy_backend_server.py @@ -436,17 +436,32 @@ class GameSpyBackendServer(object): localip_int_be = localaddr[3] def find_server(gameid): + best_match = None + for server in self.server_list[gameid]: logger.log(logging.DEBUG, "publicip: %s == %s ? %d localport: %s == %s ? %d" % (server['publicip'], publicip, server['publicip'] == publicip, server['localport'], str(localport), server['localport'] == str(localport))) - if server['publicip'] == publicip and server['localport'] == str(localport): - # for x in range(0, 10): - # s = 'localip%d' % x - # if s in server: - # if server[s] == localip: - # return server - return server + if server['publicip'] == publicip: + if server['localport'] == str(localport): + best_match = server + break - logger.log(logging.DEBUG, "Couldn't find a match for %s" % (publicip)) + for x in range(0, 10): + s = 'localip%d' % x + if s in server: + if server[s] == localip: + best_match = server + + if localport == 0 and best_match == None: + # Kinda hackish. This sometimes happens. + # Assuming two clients aren't trying to connect from the same IP, this might be safe. + # The server wasn't verified to be the *correct* server, but it's on the same IP so it + # has a chance of being correct. At least make an attempt to establish the connection. + best_match = server + + if best_match == None: + logger.log(logging.DEBUG, "Couldn't find a match for %s" % (publicip)) + + return best_match if gameid == None: # Search all servers diff --git a/gamespy_natneg_server.py b/gamespy_natneg_server.py index e885f78..bd3ddb2 100644 --- a/gamespy_natneg_server.py +++ b/gamespy_natneg_server.py @@ -170,7 +170,7 @@ class GameSpyNatNegServer(object): #if self.session_list[session_id][client_id]['serveraddr'] == None: serveraddr = self.get_server_info(gameid, session_id, client_id) if serveraddr == None: - serveraddr = self.get_server_info_alt(gameid, session_id, client) + serveraddr = self.get_server_info_alt(gameid, session_id, client_id) self.session_list[session_id][client_id]['serveraddr'] = serveraddr logger.log(logging.DEBUG, "Found server 2 from local ip/port: %s from %d" % (serveraddr, session_id)) diff --git a/gamespy_qr_server.py b/gamespy_qr_server.py index adba2c5..2a46034 100644 --- a/gamespy_qr_server.py +++ b/gamespy_qr_server.py @@ -326,10 +326,12 @@ class GameSpyQRServer(object): if "statechanged" in k: if k['statechanged'] == "2": # Close server - self.server_manager.delete_server(k['gamename'] , session_id) + self.server_manager.delete_server(k['gamename'] , session_id) + + if session_id in self.sessions: + # self.sessions[session_id].disconnected = True + del self.sessions[session_id] - if session_id in self.sessions: - self.sessions[session_id].disconnected = True else: #if k['statechanged'] == "1": # Create server #if k['publicport'] != "0" and k['publicip'] != "0": @@ -379,16 +381,16 @@ class GameSpyQRServer(object): #self.log(logging.DEBUG, None, "Keep alive check on %d sessions" % (len(self.sessions))) pruned = [] + now = int(time.time()) + for session_id in self.sessions: - now = int(time.time()) delta = now - self.sessions[session_id].keepalive -# timeout = 60 * 5 # Remove clients that haven't responded in x seconds - timeout = 30 # Remove clients that haven't responded in x seconds + timeout = 60 * 5 # Remove clients that haven't responded in x seconds if delta < 0 or delta >= timeout: pruned.append(session_id) self.server_manager.delete_server(self.sessions[session_id].gamename, self.sessions[session_id].session) - self.log(logging.DEBUG, None, "Keep alive check removed %s:%s for game %s" % (self.sessions[session_id].address[0], self.sessions[session_id].address[1], self.sessions[session_id].gamename)) + self.log(logging.DEBUG, None, "Keep alive check removed %s:%s for game %s. Client hasn't responded in %d seconds." % (self.sessions[session_id].address[0], self.sessions[session_id].address[1], self.sessions[session_id].gamename, delta)) for session_id in pruned: del self.sessions[session_id]