friends: Use structs instead of sending datagrams

This commit is contained in:
Little Cat 2023-01-11 03:56:24 -04:00
parent 9ea93bd1f4
commit 3a5ab7f857
No known key found for this signature in database
GPG Key ID: 96455BD9C4399BE8
5 changed files with 55 additions and 55 deletions

View File

@ -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;

View File

@ -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]

View File

@ -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])

View File

@ -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']

View File

@ -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')