From 837b5987fe1a753d708f8bda765bbf31f0199e67 Mon Sep 17 00:00:00 2001 From: John Cote Date: Mon, 19 Jul 2021 20:23:53 -0400 Subject: [PATCH] friends: Move make friends handling to UD --- etc/toon.dc | 1 + otp/friends/FriendManagerAI.py | 94 +------------------- toontown/friends/ToontownFriendsManagerAI.py | 11 +++ toontown/friends/ToontownFriendsManagerUD.py | 92 +++++++++++++++++-- 4 files changed, 101 insertions(+), 97 deletions(-) diff --git a/etc/toon.dc b/etc/toon.dc index d681f40..4165eca 100755 --- a/etc/toon.dc +++ b/etc/toon.dc @@ -2852,6 +2852,7 @@ dclass ToontownFriendsManager : DistributedObject { friendOnline(blob); getAvatarDetailsRequest(uint32) clsend; getAvatarDetailsResponse(blob); + makeFriends(uint32, uint32, uint8, uint32); }; dclass TTSpeedchatRelay : SpeedchatRelay { diff --git a/otp/friends/FriendManagerAI.py b/otp/friends/FriendManagerAI.py index ce62963..7f8d28a 100644 --- a/otp/friends/FriendManagerAI.py +++ b/otp/friends/FriendManagerAI.py @@ -299,100 +299,12 @@ class FriendManagerAI(DistributedObjectGlobalAI): def makeFriends(self, invite): # The invitee agreed to make friends. - self.__handleMakeFriends(invite.inviteeId, invite.inviterId, 0, - invite.context) + if __astron__ and hasattr(self.air, 'toontownFriendsManager') and self.air.toontownFriendsManager: + self.air.toontownFriendsManager.makeFriends(invite.inviteeId, invite.inviterId, 0, + invite.context) self.down_friendResponse(invite.inviterId, 1, invite.context) # The reply will clear the context out when it comes in. - def __handleMakeFriends(self, avatarAId, avatarBId, flags, context): - # And now the magic begins. - avatarA = self.air.doId2do.get(avatarAId) # invitee - avatarB = self.air.doId2do.get(avatarBId) # inviter - if avatarA and avatarB: - datagram = PyDatagram() - datagram.addServerHeader(self.GetPuppetConnectionChannel(avatarA.getDoId()), self.air.ourChannel, - CLIENTAGENT_DECLARE_OBJECT) - datagram.addUint32(avatarB.getDoId()) - datagram.addUint16(self.air.dclassesByName['DistributedToonAI'].getNumber()) - self.air.send(datagram) - - datagram = PyDatagram() - datagram.addServerHeader(self.GetPuppetConnectionChannel(avatarB.getDoId()), self.air.ourChannel, - CLIENTAGENT_DECLARE_OBJECT) - datagram.addUint32(avatarA.getDoId()) - datagram.addUint16(self.air.dclassesByName['DistributedToonAI'].getNumber()) - self.air.send(datagram) - - if avatarA: - avatarAFriendsList = avatarA.getFriendsList() - if len(avatarAFriendsList) >= OTPGlobals.MaxFriends: - self.makeFriendsReply(0, context) - return - - avatarANewFriend = (avatarBId, flags) - if avatarANewFriend in avatarAFriendsList: - self.makeFriendsReply(0, context) - return - - avatarAFriendsList.append(avatarANewFriend) - avatarA.d_setFriendsList(avatarAFriendsList) - else: - def handleAvatarA(dclass, fields): - if dclass != self.air.dclassesByName['DistributedToonAI']: - return - - avatarAFriendsList = fields['setFriendsList'][0] - if len(avatarAFriendsList) >= OTPGlobals.MaxFriends: - self.makeFriendsReply(0, context) - return - - avatarANewFriend = (avatarBId, flags) - if avatarANewFriend in avatarAFriendsList: - self.makeFriendsReply(0, context) - return - - avatarAFriendsList.append(avatarANewFriend) - self.air.dbInterface.updateObject(self.air.dbId, avatarAId, self.air.dclassesByName['DistributedToonAI'], - {'setFriendsList': [avatarAFriendsList]}) - - self.air.dbInterface.queryObject(self.air.dbId, avatarAId, handleAvatarA) - - if avatarB: - avatarBFriendsList = avatarB.getFriendsList() - if len(avatarBFriendsList) >= OTPGlobals.MaxFriends: - self.makeFriendsReply(0, context) - return - - avatarBNewFriend = (avatarAId, flags) - if avatarBNewFriend in avatarBFriendsList: - self.makeFriendsReply(0, context) - return - - avatarBFriendsList.append(avatarBNewFriend) - avatarB.d_setFriendsList(avatarBFriendsList) - else: - def handleAvatarB(dclass, fields): - if dclass != self.air.dclassesByName['DistributedToonAI']: - return - - avatarBFriendsList = fields['setFriendsList'][0] - if len(avatarBFriendsList) >= OTPGlobals.MaxFriends: - self.makeFriendsReply(0, context) - return - - avatarBNewFriend = (avatarAId, flags) - if avatarBNewFriend in avatarBFriendsList: - self.makeFriendsReply(0, context) - return - - avatarBFriendsList.append(avatarBNewFriend) - self.air.dbInterface.updateObject(self.air.dbId, avatarBId, self.air.dclassesByName['DistributedToonAI'], - {'setFriendsList': [avatarBFriendsList]}) - - self.air.dbInterface.queryObject(self.air.dbId, avatarBId, handleAvatarB) - - self.makeFriendsReply(1, context) - def __previousResponse(self, inviteeId, inviterId): # Return the previous rejection code if this invitee has # previously (recently) declined a friendship from this diff --git a/toontown/friends/ToontownFriendsManagerAI.py b/toontown/friends/ToontownFriendsManagerAI.py index 07fcae0..06f93eb 100644 --- a/toontown/friends/ToontownFriendsManagerAI.py +++ b/toontown/friends/ToontownFriendsManagerAI.py @@ -4,3 +4,14 @@ from direct.distributed.DistributedObjectGlobalAI import DistributedObjectGlobal class ToontownFriendsManagerAI(DistributedObjectGlobalAI): notify = DirectNotifyGlobal.directNotify.newCategory('ToontownFriendsManagerAI') + + def makeFriends(self, avatarAId, avatarBId, flags, context): + """ + Requests to make a friendship between avatarA and avatarB with + the indicated flags (or upgrade an existing friendship with + the indicated flags). The context is any arbitrary 32-bit + integer. When the friendship is made, or the operation fails, + the "makeFriendsReply" event is generated, with two + parameters: an integer result code, and the supplied context. + """ + self.sendUpdate('makeFriends', [avatarAId, avatarBId, flags, context]) diff --git a/toontown/friends/ToontownFriendsManagerUD.py b/toontown/friends/ToontownFriendsManagerUD.py index 06345dc..86ee423 100644 --- a/toontown/friends/ToontownFriendsManagerUD.py +++ b/toontown/friends/ToontownFriendsManagerUD.py @@ -2,6 +2,8 @@ from direct.directnotify import DirectNotifyGlobal from direct.distributed.DistributedObjectGlobalUD import DistributedObjectGlobalUD from direct.distributed.PyDatagram import * +from otp.otpbase import OTPGlobals + class FriendsOperation: @@ -154,11 +156,11 @@ class GetAvatarDetailsOperation(FriendsOperation): def __sendAvatarDetails(self, success): datagram = PyDatagram() - datagram.addUint32(self.fields['avId']) - datagram.addUint8(0 if success else 1) + datagram.addUint32(self.fields['avId']) # avId + datagram.addUint8(0 if success else 1) # returnCode if success: avatarDetails = self.__packAvatarDetails(self.dclass, self.fields) - datagram.appendData(avatarDetails) + datagram.appendData(avatarDetails) # fields self.friendsManager.sendUpdateToAvatarId(self.sender, 'getAvatarDetailsResponse', [datagram.getMessage()]) @@ -171,6 +173,64 @@ class GetAvatarDetailsOperation(FriendsOperation): FriendsOperation._handleError(self, error) +class MakeFriendsOperation(FriendsOperation): + + def __init__(self, friendsManager): + FriendsOperation.__init__(self, friendsManager, None) + self.avatarAId = None + self.avatarBId = None + self.flags = None + self.context = None + self.resultCode = None + + def start(self, avatarAId, avatarBId, flags, context): + self.avatarAId = avatarAId + self.avatarBId = avatarBId + self.flags = flags + self.context = context + self.resultCode = 0 + self.friendsManager.air.dbInterface.queryObject(self.friendsManager.air.dbId, self.avatarAId, + self.__handleAvatarARetrieved) + + def __handleMakeFriends(self, dclass, fields, avId, friendId): + if dclass != self.friendsManager.air.dclassesByName['DistributedToonUD']: + self._handleError('Retrieved avatar is not a DistributedToonUD!') + return + + friendsList = fields['setFriendsList'][0] + if len(friendsList) >= OTPGlobals.MaxFriends: + self._handleError('Avatar\'s friends list is full!') + return + + newFriend = (friendId, self.flags) + if newFriend in friendsList: + self._handleError('Already friends!') + return + + friendsList.append(newFriend) + self.friendsManager.air.dbInterface.updateObject(self.friendsManager.air.dbId, avId, + self.friendsManager.air.dclassesByName['DistributedToonUD'], + {'setFriendsList': [friendsList]}) + self.friendsManager.sendUpdateToAvatar(avId, 'setFriendsList', [friendsList]) + + def __handleAvatarARetrieved(self, dclass, fields): + self.__handleMakeFriends(dclass, fields, self.avatarAId, self.avatarBId) + self.friendsManager.air.dbInterface.queryObject(self.friendsManager.air.dbId, self.avatarBId, + self.__handleAvatarBRetrieved) + + def __handleAvatarBRetrieved(self, dclass, fields): + self.__handleMakeFriends(dclass, fields, self.avatarBId, self.avatarAId) + self._handleDone() + + def _handleDone(self): + self.resultCode = 1 + FriendsOperation._handleDone(self) + + def _handleError(self, error): + self.resultCode = 0 + FriendsOperation._handleError(self, error) + + class ToontownFriendsManagerUD(DistributedObjectGlobalUD): notify = DirectNotifyGlobal.directNotify.newCategory('ToontownFriendsManagerUD') @@ -178,7 +238,19 @@ class ToontownFriendsManagerUD(DistributedObjectGlobalUD): DistributedObjectGlobalUD.__init__(self, air) self.operations = [] - def runOperation(self, operationType, *args): + def sendUpdateToAvatar(self, avId, fieldName, args=[]): + dclass = self.air.dclassesByName['DistributedToonUD'] + if not dclass: + return + + field = dclass.getFieldByName(fieldName) + if not field: + return + + datagram = field.aiFormatUpdate(avId, avId, self.air.ourChannel, args) + self.air.send(datagram) + + def runSenderOperation(self, operationType, *args): sender = self.air.getAvatarIdFromSender() if not sender: return @@ -187,8 +259,16 @@ class ToontownFriendsManagerUD(DistributedObjectGlobalUD): self.operations.append(newOperation) newOperation.start(*args) + def runServerOperation(self, operationType, *args): + newOperation = operationType(self) + self.operations.append(newOperation) + newOperation.start(*args) + def getFriendsListRequest(self): - self.runOperation(GetFriendsListOperation) + self.runSenderOperation(GetFriendsListOperation) def getAvatarDetailsRequest(self, avId): - self.runOperation(GetAvatarDetailsOperation, avId) + self.runSenderOperation(GetAvatarDetailsOperation, avId) + + def makeFriends(self, avatarAId, avatarBId, flags, context): + self.runServerOperation(MakeFriendsOperation, avatarAId, avatarBId, flags, context)