friends: Friend removal

This commit is contained in:
John Cote 2021-07-24 20:54:28 -04:00
parent 857d11d93f
commit af2b95e3e1
No known key found for this signature in database
GPG Key ID: E3442FF71E9C1C01
4 changed files with 105 additions and 5 deletions

View File

@ -2860,6 +2860,7 @@ dclass ToontownFriendsManager : DistributedObject {
getAvatarDetailsResponse(blob);
makeFriends(uint32, uint32, uint8, uint32);
makeFriendsResponse(uint32, uint32, uint8, uint32) airecv;
removeFriend(uint32) clsend;
};
dclass TTSpeedchatRelay : SpeedchatRelay {

View File

@ -851,11 +851,14 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository):
return 1
def removeFriend(self, avatarId):
base.localAvatar.sendUpdate('friendsNotify', [base.localAvatar.doId, 1], sendToId=avatarId)
datagram = PyDatagram()
datagram.addUint16(CLIENT_REMOVE_FRIEND)
datagram.addUint32(avatarId)
self.send(datagram)
if __astron__:
self.toontownFriendsManager.sendRemoveFriend(avatarId)
else:
base.localAvatar.sendUpdate('friendsNotify', [base.localAvatar.doId, 1], sendToId=avatarId)
datagram = PyDatagram()
datagram.addUint16(CLIENT_REMOVE_FRIEND)
datagram.addUint32(avatarId)
self.send(datagram)
self.estateMgr.removeFriend(base.localAvatar.doId, avatarId)
for pair in base.localAvatar.friendsList:
friendId = pair[0]

View File

@ -27,3 +27,6 @@ class ToontownFriendsManager(DistributedObjectGlobal):
datagram = PyDatagram(avatarDetails)
di = PyDatagramIterator(datagram)
self.cr.handleGetAvatarDetailsResp(di)
def sendRemoveFriend(self, friendId):
self.sendUpdate('removeFriend', [friendId])

View File

@ -263,6 +263,89 @@ class MakeFriendsOperation(FriendsOperation):
FriendsOperation._handleError(self, error)
class RemoveFriendOperation(FriendsOperation):
def __init__(self, friendsManager, sender):
FriendsOperation.__init__(self, friendsManager, sender)
self.friendId = None
self.onlineToons = None
self.senderFriendsList = None
self.friendFriendsList = None
def start(self, friendId):
self.friendId = friendId
self.onlineToons = []
self.friendsManager.air.getActivated(self.sender, self.__gotSenderActivated)
def __handleActivatedResp(self, avId, activated):
if activated:
self.onlineToons.append(avId)
def __gotSenderActivated(self, avId, activated):
self.__handleActivatedResp(avId, activated)
self.friendsManager.air.getActivated(self.friendId, self.__gotFriendActivated)
def __gotFriendActivated(self, avId, activated):
self.__handleActivatedResp(avId, activated)
self.friendsManager.air.dbInterface.queryObject(self.friendsManager.air.dbId, self.sender,
self.__handleSenderRetrieved)
def __handleRemoveFriend(self, dclass, fields, friendId):
if dclass != self.friendsManager.air.dclassesByName['DistributedToonUD']:
self._handleError('Retrieved sender is not a DistributedToonUD!')
return False, []
friendsList = fields['setFriendsList'][0]
removed = False
for index, friend in enumerate(friendsList):
if friend[0] == friendId:
del friendsList[index]
removed = True
break
if removed:
return True, friendsList
else:
self._handleError('Unable to remove friend!')
return False, []
def __handleSenderRetrieved(self, dclass, fields):
success, senderFriendsList = self.__handleRemoveFriend(dclass, fields, self.friendId)
if success:
self.senderFriendsList = senderFriendsList
self.friendsManager.air.dbInterface.queryObject(self.friendsManager.air.dbId, self.friendId,
self.__handleFriendRetrieved)
def __handleFriendRetrieved(self, dclass, fields):
success, friendFriendsList = self.__handleRemoveFriend(dclass, fields, self.sender)
if success:
self.friendFriendsList = friendFriendsList
self._handleDone()
def __handleSetFriendsList(self, avId, friendsList):
if avId in self.onlineToons:
self.friendsManager.sendUpdateToAvatar(avId, 'setFriendsList', [friendsList])
else:
self.friendsManager.air.dbInterface.updateObject(self.friendsManager.air.dbId, avId,
self.friendsManager.air.dclassesByName[
'DistributedToonUD'],
{'setFriendsList': [friendsList]})
def _handleDone(self):
if self.senderFriendsList is not None and self.friendFriendsList is not None:
self.__handleSetFriendsList(self.sender, self.senderFriendsList)
self.__handleSetFriendsList(self.friendId, self.friendFriendsList)
if self.sender in self.onlineToons and self.friendId in self.onlineToons:
self.friendsManager.undeclareObject(self.sender, self.friendId)
self.friendsManager.undeclareObject(self.friendId, self.sender)
if self.friendId in self.onlineToons:
self.friendsManager.sendUpdateToAvatar(self.friendId, 'friendsNotify', [self.sender, 1])
FriendsOperation._handleDone(self)
class ToontownFriendsManagerUD(DistributedObjectGlobalUD):
notify = DirectNotifyGlobal.directNotify.newCategory('ToontownFriendsManagerUD')
@ -280,6 +363,13 @@ class ToontownFriendsManagerUD(DistributedObjectGlobalUD):
datagram.addUint16(self.air.dclassesByName['DistributedToonUD'].getNumber())
self.air.send(datagram)
def undeclareObject(self, doId, objId):
datagram = PyDatagram()
datagram.addServerHeader(self.GetPuppetConnectionChannel(doId), self.air.ourChannel,
CLIENTAGENT_UNDECLARE_OBJECT)
datagram.addUint32(objId)
self.air.send(datagram)
def sendFriendOnline(self, avId, friendId, commonChatFlags, whitelistChatFlags):
datagram = PyDatagram()
datagram.addUint32(friendId) # doId
@ -321,3 +411,6 @@ class ToontownFriendsManagerUD(DistributedObjectGlobalUD):
def makeFriends(self, avatarAId, avatarBId, flags, context):
self.runServerOperation(MakeFriendsOperation, avatarAId, avatarBId, flags, context)
def removeFriend(self, friendId):
self.runSenderOperation(RemoveFriendOperation, friendId)