ToonTownRewritten/otp/friends/GuildManager.py

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