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);
|
friendOnline(blob);
|
||||||
getAvatarDetailsRequest(uint32) clsend;
|
getAvatarDetailsRequest(uint32) clsend;
|
||||||
getAvatarDetailsResponse(blob);
|
getAvatarDetailsResponse(blob);
|
||||||
|
makeFriends(uint32, uint32, uint8, uint32);
|
||||||
};
|
};
|
||||||
|
|
||||||
dclass TTSpeedchatRelay : SpeedchatRelay {
|
dclass TTSpeedchatRelay : SpeedchatRelay {
|
||||||
|
|
|
||||||
|
|
@ -299,100 +299,12 @@ class FriendManagerAI(DistributedObjectGlobalAI):
|
||||||
|
|
||||||
def makeFriends(self, invite):
|
def makeFriends(self, invite):
|
||||||
# The invitee agreed to make friends.
|
# The invitee agreed to make friends.
|
||||||
self.__handleMakeFriends(invite.inviteeId, invite.inviterId, 0,
|
if __astron__ and hasattr(self.air, 'toontownFriendsManager') and self.air.toontownFriendsManager:
|
||||||
invite.context)
|
self.air.toontownFriendsManager.makeFriends(invite.inviteeId, invite.inviterId, 0,
|
||||||
|
invite.context)
|
||||||
self.down_friendResponse(invite.inviterId, 1, invite.context)
|
self.down_friendResponse(invite.inviterId, 1, invite.context)
|
||||||
# The reply will clear the context out when it comes in.
|
# 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):
|
def __previousResponse(self, inviteeId, inviterId):
|
||||||
# Return the previous rejection code if this invitee has
|
# Return the previous rejection code if this invitee has
|
||||||
# previously (recently) declined a friendship from this
|
# previously (recently) declined a friendship from this
|
||||||
|
|
|
||||||
|
|
@ -4,3 +4,14 @@ from direct.distributed.DistributedObjectGlobalAI import DistributedObjectGlobal
|
||||||
|
|
||||||
class ToontownFriendsManagerAI(DistributedObjectGlobalAI):
|
class ToontownFriendsManagerAI(DistributedObjectGlobalAI):
|
||||||
notify = DirectNotifyGlobal.directNotify.newCategory('ToontownFriendsManagerAI')
|
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.DistributedObjectGlobalUD import DistributedObjectGlobalUD
|
||||||
from direct.distributed.PyDatagram import *
|
from direct.distributed.PyDatagram import *
|
||||||
|
|
||||||
|
from otp.otpbase import OTPGlobals
|
||||||
|
|
||||||
|
|
||||||
class FriendsOperation:
|
class FriendsOperation:
|
||||||
|
|
||||||
|
|
@ -154,11 +156,11 @@ class GetAvatarDetailsOperation(FriendsOperation):
|
||||||
|
|
||||||
def __sendAvatarDetails(self, success):
|
def __sendAvatarDetails(self, success):
|
||||||
datagram = PyDatagram()
|
datagram = PyDatagram()
|
||||||
datagram.addUint32(self.fields['avId'])
|
datagram.addUint32(self.fields['avId']) # avId
|
||||||
datagram.addUint8(0 if success else 1)
|
datagram.addUint8(0 if success else 1) # returnCode
|
||||||
if success:
|
if success:
|
||||||
avatarDetails = self.__packAvatarDetails(self.dclass, self.fields)
|
avatarDetails = self.__packAvatarDetails(self.dclass, self.fields)
|
||||||
datagram.appendData(avatarDetails)
|
datagram.appendData(avatarDetails) # fields
|
||||||
|
|
||||||
self.friendsManager.sendUpdateToAvatarId(self.sender, 'getAvatarDetailsResponse', [datagram.getMessage()])
|
self.friendsManager.sendUpdateToAvatarId(self.sender, 'getAvatarDetailsResponse', [datagram.getMessage()])
|
||||||
|
|
||||||
|
|
@ -171,6 +173,64 @@ class GetAvatarDetailsOperation(FriendsOperation):
|
||||||
FriendsOperation._handleError(self, error)
|
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):
|
class ToontownFriendsManagerUD(DistributedObjectGlobalUD):
|
||||||
notify = DirectNotifyGlobal.directNotify.newCategory('ToontownFriendsManagerUD')
|
notify = DirectNotifyGlobal.directNotify.newCategory('ToontownFriendsManagerUD')
|
||||||
|
|
||||||
|
|
@ -178,7 +238,19 @@ class ToontownFriendsManagerUD(DistributedObjectGlobalUD):
|
||||||
DistributedObjectGlobalUD.__init__(self, air)
|
DistributedObjectGlobalUD.__init__(self, air)
|
||||||
self.operations = []
|
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()
|
sender = self.air.getAvatarIdFromSender()
|
||||||
if not sender:
|
if not sender:
|
||||||
return
|
return
|
||||||
|
|
@ -187,8 +259,16 @@ class ToontownFriendsManagerUD(DistributedObjectGlobalUD):
|
||||||
self.operations.append(newOperation)
|
self.operations.append(newOperation)
|
||||||
newOperation.start(*args)
|
newOperation.start(*args)
|
||||||
|
|
||||||
|
def runServerOperation(self, operationType, *args):
|
||||||
|
newOperation = operationType(self)
|
||||||
|
self.operations.append(newOperation)
|
||||||
|
newOperation.start(*args)
|
||||||
|
|
||||||
def getFriendsListRequest(self):
|
def getFriendsListRequest(self):
|
||||||
self.runOperation(GetFriendsListOperation)
|
self.runSenderOperation(GetFriendsListOperation)
|
||||||
|
|
||||||
def getAvatarDetailsRequest(self, avId):
|
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