friends: Handle going offline
This commit is contained in:
parent
20d58f41e5
commit
8d909ba01a
|
|
@ -2856,6 +2856,7 @@ dclass ToontownFriendsManager : DistributedObject {
|
||||||
getFriendsListRequest() clsend;
|
getFriendsListRequest() clsend;
|
||||||
getFriendsListResponse(blob);
|
getFriendsListResponse(blob);
|
||||||
friendOnline(blob);
|
friendOnline(blob);
|
||||||
|
friendOffline(blob);
|
||||||
getAvatarDetailsRequest(uint32) clsend;
|
getAvatarDetailsRequest(uint32) clsend;
|
||||||
getAvatarDetailsResponse(blob);
|
getAvatarDetailsResponse(blob);
|
||||||
makeFriends(uint32, uint32, uint8, uint32);
|
makeFriends(uint32, uint32, uint8, uint32);
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,11 @@ class ToontownFriendsManager(DistributedObjectGlobal):
|
||||||
di = PyDatagramIterator(datagram)
|
di = PyDatagramIterator(datagram)
|
||||||
self.cr.handleFriendOnline(di)
|
self.cr.handleFriendOnline(di)
|
||||||
|
|
||||||
|
def friendOffline(self, friend):
|
||||||
|
datagram = PyDatagram(friend)
|
||||||
|
di = PyDatagramIterator(datagram)
|
||||||
|
self.cr.handleFriendOffline(di)
|
||||||
|
|
||||||
def sendGetAvatarDetailsRequest(self, avId):
|
def sendGetAvatarDetailsRequest(self, avId):
|
||||||
self.sendUpdate('getAvatarDetailsRequest', [avId])
|
self.sendUpdate('getAvatarDetailsRequest', [avId])
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -375,6 +375,46 @@ class ComingOnlineOperation(FriendsOperation):
|
||||||
self._handleDone()
|
self._handleDone()
|
||||||
|
|
||||||
|
|
||||||
|
class GoingOfflineOperation(FriendsOperation):
|
||||||
|
|
||||||
|
def __init__(self, friendsManager):
|
||||||
|
FriendsOperation.__init__(self, friendsManager, None)
|
||||||
|
self.avId = None
|
||||||
|
self.friendsList = None
|
||||||
|
self.accId = None
|
||||||
|
self.currentFriendIdx = None
|
||||||
|
|
||||||
|
def start(self, avId):
|
||||||
|
self.avId = avId
|
||||||
|
self.friendsList = []
|
||||||
|
self.accId = 0
|
||||||
|
self.friendsManager.air.dbInterface.queryObject(self.friendsManager.air.dbId, self.avId, self.__handleAvatarRetrieved)
|
||||||
|
|
||||||
|
def __handleAvatarRetrieved(self, dclass, fields):
|
||||||
|
if dclass != self.friendsManager.air.dclassesByName['DistributedToonUD']:
|
||||||
|
self._handleError('Retrieved avatar is not a DistributedToonUD!')
|
||||||
|
return
|
||||||
|
|
||||||
|
self.friendsList = fields['setFriendsList'][0]
|
||||||
|
self.accId = fields['setDISLid'][0]
|
||||||
|
self.__checkFriendsOnline()
|
||||||
|
|
||||||
|
def __checkFriendsOnline(self):
|
||||||
|
self.currentFriendIdx = 0
|
||||||
|
for friendId, _ in self.friendsList:
|
||||||
|
self.friendsManager.air.getActivated(friendId, self.__gotFriendActivated)
|
||||||
|
|
||||||
|
def __gotFriendActivated(self, avId, activated):
|
||||||
|
self.currentFriendIdx += 1
|
||||||
|
if activated:
|
||||||
|
self.friendsManager.undeclareObject(avId, self.avId)
|
||||||
|
self.friendsManager.undeclareObject(self.accId, avId, isAccount=True)
|
||||||
|
self.friendsManager.sendFriendOffline(avId, self.avId)
|
||||||
|
|
||||||
|
if self.currentFriendIdx >= len(self.friendsList):
|
||||||
|
self._handleDone()
|
||||||
|
|
||||||
|
|
||||||
class ToontownFriendsManagerUD(DistributedObjectGlobalUD):
|
class ToontownFriendsManagerUD(DistributedObjectGlobalUD):
|
||||||
notify = DirectNotifyGlobal.directNotify.newCategory('ToontownFriendsManagerUD')
|
notify = DirectNotifyGlobal.directNotify.newCategory('ToontownFriendsManagerUD')
|
||||||
|
|
||||||
|
|
@ -392,10 +432,15 @@ class ToontownFriendsManagerUD(DistributedObjectGlobalUD):
|
||||||
datagram.addUint16(self.air.dclassesByName['DistributedToonUD'].getNumber())
|
datagram.addUint16(self.air.dclassesByName['DistributedToonUD'].getNumber())
|
||||||
self.air.send(datagram)
|
self.air.send(datagram)
|
||||||
|
|
||||||
def undeclareObject(self, doId, objId):
|
def undeclareObject(self, doId, objId, isAccount=False):
|
||||||
datagram = PyDatagram()
|
datagram = PyDatagram()
|
||||||
datagram.addServerHeader(self.GetPuppetConnectionChannel(doId), self.air.ourChannel,
|
if isAccount:
|
||||||
CLIENTAGENT_UNDECLARE_OBJECT)
|
datagram.addServerHeader(self.GetAccountConnectionChannel(doId), self.air.ourChannel,
|
||||||
|
CLIENTAGENT_UNDECLARE_OBJECT)
|
||||||
|
|
||||||
|
else:
|
||||||
|
datagram.addServerHeader(self.GetPuppetConnectionChannel(doId), self.air.ourChannel,
|
||||||
|
CLIENTAGENT_UNDECLARE_OBJECT)
|
||||||
datagram.addUint32(objId)
|
datagram.addUint32(objId)
|
||||||
self.air.send(datagram)
|
self.air.send(datagram)
|
||||||
|
|
||||||
|
|
@ -406,6 +451,11 @@ class ToontownFriendsManagerUD(DistributedObjectGlobalUD):
|
||||||
datagram.addUint8(whitelistChatFlags) # whitelistChatFlags
|
datagram.addUint8(whitelistChatFlags) # whitelistChatFlags
|
||||||
self.sendUpdateToAvatarId(avId, 'friendOnline', [datagram.getMessage()])
|
self.sendUpdateToAvatarId(avId, 'friendOnline', [datagram.getMessage()])
|
||||||
|
|
||||||
|
def sendFriendOffline(self, avId, friendId):
|
||||||
|
datagram = PyDatagram()
|
||||||
|
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']
|
||||||
if not dclass:
|
if not dclass:
|
||||||
|
|
@ -446,3 +496,6 @@ class ToontownFriendsManagerUD(DistributedObjectGlobalUD):
|
||||||
|
|
||||||
def comingOnline(self, avId, friendsList):
|
def comingOnline(self, avId, friendsList):
|
||||||
self.runServerOperation(ComingOnlineOperation, avId, friendsList)
|
self.runServerOperation(ComingOnlineOperation, avId, friendsList)
|
||||||
|
|
||||||
|
def goingOffline(self, avId):
|
||||||
|
self.runServerOperation(GoingOfflineOperation, avId)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue