diff --git a/gamespy/gs_database.py b/gamespy/gs_database.py index d0261bf..1a2d134 100644 --- a/gamespy/gs_database.py +++ b/gamespy/gs_database.py @@ -341,7 +341,7 @@ class GamespyDatabase(object): self.delete_session(profileid) # Create new session - session_key = self.generate_session_key(9) + session_key = self.generate_session_key(8) q ="INSERT INTO sessions VALUES (?, ?)" q2 = q.replace("?", "%s") % (session_key, profileid) @@ -570,22 +570,16 @@ class GamespyDatabase(object): c.execute(q, [data, profileid, dindex, ptype]) self.conn.commit() - def pd_get(self, profileid, dindex, ptype, data): + def pd_get(self, profileid, dindex, ptype): q = "SELECT * FROM gamestat_profile WHERE profileid = ? AND dindex = ? AND ptype = ?" q2 = q.replace("?", "%s") % (profileid, dindex, ptype) logger.log(-1, q2) - # c = self.conn.cursor() - # c.execute(q, [profileid, dindex, ptype]) - # - # r = self.get_dict(c.fetchone()) + c = self.conn.cursor() + c.execute(q, [profileid, dindex, ptype]) - # Eventually data will contain a list of fields that are being requested. - # Just return nothing for now. - data = "" - #if 'data' in r: - # data = r['data'] + r = self.get_dict(c.fetchone()) - # c.close() + c.close() - return data + return r diff --git a/gamespy_gamestats_server.py b/gamespy_gamestats_server.py index 1bddb85..be3a875 100644 --- a/gamespy_gamestats_server.py +++ b/gamespy_gamestats_server.py @@ -273,21 +273,39 @@ class Gamestats(LineReceiver): self.db.pd_insert(self.profileid, data_parsed['dindex'], data_parsed['ptype'], data) def perform_getpd(self, data_parsed): - logger.log(logging.DEBUG, "FIXME: Implement getpd: %s" % data_parsed) + profile = self.db.pd_get(self.profileid, data_parsed['dindex'], data_parsed['ptype']) - # Return all of the data regardless of whatever the parameters passed to the function are. - # I'll properly implement this once I get a real example of it in action. - data = self.db.pd_get(self.profileid, data_parsed['dindex'], data_parsed['ptype']) + data = "" + keys = data_parsed['keys'].split('\x01') + + profile_data = gs_query.parse_gamespy_message("\\prof\\" + profile['data'] + "\\final\\") + if profile_data != None: + profile_data = profile_data[0][0] + + for key in keys: + if key != "__cmd__" and key != "__cmd_val__" and key != "": + data += "\\" + data += key + data += "\\" + if key in profile_data: + data += profile_data[key] + + modified = int(time.time()) msg_d = [] msg_d.append(('__cmd__', "getpdr")) msg_d.append(('__cmd_val__', 1)) msg_d.append(('lid', self.lid)) msg_d.append(('pid', self.profileid)) + msg_d.append(('mod', modified)) msg_d.append(('length', len(data))) msg_d.append(('data', data)) msg = gs_query.create_gamespy_message(msg_d) + self.log(logging.DEBUG, "SENDING: '%s'..." % msg) + + + def perform_newgame(self, data_parsed): # No op diff --git a/gamespy_qr_server.py b/gamespy_qr_server.py index 8004a1f..98ada35 100644 --- a/gamespy_qr_server.py +++ b/gamespy_qr_server.py @@ -248,7 +248,9 @@ class GameSpyQRServer(object): self.server_manager.update_server_list(k['gamename'] , session_id, k, self.sessions[session_id].console) elif k['statechanged'] == "2": # Close server self.server_manager.delete_server(k['gamename'] , session_id) - #self.sessions.pop(session_id) + + if session_id in self.sessions: + self.sessions.pop(session_id) elif recv_data[0] == '\x04': # Add Error