From 4587bcd43c82c75df0035afdfc0a1add644583ab Mon Sep 17 00:00:00 2001 From: John Cote Date: Fri, 16 Jul 2021 21:44:19 -0400 Subject: [PATCH] friends: Working friends list retrieval --- etc/toon.dc | 8 +++ .../distributed/ToontownClientRepository.py | 56 ++++++++++++++----- toontown/friends/ToontownFriendsManager.py | 3 + toontown/friends/ToontownFriendsManagerUD.py | 40 ++++++++++--- 4 files changed, 84 insertions(+), 23 deletions(-) diff --git a/etc/toon.dc b/etc/toon.dc index 1bcd9a4..ac7fc2d 100755 --- a/etc/toon.dc +++ b/etc/toon.dc @@ -2846,8 +2846,16 @@ dclass TTAvatarFriendsManager : AvatarFriendsManager { dclass TTPlayerFriendsManager : PlayerFriendsManager { }; +struct Friend { + uint32 doId; + string name; + blob dnaString; + uint32 petId; +}; + dclass ToontownFriendsManager : DistributedObject { getFriendsListRequest() clsend; + getFriendsListResponse(Friend[]); }; dclass TTSpeedchatRelay : SpeedchatRelay { diff --git a/toontown/distributed/ToontownClientRepository.py b/toontown/distributed/ToontownClientRepository.py index af15747..e7eb206 100644 --- a/toontown/distributed/ToontownClientRepository.py +++ b/toontown/distributed/ToontownClientRepository.py @@ -907,20 +907,15 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository): PetDetail.PetDetail(doId, petDetailsCallback) - def handleGetFriendsList(self, di): - error = di.getUint8() - if error: - self.notify.warning('Got error return from friends list.') - self.friendsListError = 1 - else: - count = di.getUint16() - for i in range(0, count): - doId = di.getUint32() - name = di.getString() - dnaString = di.getString() + if __astron__: + def handleGetFriendsList(self, friendsList): + for friend in friendsList: + doId = friend[0] + name = friend[1] + dnaString = friend[2] dna = ToonDNA.ToonDNA() dna.makeFromNetString(dnaString) - petId = di.getUint32() + petId = friend[3] handle = FriendHandle.FriendHandle(doId, name, dna, petId) self.friendsMap[doId] = handle if doId in self.friendsOnline: @@ -937,8 +932,41 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository): self.addPetToFriendsMap(handleAddedPet) return - self.friendsMapPending = 0 - messenger.send('friendsMapComplete') + self.friendsMapPending = 0 + messenger.send('friendsMapComplete') + else: + def handleGetFriendsList(self, di): + error = di.getUint8() + if error: + self.notify.warning('Got error return from friends list.') + self.friendsListError = 1 + else: + count = di.getUint16() + for i in range(0, count): + doId = di.getUint32() + name = di.getString() + dnaString = di.getString() + dna = ToonDNA.ToonDNA() + dna.makeFromNetString(dnaString) + petId = di.getUint32() + handle = FriendHandle.FriendHandle(doId, name, dna, petId) + self.friendsMap[doId] = handle + if doId in self.friendsOnline: + self.friendsOnline[doId] = handle + if doId in self.friendPendingChatSettings: + self.notify.debug('calling setCommonAndWL %s' % str(self.friendPendingChatSettings[doId])) + handle.setCommonAndWhitelistChatFlags(*self.friendPendingChatSettings[doId]) + + if base.wantPets and base.localAvatar.hasPet(): + + def handleAddedPet(): + self.friendsMapPending = 0 + messenger.send('friendsMapComplete') + + self.addPetToFriendsMap(handleAddedPet) + return + self.friendsMapPending = 0 + messenger.send('friendsMapComplete') def handleGetFriendsListExtended(self, di): avatarHandleList = [] diff --git a/toontown/friends/ToontownFriendsManager.py b/toontown/friends/ToontownFriendsManager.py index 99201e6..10debb5 100644 --- a/toontown/friends/ToontownFriendsManager.py +++ b/toontown/friends/ToontownFriendsManager.py @@ -7,3 +7,6 @@ class ToontownFriendsManager(DistributedObjectGlobal): def sendGetFriendsListRequest(self): self.sendUpdate('getFriendsListRequest') + + def getFriendsListResponse(self, friendsList): + self.cr.handleGetFriendsList(friendsList) diff --git a/toontown/friends/ToontownFriendsManagerUD.py b/toontown/friends/ToontownFriendsManagerUD.py index 0a84b2f..0468af5 100644 --- a/toontown/friends/ToontownFriendsManagerUD.py +++ b/toontown/friends/ToontownFriendsManagerUD.py @@ -17,9 +17,20 @@ class FriendsOperation: pass -class FriendsListOperation(FriendsOperation): +class GetFriendsListOperation(FriendsOperation): + + def __init__(self, friendsManager, sender): + FriendsOperation.__init__(self, friendsManager, sender) + self.friendsList = None + self.tempFriendsList = None + self.onlineFriends = None + self.currentFriendIdx = None def start(self): + self.friendsList = [] + self.tempFriendsList = [] + self.onlineFriends = [] + self.currentFriendIdx = 0 self.friendsManager.air.dbInterface.queryObject(self.friendsManager.air.dbId, self.sender, self.__handleSenderRetrieved) @@ -30,12 +41,10 @@ class FriendsListOperation(FriendsOperation): self.tempFriendsList = fields['setFriendsList'][0] if len(self.tempFriendsList) <= 0: - self.__sendFriendsList([]) + self.__sendFriendsList() self._handleDone() return - self.currentFriendIdx = 0 - self.friendsList = [] self.friendsManager.air.dbInterface.queryObject(self.friendsManager.air.dbId, self.tempFriendsList[0][0], self.__handleFriendRetrieved) @@ -47,8 +56,7 @@ class FriendsListOperation(FriendsOperation): friendId = self.tempFriendsList[self.currentFriendIdx][0] self.friendsList.append([friendId, fields['setName'][0], fields['setDNAString'][0], fields['setPetId'][0]]) if len(self.friendsList) >= len(self.tempFriendsList): - self.__sendFriendsList(self.friendsList) - self._handleDone() + self.__checkFriendsOnline() return self.currentFriendIdx += 1 @@ -56,8 +64,22 @@ class FriendsListOperation(FriendsOperation): self.tempFriendsList[self.currentFriendIdx][0], self.__handleFriendRetrieved) - def __sendFriendsList(self, friendsList): - self.friendsManager.notify.info('TODO: __sendFriendsList') + def __checkFriendsOnline(self): + self.currentFriendIdx = 0 + for friendDetails in self.friendsList: + self.friendsManager.air.getActivated(friendDetails[0], self.__gotActivatedResp) + + def __gotActivatedResp(self, avId, activated): + self.currentFriendIdx += 1 + if activated: + self.onlineFriends.append(avId) + + if self.currentFriendIdx >= len(self.friendsList): + self.__sendFriendsList() + self._handleDone() + + def __sendFriendsList(self): + self.friendsManager.sendUpdateToAvatarId(self.sender, 'getFriendsListResponse', [self.friendsList]) class ToontownFriendsManagerUD(DistributedObjectGlobalUD): @@ -77,4 +99,4 @@ class ToontownFriendsManagerUD(DistributedObjectGlobalUD): newOperation.start(*args) def getFriendsListRequest(self): - self.runOperation(FriendsListOperation) + self.runOperation(GetFriendsListOperation)