friends: Restructure some stuff
This commit is contained in:
parent
46ac296025
commit
cc61e53496
11
etc/toon.dc
11
etc/toon.dc
|
|
@ -2846,17 +2846,10 @@ dclass TTAvatarFriendsManager : AvatarFriendsManager {
|
||||||
dclass TTPlayerFriendsManager : PlayerFriendsManager {
|
dclass TTPlayerFriendsManager : PlayerFriendsManager {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Friend {
|
|
||||||
uint32 doId;
|
|
||||||
string name;
|
|
||||||
blob dnaString;
|
|
||||||
uint32 petId;
|
|
||||||
};
|
|
||||||
|
|
||||||
dclass ToontownFriendsManager : DistributedObject {
|
dclass ToontownFriendsManager : DistributedObject {
|
||||||
getFriendsListRequest() clsend;
|
getFriendsListRequest() clsend;
|
||||||
getFriendsListResponse(Friend[]);
|
getFriendsListResponse(blob);
|
||||||
friendOnline(uint32, uint8, uint8);
|
friendOnline(blob);
|
||||||
getAvatarDetailsRequest(uint32) clsend;
|
getAvatarDetailsRequest(uint32) clsend;
|
||||||
getAvatarDetailsResponse(blob);
|
getAvatarDetailsResponse(blob);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -910,15 +910,20 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository):
|
||||||
|
|
||||||
PetDetail.PetDetail(doId, petDetailsCallback)
|
PetDetail.PetDetail(doId, petDetailsCallback)
|
||||||
|
|
||||||
if __astron__:
|
def handleGetFriendsList(self, di):
|
||||||
def handleGetFriendsList(self, friendsList):
|
error = di.getUint8()
|
||||||
for friend in friendsList:
|
if error:
|
||||||
doId = friend[0]
|
self.notify.warning('Got error return from friends list.')
|
||||||
name = friend[1]
|
self.friendsListError = 1
|
||||||
dnaString = friend[2]
|
else:
|
||||||
|
count = di.getUint16()
|
||||||
|
for i in range(0, count):
|
||||||
|
doId = di.getUint32()
|
||||||
|
name = di.getString()
|
||||||
|
dnaString = di.getBlob()
|
||||||
dna = ToonDNA.ToonDNA()
|
dna = ToonDNA.ToonDNA()
|
||||||
dna.makeFromNetString(dnaString)
|
dna.makeFromNetString(dnaString)
|
||||||
petId = friend[3]
|
petId = di.getUint32()
|
||||||
handle = FriendHandle.FriendHandle(doId, name, dna, petId)
|
handle = FriendHandle.FriendHandle(doId, name, dna, petId)
|
||||||
self.friendsMap[doId] = handle
|
self.friendsMap[doId] = handle
|
||||||
if doId in self.friendsOnline:
|
if doId in self.friendsOnline:
|
||||||
|
|
@ -935,41 +940,8 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository):
|
||||||
|
|
||||||
self.addPetToFriendsMap(handleAddedPet)
|
self.addPetToFriendsMap(handleAddedPet)
|
||||||
return
|
return
|
||||||
self.friendsMapPending = 0
|
self.friendsMapPending = 0
|
||||||
messenger.send('friendsMapComplete')
|
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):
|
def handleGetFriendsListExtended(self, di):
|
||||||
avatarHandleList = []
|
avatarHandleList = []
|
||||||
|
|
@ -998,29 +970,20 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository):
|
||||||
if avatarHandleList:
|
if avatarHandleList:
|
||||||
messenger.send('gotExtraFriendHandles', [avatarHandleList])
|
messenger.send('gotExtraFriendHandles', [avatarHandleList])
|
||||||
|
|
||||||
if __astron__:
|
def handleFriendOnline(self, di):
|
||||||
def handleFriendOnline(self, doId, commonChatFlags, whitelistChatFlags):
|
doId = di.getUint32()
|
||||||
self.notify.debug('Friend %d now online. common=%d whitelist=%d' % (doId, commonChatFlags, whitelistChatFlags))
|
commonChatFlags = 0
|
||||||
if doId not in self.friendsOnline:
|
whitelistChatFlags = 0
|
||||||
self.friendsOnline[doId] = self.identifyFriend(doId)
|
if di.getRemainingSize() > 0:
|
||||||
messenger.send('friendOnline', [doId, commonChatFlags, whitelistChatFlags])
|
commonChatFlags = di.getUint8()
|
||||||
if not self.friendsOnline[doId]:
|
if di.getRemainingSize() > 0:
|
||||||
self.friendPendingChatSettings[doId] = (commonChatFlags, whitelistChatFlags)
|
whitelistChatFlags = di.getUint8()
|
||||||
else:
|
self.notify.debug('Friend %d now online. common=%d whitelist=%d' % (doId, commonChatFlags, whitelistChatFlags))
|
||||||
def handleFriendOnline(self, di):
|
if doId not in self.friendsOnline:
|
||||||
doId = di.getUint32()
|
self.friendsOnline[doId] = self.identifyFriend(doId)
|
||||||
commonChatFlags = 0
|
messenger.send('friendOnline', [doId, commonChatFlags, whitelistChatFlags])
|
||||||
whitelistChatFlags = 0
|
if not self.friendsOnline[doId]:
|
||||||
if di.getRemainingSize() > 0:
|
self.friendPendingChatSettings[doId] = (commonChatFlags, whitelistChatFlags)
|
||||||
commonChatFlags = di.getUint8()
|
|
||||||
if di.getRemainingSize() > 0:
|
|
||||||
whitelistChatFlags = di.getUint8()
|
|
||||||
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)
|
|
||||||
messenger.send('friendOnline', [doId, commonChatFlags, whitelistChatFlags])
|
|
||||||
if not self.friendsOnline[doId]:
|
|
||||||
self.friendPendingChatSettings[doId] = (commonChatFlags, whitelistChatFlags)
|
|
||||||
|
|
||||||
def handleFriendOffline(self, di):
|
def handleFriendOffline(self, di):
|
||||||
doId = di.getUint32()
|
doId = di.getUint32()
|
||||||
|
|
|
||||||
|
|
@ -11,10 +11,14 @@ class ToontownFriendsManager(DistributedObjectGlobal):
|
||||||
self.sendUpdate('getFriendsListRequest')
|
self.sendUpdate('getFriendsListRequest')
|
||||||
|
|
||||||
def getFriendsListResponse(self, friendsList):
|
def getFriendsListResponse(self, friendsList):
|
||||||
self.cr.handleGetFriendsList(friendsList)
|
datagram = PyDatagram(friendsList)
|
||||||
|
di = PyDatagramIterator(datagram)
|
||||||
|
self.cr.handleGetFriendsList(di)
|
||||||
|
|
||||||
def friendOnline(self, doId, commonChatFlags, whitelistChatFlags):
|
def friendOnline(self, friend):
|
||||||
self.cr.handleFriendOnline(doId, commonChatFlags, whitelistChatFlags)
|
datagram = PyDatagram(friend)
|
||||||
|
di = PyDatagramIterator(datagram)
|
||||||
|
self.cr.handleFriendOnline(di)
|
||||||
|
|
||||||
def sendGetAvatarDetailsRequest(self, avId):
|
def sendGetAvatarDetailsRequest(self, avId):
|
||||||
self.sendUpdate('getAvatarDetailsRequest', [avId])
|
self.sendUpdate('getAvatarDetailsRequest', [avId])
|
||||||
|
|
|
||||||
|
|
@ -18,65 +18,6 @@ class FriendsOperation:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class GetAvatarDetailsOperation(FriendsOperation):
|
|
||||||
|
|
||||||
def __init__(self, friendsManager, sender):
|
|
||||||
FriendsOperation.__init__(self, friendsManager, sender)
|
|
||||||
self.avId = None
|
|
||||||
self.dclass = None
|
|
||||||
self.fields = None
|
|
||||||
|
|
||||||
def start(self, avId):
|
|
||||||
self.avId = avId
|
|
||||||
self.fields = {}
|
|
||||||
self.friendsManager.air.dbInterface.queryObject(self.friendsManager.air.dbId, avId,
|
|
||||||
self.__handleAvatarRetrieved)
|
|
||||||
|
|
||||||
def __handleAvatarRetrieved(self, dclass, fields):
|
|
||||||
if dclass not in (self.friendsManager.air.dclassesByName['DistributedToonUD'],
|
|
||||||
self.friendsManager.air.dclassesByName['DistributedPetAI']):
|
|
||||||
self.__sendAvatarDetails(False)
|
|
||||||
self._handleError('Retrieved avatar is not a DistributedToonUD or DistributedPetAI!')
|
|
||||||
return
|
|
||||||
|
|
||||||
self.dclass = dclass
|
|
||||||
self.fields = fields
|
|
||||||
self.fields['avId'] = self.avId
|
|
||||||
self.__sendAvatarDetails(True)
|
|
||||||
self._handleDone()
|
|
||||||
|
|
||||||
def __packAvatarDetails(self, dclass, fields):
|
|
||||||
# Pack required fields.
|
|
||||||
fieldPacker = DCPacker()
|
|
||||||
for i in range(dclass.getNumInheritedFields()):
|
|
||||||
field = dclass.getInheritedField(i)
|
|
||||||
if not field.isRequired() or field.asMolecularField():
|
|
||||||
continue
|
|
||||||
|
|
||||||
k = field.getName()
|
|
||||||
v = fields.get(k, None)
|
|
||||||
|
|
||||||
fieldPacker.beginPack(field)
|
|
||||||
if not v:
|
|
||||||
fieldPacker.packDefaultValue()
|
|
||||||
else:
|
|
||||||
field.packArgs(fieldPacker, v)
|
|
||||||
|
|
||||||
fieldPacker.endPack()
|
|
||||||
|
|
||||||
return fieldPacker.getBytes()
|
|
||||||
|
|
||||||
def __sendAvatarDetails(self, success):
|
|
||||||
datagram = PyDatagram()
|
|
||||||
datagram.addUint32(self.fields['avId'])
|
|
||||||
datagram.addUint8(0 if success else 1)
|
|
||||||
if success:
|
|
||||||
details = self.__packAvatarDetails(self.dclass, self.fields)
|
|
||||||
datagram.appendData(details)
|
|
||||||
|
|
||||||
self.friendsManager.sendUpdateToAvatarId(self.sender, 'getAvatarDetailsResponse', [datagram.getMessage()])
|
|
||||||
|
|
||||||
|
|
||||||
class GetFriendsListOperation(FriendsOperation):
|
class GetFriendsListOperation(FriendsOperation):
|
||||||
|
|
||||||
def __init__(self, friendsManager, sender):
|
def __init__(self, friendsManager, sender):
|
||||||
|
|
@ -101,7 +42,6 @@ class GetFriendsListOperation(FriendsOperation):
|
||||||
|
|
||||||
self.tempFriendsList = fields['setFriendsList'][0]
|
self.tempFriendsList = fields['setFriendsList'][0]
|
||||||
if len(self.tempFriendsList) <= 0:
|
if len(self.tempFriendsList) <= 0:
|
||||||
self.__sendFriendsList()
|
|
||||||
self._handleDone()
|
self._handleDone()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
@ -135,13 +75,100 @@ class GetFriendsListOperation(FriendsOperation):
|
||||||
self.onlineFriends.append(avId)
|
self.onlineFriends.append(avId)
|
||||||
|
|
||||||
if self.currentFriendIdx >= len(self.friendsList):
|
if self.currentFriendIdx >= len(self.friendsList):
|
||||||
self.__sendFriendsList()
|
|
||||||
self._handleDone()
|
self._handleDone()
|
||||||
|
|
||||||
def __sendFriendsList(self):
|
def __sendFriendsList(self, success):
|
||||||
self.friendsManager.sendUpdateToAvatarId(self.sender, 'getFriendsListResponse', [self.friendsList])
|
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()])
|
||||||
for friendId in self.onlineFriends:
|
for friendId in self.onlineFriends:
|
||||||
self.friendsManager.sendUpdateToAvatarId(self.sender, 'friendOnline', [friendId, 0, 1])
|
datagram = PyDatagram()
|
||||||
|
datagram.addUint32(friendId) # doId
|
||||||
|
datagram.addUint8(0) # commonChatFlags
|
||||||
|
datagram.addUint8(1) # whitelistChatFlags
|
||||||
|
self.friendsManager.sendUpdateToAvatarId(self.sender, 'friendOnline', [datagram.getMessage()])
|
||||||
|
|
||||||
|
def _handleDone(self):
|
||||||
|
self.__sendFriendsList(True)
|
||||||
|
FriendsOperation._handleDone(self)
|
||||||
|
|
||||||
|
def _handleError(self, error):
|
||||||
|
self.__sendFriendsList(False)
|
||||||
|
FriendsOperation._handleError(self, error)
|
||||||
|
|
||||||
|
|
||||||
|
class GetAvatarDetailsOperation(FriendsOperation):
|
||||||
|
|
||||||
|
def __init__(self, friendsManager, sender):
|
||||||
|
FriendsOperation.__init__(self, friendsManager, sender)
|
||||||
|
self.avId = None
|
||||||
|
self.dclass = None
|
||||||
|
self.fields = None
|
||||||
|
|
||||||
|
def start(self, avId):
|
||||||
|
self.avId = avId
|
||||||
|
self.fields = {}
|
||||||
|
self.friendsManager.air.dbInterface.queryObject(self.friendsManager.air.dbId, avId,
|
||||||
|
self.__handleAvatarRetrieved)
|
||||||
|
|
||||||
|
def __handleAvatarRetrieved(self, dclass, fields):
|
||||||
|
if dclass not in (self.friendsManager.air.dclassesByName['DistributedToonUD'],
|
||||||
|
self.friendsManager.air.dclassesByName['DistributedPetAI']):
|
||||||
|
self._handleError('Retrieved avatar is not a DistributedToonUD or DistributedPetAI!')
|
||||||
|
return
|
||||||
|
|
||||||
|
self.dclass = dclass
|
||||||
|
self.fields = fields
|
||||||
|
self.fields['avId'] = self.avId
|
||||||
|
self._handleDone()
|
||||||
|
|
||||||
|
def __packAvatarDetails(self, dclass, fields):
|
||||||
|
# Pack required fields.
|
||||||
|
fieldPacker = DCPacker()
|
||||||
|
for i in range(dclass.getNumInheritedFields()):
|
||||||
|
field = dclass.getInheritedField(i)
|
||||||
|
if not field.isRequired() or field.asMolecularField():
|
||||||
|
continue
|
||||||
|
|
||||||
|
k = field.getName()
|
||||||
|
v = fields.get(k, None)
|
||||||
|
|
||||||
|
fieldPacker.beginPack(field)
|
||||||
|
if not v:
|
||||||
|
fieldPacker.packDefaultValue()
|
||||||
|
else:
|
||||||
|
field.packArgs(fieldPacker, v)
|
||||||
|
|
||||||
|
fieldPacker.endPack()
|
||||||
|
|
||||||
|
return fieldPacker.getBytes()
|
||||||
|
|
||||||
|
def __sendAvatarDetails(self, success):
|
||||||
|
datagram = PyDatagram()
|
||||||
|
datagram.addUint32(self.fields['avId'])
|
||||||
|
datagram.addUint8(0 if success else 1)
|
||||||
|
if success:
|
||||||
|
avatarDetails = self.__packAvatarDetails(self.dclass, self.fields)
|
||||||
|
datagram.appendData(avatarDetails)
|
||||||
|
|
||||||
|
self.friendsManager.sendUpdateToAvatarId(self.sender, 'getAvatarDetailsResponse', [datagram.getMessage()])
|
||||||
|
|
||||||
|
def _handleDone(self):
|
||||||
|
self.__sendAvatarDetails(True)
|
||||||
|
FriendsOperation._handleDone(self)
|
||||||
|
|
||||||
|
def _handleError(self, error):
|
||||||
|
self.__sendAvatarDetails(False)
|
||||||
|
FriendsOperation._handleError(self, error)
|
||||||
|
|
||||||
|
|
||||||
class ToontownFriendsManagerUD(DistributedObjectGlobalUD):
|
class ToontownFriendsManagerUD(DistributedObjectGlobalUD):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue