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 {
|
dclass TTPlayerFriendsManager : PlayerFriendsManager {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct Friend {
|
||||||
|
uint32 doId;
|
||||||
|
string name;
|
||||||
|
blob dnaString;
|
||||||
|
uint32 petId;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Astron-specific Friends Manager
|
||||||
dclass ToontownFriendsManager : DistributedObject {
|
dclass ToontownFriendsManager : DistributedObject {
|
||||||
getFriendsListRequest() clsend;
|
getFriendsListRequest() clsend;
|
||||||
getFriendsListResponse(blob);
|
getFriendsListResponse(bool success, Friend friends[]);
|
||||||
friendOnline(blob);
|
friendOnline(uint32 friendId, uint8 commonChatFlags, uint8 whitelistChatFlags);
|
||||||
friendOffline(blob);
|
friendOffline(uint32 friendId);
|
||||||
goingOffline(uint32);
|
goingOffline(uint32 friendId);
|
||||||
getAvatarDetailsRequest(uint32) clsend;
|
getAvatarDetailsRequest(uint32 avId) clsend;
|
||||||
getAvatarDetailsResponse(blob);
|
getAvatarDetailsResponse(blob avatarDetails);
|
||||||
makeFriends(uint32, uint32, uint8, uint32);
|
makeFriends(uint32, uint32, uint8, uint32);
|
||||||
makeFriendsResponse(uint32, uint32, uint8, uint32) airecv;
|
makeFriendsResponse(uint32, uint32, uint8, uint32) airecv;
|
||||||
removeFriend(uint32) clsend;
|
removeFriend(uint32) clsend;
|
||||||
|
|
|
||||||
|
|
@ -901,6 +901,7 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository):
|
||||||
|
|
||||||
def handleGetFriendsList(self, di):
|
def handleGetFriendsList(self, di):
|
||||||
error = di.getUint8()
|
error = di.getUint8()
|
||||||
|
friends = []
|
||||||
if error:
|
if error:
|
||||||
self.notify.warning('Got error return from friends list.')
|
self.notify.warning('Got error return from friends list.')
|
||||||
self.friendsListError = 1
|
self.friendsListError = 1
|
||||||
|
|
@ -910,25 +911,30 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository):
|
||||||
doId = di.getUint32()
|
doId = di.getUint32()
|
||||||
name = di.getString()
|
name = di.getString()
|
||||||
dnaString = di.getBlob()
|
dnaString = di.getBlob()
|
||||||
dna = ToonDNA.ToonDNA()
|
|
||||||
dna.makeFromNetString(dnaString)
|
|
||||||
petId = di.getUint32()
|
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():
|
def setFriendsMap(self, friends):
|
||||||
self.friendsMapPending = 0
|
for doId, name, dnaString, petId in friends:
|
||||||
messenger.send('friendsMapComplete')
|
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
|
self.friendsMapPending = 0
|
||||||
messenger.send('friendsMapComplete')
|
messenger.send('friendsMapComplete')
|
||||||
|
|
||||||
|
|
@ -967,6 +973,9 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository):
|
||||||
commonChatFlags = di.getUint8()
|
commonChatFlags = di.getUint8()
|
||||||
if di.getRemainingSize() > 0:
|
if di.getRemainingSize() > 0:
|
||||||
whitelistChatFlags = di.getUint8()
|
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))
|
self.notify.debug('Friend %d now online. common=%d whitelist=%d' % (doId, commonChatFlags, whitelistChatFlags))
|
||||||
if doId not in self.friendsOnline:
|
if doId not in self.friendsOnline:
|
||||||
self.friendsOnline[doId] = self.identifyFriend(doId)
|
self.friendsOnline[doId] = self.identifyFriend(doId)
|
||||||
|
|
@ -976,6 +985,9 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository):
|
||||||
|
|
||||||
def handleFriendOffline(self, di):
|
def handleFriendOffline(self, di):
|
||||||
doId = di.getUint32()
|
doId = di.getUint32()
|
||||||
|
self.setFriendOffline(doId)
|
||||||
|
|
||||||
|
def setFriendOffline(self, doId):
|
||||||
self.notify.debug('Friend %d now offline.' % doId)
|
self.notify.debug('Friend %d now offline.' % doId)
|
||||||
try:
|
try:
|
||||||
del self.friendsOnline[doId]
|
del self.friendsOnline[doId]
|
||||||
|
|
|
||||||
|
|
@ -10,20 +10,18 @@ class ToontownFriendsManager(DistributedObjectGlobal):
|
||||||
def sendGetFriendsListRequest(self):
|
def sendGetFriendsListRequest(self):
|
||||||
self.sendUpdate('getFriendsListRequest')
|
self.sendUpdate('getFriendsListRequest')
|
||||||
|
|
||||||
def getFriendsListResponse(self, friendsList):
|
def getFriendsListResponse(self, success, friendsList):
|
||||||
datagram = PyDatagram(friendsList)
|
if not success:
|
||||||
di = PyDatagramIterator(datagram)
|
self.notify.warning('An error has occurred when retrieving friends list.')
|
||||||
self.cr.handleGetFriendsList(di)
|
self.cr.friendsListError = 1
|
||||||
|
|
||||||
def friendOnline(self, friend):
|
self.cr.setFriendsMap(friendsList)
|
||||||
datagram = PyDatagram(friend)
|
|
||||||
di = PyDatagramIterator(datagram)
|
|
||||||
self.cr.handleFriendOnline(di)
|
|
||||||
|
|
||||||
def friendOffline(self, friend):
|
def friendOnline(self, friendId, commonChatFlags, whitelistChatFlags):
|
||||||
datagram = PyDatagram(friend)
|
self.cr.setFriendOnline(friendId, commonChatFlags, whitelistChatFlags)
|
||||||
di = PyDatagramIterator(datagram)
|
|
||||||
self.cr.handleFriendOffline(di)
|
def friendOffline(self, friendId):
|
||||||
|
self.cr.setFriendOffline(friendId)
|
||||||
|
|
||||||
def sendGetAvatarDetailsRequest(self, avId):
|
def sendGetAvatarDetailsRequest(self, avId):
|
||||||
self.sendUpdate('getAvatarDetailsRequest', [avId])
|
self.sendUpdate('getAvatarDetailsRequest', [avId])
|
||||||
|
|
|
||||||
|
|
@ -80,18 +80,7 @@ class GetFriendsListOperation(FriendsOperation):
|
||||||
self._handleDone()
|
self._handleDone()
|
||||||
|
|
||||||
def __sendFriendsList(self, success):
|
def __sendFriendsList(self, success):
|
||||||
datagram = PyDatagram()
|
self.friendsManager.sendUpdateToAvatarId(self.sender, 'getFriendsListResponse', [success, self.friendsList if success else []])
|
||||||
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.sendFriendOnline(self.sender, friendId, 0, 1)
|
self.friendsManager.sendFriendOnline(self.sender, friendId, 0, 1)
|
||||||
|
|
||||||
|
|
@ -446,16 +435,10 @@ class ToontownFriendsManagerUD(DistributedObjectGlobalUD):
|
||||||
self.air.send(datagram)
|
self.air.send(datagram)
|
||||||
|
|
||||||
def sendFriendOnline(self, avId, friendId, commonChatFlags, whitelistChatFlags):
|
def sendFriendOnline(self, avId, friendId, commonChatFlags, whitelistChatFlags):
|
||||||
datagram = PyDatagram()
|
self.sendUpdateToAvatarId(avId, 'friendOnline', [friendId, commonChatFlags, whitelistChatFlags])
|
||||||
datagram.addUint32(friendId) # doId
|
|
||||||
datagram.addUint8(commonChatFlags) # commonChatFlags
|
|
||||||
datagram.addUint8(whitelistChatFlags) # whitelistChatFlags
|
|
||||||
self.sendUpdateToAvatarId(avId, 'friendOnline', [datagram.getMessage()])
|
|
||||||
|
|
||||||
def sendFriendOffline(self, avId, friendId):
|
def sendFriendOffline(self, avId, friendId):
|
||||||
datagram = PyDatagram()
|
self.sendUpdateToAvatarId(avId, 'friendOffline', [friendId])
|
||||||
datagram.addUint32(friendId)
|
|
||||||
self.sendUpdateToAvatarId(avId, 'friendOffline', [datagram.getMessage()])
|
|
||||||
|
|
||||||
def sendUpdateToAvatar(self, avId, fieldName, args=[]):
|
def sendUpdateToAvatar(self, avId, fieldName, args=[]):
|
||||||
dclass = self.air.dclassesByName['DistributedToonUD']
|
dclass = self.air.dclassesByName['DistributedToonUD']
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,5 @@ class ToontownUDRepository(ToontownInternalRepository):
|
||||||
# Create our Astron login manager...
|
# Create our Astron login manager...
|
||||||
self.astronLoginManager = self.generateGlobalObject(OTP_DO_ID_ASTRON_LOGIN_MANAGER, 'AstronLoginManager')
|
self.astronLoginManager = self.generateGlobalObject(OTP_DO_ID_ASTRON_LOGIN_MANAGER, 'AstronLoginManager')
|
||||||
|
|
||||||
# Create our Toontown friends manager...
|
# Create our Toontown friends manager... (Astron specific)
|
||||||
# TODO: Is this Astron specific?
|
|
||||||
self.toontownFriendsManager = self.generateGlobalObject(OTP_DO_ID_TOONTOWN_FRIENDS_MANAGER, 'ToontownFriendsManager')
|
self.toontownFriendsManager = self.generateGlobalObject(OTP_DO_ID_TOONTOWN_FRIENDS_MANAGER, 'ToontownFriendsManager')
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue