407 lines
16 KiB
Python
407 lines
16 KiB
Python
from direct.distributed.DistributedObjectGlobal import DistributedObjectGlobal
|
|
from direct.directnotify.DirectNotifyGlobal import directNotify
|
|
from otp.distributed import OtpDoGlobals
|
|
from otp.otpbase import OTPLocalizer
|
|
from otp.otpbase import OTPGlobals
|
|
from otp.avatar.AvatarHandle import AvatarHandle
|
|
from otp.ai import AIInterestHandles
|
|
GUILDRANK_VETERAN = 4
|
|
GUILDRANK_GM = 3
|
|
GUILDRANK_OFFICER = 2
|
|
GUILDRANK_MEMBER = 1
|
|
import queue
|
|
|
|
class GuildMemberInfo(AvatarHandle):
|
|
|
|
def __init__(self, name, isOnline, rank, bandId):
|
|
self.name = name
|
|
self.rank = rank
|
|
self.bandId = bandId
|
|
self.onlineYesNo = isOnline
|
|
|
|
def getName(self):
|
|
return self.name
|
|
|
|
def getRank(self):
|
|
return self.rank
|
|
|
|
def getBandId(self):
|
|
return self.bandId
|
|
|
|
def isOnline(self):
|
|
return self.onlineYesNo
|
|
|
|
def isUnderstandable(self):
|
|
return True
|
|
|
|
@report(types=['deltaStamp', 'args'], dConfigParam='teleport')
|
|
def sendTeleportQuery(self, sendToId, localBandMgrId, localBandId, localGuildId, localShardId):
|
|
base.cr.guildManager.d_reflectTeleportQuery(sendToId, localBandMgrId, localBandId, localGuildId, localShardId)
|
|
|
|
@report(types=['deltaStamp', 'args'], dConfigParam='teleport')
|
|
def sendTeleportResponse(self, available, shardId, instanceDoId, areaDoId, sendToId = None):
|
|
base.cr.guildManager.d_reflectTeleportResponse(available, shardId, instanceDoId, areaDoId, sendToId)
|
|
|
|
|
|
class GuildManager(DistributedObjectGlobal):
|
|
notify = directNotify.newCategory('GuildManager')
|
|
|
|
def __init__(self, cr):
|
|
DistributedObjectGlobal.__init__(self, cr)
|
|
self.id2Name = {}
|
|
self.id2BandId = {}
|
|
self.id2Rank = {}
|
|
self.id2Online = {}
|
|
self.pendingMsgs = []
|
|
self.whiteListEnabled = base.config.GetBool('whitelist-chat-enabled', 1)
|
|
self.emailNotification = 0
|
|
self.emailNotificationAddress = None
|
|
self.receivingNewList = False
|
|
self.spamGateOpen = True
|
|
return
|
|
|
|
def _allowMemberList(self, task):
|
|
self.spamGateOpen = True
|
|
return task.done
|
|
|
|
def memberList(self):
|
|
if self.spamGateOpen:
|
|
self.sendUpdate('memberList', [])
|
|
self.spamGateOpen = False
|
|
taskMgr.doMethodLater(60.0, self._allowMemberList, 'allowMemberList')
|
|
|
|
def createGuild(self):
|
|
messenger.send('declineGuildInvitation')
|
|
self.sendUpdate('createGuild', [])
|
|
|
|
def setWantName(self, newName):
|
|
self.sendUpdate('setWantName', [newName])
|
|
|
|
def removeMember(self, avatarId):
|
|
self.sendUpdate('removeMember', [avatarId])
|
|
|
|
def changeRank(self, avatarId, rank):
|
|
self.sendUpdate('changeRank', [avatarId, rank])
|
|
|
|
def changeRankAvocate(self, avatarId):
|
|
self.sendUpdate('changeRankAvocate', [avatarId])
|
|
|
|
def statusRequest(self):
|
|
self.sendUpdate('statusRequest', [])
|
|
|
|
def requestLeaderboardTopTen(self):
|
|
self.sendUpdate('requestLeaderboardTopTen', [])
|
|
|
|
def sendRequestInvite(self, avatarId):
|
|
self.sendUpdate('requestInvite', [avatarId])
|
|
|
|
def sendAcceptInvite(self):
|
|
self.sendUpdate('acceptInvite', [])
|
|
|
|
def sendDeclineInvite(self):
|
|
self.sendUpdate('declineInvite', [])
|
|
|
|
def sendTalk(self, msgText, chatFlags = 0):
|
|
self.sendUpdate('setTalkGroup', [0,
|
|
0,
|
|
'',
|
|
msgText,
|
|
[],
|
|
0])
|
|
|
|
def setTalkGroup(self, fromAv, fromAC, avatarName, chat, mods, flags):
|
|
if hasattr(base, 'localAvatar'):
|
|
message, scrubbed = localAvatar.scrubTalk(chat, mods)
|
|
base.talkAssistant.receiveGuildTalk(fromAv, fromAC, avatarName, message, scrubbed)
|
|
|
|
def sendSC(self, msgIndex):
|
|
self.sendUpdate('sendSC', [msgIndex])
|
|
|
|
def sendSCQuest(self, questInt, msgType, taskNum):
|
|
self.sendUpdate('sendSCQuest', [questInt, msgType, taskNum])
|
|
|
|
def sendTokenRequest(self):
|
|
self.sendUpdate('sendTokenRequest', [])
|
|
|
|
def sendTokenForJoinRequest(self, token):
|
|
name = base.localAvatar.getName()
|
|
self.sendUpdate('sendTokenForJoinRequest', [token, name])
|
|
|
|
def isInGuild(self, avId):
|
|
return avId in self.id2Name
|
|
|
|
def getRank(self, avId):
|
|
return self.id2Rank.get(avId)
|
|
|
|
def getBandId(self, avId):
|
|
return self.id2BandId.get(avId)
|
|
|
|
def getMemberInfo(self, avId):
|
|
if self.isInGuild(avId):
|
|
return GuildMemberInfo(self.id2Name[avId], self.id2Online[avId], self.id2Rank[avId], self.id2BandId[avId])
|
|
return None
|
|
|
|
def getOptionsFor(self, avId):
|
|
if self.isInGuild(avId):
|
|
myRank = self.id2Rank.get(localAvatar.doId, localAvatar.getGuildRank())
|
|
hisRank = self.id2Rank[avId]
|
|
canpromote = False
|
|
candemote = False
|
|
cankick = False
|
|
if myRank == GUILDRANK_GM:
|
|
canpromote = True
|
|
candemote = True
|
|
cankick = True
|
|
if myRank > GUILDRANK_MEMBER and myRank != GUILDRANK_VETERAN and (hisRank <= GUILDRANK_MEMBER or hisRank == GUILDRANK_VETERAN):
|
|
cankick = True
|
|
return (canpromote, candemote, cankick)
|
|
else:
|
|
return None
|
|
return None
|
|
|
|
def updateTokenRValue(self, tokenString, rValue):
|
|
rValue = int(rValue)
|
|
self.sendUpdate('sendTokenRValue', [tokenString, rValue])
|
|
if rValue == -1:
|
|
base.localAvatar.guiMgr.guildPage.receivePermTokenValue(tokenString)
|
|
|
|
def requestPermToken(self):
|
|
self.sendUpdate('sendPermToken', [])
|
|
|
|
def requestNonPermTokenCount(self):
|
|
self.sendUpdate('sendNonPermTokenCount', [])
|
|
|
|
def requestClearTokens(self, type):
|
|
self.sendUpdate('sendClearTokens', [type])
|
|
|
|
def receiveMember(self, member):
|
|
if not self.receivingNewList:
|
|
self.receivingNewList = True
|
|
self.newList = []
|
|
self.newList.append(member)
|
|
|
|
def clearMembers(self):
|
|
self.newList = []
|
|
self.receiveMembersDone()
|
|
|
|
def receiveMembersDone(self):
|
|
self.receivingNewList = False
|
|
memberlist = self.newList
|
|
self.newList = []
|
|
self.id2Name = {}
|
|
self.id2Rank = {}
|
|
self.id2BandId = {}
|
|
for guy in memberlist:
|
|
id = guy[0]
|
|
name = guy[1]
|
|
rank = guy[2]
|
|
isOnline = guy[3]
|
|
self.id2Name[id] = name
|
|
self.id2Rank[id] = rank
|
|
self.id2Online[id] = isOnline
|
|
self.id2BandId[id] = tuple(guy[4:6])
|
|
|
|
for id, msg in self.pendingMsgs:
|
|
if not self.cr.avatarFriendsManager.checkIgnored(id):
|
|
base.talkAssistant.receiveGuildMessage(msg, id, self.id2Name.get(id, 'Unknown'))
|
|
|
|
if localAvatar.getGuildId():
|
|
self.accept(self.cr.StopVisibilityEvent, self.handleLogout)
|
|
else:
|
|
self.ignore(self.cr.StopVisibilityEvent)
|
|
if hasattr(base, 'localAvatar'):
|
|
base.localAvatar.guiMgr.guildPage.receiveMembers(memberlist)
|
|
messenger.send('guildMemberUpdated', sentArgs=[localAvatar.doId])
|
|
|
|
def guildStatusUpdate(self, guildId, guildName, guildRank):
|
|
if hasattr(base, 'localAvatar'):
|
|
base.localAvatar.guildStatusUpdate(guildId, guildName, guildRank)
|
|
self.memberList()
|
|
|
|
def guildNameReject(self, guildId):
|
|
if hasattr(base, 'localAvatar'):
|
|
base.localAvatar.guildNameReject(guildId)
|
|
|
|
def guildNameChange(self, guildName, changeStatus):
|
|
if hasattr(base, 'localAvatar'):
|
|
base.localAvatar.guildNameChange(guildName, changeStatus)
|
|
|
|
def guildNameUpdate(self, avatarId, guildName):
|
|
print('DEBUG - guildNameUpdate for ', avatarId, ' to ', guildName)
|
|
|
|
def invitationFrom(self, avatarId, avatarName, guildId, guildName):
|
|
print('GM invitationFrom %s(%d)' % (avatarName, avatarId))
|
|
if hasattr(base, 'localAvatar'):
|
|
base.localAvatar.guiMgr.handleGuildInvitation(avatarId, avatarName, guildId, guildName)
|
|
|
|
def retractInvite(self, avatarId):
|
|
print('GM retraction')
|
|
|
|
def guildAcceptInvite(self, avatarId):
|
|
print('sending accept event')
|
|
messenger.send(OTPGlobals.GuildAcceptInviteEvent, [avatarId])
|
|
|
|
def leaderboardTopTen(self, stuff):
|
|
base.localAvatar.guiMgr.handleTopTen(stuff)
|
|
|
|
def guildRejectInvite(self, avatarId, reason):
|
|
messenger.send(OTPGlobals.GuildRejectInviteEvent, [avatarId, reason])
|
|
|
|
def rejectInvite(self, avatarId, reason):
|
|
pass
|
|
|
|
def recvSC(self, senderId, msgIndex):
|
|
senderName = self.id2Name.get(senderId, None)
|
|
if senderName:
|
|
if not self.cr.avatarFriendsManager.checkIgnored(senderId):
|
|
displayMess = '%s %s %s' % (senderName, OTPLocalizer.GuildPrefix, OTPLocalizer.SpeedChatStaticText[msgIndex])
|
|
message = OTPLocalizer.SpeedChatStaticText[msgIndex]
|
|
base.talkAssistant.receiveGuildMessage(message, senderId, senderName)
|
|
else:
|
|
self.pendingMsgs.append([senderId, OTPLocalizer.SpeedChatStaticText[msgIndex]])
|
|
self.memberList()
|
|
return
|
|
|
|
def recvSCQuest(self, senderId, questInt, msgType, taskNum):
|
|
senderName = self.id2Name.get(senderId, None)
|
|
message = base.talkAssistant.SCDecoder.decodeSCQuestMsgInt(questInt, msgType, taskNum)
|
|
if senderName:
|
|
if not self.cr.avatarFriendsManager.checkIgnored(senderId):
|
|
displayMess = '%s %s %s' % (senderName, OTPLocalizer.GuildPrefix, message)
|
|
base.talkAssistant.receiveGuildMessage(message, senderId, senderName)
|
|
else:
|
|
self.pendingMsgs.append([senderId, message])
|
|
self.memberList()
|
|
return
|
|
|
|
def recvAvatarOnline(self, avatarId, avatarName, bandManagerId, bandId):
|
|
self.id2Online[avatarId] = True
|
|
if hasattr(base, 'localAvatar') and avatarId != base.localAvatar.doId:
|
|
if not self.cr.avatarFriendsManager.checkIgnored(avatarId):
|
|
base.talkAssistant.receiveGuildUpdate(avatarId, avatarName, True)
|
|
else:
|
|
return
|
|
messenger.send('guildMemberOnlineStatus', [avatarId, 1])
|
|
|
|
def recvAvatarOffline(self, avatarId, avatarName):
|
|
self.id2BandId[avatarId] = (0, 0)
|
|
self.id2Online[avatarId] = False
|
|
if hasattr(base, 'localAvatar') and avatarId != base.localAvatar.doId:
|
|
if not self.cr.avatarFriendsManager.checkIgnored(avatarId):
|
|
base.talkAssistant.receiveGuildUpdate(avatarId, avatarName, False)
|
|
messenger.send('guildMemberOnlineStatus', [avatarId, 0])
|
|
|
|
def recvMemberAdded(self, memberInfo, inviterId, inviterName):
|
|
avatarId, avatarName, rank, isOnline, bandManagerId, bandId = memberInfo
|
|
self.id2Name[avatarId] = avatarName
|
|
self.id2Rank[avatarId] = rank
|
|
self.id2BandId[avatarId] = (bandManagerId, bandId)
|
|
self.id2Online[avatarId] = isOnline
|
|
if hasattr(base, 'localAvatar'):
|
|
base.localAvatar.guiMgr.guildPage.addMember(memberInfo)
|
|
messenger.send('guildMemberUpdated', sentArgs=[avatarId])
|
|
|
|
def recvMemberRemoved(self, avatarId, senderId, avatarName, senderName):
|
|
if avatarId == localAvatar.doId:
|
|
self.clearMembers()
|
|
else:
|
|
self.id2Name.pop(avatarId, None)
|
|
self.id2Rank.pop(avatarId, None)
|
|
self.id2BandId.pop(avatarId, None)
|
|
self.id2Online.pop(avatarId, None)
|
|
if hasattr(base, 'localAvatar'):
|
|
base.localAvatar.guiMgr.guildPage.removeMember(avatarId)
|
|
messenger.send('guildMemberUpdated', sentArgs=[avatarId])
|
|
return
|
|
|
|
def recvMemberUpdateRank(self, avatarId, senderId, avatarName, senderName, rank, promote):
|
|
self.id2Rank[avatarId] = rank
|
|
if hasattr(base, 'localAvatar') and base.localAvatar.guiMgr:
|
|
base.localAvatar.guiMgr.guildPage.updateGuildMemberRank(avatarId, rank)
|
|
messenger.send('guildMemberUpdated', sentArgs=[avatarId])
|
|
|
|
def recvMemberUpdateBandId(self, avatarId, bandManagerId, bandId):
|
|
self.id2BandId[avatarId] = (bandManagerId, bandId)
|
|
messenger.send('guildMemberUpdated', sentArgs=[avatarId])
|
|
|
|
def recvTokenInviteValue(self, tokenValue, preExistPerm):
|
|
if hasattr(base, 'localAvatar') and base.localAvatar.guiMgr:
|
|
base.localAvatar.guiMgr.guildPage.displayInviteGuild(tokenValue, preExistPerm)
|
|
|
|
def recvTokenRedeemMessage(self, guildName):
|
|
if hasattr(base, 'localAvatar') and base.localAvatar.guiMgr:
|
|
if guildName == '***ERROR - GUILD CODE INVALID***':
|
|
base.localAvatar.guiMgr.guildPage.displayRedeemErrorMessage(OTPLocalizer.GuildRedeemErrorInvalidToken)
|
|
elif guildName == '***ERROR - GUILD FULL***':
|
|
base.localAvatar.guiMgr.guildPage.displayRedeemErrorMessage(OTPLocalizer.GuildRedeemErrorGuildFull)
|
|
else:
|
|
base.localAvatar.guiMgr.guildPage.displayRedeemConfirmMessage(guildName)
|
|
|
|
def recvTokenRedeemedByPlayerMessage(self, redeemerName):
|
|
if hasattr(base, 'localAvatar') and base.localAvatar.guiMgr:
|
|
base.localAvatar.guiMgr.guildPage.notifyTokenGeneratorOfRedeem(redeemerName)
|
|
|
|
def recvPermToken(self, token):
|
|
if hasattr(base, 'localAvatar') and base.localAvatar.guiMgr:
|
|
if token == '0':
|
|
base.localAvatar.guiMgr.guildPage.receivePermTokenValue(None)
|
|
else:
|
|
base.localAvatar.guiMgr.guildPage.receivePermTokenValue(token)
|
|
return
|
|
|
|
def requestEmailNotificationPref(self):
|
|
self.sendUpdate('sendRequestEmailNotificationPref', [])
|
|
|
|
def respondEmailNotificationPref(self, notify, emailAddress):
|
|
self.emailNotification = notify
|
|
if emailAddress == 'None':
|
|
self.emailNotificationAddress = None
|
|
else:
|
|
self.emailNotificationAddress = emailAddress
|
|
return
|
|
|
|
def getEmailNotificationPref(self):
|
|
return [self.emailNotification, self.emailNotificationAddress]
|
|
|
|
def requestEmailNotificationPrefUpdate(self, notify, emailAddress):
|
|
self.sendUpdate('sendEmailNotificationPrefUpdate', [notify, emailAddress])
|
|
self.emailNotification = notify
|
|
if emailAddress == 'None':
|
|
self.emailNotificationAddress = None
|
|
else:
|
|
self.emailNotificationAddress = emailAddress
|
|
return
|
|
|
|
def recvNonPermTokenCount(self, tCount):
|
|
if hasattr(base, 'localAvatar') and base.localAvatar.guiMgr:
|
|
base.localAvatar.guiMgr.guildPage.receiveNonPermTokenCount(tCount)
|
|
|
|
@report(types=['deltaStamp', 'args'], dConfigParam='teleport')
|
|
def d_reflectTeleportQuery(self, sendToId, localBandMgrId, localBandId, localGuildId, localShardId):
|
|
self.sendUpdate('reflectTeleportQuery', [sendToId,
|
|
localBandMgrId,
|
|
localBandId,
|
|
localGuildId,
|
|
localShardId])
|
|
|
|
@report(types=['deltaStamp', 'args'], dConfigParam='teleport')
|
|
def teleportQuery(self, requesterId, requesterBandMgrId, requesterBandId, requesterGuildId, requesterShardId):
|
|
if self.cr.teleportMgr:
|
|
self.cr.teleportMgr.handleAvatarTeleportQuery(requesterId, requesterBandMgrId, requesterBandId, requesterGuildId, requesterShardId)
|
|
|
|
@report(types=['deltaStamp', 'args'], dConfigParam='teleport')
|
|
def d_reflectTeleportResponse(self, available, shardId, instanceDoId, areaDoId, sendToId):
|
|
self.sendUpdate('reflectTeleportResponse', [sendToId,
|
|
available,
|
|
shardId,
|
|
instanceDoId,
|
|
areaDoId])
|
|
|
|
@report(types=['deltaStamp', 'args'], dConfigParam='teleport')
|
|
def teleportResponse(self, responderId, available, shardId, instanceDoId, areaDoId):
|
|
if self.cr.teleportMgr:
|
|
self.cr.teleportMgr.handleAvatarTeleportResponse(responderId, available, shardId, instanceDoId, areaDoId)
|
|
|
|
@report(types=['args'], dConfigParam='guildmgr')
|
|
def handleLogout(self, *args, **kw):
|
|
self.cr.removeAIInterest(AIInterestHandles.PIRATES_GUILD)
|