friends: Move make friends handling to UD
This commit is contained in:
parent
cc61e53496
commit
837b5987fe
|
|
@ -2852,6 +2852,7 @@ dclass ToontownFriendsManager : DistributedObject {
|
|||
friendOnline(blob);
|
||||
getAvatarDetailsRequest(uint32) clsend;
|
||||
getAvatarDetailsResponse(blob);
|
||||
makeFriends(uint32, uint32, uint8, uint32);
|
||||
};
|
||||
|
||||
dclass TTSpeedchatRelay : SpeedchatRelay {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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])
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue