From af35d9fff1bec8b642a2ca4e73f64958d529a065 Mon Sep 17 00:00:00 2001 From: polaris Date: Thu, 15 Jan 2015 22:01:04 -0500 Subject: [PATCH] Hideous hacks to get friends working better --- gamespy_profile_server.py | 73 +++++++++++++++++++++++++++++++++++---- master_server.py | 4 ++- 2 files changed, 69 insertions(+), 8 deletions(-) diff --git a/gamespy_profile_server.py b/gamespy_profile_server.py index 1129fc0..1913034 100644 --- a/gamespy_profile_server.py +++ b/gamespy_profile_server.py @@ -439,6 +439,8 @@ class PlayerSession(LineReceiver): if dest_profileid in self.sessions: self.log(logging.DEBUG, "SENDING TO %s:%s: %s" % (self.sessions[dest_profileid].address.host, self.sessions[dest_profileid].address.port, msg)) self.sessions[dest_profileid].transport.write(bytes(msg)) + self.send_status_to_friends(dest_profileid) + self.get_status_from_friends(dest_profileid) else: if data_parsed['__cmd_val__'] == "1": self.log(logging.DEBUG, "Saving message to %d: %s" % (dest_profileid, msg)) @@ -475,21 +477,71 @@ class PlayerSession(LineReceiver): if newprofileid in self.sessions: logger.log(logging.DEBUG, "User is online, sending direct request from profile id %d to profile id %d..." % (self.profileid, newprofileid)) - self.send_buddy_request(self.sessions[newprofileid], self.profileid) + + # TODO: Add a way to check if a profile id is already a buddy using SQL + other_player_authorized = False + target_buddy_list = self.db.get_buddy_list(newprofileid) + logger.log(logging.DEBUG, target_buddy_list) + for buddy in target_buddy_list: + if buddy['buddyProfileId'] == self.profileid and buddy['blocked'] == 0: + other_player_authorized = True + break + + if other_player_authorized == True: + logger.log(logging.DEBUG, "Automatic authorization: %d (target) already has %d (source) as a friend." % (newprofileid, self.profileid)) + + # Force them both to add each other + self.send_buddy_request(self.sessions[newprofileid], self.profileid) + self.send_buddy_request(self.sessions[self.profileid], newprofileid) + + self.send_bm4(newprofileid) + + self.db.auth_buddy(newprofileid, self.profileid) + self.db.auth_buddy(self.profileid, newprofileid) + + self.send_status_to_friends(newprofileid) + self.get_status_from_friends(newprofileid) + + else: + self.send_buddy_request(self.sessions[newprofileid], self.profileid) + else: + # Trying to add someone who is already a friend. Just send status updates + self.send_status_to_friends(newprofileid) + self.get_status_from_friends(newprofileid) + + self.buddies = self.db.get_buddy_list(self.profileid) + def send_bm4(self, playerid): + date = int(time.time()) + msg = gs_query.create_gamespy_message([ + ('__cmd__', "bm"), + ('__cmd_val__', "4"), + ('f', playerid), + ('date', date), + ('msg', ""), + ]) + + self.transport.write(bytes(msg)) def perform_delbuddy(self, data_parsed): # Sample: \delbuddy\\sesskey\61913621\delprofileid\1\final\ self.db.delete_buddy(self.profileid, int(data_parsed['delprofileid'])) + self.buddies = self.db.get_buddy_list(self.profileid) def perform_authadd(self, data_parsed): # Sample: \authadd\\sesskey\231587549\fromprofileid\217936895\sig\f259f26d3273f8bda23c7c5e4bd8c5aa\final\ # Authorize the other person's friend request. - self.db.auth_buddy(int(data_parsed['fromprofileid']), self.profileid) - + target_profile = int(data_parsed['fromprofileid']) + self.db.auth_buddy(target_profile, self.profileid) self.get_buddy_authorized() + self.buddies = self.db.get_buddy_list(self.profileid) + + self.send_bm4(target_profile) + + self.send_status_to_friends(target_profile) + self.get_status_from_friends(target_profile) - def send_status_to_friends(self): + def send_status_to_friends(self, buddy_profileid = None): # TODO: Cache buddy list so we don't have to query the database every time self.buddies = self.db.get_buddy_list(self.profileid) @@ -506,17 +558,24 @@ class PlayerSession(LineReceiver): ('msg', status_msg), ]) - for buddy in self.buddies: + buddy_list = self.buddies + if buddy_profileid != None: + buddy_list = [{"buddyProfileId":buddy_profileid}] + + for buddy in buddy_list: if buddy['buddyProfileId'] in self.sessions: #self.log(logging.DEBUG, "Sending status to buddy id %s (%s:%d): %s" % (str(buddy['buddyProfileId']), self.sessions[buddy['buddyProfileId']].address.host, self.sessions[buddy['buddyProfileId']].address.port, msg)) self.sessions[buddy['buddyProfileId']].transport.write(bytes(msg)) - - def get_status_from_friends(self): + def get_status_from_friends(self, buddy_profileid = None): # This will be called when the player logs in. Grab the player's buddy list and check the current sessions to # see if anyone is online. If they are online, make them send an update to the calling client. self.buddies = self.db.get_buddy_list(self.profileid) + buddy_list = self.buddies + if buddy_profileid != None: + buddy_list = [{"buddyProfileId":buddy_profileid}] + for buddy in self.buddies: if buddy['status'] != 1: continue diff --git a/master_server.py b/master_server.py index d28518f..81023dc 100644 --- a/master_server.py +++ b/master_server.py @@ -39,7 +39,9 @@ if __name__ == "__main__": # Let database initialize before starting any servers. # This fixes any conflicts where two servers find an uninitialized database at the same time and both try to # initialize it. - gs_database.GamespyDatabase().initialize_database() + db = gs_database.GamespyDatabase() + db.initialize_database() + db.close() servers = [ GameSpyBackendServer,