From 3a5ab7f857eaa9ccedc6449054436e46fe111ca0 Mon Sep 17 00:00:00 2001 From: Little Cat Date: Wed, 11 Jan 2023 03:56:24 -0400 Subject: [PATCH] friends: Use structs instead of sending datagrams --- etc/toon.dc | 20 ++++++--- .../distributed/ToontownClientRepository.py | 42 ++++++++++++------- toontown/friends/ToontownFriendsManager.py | 22 +++++----- toontown/friends/ToontownFriendsManagerUD.py | 23 ++-------- toontown/uberdog/ToontownUDRepository.py | 3 +- 5 files changed, 55 insertions(+), 55 deletions(-) diff --git a/etc/toon.dc b/etc/toon.dc index 66e67b6..083bcb9 100755 --- a/etc/toon.dc +++ b/etc/toon.dc @@ -2853,14 +2853,22 @@ dclass TTAvatarFriendsManager : AvatarFriendsManager { dclass TTPlayerFriendsManager : PlayerFriendsManager { }; +struct Friend { + uint32 doId; + string name; + blob dnaString; + uint32 petId; +}; + +// Astron-specific Friends Manager dclass ToontownFriendsManager : DistributedObject { getFriendsListRequest() clsend; - getFriendsListResponse(blob); - friendOnline(blob); - friendOffline(blob); - goingOffline(uint32); - getAvatarDetailsRequest(uint32) clsend; - getAvatarDetailsResponse(blob); + getFriendsListResponse(bool success, Friend friends[]); + friendOnline(uint32 friendId, uint8 commonChatFlags, uint8 whitelistChatFlags); + friendOffline(uint32 friendId); + goingOffline(uint32 friendId); + getAvatarDetailsRequest(uint32 avId) clsend; + getAvatarDetailsResponse(blob avatarDetails); makeFriends(uint32, uint32, uint8, uint32); makeFriendsResponse(uint32, uint32, uint8, uint32) airecv; removeFriend(uint32) clsend; diff --git a/toontown/distributed/ToontownClientRepository.py b/toontown/distributed/ToontownClientRepository.py index 6401f22..2f7df7c 100644 --- a/toontown/distributed/ToontownClientRepository.py +++ b/toontown/distributed/ToontownClientRepository.py @@ -901,6 +901,7 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository): def handleGetFriendsList(self, di): error = di.getUint8() + friends = [] if error: self.notify.warning('Got error return from friends list.') self.friendsListError = 1 @@ -910,25 +911,30 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository): doId = di.getUint32() name = di.getString() dnaString = di.getBlob() - 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(): + friends.append((doId, name, dnaString, petId)) + self.setFriendsMap(friends) - def handleAddedPet(): - self.friendsMapPending = 0 - messenger.send('friendsMapComplete') + def setFriendsMap(self, friends): + for doId, name, dnaString, petId in friends: + dna = ToonDNA.ToonDNA() + dna.makeFromNetString(dnaString) + 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.addPetToFriendsMap(handleAddedPet) - return self.friendsMapPending = 0 messenger.send('friendsMapComplete') @@ -967,6 +973,9 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository): commonChatFlags = di.getUint8() if di.getRemainingSize() > 0: whitelistChatFlags = di.getUint8() + self.setFriendOnline(doId, commonChatFlags, whitelistChatFlags) + + def setFriendOnline(self, doId, commonChatFlags, whitelistChatFlags): self.notify.debug('Friend %d now online. common=%d whitelist=%d' % (doId, commonChatFlags, whitelistChatFlags)) if doId not in self.friendsOnline: self.friendsOnline[doId] = self.identifyFriend(doId) @@ -976,6 +985,9 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository): def handleFriendOffline(self, di): doId = di.getUint32() + self.setFriendOffline(doId) + + def setFriendOffline(self, doId): self.notify.debug('Friend %d now offline.' % doId) try: del self.friendsOnline[doId] diff --git a/toontown/friends/ToontownFriendsManager.py b/toontown/friends/ToontownFriendsManager.py index a23726e..01ae9d8 100644 --- a/toontown/friends/ToontownFriendsManager.py +++ b/toontown/friends/ToontownFriendsManager.py @@ -10,20 +10,18 @@ class ToontownFriendsManager(DistributedObjectGlobal): def sendGetFriendsListRequest(self): self.sendUpdate('getFriendsListRequest') - def getFriendsListResponse(self, friendsList): - datagram = PyDatagram(friendsList) - di = PyDatagramIterator(datagram) - self.cr.handleGetFriendsList(di) + def getFriendsListResponse(self, success, friendsList): + if not success: + self.notify.warning('An error has occurred when retrieving friends list.') + self.cr.friendsListError = 1 - def friendOnline(self, friend): - datagram = PyDatagram(friend) - di = PyDatagramIterator(datagram) - self.cr.handleFriendOnline(di) + self.cr.setFriendsMap(friendsList) - def friendOffline(self, friend): - datagram = PyDatagram(friend) - di = PyDatagramIterator(datagram) - self.cr.handleFriendOffline(di) + def friendOnline(self, friendId, commonChatFlags, whitelistChatFlags): + self.cr.setFriendOnline(friendId, commonChatFlags, whitelistChatFlags) + + def friendOffline(self, friendId): + self.cr.setFriendOffline(friendId) def sendGetAvatarDetailsRequest(self, avId): self.sendUpdate('getAvatarDetailsRequest', [avId]) diff --git a/toontown/friends/ToontownFriendsManagerUD.py b/toontown/friends/ToontownFriendsManagerUD.py index 53d94b3..91830eb 100644 --- a/toontown/friends/ToontownFriendsManagerUD.py +++ b/toontown/friends/ToontownFriendsManagerUD.py @@ -80,18 +80,7 @@ class GetFriendsListOperation(FriendsOperation): self._handleDone() def __sendFriendsList(self, success): - datagram = PyDatagram() - datagram.addUint8(0 if success else 1) # error - if success: - count = len(self.friendsList) - datagram.addUint16(count) # count - for i in range(count): - datagram.addUint32(self.friendsList[i][0]) # doId - datagram.addString(self.friendsList[i][1]) # name - datagram.addBlob(self.friendsList[i][2]) # dnaString - datagram.addUint32(self.friendsList[i][3]) # petId - - self.friendsManager.sendUpdateToAvatarId(self.sender, 'getFriendsListResponse', [datagram.getMessage()]) + self.friendsManager.sendUpdateToAvatarId(self.sender, 'getFriendsListResponse', [success, self.friendsList if success else []]) for friendId in self.onlineFriends: self.friendsManager.sendFriendOnline(self.sender, friendId, 0, 1) @@ -446,16 +435,10 @@ class ToontownFriendsManagerUD(DistributedObjectGlobalUD): self.air.send(datagram) def sendFriendOnline(self, avId, friendId, commonChatFlags, whitelistChatFlags): - datagram = PyDatagram() - datagram.addUint32(friendId) # doId - datagram.addUint8(commonChatFlags) # commonChatFlags - datagram.addUint8(whitelistChatFlags) # whitelistChatFlags - self.sendUpdateToAvatarId(avId, 'friendOnline', [datagram.getMessage()]) + self.sendUpdateToAvatarId(avId, 'friendOnline', [friendId, commonChatFlags, whitelistChatFlags]) def sendFriendOffline(self, avId, friendId): - datagram = PyDatagram() - datagram.addUint32(friendId) - self.sendUpdateToAvatarId(avId, 'friendOffline', [datagram.getMessage()]) + self.sendUpdateToAvatarId(avId, 'friendOffline', [friendId]) def sendUpdateToAvatar(self, avId, fieldName, args=[]): dclass = self.air.dclassesByName['DistributedToonUD'] diff --git a/toontown/uberdog/ToontownUDRepository.py b/toontown/uberdog/ToontownUDRepository.py index b07dca5..3b6aff8 100644 --- a/toontown/uberdog/ToontownUDRepository.py +++ b/toontown/uberdog/ToontownUDRepository.py @@ -47,6 +47,5 @@ class ToontownUDRepository(ToontownInternalRepository): # Create our Astron login manager... self.astronLoginManager = self.generateGlobalObject(OTP_DO_ID_ASTRON_LOGIN_MANAGER, 'AstronLoginManager') - # Create our Toontown friends manager... - # TODO: Is this Astron specific? + # Create our Toontown friends manager... (Astron specific) self.toontownFriendsManager = self.generateGlobalObject(OTP_DO_ID_TOONTOWN_FRIENDS_MANAGER, 'ToontownFriendsManager')