historical/toontown-classic.git/toontown/uberdog/TTOffChatManagerUD.py
2024-01-16 11:20:27 -06:00

99 lines
4.1 KiB
Python

from direct.directnotify import DirectNotifyGlobal
from direct.distributed.DistributedObjectGlobalUD import DistributedObjectGlobalUD
from toontown.chat.TTWhiteList import TTWhiteList
class TTOffChatManagerUD(DistributedObjectGlobalUD):
notify = DirectNotifyGlobal.directNotify.newCategory('TTOffChatManagerUD')
def __init__(self, air):
DistributedObjectGlobalUD.__init__(self, air)
self.wantWhiteList = False
self.whiteList = None
def announceGenerate(self):
DistributedObjectGlobalUD.announceGenerate(self)
self.wantWhiteList = config.GetBool('want-whitelist', True)
if self.wantWhiteList:
self.whiteList = TTWhiteList()
def chatMessage(self, message):
accId = self.air.getAccountIdFromSender()
if not accId:
return
avId = self.air.getAvatarIdFromSender()
if not avId:
self.air.writeServerEvent('suspicious', accId=accId, issue='Account sent chat without an avatar!',
message=message)
return
def handleAvatar(dclass, fields):
if dclass != self.air.dclassesByName['DistributedToonUD']:
return
senderName = fields['setName'][0]
if self.wantWhiteList:
filteredMessage, modifications = self.filterWhiteList(message)
else:
filteredMessage, modifications = message, []
do = self.air.dclassesByName['DistributedAvatarUD']
datagram = do.aiFormatUpdate('setTalk', avId, avId, self.air.ourChannel,
[avId, accId, senderName, filteredMessage, modifications, 0])
self.air.send(datagram)
self.air.writeServerEvent('chat-message-said', avId=avId, message=message, filteredMessage=filteredMessage)
self.air.dbInterface.queryObject(self.air.dbId, avId, handleAvatar)
def whisperMessage(self, message, receiverAvId):
accId = self.air.getAccountIdFromSender()
if not accId:
return
avId = self.air.getAvatarIdFromSender()
if not avId:
self.air.writeServerEvent('suspicious', accId=accId, issue='Account sent chat without an avatar!',
message=message)
return
def handleAvatar(dclass, fields):
if dclass != self.air.dclassesByName['DistributedToonUD']:
return
senderName = fields['setName'][0]
senderFriendsList = fields['setFriendsList'][0]
if (receiverAvId, 1) in senderFriendsList:
filteredMessage, modifications = message, []
else:
if self.wantWhiteList:
filteredMessage, modifications = self.filterWhiteList(message)
else:
filteredMessage, modifications = message, []
do = self.air.dclassesByName['DistributedAvatarUD']
datagram = do.aiFormatUpdate('setTalkWhisper', receiverAvId, receiverAvId, self.air.ourChannel,
[avId, accId, senderName, filteredMessage, modifications, 0])
self.air.send(datagram)
self.air.writeServerEvent('whisper-message-said', avId=avId, receiverAvId=receiverAvId, message=message,
filteredMessage=filteredMessage)
self.air.dbInterface.queryObject(self.air.dbId, avId, handleAvatar)
def filterWhiteList(self, message):
modifications = []
words = message.split(' ')
offset = 0
for word in words:
if word and not self.whiteList.isWord(word):
modifications.append((offset, offset + len(word) - 1))
offset += len(word) + 1
filteredMessage = message
for modStart, modStop in modifications:
filteredMessage = filteredMessage[:modStart] + '*' * (modStop - modStart + 1) + filteredMessage[
modStop + 1:]
return filteredMessage, modifications