historical/toontown-classic.git/otp/friends/GuildManager.py

408 lines
16 KiB
Python
Raw Normal View History

2024-01-16 11:20:27 -06:00
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)