diff --git a/otp/avatar/DistributedPlayer.py b/otp/avatar/DistributedPlayer.py index 476535ca..ec764059 100755 --- a/otp/avatar/DistributedPlayer.py +++ b/otp/avatar/DistributedPlayer.py @@ -182,30 +182,27 @@ class DistributedPlayer(DistributedAvatar.DistributedAvatar, PlayerBase.PlayerBa pass def setTalk(self, chat): - if not base.cr.verifyMessage(chat): + if not base.cr.chatAgent.verifyMessage(chat): return if base.localAvatar.isIgnored(self.doId): return - #newText, scrubbed = self.scrubTalk(chat, mods) + if base.whiteList: + chat = base.whiteList.processThroughAll(chat, self, self.chatGarbler) self.displayTalk(chat) def setTalkWhisper(self, avId, chat): - if not base.cr.verifyMessage(chat): + if not base.cr.chatAgent.verifyMessage(chat): return if base.localAvatar.isIgnored(avId): return self.displayTalkWhisper(avId, chat) def displayTalk(self, chat): - print 'displaytalk AV' print 'Talk: %s' % chat def displayTalkWhisper(self, avId, chat): print 'TalkWhisper from %s: %s' % (avId, chat) - def scrubTalk(self, chat, mods): - return chat - def b_setSC(self, msgIndex): self.setSC(msgIndex) self.d_setSC(msgIndex) diff --git a/otp/chat/ChatAgentAI.py b/otp/chat/ChatAgentAI.py index be09fa56..2c5029da 100755 --- a/otp/chat/ChatAgentAI.py +++ b/otp/chat/ChatAgentAI.py @@ -1,6 +1,4 @@ from direct.directnotify import DirectNotifyGlobal -# TODO: OTP should not depend on Toontown... Hrrm. -from toontown.chat.TTWhiteList import TTWhiteList class ChatAgentAI: notify = DirectNotifyGlobal.directNotify.newCategory("ChatAgentAI") @@ -9,7 +7,4 @@ class ChatAgentAI: pass def chatMessage(self, todo0): - pass - - def setWhiteList(self, todo0): pass \ No newline at end of file diff --git a/otp/chat/ChatGarbler.py b/otp/chat/ChatGarbler.py index 608217aa..6cfdf370 100755 --- a/otp/chat/ChatGarbler.py +++ b/otp/chat/ChatGarbler.py @@ -5,14 +5,19 @@ class ChatGarbler: def __init__(self, messages): self.messages = messages - def garble(self, avatar, message, isRandom=False): + def garble(self, avatar, message, type=0): newMessage = '' if avatar.style: avatarType = avatar.style.getType() wordList = self.messages[avatarType if avatarType in self.messages else 'default'] - numWords = random.randint(1, 7) if isRandom else 1 + if type == 0: + numWords = 1 + elif type == 1: + numWords = random.randint(1, 7) + elif type == 2: + numWords = len(message.split(' ')) for i in xrange(1, numWords + 1): wordIndex = random.randint(0, len(wordList) - 1) diff --git a/otp/chat/ChatInputWhiteListFrame.py b/otp/chat/ChatInputWhiteListFrame.py index 60f63104..bf7200a4 100755 --- a/otp/chat/ChatInputWhiteListFrame.py +++ b/otp/chat/ChatInputWhiteListFrame.py @@ -47,12 +47,9 @@ class ChatInputWhiteListFrame(FSM.FSM, DirectFrame): self.history = [''] self.historySize = base.config.GetInt('chat-history-size', 10) self.historyIndex = 0 - self.promoteWhiteList = 0 - self.whiteList = None self.active = 0 self.autoOff = 0 self.sendBy = 'Mode' - self.prefilter = 1 from direct.gui import DirectGuiGlobals self.chatEntry.bind(DirectGuiGlobals.TYPE, self.applyFilter) self.chatEntry.bind(DirectGuiGlobals.ERASE, self.applyFilter) @@ -129,30 +126,15 @@ class ChatInputWhiteListFrame(FSM.FSM, DirectFrame): def sendChat(self, text, overflow = False): if not (len(text) > 0 and text[0] in ['~', '>']): - if self.prefilter: - words = text.split(' ') - newwords = [] - for word in words: - if word == '' or self.whiteList.isWord(word) or self.promoteWhiteList: - newwords.append(word) - else: - newwords.append(base.whiteList.defaultWord) - - text = ' '.join(newwords) - else: - text = self.chatEntry.get(plain=True) + text = self.chatEntry.get(plain=True) if text: self.chatEntry.set('') - try: - text.decode('ascii') - self.sendChatBySwitch(text) - - if self.wantHistory: - self.addToHistory(text) - except UnicodeEncodeError: - base.localAvatar.setSystemMessage(0, OTPLocalizer.AsciiNotSupported) + if not base.cr.chatAgent.verifyMessage(text): + return + + self.sendChatBySwitch(text) if not overflow: self.hide() @@ -203,24 +185,6 @@ class ChatInputWhiteListFrame(FSM.FSM, DirectFrame): self.historyIndex -= 1 self.historyIndex %= len(self.history) - def applyFilter(self, keyArgs, strict = False): - text = self.chatEntry.get(plain=True) - - if not text.startswith('~'): - words = text.split(' ') - newwords = [] - self.notify.debug('%s' % words) - for word in words: - if word == '' or self.whiteList.isWord(word): - newwords.append(word) - else: - newwords.append('\x01WLEnter\x01' + word + '\x02') - - if not strict: - lastword = words[-1] - if lastword == '' or self.whiteList.isPrefix(lastword): - newwords[-1] = lastword - else: - newwords[-1] = '\x01WLEnter\x01' + lastword + '\x02' - newtext = ' '.join(newwords) - self.chatEntry.set(newtext) \ No newline at end of file + def applyFilter(self, keyArgs): + if base.whiteList: + self.chatEntry.set(base.whiteList.processThroughAll(self.chatEntry.get(plain=True))) \ No newline at end of file diff --git a/otp/chat/TalkAssistant.py b/otp/chat/TalkAssistant.py index cf4aad72..4e01274c 100755 --- a/otp/chat/TalkAssistant.py +++ b/otp/chat/TalkAssistant.py @@ -12,7 +12,6 @@ from otp.otpbase import OTPGlobals from otp.otpbase import OTPLocalizer from otp.speedchat import SCDecoders from toontown.chat.ChatGlobals import * -from toontown.chat.TTWhiteList import TTWhiteList ThoughtPrefix = '.' @@ -23,16 +22,13 @@ class TalkAssistant(DirectObject.DirectObject): def __init__(self): self.logWhispers = 1 - self.whiteList = None self.clearHistory() self.zeroTimeDay = time.time() self.zeroTimeGame = globalClock.getRealTime() self.floodThreshold = 10.0 - self.useWhiteListFilter = base.config.GetBool('white-list-filter-openchat', 0) self.lastWhisperDoId = None self.lastWhisper = None self.SCDecoder = SCDecoders - self.whiteList = TTWhiteList() return def clearHistory(self): @@ -45,7 +41,6 @@ class TalkAssistant(DirectObject.DirectObject): self.spamDictByDoId = {} self.handleDict = {} self.messageCount = 0 - self.shownWhiteListWarning = 0 def delete(self): self.ignoreAll() @@ -91,42 +86,6 @@ class TalkAssistant(DirectObject.DirectObject): def getHandle(self, doId): return self.handleDict.get(doId) - def doWhiteListWarning(self): - pass - - def addToHistoryDoId(self, message, doId, scrubbed = 0): - if message.getTalkType() == TALK_WHISPER and doId != localAvatar.doId: - self.lastWhisperDoId = doId - self.lastWhisper = self.lastWhisperDoId - if doId not in self.historyByDoId: - self.historyByDoId[doId] = [] - self.historyByDoId[doId].append(message) - if not self.shownWhiteListWarning and scrubbed and doId == localAvatar.doId: - self.doWhiteListWarning() - self.shownWhiteListWarning = 1 - if doId not in self.floodDataByDoId: - self.floodDataByDoId[doId] = [0.0, self.stampTime(), message] - else: - oldTime = self.floodDataByDoId[doId][1] - newTime = self.stampTime() - timeDiff = newTime - oldTime - oldRating = self.floodDataByDoId[doId][0] - contentMult = 1.0 - if len(message.getBody()) < 6: - contentMult += 0.2 * float(6 - len(message.getBody())) - if self.floodDataByDoId[doId][2].getBody() == message.getBody(): - contentMult += 1.0 - floodRating = max(0, 3.0 * contentMult + oldRating - timeDiff) - self.floodDataByDoId[doId] = [floodRating, self.stampTime(), message] - if floodRating > self.floodThreshold: - if oldRating < self.floodThreshold: - self.floodDataByDoId[doId] = [floodRating + 3.0, self.stampTime(), message] - return 1 - else: - self.floodDataByDoId[doId] = [oldRating - timeDiff, self.stampTime(), message] - return 2 - return 0 - def addToHistoryDISLId(self, message, dISLId, scrubbed = 0): if dISLId not in self.historyByDISLId: self.historyByDISLId[dISLId] = [] @@ -150,36 +109,6 @@ class TalkAssistant(DirectObject.DirectObject): return info.getName() if info else '' - def whiteListFilterMessage(self, text): - if not self.useWhiteListFilter: - return text - elif not base.whiteList: - return 'no list' - words = text.split(' ') - newwords = [] - for word in words: - if word == '' or base.whiteList.isWord(word): - newwords.append(word) - else: - newwords.append(base.whiteList.defaultWord) - - newText = ' '.join(newwords) - return newText - - def colorMessageByWhiteListFilter(self, text): - if not base.whiteList: - return text - words = text.split(' ') - newwords = [] - for word in words: - if word == '' or base.whiteList.isWord(word): - newwords.append(word) - else: - newwords.append('\x01WLRed\x01' + word + '\x02') - - newText = ' '.join(newwords) - return newText - def isThought(self, message): if not message: return 0 @@ -260,6 +189,5 @@ class TalkAssistant(DirectObject.DirectObject): avatarName = avatar.getName() newMessage = TalkMessage(self.countMessage(), self.stampTime(), message, localAvatar.doId, localAvatar.getName(), localAvatar.DISLid, localAvatar.DISLname, receiverId, avatarName, None, None, TALK_WHISPER, None) self.historyComplete.append(newMessage) - self.addToHistoryDoId(newMessage, localAvatar.doId) messenger.send('NewOpenMessage', [newMessage]) return error diff --git a/otp/chat/WhiteList.py b/otp/chat/WhiteList.py index 94dc8b3c..4cdc337f 100755 --- a/otp/chat/WhiteList.py +++ b/otp/chat/WhiteList.py @@ -1,13 +1,13 @@ from bisect import bisect_left class WhiteList: - def __init__(self, words): + + def setWords(self, words): self.words = words self.numWords = len(self.words) def cleanText(self, text): - text = text.strip('.,?!') - return text.lower() + return text.strip('.,?!').lower() def isWord(self, text): return self.cleanText(text) in self.words @@ -16,25 +16,32 @@ class WhiteList: text = self.cleanText(text) i = bisect_left(self.words, text) - if i == self.numWords: - return False + return i != self.numWords and self.words[i].startswith(text) + + def getReplacement(self, text, av=None, garbler=None): + return '\x01%s\x01%s\x02' % ('WLDisplay' if garbler else 'WLRed', text if not garbler else garbler.garble(av, text, 2)) - return self.words[i].startswith(text) + def processText(self, text, av=None, garbler=None): + if (not self.words) or text.startswith('~'): + return text - def prefixCount(self, text): - text = self.cleanText(text) - i = bisect_left(self.words, text) - j = i - while j < self.numWords and self.words[j].startswith(text): - j += 1 + words = text.split(' ') + newWords = [] - return j - i + for word in words: + if (not word) or self.isWord(word): + newWords.append(word) + else: + newWords.append(self.getReplacement(word, av, garbler)) - def prefixList(self, text): - text = self.cleanText(text) - i = bisect_left(self.words, text) - j = i - while j < self.numWords and self.words[j].startswith(text): - j += 1 + lastWord = words[-1] - return self.words[i:j] + if (not lastWord) or self.isPrefix(lastWord): + newWords[-1] = lastWord + else: + newWords[-1] = self.getReplacement(lastWord, av, garbler) + + return ' '.join(newWords) + + def processThroughAll(self, text, av=None, garbler=None): + return self.processText(text, av, garbler) \ No newline at end of file diff --git a/toontown/chat/WhiteListData.py b/otp/chat/WhiteListData.py similarity index 100% rename from toontown/chat/WhiteListData.py rename to otp/chat/WhiteListData.py diff --git a/otp/otpbase/OTPBase.py b/otp/otpbase/OTPBase.py index be55e7a3..eac4d08c 100755 --- a/otp/otpbase/OTPBase.py +++ b/otp/otpbase/OTPBase.py @@ -1,5 +1,6 @@ from direct.showbase.ShowBase import ShowBase from otp.ai.MagicWordGlobal import * +from otp.chat import WhiteList, WhiteListData from pandac.PandaModules import Camera, TPLow, VBase4, ColorWriteAttrib, Filename, getModelPath, NodePath, Vec4 import OTPGlobals, OTPRender, math @@ -19,6 +20,12 @@ class OTPBase(ShowBase): self.enviroCam = None self.pixelZoomSetup = False self.gameOptionsCode = '' + self.whiteList = None + + if config.GetBool('want-whitelist', True): + self.whiteList = WhiteList.WhiteList() + self.whiteList.setWords(WhiteListData.WHITELIST) + if base.cam: if self.wantEnviroDR: base.cam.node().setCameraMask(OTPRender.MainCameraBitmask) diff --git a/toontown/ai/ToontownAIMsgTypes.py b/toontown/ai/ToontownAIMsgTypes.py index 682b8974..2d194ea9 100755 --- a/toontown/ai/ToontownAIMsgTypes.py +++ b/toontown/ai/ToontownAIMsgTypes.py @@ -1,8 +1,7 @@ from otp.ai.AIMsgTypes import * TTAIMsgName2Id = {'DBSERVER_GET_ESTATE': 1040, 'DBSERVER_GET_ESTATE_RESP': 1041, - 'PARTY_MANAGER_UD_TO_ALL_AI': 1042, - 'WHITELIST_MANAGER_UD_TO_ALL_AI': 1044} + 'PARTY_MANAGER_UD_TO_ALL_AI': 1042} TTAIMsgId2Names = invertDictLossless(TTAIMsgName2Id) globals().update(TTAIMsgName2Id) diff --git a/toontown/chat/TTChatInputWhiteList.py b/toontown/chat/TTChatInputWhiteList.py index 38f36a85..f607e37b 100755 --- a/toontown/chat/TTChatInputWhiteList.py +++ b/toontown/chat/TTChatInputWhiteList.py @@ -1,5 +1,4 @@ from otp.chat.ChatInputWhiteListFrame import ChatInputWhiteListFrame -from toontown.chat.TTWhiteList import TTWhiteList from direct.showbase import DirectObject from otp.otpbase import OTPGlobals import sys @@ -32,8 +31,6 @@ class TTChatInputWhiteList(ChatInputWhiteListFrame): 'text': '', 'sortOrder': DGG.FOREGROUND_SORT_INDEX} ChatInputWhiteListFrame.__init__(self, entryOptions, parent, **kw) - self.whiteList = TTWhiteList() - base.whiteList = self.whiteList base.ttwl = self self.autoOff = 1 self.sendBy = 'Data' @@ -92,7 +89,6 @@ class TTChatInputWhiteList(ChatInputWhiteListFrame): ChatInputWhiteListFrame.destroy(self) def delete(self): - base.whiteList = None ChatInputWhiteListFrame.delete(self) return @@ -154,35 +150,4 @@ class TTChatInputWhiteList(ChatInputWhiteListFrame): self.whisperLabel['text'] = OTPLocalizer.ChatInputWhisperLabel % self.whisperName self.whisperLabel.show() else: - self.whisperLabel.hide() - - def applyFilter(self, keyArgs, strict = False): - text = self.chatEntry.get(plain=True) - - if not text.startswith('~'): - words = text.split(' ') - newwords = [] - flag = 0 - for friendId, flags in base.localAvatar.friendsList: - if flags & ToontownGlobals.FriendChat: - flag = 1 - - for word in words: - if word == '' or self.whiteList.isWord(word) or not settings['speedchatPlus']: - newwords.append(word) - else: - if flag: - newwords.append('\x01WLDisplay\x01' + word + '\x02') - else: - newwords.append('\x01WLEnter\x01' + word + '\x02') - - if not strict: - lastword = words[-1] - if lastword == '' or self.whiteList.isPrefix(lastword) or not settings['speedchatPlus']: - newwords[-1] = lastword - elif flag: - newwords[-1] = '\x01WLDisplay\x01' + lastword + '\x02' - else: - newwords[-1] = '\x01WLEnter\x01' + lastword + '\x02' - newtext = ' '.join(newwords) - self.chatEntry.set(newtext) \ No newline at end of file + self.whisperLabel.hide() \ No newline at end of file diff --git a/toontown/chat/TTWhiteList.py b/toontown/chat/TTWhiteList.py deleted file mode 100755 index 92443594..00000000 --- a/toontown/chat/TTWhiteList.py +++ /dev/null @@ -1,11 +0,0 @@ -from otp.chat.WhiteList import WhiteList -from toontown.toonbase import TTLocalizer -from toontown.chat import WhiteListData - -class TTWhiteList(WhiteList): - notify = directNotify.newCategory('TTWhiteList') - - def __init__(self): - WhiteList.__init__(self, WhiteListData.WHITELIST) - - self.defaultWord = TTLocalizer.ChatGarblerDefault[0] diff --git a/toontown/friends/FriendHandle.py b/toontown/friends/FriendHandle.py index 6dfa2ac4..34e17872 100755 --- a/toontown/friends/FriendHandle.py +++ b/toontown/friends/FriendHandle.py @@ -65,45 +65,3 @@ class FriendHandle: elif settings['trueFriends'] and base.cr.getFriendFlags(self.doId) & ToontownGlobals.FriendChat: return 1 return 0 - - def scrubTalk(self, message, mods): - scrubbed = 0 - text = copy.copy(message) - for mod in mods: - index = mod[0] - length = mod[1] - mod[0] + 1 - newText = text[0:index] + length * '\x07' + text[index + length:] - text = newText - - words = text.split(' ') - newwords = [] - for word in words: - if word == '': - newwords.append(word) - elif word[0] == '\x07': - newwords.append('\x01WLDisplay\x01' + self.chatGarbler.garble(self, word) + '\x02') - scrubbed = 1 - elif base.whiteList.isWord(word): - newwords.append(word) - else: - newwords.append('\x01WLDisplay\x01' + word + '\x02') - scrubbed = 1 - - newText = ' '.join(newwords) - return (newText, scrubbed) - - def replaceBadWords(self, text): - words = text.split(' ') - newwords = [] - for word in words: - if word == '': - newwords.append(word) - elif word[0] == '\x07': - newwords.append('\x01WLRed\x01' + self.chatGarbler.garble(self, word) + '\x02') - elif base.whiteList.isWord(word): - newwords.append(word) - else: - newwords.append('\x01WLRed\x01' + word + '\x02') - - newText = ' '.join(newwords) - return newText diff --git a/toontown/toon/DistributedToon.py b/toontown/toon/DistributedToon.py index 546a1abe..ba58ac04 100755 --- a/toontown/toon/DistributedToon.py +++ b/toontown/toon/DistributedToon.py @@ -457,13 +457,6 @@ class DistributedToon(DistributedPlayer.DistributedPlayer, Toon.Toon, Distribute def isAvFriend(self, avId): return base.cr.isFriend(avId) - - def setTalk(self, chat): - if not base.cr.chatAgent.verifyMessage(chat): - return - if base.localAvatar.isIgnored(self.doId): - return - self.displayTalk(chat) def setTalkWhisper(self, avId, chat): if not base.cr.chatAgent.verifyMessage(chat): @@ -2373,56 +2366,6 @@ class DistributedToon(DistributedPlayer.DistributedPlayer, Toon.Toon, Distribute reply.status = newStatus break - def scrubTalk(self, message, mods): - scrubbed = 0 - text = copy.copy(message) - for mod in mods: - index = mod[0] - length = mod[1] - mod[0] + 1 - newText = text[0:index] + length * '\x07' + text[index + length:] - text = newText - - words = text.split(' ') - newwords = [] - for word in words: - if word == '': - newwords.append(word) - elif word[0] == '\x07' or len(word) > 1 and word[0] == '.' and word[1] == '\x07': - newwords.append('\x01WLDisplay\x01' + self.chatGarbler.garble(self, word) + '\x02') - scrubbed = 1 - elif not base.whiteList.isWord(word): - newwords.append(word) - else: - flag = 0 - for friendId, flags in self.friendsList: - if not flags & ToontownGlobals.FriendChat: - flag = 1 - - if flag: - scrubbed = 1 - newwords.append('\x01WLDisplay\x01' + word + '\x02') - else: - newwords.append(word) - - newText = ' '.join(newwords) - return (newText, scrubbed) - - def replaceBadWords(self, text): - words = text.split(' ') - newwords = [] - for word in words: - if word == '': - newwords.append(word) - elif word[0] == '\x07': - newwords.append('\x01WLRed\x01' + self.chatGarbler.garble(self, word) + '\x02') - elif not base.whiteList.isWord(word): - newwords.append(word) - else: - newwords.append('\x01WLRed\x01' + word + '\x02') - - newText = ' '.join(newwords) - return newText - def toonUp(self, hpGained, hasInteractivePropBonus = False): if self.hp == None or hpGained < 0: return diff --git a/toontown/toon/LocalToon.py b/toontown/toon/LocalToon.py index 1f4fdf3e..2938277f 100755 --- a/toontown/toon/LocalToon.py +++ b/toontown/toon/LocalToon.py @@ -427,12 +427,14 @@ class LocalToon(DistributedToon.DistributedToon, LocalAvatar.LocalAvatar): self.d_updateGMNameTag() def displayTalkWhisper(self, avId, chat): - # SKRUB PLZ sender = base.cr.identifyAvatar(avId) if not sender: return + if base.whiteList: + chat = base.whiteList.processThroughAll(chat, sender, self.chatGarbler) + name = sender.getName() chatString = '%s: %s' % (name, chat) whisper = WhisperPopup(chatString, OTPGlobals.getInterfaceFont(), WTNormal) diff --git a/toontown/toonbase/ToonBase.py b/toontown/toonbase/ToonBase.py index 27d7e22f..f1934340 100755 --- a/toontown/toonbase/ToonBase.py +++ b/toontown/toonbase/ToonBase.py @@ -129,10 +129,7 @@ class ToonBase(OTPBase.OTPBase): tpMgr = TextPropertiesManager.getGlobalPtr() WLDisplay = TextProperties() WLDisplay.setSlant(0.3) - WLEnter = TextProperties() - WLEnter.setTextColor(1.0, 0.0, 0.0, 1) tpMgr.setProperties('WLDisplay', WLDisplay) - tpMgr.setProperties('WLEnter', WLEnter) del tpMgr self.lastScreenShotTime = globalClock.getRealTime() self.accept('InputState-forward', self.__walking)