diff --git a/gamespy_backend_server.py b/gamespy_backend_server.py index 92ef071..a87e805 100644 --- a/gamespy_backend_server.py +++ b/gamespy_backend_server.py @@ -397,12 +397,25 @@ class GameSpyBackendServer(object): return None - def find_server_by_local_address(self, publicip, localip, localport, gameid = None): + def find_server_by_local_address(self, publicip, localaddr, gameid = None): + localip = localaddr[0] + localport = localaddr[1] + localip_int_le = localaddr[2] + localip_int_be = localaddr[3] + if gameid == None: # Search all servers for gameid in self.server_list: for server in self.server_list[gameid]: - logger.log(logging.DEBUG, "publicip: %s == %s ? %d" % (server['publicip'], publicip, server['publicip'] == publicip)) + logger.log(logging.DEBUG, "publicip 1: %s == %s ? %d port: %s == %s ? %d" % (server['publicip'], str(localip_int_le), server['publicip'] == str(localip_int_le), server['publicport'], str(localport), server['publicport'] == str(localport))) + if server['publicip'] == str(localip_int_le) and server['publicport'] == str(localport): + return server + + logger.log(logging.DEBUG, "publicip 2: %s == %s ? %d port: %s == %s ? %d" % (server['publicip'], str(localip_int_be), server['publicip'] == str(localip_int_be), server['publicport'], str(localport), server['publicport'] == str(localport))) + if server['publicip'] == str(localip_int_be) and server['publicport'] == str(localport): + return server + + logger.log(logging.DEBUG, "publicip 3: %s == %s ? %d" % (server['publicip'], publicip, server['publicip'] == publicip)) if server['publicip'] == publicip and (server['localport'] == str(localport) or server['publicport'] == str(localport)): for x in range(0, 10): s = 'localip%d' % x @@ -411,6 +424,14 @@ class GameSpyBackendServer(object): return server else: for server in self.server_list[gameid]: + logger.log(logging.DEBUG, "publicip 1: %s == %s ? %d port: %s == %s ? %d" % (server['publicip'], str(localip_int_le), server['publicip'] == str(localip_int_le), server['publicport'], str(localport), server['publicport'] == str(localport))) + if server['publicip'] == str(localip_int_le) and server['publicport'] == str(localport): + return server + + logger.log(logging.DEBUG, "publicip 2: %s == %s ? %d port: %s == %s ? %d" % (server['publicip'], str(localip_int_be), server['publicip'] == str(localip_int_be), server['publicport'], str(localport), server['publicport'] == str(localport))) + if server['publicip'] == str(localip_int_be) and server['publicport'] == str(localport): + return server + logger.log(logging.DEBUG, "publicip: %s == %s ? %d" % (server['publicip'], publicip, server['publicip'] == publicip)) if server['publicip'] == publicip and (server['localport'] == str(localport) or server['publicport'] == str(localport)): for x in range(0, 10): diff --git a/gamespy_natneg_server.py b/gamespy_natneg_server.py index f3f1818..fb46fd2 100644 --- a/gamespy_natneg_server.py +++ b/gamespy_natneg_server.py @@ -75,10 +75,12 @@ class GameSpyNatNegServer(object): client_id = "%02x" % ord(recv_data[13]) localip_raw = recv_data[15:19] + localip_int_le = utils.get_int(recv_data, 15) + localip_int_be = utils.get_int_be(recv_data, 15) localip = '.'.join(["%d" % ord(x) for x in localip_raw]) localport_raw = recv_data[19:21] localport = utils.get_short_be(localport_raw, 0) - localaddr = (localip, localport) + localaddr = (localip, localport, localip_int_le, localip_int_be) if gameid not in self.session_list: self.session_list[gameid] = {} @@ -99,6 +101,9 @@ class GameSpyNatNegServer(object): #if self.session_list[gameid][session_id][client]['serveraddr'] == None: serveraddr = self.get_server_info(gameid, session_id, client) + if serveraddr == None: + serveraddr = self.get_server_info_alt(gameid, session_id, client) + self.session_list[gameid][session_id][client]['serveraddr'] = serveraddr logger.log(logging.DEBUG, "Found server from local ip/port: %s from %d" % (serveraddr, session_id)) @@ -125,6 +130,9 @@ class GameSpyNatNegServer(object): # Send to other client #if self.session_list[gameid][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) + self.session_list[gameid][session_id][client_id]['serveraddr'] = serveraddr logger.log(logging.DEBUG, "Found server 2 from local ip/port: %s from %d" % (serveraddr, session_id)) @@ -175,6 +183,17 @@ class GameSpyNatNegServer(object): logger.log(logging.DEBUG, "Sent address check response to %s:%d..." % (self.session_list[gameid][session_id][client]['addr'][0], self.session_list[gameid][session_id][client]['addr'][1])) logger.log(logging.DEBUG, utils.pretty_print_hex(output)) + elif recv_data[7] == '\x0c': # Natify + port_type = "%02x" % ord(recv_data[12]) + logger.log(logging.DEBUG, "Received natify command from %s:%s..." % (addr[0], addr[1])) + + output = bytearray(recv_data) + output[7] = 0x02 # ERT Test + s.sendto(output, addr) + + logger.log(logging.DEBUG, "Sent natify response to %s:%d..." % (self.session_list[gameid][session_id][client]['addr'][0], self.session_list[gameid][session_id][client]['addr'][1])) + logger.log(logging.DEBUG, utils.pretty_print_hex(output)) + elif recv_data[7] == '\x0d': client_id = "%02x" % ord(recv_data[13]) logger.log(logging.DEBUG, "Received report command from %s:%s..." % (addr[0], addr[1])) @@ -222,29 +241,30 @@ class GameSpyNatNegServer(object): return server_info - # console = 0 - # ipstr = self.session_list[gameid][session_id][client_id]['addr'][0] - # - # if console != 0: - # ip = str(ctypes.c_int32(utils.get_int_be(bytearray([int(x) for x in ipstr.split('.')]), 0)).value) # Wii - # console = 0 - # else: - # ip = str(ctypes.c_int32(utils.get_int(bytearray([int(x) for x in ipstr.split('.')]), 0)).value) # DS - # console = 1 - # - # serveraddr = self.server_manager.find_server_by_local_address(ip, self.session_list[gameid][session_id][client_id]['localaddr'][0], self.session_list[gameid][session_id][client_id]['localaddr'][1], self.session_list[gameid][session_id][client_id]['gameid'])._getvalue() - # - # if serveraddr == None: - # if console != 0: - # ip = str(ctypes.c_int32(utils.get_int_be(bytearray([int(x) for x in ipstr.split('.')]), 0)).value) # Wii - # console = 0 - # else: - # ip = str(ctypes.c_int32(utils.get_int(bytearray([int(x) for x in ipstr.split('.')]), 0)).value) # DS - # console = 1 - # - # serveraddr = self.server_manager.find_server_by_local_address(ip, self.session_list[gameid][session_id][client_id]['localaddr'][0], self.session_list[gameid][session_id][client_id]['localaddr'][1], self.session_list[gameid][session_id][client_id]['gameid'])._getvalue() - # - # return serveraddr + def get_server_info_alt(self, gameid, session_id, client_id): + console = 0 + ipstr = self.session_list[gameid][session_id][client_id]['addr'][0] + + if console != 0: + ip = str(ctypes.c_int32(utils.get_int_be(bytearray([int(x) for x in ipstr.split('.')]), 0)).value) # Wii + console = 0 + else: + ip = str(ctypes.c_int32(utils.get_int(bytearray([int(x) for x in ipstr.split('.')]), 0)).value) # DS + console = 1 + + serveraddr = self.server_manager.find_server_by_local_address(ip, self.session_list[gameid][session_id][client_id]['localaddr'], self.session_list[gameid][session_id][client_id]['gameid'])._getvalue() + + if serveraddr == None: + if console != 0: + ip = str(ctypes.c_int32(utils.get_int_be(bytearray([int(x) for x in ipstr.split('.')]), 0)).value) # Wii + console = 0 + else: + ip = str(ctypes.c_int32(utils.get_int(bytearray([int(x) for x in ipstr.split('.')]), 0)).value) # DS + console = 1 + + serveraddr = self.server_manager.find_server_by_local_address(ip, self.session_list[gameid][session_id][client_id]['localaddr'], self.session_list[gameid][session_id][client_id]['gameid'])._getvalue() + + return serveraddr if __name__ == "__main__": natneg_server = GameSpyNatNegServer() diff --git a/gamespy_profile_server.py b/gamespy_profile_server.py index 31258bf..414f445 100644 --- a/gamespy_profile_server.py +++ b/gamespy_profile_server.py @@ -120,8 +120,9 @@ class PlayerSession(LineReceiver): if self.session in self.sessions: del self.sessions[self.session] - self.db.delete_session(self.session) - self.log(logging.INFO, "Deleted session %d" % self.sessions) + + self.db.delete_session(self.session) + self.log(logging.INFO, "Deleted session " + self.session) def rawDataReceived(self, data): self.log(logging.DEBUG, "RESPONSE: '%s'..." % data) @@ -133,7 +134,8 @@ class PlayerSession(LineReceiver): commands, self.remaining_message = gs_query.parse_gamespy_message(data) for data_parsed in commands: - self.log(-1, data_parsed) + #self.log(-1, data_parsed) + self.log(logging.DEBUG, data_parsed) if data_parsed['__cmd__'] == "login": self.perform_login(data_parsed) @@ -273,9 +275,18 @@ class PlayerSession(LineReceiver): self.get_status_from_friends() self.send_status_to_friends() + profile = self.db.get_profile_from_profileid(profileid) + if profile != None: + self.statstring = profile['stat'] + self.locstring = profile['loc'] + def perform_logout(self, data_parsed): self.log(logging.INFO, "Session %s has logged off" % (data_parsed['sesskey'])) self.db.delete_session(data_parsed['sesskey']) + + if self.session in self.sessions: + del self.sessions[self.session] + self.transport.loseConnection() def perform_getprofile(self, data_parsed): @@ -345,16 +356,19 @@ class PlayerSession(LineReceiver): def perform_status(self, data_parsed): self.sesskey = data_parsed['sesskey'] - #fields = [] - #fields.append(("stat", data_parsed['statstring'])) - #fields.append(("loc", data_parsed['locstring'])) - - #self.db.update_profile(sesskey, fields) self.status = data_parsed['__cmd_val__'] self.statstring = data_parsed['statstring'] self.locstring = data_parsed['locstring'] + fields = [] + #fields.append(("status", self.status)) + fields.append(("stat", self.statstring)) + fields.append(("loc", self.locstring)) + + for f in fields: + self.db.update_profile(self.sesskey, f) + # Send authorization requests to client self.get_buddy_requests() diff --git a/gamespy_qr_server.py b/gamespy_qr_server.py index e44bd74..2b7f900 100644 --- a/gamespy_qr_server.py +++ b/gamespy_qr_server.py @@ -39,7 +39,6 @@ class GameSpyQRServer(object): self.gamename = "" self.keepalive = -1 - self.own_server = None def __init__(self): self.sessions = {} @@ -268,7 +267,7 @@ class GameSpyQRServer(object): # 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.own_server = self.server_manager.update_server_list(k['gamename'], session_id, k, self.sessions[session_id].console)._getvalue() + self.server_manager.update_server_list(k['gamename'], session_id, k, self.sessions[session_id].console)._getvalue() self.sessions[session_id].gamename = k['gamename'] elif k['statechanged'] == "2": # Close server self.server_manager.delete_server(k['gamename'] , session_id) @@ -326,6 +325,3 @@ class GameSpyQRServer(object): del self.sessions[session_id] time.sleep(15.0) - - def get_own_server(self): - return self.own_server diff --git a/gamespy_server_browser_server.py b/gamespy_server_browser_server.py index 4910ba9..0afb4f7 100644 --- a/gamespy_server_browser_server.py +++ b/gamespy_server_browser_server.py @@ -79,7 +79,7 @@ class Session(LineReceiver): self.setRawMode() # We're dealing with binary data so set to raw mode self.address = address self.forward_to_client = False - self.forward_client = () + self.forward_client = None self.header_length = 0 self.expected_packet_length = 0 self.forward_packet = None @@ -121,7 +121,7 @@ class Session(LineReceiver): self.forward_data_to_client(self.forward_packet, self.forward_client) self.forward_to_client = False - self.forward_client = () + self.forward_client = None self.header_length = 0 self.expected_packet_length = 0 self.forward_packet = None @@ -217,7 +217,7 @@ class Session(LineReceiver): self.forward_data_to_client(data[3:], dest) self.forward_to_client = False - self.forward_client = () + self.forward_client = None self.header_length = 0 self.expected_packet_length = 0 self.forward_packet = None @@ -402,14 +402,14 @@ class Session(LineReceiver): if len(data) == 10 and bytearray(data)[0:6] == bytearray([0xfd, 0xfc, 0x1e, 0x66, 0x6a, 0xb2]): natneg_session = utils.get_int(data,6) - self.log(logging.DEBUG, "Adding %d to natneg server list" % (natneg_session)) + self.log(logging.DEBUG, "Adding %d to natneg server list: %s" % (natneg_session, server)) self.server_manager.add_natneg_server(natneg_session, server) # Store info in backend so we can get it later in natneg - if self.qr != None: - own_server = self.qr.get_own_server() - - self.log(logging.DEBUG, "Adding %d to natneg server list" % (natneg_session)) - self.server_manager.add_natneg_server(natneg_session, own_server) # Store info in backend so we can get it later in natneg + # if self.qr != None: + # own_server = self.qr.get_own_server() + # + # self.log(logging.DEBUG, "Adding %d to natneg server list: %s" % (natneg_session, own_server)) + # self.server_manager.add_natneg_server(natneg_session, own_server) # Store info in backend so we can get it later in natneg output = bytearray([0xfe, 0xfd, 0x06]) output += utils.get_bytes_from_int(server['__session__'])