friends: Working friends list retrieval

This commit is contained in:
John Cote 2021-07-16 21:44:19 -04:00
parent ca5db53eea
commit 4587bcd43c
No known key found for this signature in database
GPG Key ID: E3442FF71E9C1C01
4 changed files with 84 additions and 23 deletions

View File

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

View File

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

View File

@ -7,3 +7,6 @@ class ToontownFriendsManager(DistributedObjectGlobal):
def sendGetFriendsListRequest(self):
self.sendUpdate('getFriendsListRequest')
def getFriendsListResponse(self, friendsList):
self.cr.handleGetFriendsList(friendsList)

View File

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