friends: Use structs instead of sending datagrams
This commit is contained in:
parent
9ea93bd1f4
commit
3a5ab7f857
20
etc/toon.dc
20
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;
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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])
|
||||
|
|
|
|||
|
|
@ -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']
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
Loading…
Reference in New Issue