friends: Move make friends handling to UD

This commit is contained in:
John Cote 2021-07-19 20:23:53 -04:00
parent cc61e53496
commit 837b5987fe
No known key found for this signature in database
GPG Key ID: E3442FF71E9C1C01
4 changed files with 101 additions and 97 deletions

View File

@ -2852,6 +2852,7 @@ dclass ToontownFriendsManager : DistributedObject {
friendOnline(blob);
getAvatarDetailsRequest(uint32) clsend;
getAvatarDetailsResponse(blob);
makeFriends(uint32, uint32, uint8, uint32);
};
dclass TTSpeedchatRelay : SpeedchatRelay {

View File

@ -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

View File

@ -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])

View File

@ -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)