def __init__(self, cr, localAvatar):
     gui = loader.loadModel('phase_3.5/models/gui/chat_input_gui')
     self.normalButton = DirectButton(image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=(0.0683, 0, -0.072), parent=base.a2dTopLeft, scale=1.179, relief=None, image_color=Vec4(1, 1, 1, 1), text=('', OTPLocalizer.ChatManagerChat, OTPLocalizer.ChatManagerChat), text_align=TextNode.ALeft, text_scale=TTLocalizer.TCMnormalButton, text_fg=Vec4(1, 1, 1, 1), text_shadow=Vec4(0, 0, 0, 1), text_pos=(-0.0525, -0.09), textMayChange=0, sortOrder=DGG.FOREGROUND_SORT_INDEX, command=self.__normalButtonPressed)
     self.normalButton.hide()
     self.openScSfx = loader.loadSfx('phase_3.5/audio/sfx/GUI_quicktalker.ogg')
     self.openScSfx.setVolume(0.6)
     self.scButton = DirectButton(image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=TTLocalizer.TCMscButtonPos, parent=base.a2dTopLeft, scale=1.179, relief=None, image_color=Vec4(0.75, 1, 0.6, 1), text=('', OTPLocalizer.GlobalSpeedChatName, OTPLocalizer.GlobalSpeedChatName), text_scale=TTLocalizer.TCMscButton, text_fg=Vec4(1, 1, 1, 1), text_shadow=Vec4(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, sortOrder=DGG.FOREGROUND_SORT_INDEX, command=self.__scButtonPressed, clickSound=self.openScSfx)
     self.scButton.hide()
     self.whisperFrame = DirectFrame(parent=base.a2dTopLeft, relief=None, image=DGG.getDefaultDialogGeom(), image_scale=(0.45, 0.45, 0.45), image_color=OTPGlobals.GlobalDialogColor, pos=(1.25, 0, -0.269), text=OTPLocalizer.ChatManagerWhisperTo, text_wordwrap=7.0, text_scale=TTLocalizer.TCMwhisperFrame, text_fg=Vec4(0, 0, 0, 1), text_pos=(0, 0.14), textMayChange=1, sortOrder=DGG.FOREGROUND_SORT_INDEX)
     self.whisperFrame.hide()
     self.whisperButton = DirectButton(parent=self.whisperFrame, image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=(-0.125, 0, -0.1), scale=1.179, relief=None, image_color=Vec4(1, 1, 1, 1), text=('',
      OTPLocalizer.ChatManagerChat,
      OTPLocalizer.ChatManagerChat,
      ''), image3_color=Vec4(0.6, 0.6, 0.6, 0.6), text_scale=TTLocalizer.TCMwhisperButton, text_fg=(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, command=self.__whisperButtonPressed)
     self.whisperScButton = DirectButton(parent=self.whisperFrame, image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=(0.0, 0, -0.1), scale=1.179, relief=None, image_color=Vec4(0.75, 1, 0.6, 1), text=('',
      OTPLocalizer.GlobalSpeedChatName,
      OTPLocalizer.GlobalSpeedChatName,
      ''), image3_color=Vec4(0.6, 0.6, 0.6, 0.6), text_scale=TTLocalizer.TCMwhisperScButton, text_fg=(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, command=self.__whisperScButtonPressed)
     self.whisperCancelButton = DirectButton(parent=self.whisperFrame, image=(gui.find('**/CloseBtn_UP'), gui.find('**/CloseBtn_DN'), gui.find('**/CloseBtn_Rllvr')), pos=(0.125, 0, -0.1), scale=1.179, relief=None, text=('', OTPLocalizer.ChatManagerCancel, OTPLocalizer.ChatManagerCancel), text_scale=0.05, text_fg=(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, command=self.__whisperCancelPressed)
     gui.removeNode()
     ChatManager.ChatManager.__init__(self, cr, localAvatar)
     self.chatInputSpeedChat = TTChatInputSpeedChat(self)
     self.normalPos = Vec3(0.25, 0, -0.196)
     self.whisperPos = Vec3(0.25, 0, -0.28)
     self.speedChatPlusPos = Vec3(-0.35, 0, 0.71)
     self.SCWhisperPos = Vec3(0, 0, 0)
     self.chatInputWhiteList = TTChatInputWhiteList()
     self.chatInputNormal = self.chatInputWhiteList
     self.chatInputNormal.setPos(self.normalPos)
     self.chatInputNormal.desc = 'chatInputNormal'
     self.chatInputWhiteList.setPos(self.speedChatPlusPos)
     self.chatInputWhiteList.reparentTo(base.a2dTopLeft)
     self.chatInputWhiteList.desc = 'chatInputWhiteList'
     return
 def __init__(self, cr, localAvatar):
     gui = loader.loadModel('phase_3.5/models/gui/chat_input_gui')
     self.normalButton = DirectButton(image = (gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos = (-1.2646999999999999, 0, 0.92800000000000005), scale = 1.179, relief = None, image_color = Vec4(1, 1, 1, 1), text = ('', OTPLocalizer.ChatManagerChat, OTPLocalizer.ChatManagerChat), text_align = TextNode.ALeft, text_scale = TTLocalizer.TCMnormalButton, text_fg = Vec4(1, 1, 1, 1), text_shadow = Vec4(0, 0, 0, 1), text_pos = (-0.052499999999999998, -0.089999999999999997), textMayChange = 0, sortOrder = DGG.FOREGROUND_SORT_INDEX, command = self._ToontownChatManager__normalButtonPressed)
     self.normalButton.hide()
     self.openScSfx = loader.loadSfx('phase_3.5/audio/sfx/GUI_quicktalker.mp3')
     self.openScSfx.setVolume(0.59999999999999998)
     self.scButton = DirectButton(image = (gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos = TTLocalizer.TCMscButtonPos, scale = 1.179, relief = None, image_color = Vec4(0.75, 1, 0.59999999999999998, 1), text = ('', OTPLocalizer.GlobalSpeedChatName, OTPLocalizer.GlobalSpeedChatName), text_scale = TTLocalizer.TCMscButton, text_fg = Vec4(1, 1, 1, 1), text_shadow = Vec4(0, 0, 0, 1), text_pos = (0, -0.089999999999999997), textMayChange = 0, sortOrder = DGG.FOREGROUND_SORT_INDEX, command = self._ToontownChatManager__scButtonPressed, clickSound = self.openScSfx)
     self.scButton.hide()
     self.whisperFrame = DirectFrame(parent = aspect2dp, relief = None, image = DGG.getDefaultDialogGeom(), image_scale = (0.45000000000000001, 0.45000000000000001, 0.45000000000000001), image_color = OTPGlobals.GlobalDialogColor, pos = (-0.40000000000000002, 0, 0.754), text = OTPLocalizer.ChatManagerWhisperTo, text_wordwrap = 7.0, text_scale = TTLocalizer.TCMwhisperFrame, text_fg = Vec4(0, 0, 0, 1), text_pos = (0, 0.14000000000000001), textMayChange = 1, sortOrder = DGG.FOREGROUND_SORT_INDEX)
     self.whisperFrame.hide()
     self.whisperButton = DirectButton(parent = self.whisperFrame, image = (gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos = (-0.125, 0, -0.10000000000000001), scale = 1.179, relief = None, image_color = Vec4(1, 1, 1, 1), text = ('', OTPLocalizer.ChatManagerChat, OTPLocalizer.ChatManagerChat, ''), image3_color = Vec4(0.59999999999999998, 0.59999999999999998, 0.59999999999999998, 0.59999999999999998), text_scale = TTLocalizer.TCMwhisperButton, text_fg = (0, 0, 0, 1), text_pos = (0, -0.089999999999999997), textMayChange = 0, command = self._ToontownChatManager__whisperButtonPressed)
     self.whisperScButton = DirectButton(parent = self.whisperFrame, image = (gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos = (0.0, 0, -0.10000000000000001), scale = 1.179, relief = None, image_color = Vec4(0.75, 1, 0.59999999999999998, 1), text = ('', OTPLocalizer.GlobalSpeedChatName, OTPLocalizer.GlobalSpeedChatName, ''), image3_color = Vec4(0.59999999999999998, 0.59999999999999998, 0.59999999999999998, 0.59999999999999998), text_scale = TTLocalizer.TCMwhisperScButton, text_fg = (0, 0, 0, 1), text_pos = (0, -0.089999999999999997), textMayChange = 0, command = self._ToontownChatManager__whisperScButtonPressed)
     self.whisperCancelButton = DirectButton(parent = self.whisperFrame, image = (gui.find('**/CloseBtn_UP'), gui.find('**/CloseBtn_DN'), gui.find('**/CloseBtn_Rllvr')), pos = (0.125, 0, -0.10000000000000001), scale = 1.179, relief = None, text = ('', OTPLocalizer.ChatManagerCancel, OTPLocalizer.ChatManagerCancel), text_scale = 0.050000000000000003, text_fg = (0, 0, 0, 1), text_pos = (0, -0.089999999999999997), textMayChange = 0, command = self._ToontownChatManager__whisperCancelPressed)
     gui.removeNode()
     ChatManager.ChatManager.__init__(self, cr, localAvatar)
     self.defaultToWhiteList = base.config.GetBool('white-list-is-default', 1)
     self.chatInputSpeedChat = TTChatInputSpeedChat(self)
     self.normalPos = Vec3(-1.083, 0, 0.80400000000000005)
     self.whisperPos = Vec3(0.0, 0, 0.70999999999999996)
     self.speedChatPlusPos = Vec3(-0.34999999999999998, 0, 0.70999999999999996)
     self.chatInputWhiteList = TTChatInputWhiteList()
     if self.defaultToWhiteList:
         self.chatInputNormal = self.chatInputWhiteList
         self.chatInputNormal.setPos(self.normalPos)
         self.chatInputNormal.desc = 'chatInputNormal'
     else:
         self.chatInputNormal = TTChatInputNormal(self)
     self.chatInputWhiteList.setPos(self.speedChatPlusPos)
     self.chatInputWhiteList.desc = 'chatInputWhiteList'
示例#3
0
 def __init__(self, cr, localAvatar):
     gui = loader.loadModel('phase_3.5/models/gui/chat_input_gui')
     self.normalButton = DirectButton(image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=(0.0683, 0, -0.072), parent=base.a2dTopLeft, scale=1.179, relief=None, image_color=Vec4(1, 1, 1, 1), text=('', OTPLocalizer.ChatManagerChat, OTPLocalizer.ChatManagerChat), text_align=TextNode.ALeft, text_scale=TTLocalizer.TCMnormalButton, text_fg=Vec4(1, 1, 1, 1), text_shadow=Vec4(0, 0, 0, 1), text_pos=(-0.0525, -0.09), textMayChange=0, sortOrder=DGG.FOREGROUND_SORT_INDEX, command=self.__normalButtonPressed)
     self.normalButton.hide()
     self.openScSfx = loader.loadSfx('phase_3.5/audio/sfx/GUI_quicktalker.ogg')
     self.openScSfx.setVolume(0.6)
     self.scButton = DirectButton(image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=TTLocalizer.TCMscButtonPos, parent=base.a2dTopLeft, scale=1.179, relief=None, image_color=Vec4(0.75, 1, 0.6, 1), text=('', OTPLocalizer.GlobalSpeedChatName, OTPLocalizer.GlobalSpeedChatName), text_scale=TTLocalizer.TCMscButton, text_fg=Vec4(1, 1, 1, 1), text_shadow=Vec4(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, sortOrder=DGG.FOREGROUND_SORT_INDEX, command=self.__scButtonPressed, clickSound=self.openScSfx)
     self.scButton.hide()
     self.whisperFrame = DirectFrame(parent=base.a2dTopLeft, relief=None, image=DGG.getDefaultDialogGeom(), image_scale=(0.45, 0.45, 0.45), image_color=OTPGlobals.GlobalDialogColor, pos=(0.933333, 0, -0.246), text=OTPLocalizer.ChatManagerWhisperTo, text_wordwrap=7.0, text_scale=TTLocalizer.TCMwhisperFrame, text_fg=Vec4(0, 0, 0, 1), text_pos=(0, 0.14), textMayChange=1, sortOrder=DGG.FOREGROUND_SORT_INDEX)
     self.whisperFrame.hide()
     self.whisperButton = DirectButton(parent=self.whisperFrame, image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=(-0.125, 0, -0.1), scale=1.179, relief=None, image_color=Vec4(1, 1, 1, 1), text=('',
      OTPLocalizer.ChatManagerChat,
      OTPLocalizer.ChatManagerChat,
      ''), image3_color=Vec4(0.6, 0.6, 0.6, 0.6), text_scale=TTLocalizer.TCMwhisperButton, text_fg=(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, command=self.__whisperButtonPressed)
     self.whisperScButton = DirectButton(parent=self.whisperFrame, image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=(0.0, 0, -0.1), scale=1.179, relief=None, image_color=Vec4(0.75, 1, 0.6, 1), text=('',
      OTPLocalizer.GlobalSpeedChatName,
      OTPLocalizer.GlobalSpeedChatName,
      ''), image3_color=Vec4(0.6, 0.6, 0.6, 0.6), text_scale=TTLocalizer.TCMwhisperScButton, text_fg=(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, command=self.__whisperScButtonPressed)
     self.whisperCancelButton = DirectButton(parent=self.whisperFrame, image=(gui.find('**/CloseBtn_UP'), gui.find('**/CloseBtn_DN'), gui.find('**/CloseBtn_Rllvr')), pos=(0.125, 0, -0.1), scale=1.179, relief=None, text=('', OTPLocalizer.ChatManagerCancel, OTPLocalizer.ChatManagerCancel), text_scale=0.05, text_fg=(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, command=self.__whisperCancelPressed)
     gui.removeNode()
     ChatManager.ChatManager.__init__(self, cr, localAvatar)
     self.defaultToWhiteList = base.config.GetBool('white-list-is-default', 1)
     self.chatInputSpeedChat = TTChatInputSpeedChat(self)
     self.normalPos = Vec3(0.25, 0, -0.196)
     self.whisperPos = Vec3(0.0, 0, 0.71)
     self.speedChatPlusPos = Vec3(-0.35, 0, 0.71)
     self.chatInputWhiteList = TTChatInputWhiteList()
     if self.defaultToWhiteList:
         self.chatInputNormal = self.chatInputWhiteList
         self.chatInputNormal.setPos(self.normalPos)
         self.chatInputNormal.desc = 'chatInputNormal'
     else:
         self.chatInputNormal = TTChatInputNormal(self)
     self.chatInputWhiteList.setPos(self.speedChatPlusPos)
     self.chatInputWhiteList.reparentTo(base.a2dTopLeft)
     self.chatInputWhiteList.desc = 'chatInputWhiteList'
     return
class ToontownChatManager(ChatManager.ChatManager):
    notify = DirectNotifyGlobal.directNotify.newCategory('ToontownChatManager')

    def __init__(self, cr, localAvatar):
        gui = loader.loadModel('phase_3.5/models/gui/chat_input_gui')
        self.normalButton = DirectButton(image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=(0.0683, 0, -0.072), parent=base.a2dTopLeft, scale=1.179, relief=None, image_color=Vec4(1, 1, 1, 1), text=('', OTPLocalizer.ChatManagerChat, OTPLocalizer.ChatManagerChat), text_align=TextNode.ALeft, text_scale=TTLocalizer.TCMnormalButton, text_fg=Vec4(1, 1, 1, 1), text_shadow=Vec4(0, 0, 0, 1), text_pos=(-0.0525, -0.09), textMayChange=0, sortOrder=DGG.FOREGROUND_SORT_INDEX, command=self.__normalButtonPressed)
        self.normalButton.hide()
        self.openScSfx = loader.loadSfx('phase_3.5/audio/sfx/GUI_quicktalker.ogg')
        self.openScSfx.setVolume(0.6)
        self.scButton = DirectButton(image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=TTLocalizer.TCMscButtonPos, parent=base.a2dTopLeft, scale=1.179, relief=None, image_color=Vec4(0.75, 1, 0.6, 1), text=('', OTPLocalizer.GlobalSpeedChatName, OTPLocalizer.GlobalSpeedChatName), text_scale=TTLocalizer.TCMscButton, text_fg=Vec4(1, 1, 1, 1), text_shadow=Vec4(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, sortOrder=DGG.FOREGROUND_SORT_INDEX, command=self.__scButtonPressed, clickSound=self.openScSfx)
        self.scButton.hide()
        self.whisperFrame = DirectFrame(parent=base.a2dTopLeft, relief=None, image=DGG.getDefaultDialogGeom(), image_scale=(0.45, 0.45, 0.45), image_color=OTPGlobals.GlobalDialogColor, pos=(1.25, 0, -0.269), text=OTPLocalizer.ChatManagerWhisperTo, text_wordwrap=7.0, text_scale=TTLocalizer.TCMwhisperFrame, text_fg=Vec4(0, 0, 0, 1), text_pos=(0, 0.14), textMayChange=1, sortOrder=DGG.FOREGROUND_SORT_INDEX)
        self.whisperFrame.hide()
        self.whisperButton = DirectButton(parent=self.whisperFrame, image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=(-0.125, 0, -0.1), scale=1.179, relief=None, image_color=Vec4(1, 1, 1, 1), text=('',
         OTPLocalizer.ChatManagerChat,
         OTPLocalizer.ChatManagerChat,
         ''), image3_color=Vec4(0.6, 0.6, 0.6, 0.6), text_scale=TTLocalizer.TCMwhisperButton, text_fg=(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, command=self.__whisperButtonPressed)
        self.whisperScButton = DirectButton(parent=self.whisperFrame, image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=(0.0, 0, -0.1), scale=1.179, relief=None, image_color=Vec4(0.75, 1, 0.6, 1), text=('',
         OTPLocalizer.GlobalSpeedChatName,
         OTPLocalizer.GlobalSpeedChatName,
         ''), image3_color=Vec4(0.6, 0.6, 0.6, 0.6), text_scale=TTLocalizer.TCMwhisperScButton, text_fg=(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, command=self.__whisperScButtonPressed)
        self.whisperCancelButton = DirectButton(parent=self.whisperFrame, image=(gui.find('**/CloseBtn_UP'), gui.find('**/CloseBtn_DN'), gui.find('**/CloseBtn_Rllvr')), pos=(0.125, 0, -0.1), scale=1.179, relief=None, text=('', OTPLocalizer.ChatManagerCancel, OTPLocalizer.ChatManagerCancel), text_scale=0.05, text_fg=(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, command=self.__whisperCancelPressed)
        gui.removeNode()
        ChatManager.ChatManager.__init__(self, cr, localAvatar)
        self.chatInputSpeedChat = TTChatInputSpeedChat(self)
        self.normalPos = Vec3(0.25, 0, -0.196)
        self.whisperPos = Vec3(0.25, 0, -0.28)
        self.speedChatPlusPos = Vec3(-0.35, 0, 0.71)
        self.SCWhisperPos = Vec3(0, 0, 0)
        self.chatInputWhiteList = TTChatInputWhiteList()
        self.chatInputNormal = self.chatInputWhiteList
        self.chatInputNormal.setPos(self.normalPos)
        self.chatInputNormal.desc = 'chatInputNormal'
        self.chatInputWhiteList.setPos(self.speedChatPlusPos)
        self.chatInputWhiteList.reparentTo(base.a2dTopLeft)
        self.chatInputWhiteList.desc = 'chatInputWhiteList'
        return

    def delete(self):
        ChatManager.ChatManager.delete(self)
        loader.unloadModel('phase_3.5/models/gui/chat_input_gui')
        self.normalButton.destroy()
        del self.normalButton
        self.scButton.destroy()
        del self.scButton
        del self.openScSfx
        self.whisperFrame.destroy()
        del self.whisperFrame
        self.whisperButton.destroy()
        del self.whisperButton
        self.whisperScButton.destroy()
        del self.whisperScButton
        self.whisperCancelButton.destroy()
        del self.whisperCancelButton
        self.chatInputWhiteList.destroy()
        del self.chatInputWhiteList

    def sendSCResistanceChatMessage(self, textId):
        messenger.send('chatUpdateSCResistance', [textId])
        self.announceSCChat()

    def sendSCToontaskChatMessage(self, taskId, toNpcId, toonProgress, msgIndex):
        messenger.send('chatUpdateSCToontask', [taskId,
         toNpcId,
         toonProgress,
         msgIndex])
        self.announceSCChat()

    def sendSCToontaskWhisperMessage(self, taskId, toNpcId, toonProgress, msgIndex, whisperAvatarId):
        messenger.send('whisperUpdateSCToontask', [taskId,
         toNpcId,
         toonProgress,
         msgIndex,
         whisperAvatarId])

    def enterMainMenu(self):
        self.chatInputNormal.setPos(self.normalPos)
        self.chatInputNormal.reparentTo(base.a2dTopLeft)
        if self.chatInputWhiteList.isActive():
            self.notify.debug('enterMainMenu calling checkObscured')
            ChatManager.ChatManager.checkObscurred(self)
        else:
            ChatManager.ChatManager.enterMainMenu(self)

    def enterNoTrueFriends(self):
        if self.noTrueFriends == None:
            buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui')
            okButtonImage = (buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr'))
            self.noTrueFriends = DirectFrame(parent=aspect2dp, pos=(0.0, 0.1, 0.2), relief=None, image=DGG.getDefaultDialogGeom(), image_color=OTPGlobals.GlobalDialogColor, image_scale=(1.4, 1.0, 1.1), text=OTPLocalizer.NoTrueFriends, text_wordwrap=20, textMayChange=0, text_scale=0.06, text_pos=(0, 0.3))
            DirectLabel(parent=self.noTrueFriends, relief=None, pos=(0, 0, 0.4), text=OTPLocalizer.NoTrueFriendsTitle, textMayChange=0, text_scale=0.08)
            DirectButton(self.noTrueFriends, image=okButtonImage, relief=None, text=OTPLocalizer.NoTrueFriendsOK, text_scale=0.05, text_pos=(0.0, -0.1), textMayChange=0, pos=(0.0, 0.0, -0.4), command=self.__handleNoTrueFriendsOK)
            buttons.removeNode()
        self.noTrueFriends.show()
        return

    def exitNoTrueFriends(self):
        self.noTrueFriends.hide()

    def __normalButtonPressed(self):
        if base.config.GetBool('want-qa-regression', 0):
            self.notify.info('QA-REGRESSION: CHAT: Speedchat Plus')
        messenger.send('wakeup')
        if not settings['trueFriends'] and not settings['speedchatPlus']:
            self.fsm.request('noSpeedchatPlus')
            return
        self.fsm.request('normalChat')

    def __scButtonPressed(self):
        messenger.send('wakeup')
        if self.fsm.getCurrentState().getName() == 'speedChat':
            self.fsm.request('mainMenu')
        else:
            self.fsm.request('speedChat')

    def __whisperButtonPressed(self, avatarName, avatarId):
        messenger.send('wakeup')
        if not settings['trueFriends'] and not settings['speedchatPlus']:
            self.fsm.request('noSpeedchatPlus')
            return
        if avatarId:
            self.enterWhisperChat(avatarName, avatarId)
        self.whisperFrame.hide()
        return

    def enterNormalChat(self):
        if not settings['trueFriends'] and not settings['speedchatPlus']:
            self.fsm.request('mainMenu')
            return
        result = ChatManager.ChatManager.enterNormalChat(self)
        if result == None:
            self.notify.warning('something went wrong in enterNormalChat, falling back to main menu')
            self.fsm.request('mainMenu')

    def enterWhisperChat(self, avatarName, avatarId):
        if not settings['trueFriends'] and not settings['speedchatPlus']:
            self.fsm.request('mainMenu')
            return
        result = ChatManager.ChatManager.enterWhisperChat(self, avatarName, avatarId)
        self.chatInputNormal.reparentTo(base.a2dTopCenter)
        self.chatInputNormal.setPos(self.whisperPos)
        if result == None:
            self.notify.warning('something went wrong in enterWhisperChat, falling back to main menu')
            self.fsm.request('mainMenu')

    def enterNoSpeedchatPlus(self):
        if self.noSpeedchatPlus == None:
            buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui')
            okButtonImage = (buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr'))
            self.noSpeedchatPlus = DirectFrame(parent=aspect2dp, pos=(0.0, 0.1, 0.05), relief=None, image=DGG.getDefaultDialogGeom(), image_color=OTPGlobals.GlobalDialogColor, image_scale=(1.4, 1.0, 1.58), text=OTPLocalizer.NoSpeedchatPlus, text_wordwrap=20, textMayChange=0, text_scale=0.06, text_pos=(0, 0.55))
            DirectLabel(parent=self.noSpeedchatPlus, relief=None, pos=(0, 0, 0.67), text=OTPLocalizer.NoSpeedchatPlusTitle, textMayChange=0, text_scale=0.08)
            DirectButton(self.noSpeedchatPlus, image=okButtonImage, relief=None, text=OTPLocalizer.NoTrueFriendsOK, text_scale=0.05, text_pos=(0.0, -0.1), textMayChange=0, pos=(0.0, 0.0, -0.64), command=self.__handleNoTrueFriendsOK)
            buttons.removeNode()
        self.noSpeedchatPlus.show()
        return

    def exitNoSpeedchatPlus(self):
        self.noSpeedchatPlus.hide()

    def __whisperScButtonPressed(self, avatarName, avatarId):
        messenger.send('wakeup')
        if avatarId:
            if self.fsm.getCurrentState().getName() == 'whisperSpeedChat':
                self.fsm.request('whisper', [avatarName, avatarId])
            else:
                self.fsm.request('whisperSpeedChat', [avatarId])

    def __whisperCancelPressed(self):
        self.fsm.request('mainMenu')

    def __handleNoTrueFriendsOK(self):
        self.fsm.request('mainMenu')

    def messageSent(self):
        pass
class ToontownChatManager(ChatManager.ChatManager):
    notify = DirectNotifyGlobal.directNotify.newCategory('ToontownChatManager')

    def __init__(self, cr, localAvatar):
        gui = loader.loadModel('phase_3.5/models/gui/chat_input_gui')
        self.normalButton = DirectButton(
            image=(gui.find('**/ChtBx_ChtBtn_UP'),
                   gui.find('**/ChtBx_ChtBtn_DN'),
                   gui.find('**/ChtBx_ChtBtn_RLVR')),
            pos=(0.0683, 0, -0.072),
            parent=base.a2dTopLeft,
            scale=1.179,
            relief=None,
            image_color=Vec4(1, 1, 1, 1),
            text=('', OTPLocalizer.ChatManagerChat,
                  OTPLocalizer.ChatManagerChat),
            text_align=TextNode.ALeft,
            text_scale=TTLocalizer.TCMnormalButton,
            text_fg=Vec4(1, 1, 1, 1),
            text_shadow=Vec4(0, 0, 0, 1),
            text_pos=(-0.0525, -0.09),
            textMayChange=0,
            sortOrder=DGG.FOREGROUND_SORT_INDEX,
            command=self.__normalButtonPressed)
        self.normalButton.hide()
        self.openScSfx = loader.loadSfx(
            'phase_3.5/audio/sfx/GUI_quicktalker.ogg')
        self.openScSfx.setVolume(0.6)
        self.scButton = DirectButton(image=(gui.find('**/ChtBx_ChtBtn_UP'),
                                            gui.find('**/ChtBx_ChtBtn_DN'),
                                            gui.find('**/ChtBx_ChtBtn_RLVR')),
                                     pos=TTLocalizer.TCMscButtonPos,
                                     parent=base.a2dTopLeft,
                                     scale=1.179,
                                     relief=None,
                                     image_color=Vec4(0.75, 1, 0.6, 1),
                                     text=('',
                                           OTPLocalizer.GlobalSpeedChatName,
                                           OTPLocalizer.GlobalSpeedChatName),
                                     text_scale=TTLocalizer.TCMscButton,
                                     text_fg=Vec4(1, 1, 1, 1),
                                     text_shadow=Vec4(0, 0, 0, 1),
                                     text_pos=(0, -0.09),
                                     textMayChange=0,
                                     sortOrder=DGG.FOREGROUND_SORT_INDEX,
                                     command=self.__scButtonPressed,
                                     clickSound=self.openScSfx)
        self.scButton.hide()
        self.whisperFrame = DirectFrame(
            parent=base.a2dTopCenter,
            relief=None,
            image=DGG.getDefaultDialogGeom(),
            image_scale=(0.45, 0.45, 0.45),
            image_color=OTPGlobals.GlobalDialogColor,
            pos=(0, 0, -0.229),
            text=OTPLocalizer.ChatManagerWhisperTo,
            text_wordwrap=7.0,
            text_scale=TTLocalizer.TCMwhisperFrame,
            text_fg=Vec4(0, 0, 0, 1),
            text_pos=(0, 0.14),
            textMayChange=1,
            sortOrder=DGG.FOREGROUND_SORT_INDEX)
        self.whisperFrame.hide()
        self.whisperButton = DirectButton(
            parent=self.whisperFrame,
            image=(gui.find('**/ChtBx_ChtBtn_UP'),
                   gui.find('**/ChtBx_ChtBtn_DN'),
                   gui.find('**/ChtBx_ChtBtn_RLVR')),
            pos=(-0.125, 0, -0.1),
            scale=1.179,
            relief=None,
            image_color=Vec4(1, 1, 1, 1),
            text=('', OTPLocalizer.ChatManagerChat,
                  OTPLocalizer.ChatManagerChat, ''),
            image3_color=Vec4(0.6, 0.6, 0.6, 0.6),
            text_scale=TTLocalizer.TCMwhisperButton,
            text_fg=(0, 0, 0, 1),
            text_pos=(0, -0.09),
            textMayChange=0,
            command=self.__whisperButtonPressed)
        self.whisperScButton = DirectButton(
            parent=self.whisperFrame,
            image=(gui.find('**/ChtBx_ChtBtn_UP'),
                   gui.find('**/ChtBx_ChtBtn_DN'),
                   gui.find('**/ChtBx_ChtBtn_RLVR')),
            pos=(0.0, 0, -0.1),
            scale=1.179,
            relief=None,
            image_color=Vec4(0.75, 1, 0.6, 1),
            text=('', OTPLocalizer.GlobalSpeedChatName,
                  OTPLocalizer.GlobalSpeedChatName, ''),
            image3_color=Vec4(0.6, 0.6, 0.6, 0.6),
            text_scale=TTLocalizer.TCMwhisperScButton,
            text_fg=(0, 0, 0, 1),
            text_pos=(0, -0.09),
            textMayChange=0,
            command=self.__whisperScButtonPressed)
        self.whisperCancelButton = DirectButton(
            parent=self.whisperFrame,
            image=(gui.find('**/CloseBtn_UP'), gui.find('**/CloseBtn_DN'),
                   gui.find('**/CloseBtn_Rllvr')),
            pos=(0.125, 0, -0.1),
            scale=1.179,
            relief=None,
            text=('', OTPLocalizer.ChatManagerCancel,
                  OTPLocalizer.ChatManagerCancel),
            text_scale=0.05,
            text_fg=(0, 0, 0, 1),
            text_pos=(0, -0.09),
            textMayChange=0,
            command=self.__whisperCancelPressed)
        gui.removeNode()
        ChatManager.ChatManager.__init__(self, cr, localAvatar)
        self.defaultToWhiteList = base.config.GetBool('white-list-is-default',
                                                      1)
        self.chatInputSpeedChat = TTChatInputSpeedChat(self)
        self.normalPos = Vec3(0.25, 0, -0.196)
        self.whisperPos = Vec3(3.4, 0, -0.796)
        self.speedChatPlusPos = Vec3(-0.35, 0, 0.71)
        self.chatInputWhiteList = TTChatInputWhiteList()
        if self.defaultToWhiteList:
            self.chatInputNormal = self.chatInputWhiteList
            self.chatInputNormal.setPos(self.normalPos)
            self.chatInputNormal.desc = 'chatInputNormal'
        else:
            self.chatInputNormal = TTChatInputNormal(self)
        self.chatInputWhiteList.setPos(self.speedChatPlusPos)
        self.chatInputWhiteList.reparentTo(base.a2dTopLeft)
        self.chatInputWhiteList.desc = 'chatInputWhiteList'
        return

    def delete(self):
        ChatManager.ChatManager.delete(self)
        loader.unloadModel('phase_3.5/models/gui/chat_input_gui')
        self.normalButton.destroy()
        del self.normalButton
        self.scButton.destroy()
        del self.scButton
        del self.openScSfx
        self.whisperFrame.destroy()
        del self.whisperFrame
        self.whisperButton.destroy()
        del self.whisperButton
        self.whisperScButton.destroy()
        del self.whisperScButton
        self.whisperCancelButton.destroy()
        del self.whisperCancelButton
        self.chatInputWhiteList.destroy()
        del self.chatInputWhiteList

    def sendSCResistanceChatMessage(self, textId):
        messenger.send('chatUpdateSCResistance', [textId])
        self.announceSCChat()

    def sendSCSingingChatMessage(self, textId):
        messenger.send('chatUpdateSCSinging', [textId])
        self.announceSCChat()

    def sendSCSingingWhisperMessage(self, textId):
        pass

    def sendSCToontaskChatMessage(self, taskId, toNpcId, toonProgress,
                                  msgIndex):
        messenger.send('chatUpdateSCToontask',
                       [taskId, toNpcId, toonProgress, msgIndex])
        self.announceSCChat()

    def sendSCToontaskWhisperMessage(self, taskId, toNpcId, toonProgress,
                                     msgIndex, whisperAvatarId, toPlayer):
        if toPlayer:
            base.talkAssistant.sendPlayerWhisperToonTaskSpeedChat(
                taskId, toNpcId, toonProgress, msgIndex, whisperAvatarId)
        else:
            messenger.send(
                'whisperUpdateSCToontask',
                [taskId, toNpcId, toonProgress, msgIndex, whisperAvatarId])

    def enterOpenChatWarning(self):
        if self.openChatWarning == None:
            buttons = loader.loadModel(
                'phase_3/models/gui/dialog_box_buttons_gui')
            buttonImage = (buttons.find('**/ChtBx_OKBtn_UP'),
                           buttons.find('**/ChtBx_OKBtn_DN'),
                           buttons.find('**/ChtBx_OKBtn_Rllvr'))
            self.openChatWarning = DirectFrame(
                parent=aspect2dp,
                pos=(0.0, 0.1, 0.2),
                relief=None,
                image=DGG.getDefaultDialogGeom(),
                image_color=OTPGlobals.GlobalDialogColor,
                image_scale=(1.2, 1.0, 1.4),
                text=OTPLocalizer.OpenChatWarning,
                text_wordwrap=19,
                text_scale=TTLocalizer.TCMopenChatWarning,
                text_pos=(0.0, 0.575),
                textMayChange=0)
            DirectButton(self.openChatWarning,
                         image=buttonImage,
                         relief=None,
                         text=OTPLocalizer.OpenChatWarningOK,
                         text_scale=0.05,
                         text_pos=(0.0, -0.1),
                         textMayChange=0,
                         pos=(0.0, 0.0, -0.55),
                         command=self.__handleOpenChatWarningOK)
            buttons.removeNode()
        self.openChatWarning.show()
        normObs, scObs = self.isObscured()
        if not scObs:
            self.scButton.show()
        if not normObs:
            self.normalButton.show()
        return

    def enterMainMenu(self):
        self.chatInputNormal.setPos(self.normalPos)
        if self.chatInputWhiteList.isActive():
            self.notify.debug('enterMainMenu calling checkObscured')
            ChatManager.ChatManager.checkObscurred(self)
        else:
            ChatManager.ChatManager.enterMainMenu(self)

    def exitOpenChatWarning(self):
        self.openChatWarning.hide()
        self.scButton.hide()

    def enterUnpaidChatWarning(self):
        self.forceHidePayButton = False
        if base.cr.productName in ['DisneyOnline-UK', 'JP', 'DE', 'BR', 'FR']:
            directFrameText = OTPLocalizer.PaidParentPasswordUKWarning
            payButtonText = OTPLocalizer.PaidParentPasswordUKWarningSet
            directButtonText = OTPLocalizer.PaidParentPasswordUKWarningContinue
        else:
            directFrameText = OTPLocalizer.PaidNoParentPasswordWarning
            payButtonText = OTPLocalizer.PaidNoParentPasswordWarningSet
            directButtonText = OTPLocalizer.PaidNoParentPasswordWarningContinue
            if 'QuickLauncher' not in str(
                    base.cr.launcher.__class__) and not base.cr.isPaid():
                directFrameText = OTPLocalizer.UnpaidNoParentPasswordWarning
                self.forceHidePayButton = True
        if self.unpaidChatWarning == None:
            guiButton = loader.loadModel('phase_3/models/gui/quit_button')
            buttonImage = (guiButton.find('**/QuitBtn_UP'),
                           guiButton.find('**/QuitBtn_DN'),
                           guiButton.find('**/QuitBtn_RLVR'))
            self.unpaidChatWarning = DirectFrame(
                parent=aspect2dp,
                pos=(0.0, 0.1, 0.4),
                relief=None,
                image=DGG.getDefaultDialogGeom(),
                image_color=OTPGlobals.GlobalDialogColor,
                image_scale=(1.2, 1.0, 0.8),
                text=directFrameText,
                text_wordwrap=TTLocalizer.TCMunpaidChatWarningWordwrap,
                text_scale=TTLocalizer.TCMunpaidChatWarning,
                text_pos=TTLocalizer.TCMunpaidChatWarningPos,
                textMayChange=0)
            self.payButton = DirectButton(
                self.unpaidChatWarning,
                image=buttonImage,
                relief=None,
                text=payButtonText,
                image_scale=(1.75, 1, 1.15),
                text_scale=TTLocalizer.TCMpayButton,
                text_pos=(0, -0.02),
                textMayChange=0,
                pos=TTLocalizer.TCMpayButtonPos,
                command=self.__handleUnpaidChatWarningPay)
            DirectButton(self.unpaidChatWarning,
                         image=buttonImage,
                         relief=None,
                         text=directButtonText,
                         textMayChange=0,
                         image_scale=(1.75, 1, 1.15),
                         text_scale=0.06,
                         text_pos=(0, -0.02),
                         pos=TTLocalizer.TCMdirectButtonTextPos,
                         command=self.__handleUnpaidChatWarningContinue)
            guiButton.removeNode()
        if base.localAvatar.cantLeaveGame or self.forceHidePayButton:
            self.payButton.hide()
        else:
            self.payButton.show()
        if base.cr.productName not in ['ES', 'JP', 'DE', 'BR', 'FR']:
            self.unpaidChatWarning.show()
        else:
            place = base.cr.playGame.getPlace()
            if place:
                place.fsm.request('stopped')
            self.teaser = TeaserPanel.TeaserPanel(
                'secretChat', self.__handleUnpaidChatWarningDone)
            if base.localAvatar.inTutorial:
                self.teaser.hidePay()
        normObs, scObs = self.isObscured()
        if not scObs:
            self.scButton.show()
        if not normObs:
            self.normalButton.show()
        return

    def exitUnpaidChatWarning(self):
        if self.unpaidChatWarning:
            self.unpaidChatWarning.hide()
        self.scButton.hide()

    def enterNoSecretChatAtAll(self):
        if self.noSecretChatAtAll == None:
            buttons = loader.loadModel(
                'phase_3/models/gui/dialog_box_buttons_gui')
            okButtonImage = (buttons.find('**/ChtBx_OKBtn_UP'),
                             buttons.find('**/ChtBx_OKBtn_DN'),
                             buttons.find('**/ChtBx_OKBtn_Rllvr'))
            self.noSecretChatAtAll = DirectFrame(
                parent=aspect2dp,
                pos=(0.0, 0.1, 0.2),
                relief=None,
                image=DGG.getDefaultDialogGeom(),
                image_color=OTPGlobals.GlobalDialogColor,
                image_scale=(1.4, 1.0, 1.1),
                text=OTPLocalizer.NoSecretChatAtAll,
                text_wordwrap=20,
                textMayChange=0,
                text_scale=0.06,
                text_pos=(0, 0.3))
            DirectLabel(parent=self.noSecretChatAtAll,
                        relief=None,
                        pos=(0, 0, 0.4),
                        text=OTPLocalizer.NoSecretChatAtAllTitle,
                        textMayChange=0,
                        text_scale=0.08)
            DirectButton(self.noSecretChatAtAll,
                         image=okButtonImage,
                         relief=None,
                         text=OTPLocalizer.NoSecretChatAtAllOK,
                         text_scale=0.05,
                         text_pos=(0.0, -0.1),
                         textMayChange=0,
                         pos=(0.0, 0.0, -0.4),
                         command=self.__handleNoSecretChatAtAllOK)
            buttons.removeNode()
        self.noSecretChatAtAll.show()
        return

    def exitNoSecretChatAtAll(self):
        self.noSecretChatAtAll.hide()

    def enterNoSecretChatWarning(self, passwordOnly=0):
        if not passwordOnly:
            warningText = OTPLocalizer.NoSecretChatWarning
        else:
            warningText = OTPLocalizer.ChangeSecretFriendsOptionsWarning
        if self.noSecretChatWarning == None:
            buttons = loader.loadModel(
                'phase_3/models/gui/dialog_box_buttons_gui')
            nameBalloon = loader.loadModel(
                'phase_3/models/props/chatbox_input')
            okButtonImage = (buttons.find('**/ChtBx_OKBtn_UP'),
                             buttons.find('**/ChtBx_OKBtn_DN'),
                             buttons.find('**/ChtBx_OKBtn_Rllvr'))
            cancelButtonImage = (buttons.find('**/CloseBtn_UP'),
                                 buttons.find('**/CloseBtn_DN'),
                                 buttons.find('**/CloseBtn_Rllvr'))
            if base.cr.productName != 'Terra-DMC':
                okPos = (-0.22, 0.0, -0.35)
                textPos = (0, 0.25)
                okCommand = self.__handleNoSecretChatWarningOK
            else:
                self.passwordEntry = None
                okPos = (0, 0, -0.35)
                textPos = (0, 0.125)
                okCommand = self.__handleNoSecretChatWarningCancel
            self.noSecretChatWarning = DirectFrame(
                parent=aspect2dp,
                pos=(0.0, 0.1, 0.2),
                relief=None,
                image=DGG.getDefaultDialogGeom(),
                image_color=OTPGlobals.GlobalDialogColor,
                image_scale=(1.4, 1.0, 1.0),
                text=warningText,
                text_wordwrap=20,
                text_scale=0.055,
                text_pos=textPos,
                textMayChange=1)
            DirectButton(self.noSecretChatWarning,
                         image=okButtonImage,
                         relief=None,
                         text=OTPLocalizer.NoSecretChatWarningOK,
                         text_scale=0.05,
                         text_pos=(0.0, -0.1),
                         textMayChange=0,
                         pos=okPos,
                         command=okCommand)
            DirectLabel(parent=self.noSecretChatWarning,
                        relief=None,
                        pos=(0, 0, 0.35),
                        text=OTPLocalizer.NoSecretChatWarningTitle,
                        textMayChange=0,
                        text_scale=0.08)
            if base.cr.productName != 'Terra-DMC':
                self.passwordLabel = DirectLabel(
                    parent=self.noSecretChatWarning,
                    relief=None,
                    pos=(-0.07, 0.0, -0.2),
                    text=OTPLocalizer.ParentPassword,
                    text_scale=0.06,
                    text_align=TextNode.ARight,
                    textMayChange=0)
                self.passwordEntry = DirectEntry(
                    parent=self.noSecretChatWarning,
                    relief=None,
                    image=nameBalloon,
                    image1_color=(0.8, 0.8, 0.8, 1.0),
                    scale=0.064,
                    pos=(0.0, 0.0, -0.2),
                    width=OTPGlobals.maxLoginWidth,
                    numLines=1,
                    focus=1,
                    cursorKeys=1,
                    obscured=1,
                    command=self.__handleNoSecretChatWarningOK)
                DirectButton(self.noSecretChatWarning,
                             image=cancelButtonImage,
                             relief=None,
                             text=OTPLocalizer.NoSecretChatWarningCancel,
                             text_scale=0.05,
                             text_pos=(0.0, -0.1),
                             textMayChange=1,
                             pos=(0.2, 0.0, -0.35),
                             command=self.__handleNoSecretChatWarningCancel)
            buttons.removeNode()
            nameBalloon.removeNode()
        else:
            self.noSecretChatWarning['text'] = warningText
            if self.passwordEntry:
                self.passwordEntry['focus'] = 1
                self.passwordEntry.enterText('')
        self.noSecretChatWarning.show()
        return

    def exitNoSecretChatWarning(self):
        self.noSecretChatWarning.hide()

    def enterActivateChat(self):
        if self.activateChatGui == None:
            guiButton = loader.loadModel('phase_3/models/gui/quit_button')
            buttons = loader.loadModel(
                'phase_3/models/gui/dialog_box_buttons_gui')
            okButtonImage = (buttons.find('**/ChtBx_OKBtn_UP'),
                             buttons.find('**/ChtBx_OKBtn_DN'),
                             buttons.find('**/ChtBx_OKBtn_Rllvr'))
            cancelButtonImage = (buttons.find('**/CloseBtn_UP'),
                                 buttons.find('**/CloseBtn_DN'),
                                 buttons.find('**/CloseBtn_Rllvr'))
            moreButtonImage = (guiButton.find('**/QuitBtn_UP'),
                               guiButton.find('**/QuitBtn_DN'),
                               guiButton.find('**/QuitBtn_RLVR'))
            nameShopGui = loader.loadModel('phase_3/models/gui/nameshop_gui')
            circle = nameShopGui.find('**/namePanelCircle')
            self.activateChatGui = DirectFrame(
                parent=aspect2dp,
                pos=(0.0, 0.1, 0.2),
                relief=None,
                image=DGG.getDefaultDialogGeom(),
                image_color=OTPGlobals.GlobalDialogColor,
                image_scale=(1.8, 1.0, 1.6),
                text=OTPLocalizer.ActivateChat,
                text_align=TextNode.ALeft,
                text_wordwrap=33,
                text_scale=TTLocalizer.TCMactivateChatGui,
                text_pos=(-0.82, 0.58),
                textMayChange=0)
            innerCircle = circle.copyTo(hidden)
            innerCircle.setPos(0, 0, 0.2)
            self.c1b = circle.copyTo(self.activateChatGui, -1)
            self.c1b.setColor(0, 0, 0, 1)
            self.c1b.setPos(-0.8, 0, 0.29)
            self.c1b.setScale(0.4)
            c1f = circle.copyTo(self.c1b)
            c1f.setColor(1, 1, 1, 1)
            c1f.setScale(0.8)
            self.c2b = circle.copyTo(self.activateChatGui, -2)
            self.c2b.setColor(0, 0, 0, 1)
            self.c2b.setPos(-0.8, 0, 0.14)
            self.c2b.setScale(0.4)
            c2f = circle.copyTo(self.c2b)
            c2f.setColor(1, 1, 1, 1)
            c2f.setScale(0.8)
            self.c3b = circle.copyTo(self.activateChatGui, -2)
            self.c3b.setColor(0, 0, 0, 1)
            self.c3b.setPos(-0.8, 0, -0.01)
            self.c3b.setScale(0.4)
            c3f = circle.copyTo(self.c3b)
            c3f.setColor(1, 1, 1, 1)
            c3f.setScale(0.8)
            DirectLabel(self.activateChatGui,
                        relief=None,
                        text=OTPLocalizer.ActivateChatTitle,
                        text_align=TextNode.ACenter,
                        text_scale=0.07,
                        text_pos=(0, 0.7),
                        textMayChange=0)
            if base.cr.productName != 'JP':
                DirectButton(self.activateChatGui,
                             image=moreButtonImage,
                             image_scale=(1.25, 1.0, 1.0),
                             relief=None,
                             text=OTPLocalizer.ActivateChatMoreInfo,
                             text_scale=0.06,
                             text_pos=(0, -0.02),
                             textMayChange=0,
                             pos=(0.0, 0.0, -0.7),
                             command=self.__handleActivateChatMoreInfo)
            self.dcb1 = HackedDirectRadioButton(
                parent=self.activateChatGui,
                relief=None,
                scale=0.1,
                boxImage=innerCircle,
                boxImageScale=2.5,
                boxImageColor=VBase4(0, 0.25, 0.5, 1),
                boxRelief=None,
                pos=(-0.745, 0, 0.297),
                command=self.__updateCheckBoxen,
                extraArgs=[1])
            self.dcb2 = HackedDirectRadioButton(
                parent=self.activateChatGui,
                relief=None,
                scale=0.1,
                boxImage=innerCircle,
                boxImageScale=2.5,
                boxImageColor=VBase4(0, 0.25, 0.5, 1),
                boxRelief=None,
                pos=(-0.745, 0, 0.147),
                command=self.__updateCheckBoxen,
                extraArgs=[2])
            self.dcb3 = HackedDirectRadioButton(
                parent=self.activateChatGui,
                relief=None,
                scale=0.1,
                boxImage=innerCircle,
                boxImageScale=2.5,
                boxImageColor=VBase4(0, 0.25, 0.5, 1),
                boxRelief=None,
                pos=(-0.745, 0, -0.003),
                command=self.__updateCheckBoxen,
                extraArgs=[3])
            DirectButton(self.activateChatGui,
                         image=okButtonImage,
                         relief=None,
                         text=OTPLocalizer.ActivateChatYes,
                         text_scale=0.05,
                         text_pos=(0.0, -0.1),
                         textMayChange=0,
                         pos=(-0.35, 0.0, -0.27),
                         command=self.__handleActivateChatYes)
            DirectButton(self.activateChatGui,
                         image=cancelButtonImage,
                         relief=None,
                         text=OTPLocalizer.ActivateChatNo,
                         text_scale=0.05,
                         text_pos=(0.0, -0.1),
                         textMayChange=0,
                         pos=(0.35, 0.0, -0.27),
                         command=self.__handleActivateChatNo)
            guiButton.removeNode()
            buttons.removeNode()
            nameShopGui.removeNode()
            innerCircle.removeNode()
        self.__initializeCheckBoxen()
        self.activateChatGui.show()
        return

    def __initializeCheckBoxen(self):
        if base.cr.secretChatAllowed and not base.cr.secretChatNeedsParentPassword:
            self.dcb1['indicatorValue'] = 0
            self.dcb2['indicatorValue'] = 0
            self.dcb3['indicatorValue'] = 1
        elif base.cr.secretChatAllowed and base.cr.secretChatNeedsParentPassword:
            self.dcb1['indicatorValue'] = 0
            self.dcb2['indicatorValue'] = 1
            self.dcb3['indicatorValue'] = 0
        else:
            self.dcb1['indicatorValue'] = 1
            self.dcb2['indicatorValue'] = 0
            self.dcb3['indicatorValue'] = 0

    def __updateCheckBoxen(self, value, checkBox):
        if value == 0:
            return
        if checkBox == 1:
            self.dcb2['indicatorValue'] = 0
            self.dcb3['indicatorValue'] = 0
        elif checkBox == 2:
            self.dcb1['indicatorValue'] = 0
            self.dcb3['indicatorValue'] = 0
        else:
            self.dcb1['indicatorValue'] = 0
            self.dcb2['indicatorValue'] = 0

    def exitActivateChat(self):
        self.activateChatGui.hide()

    def enterSecretChatActivated(self, mode=2):
        if mode == 0:
            modeText = OTPLocalizer.SecretChatDeactivated
        elif mode == 1:
            modeText = OTPLocalizer.RestrictedSecretChatActivated
        else:
            modeText = OTPLocalizer.SecretChatActivated
        if self.secretChatActivated == None:
            guiButton = loader.loadModel('phase_3/models/gui/quit_button')
            optionsButtonImage = (guiButton.find('**/QuitBtn_UP'),
                                  guiButton.find('**/QuitBtn_DN'),
                                  guiButton.find('**/QuitBtn_RLVR'))
            buttons = loader.loadModel(
                'phase_3/models/gui/dialog_box_buttons_gui')
            buttonImage = (buttons.find('**/ChtBx_OKBtn_UP'),
                           buttons.find('**/ChtBx_OKBtn_DN'),
                           buttons.find('**/ChtBx_OKBtn_Rllvr'))
            self.secretChatActivated = DirectFrame(
                parent=aspect2dp,
                pos=(0.0, 0.1, 0.4),
                relief=None,
                image=DGG.getDefaultDialogGeom(),
                image_color=OTPGlobals.GlobalDialogColor,
                image_scale=(1.0, 1.0, 0.8),
                text=modeText,
                text_align=TextNode.ACenter,
                text_wordwrap=14,
                text_scale=TTLocalizer.TCMsecretChatActivated,
                text_pos=(0, 0.25))
            DirectButton(self.secretChatActivated,
                         image=buttonImage,
                         relief=None,
                         text=OTPLocalizer.SecretChatActivatedOK,
                         text_scale=0.05,
                         text_pos=(0.0, -0.1),
                         textMayChange=0,
                         pos=(0.0, 0.0, -0.1),
                         command=self.__handleSecretChatActivatedOK)
            buttons.removeNode()
            guiButton.removeNode()
        else:
            self.secretChatActivated['text'] = modeText
        self.secretChatActivated.show()
        return

    def exitSecretChatActivated(self):
        self.secretChatActivated.hide()

    def enterProblemActivatingChat(self):
        if self.problemActivatingChat == None:
            buttons = loader.loadModel(
                'phase_3/models/gui/dialog_box_buttons_gui')
            buttonImage = (buttons.find('**/ChtBx_OKBtn_UP'),
                           buttons.find('**/ChtBx_OKBtn_DN'),
                           buttons.find('**/ChtBx_OKBtn_Rllvr'))
            self.problemActivatingChat = DirectFrame(
                parent=aspect2dp,
                pos=(0.0, 0.1, 0.4),
                relief=None,
                image=DGG.getDefaultDialogGeom(),
                image_color=OTPGlobals.GlobalDialogColor,
                image_scale=(1.2, 1.0, 0.9),
                text='',
                text_align=TextNode.ALeft,
                text_wordwrap=18,
                text_scale=0.06,
                text_pos=(-0.5, 0.28),
                textMayChange=1)
            DirectButton(self.problemActivatingChat,
                         image=buttonImage,
                         relief=None,
                         text=OTPLocalizer.ProblemActivatingChatOK,
                         text_scale=0.05,
                         text_pos=(0.0, -0.1),
                         textMayChange=0,
                         pos=(0.0, 0.0, -0.28),
                         command=self.__handleProblemActivatingChatOK)
            buttons.removeNode()
        self.problemActivatingChat.show()
        return

    def exitProblemActivatingChat(self):
        self.problemActivatingChat.hide()

    def __normalButtonPressed(self):
        if base.config.GetBool('want-qa-regression', 0):
            self.notify.info('QA-REGRESSION: CHAT: Speedchat Plus')
        messenger.send('wakeup')
        self.fsm.request('normalChat')

    def __scButtonPressed(self):
        if base.config.GetBool('want-qa-regression', 0):
            self.notify.info('QA-REGRESSION: CHAT: Speedchat')
        messenger.send('wakeup')
        if self.fsm.getCurrentState().getName() == 'speedChat':
            self.fsm.request('mainMenu')
        else:
            self.fsm.request('speedChat')

    def __whisperButtonPressed(self, avatarName, avatarId, playerId):
        print 'Whisper button was pressed'
        messenger.send('wakeup')
        if playerId:
            playerInfo = base.cr.playerFriendsManager.getFriendInfo(playerId)
        if avatarId:
            self.enterWhisperChat(avatarName, avatarId)
        return

    def enterNormalChat(self):
        result = ChatManager.ChatManager.enterNormalChat(self)
        if result == None:
            self.notify.warning(
                'something went wrong in enterNormalChat, falling back to main menu'
            )
            self.fsm.request('mainMenu')
        return

    def enterWhisperChatPlayer(self, avatarName, playerId):
        result = ChatManager.ChatManager.enterWhisperChatPlayer(
            self, avatarName, playerId)
        self.chatInputNormal.setPos(self.whisperPos)
        if result == None:
            print 'failed!'
            self.notify.warning(
                'something went wrong in enterWhisperChatPlayer, falling back to main menu'
            )
            self.fsm.request('mainMenu')
        return

    def enterWhisperChat(self, avatarName, avatarId):
        result = ChatManager.ChatManager.enterWhisperChat(
            self, avatarName, avatarId)
        #self.chatInputNormal.setPos(0.238, 0, -0.267)
        self.fsm.request('mainMenu')
        return

    def enterNoSecretChatAtAllAndNoWhitelist(self):
        if self.noSecretChatAtAllAndNoWhitelist == None:
            buttons = loader.loadModel(
                'phase_3/models/gui/dialog_box_buttons_gui')
            okButtonImage = (buttons.find('**/ChtBx_OKBtn_UP'),
                             buttons.find('**/ChtBx_OKBtn_DN'),
                             buttons.find('**/ChtBx_OKBtn_Rllvr'))
            self.noSecretChatAtAllAndNoWhitelist = DirectFrame(
                parent=aspect2dp,
                pos=(0.0, 0.1, 0.05),
                relief=None,
                image=DGG.getDefaultDialogGeom(),
                image_color=OTPGlobals.GlobalDialogColor,
                image_scale=(1.4, 1.0, 1.58),
                text=OTPLocalizer.NoSecretChatAtAllAndNoWhitelist,
                text_wordwrap=20,
                textMayChange=0,
                text_scale=0.06,
                text_pos=(0, 0.55))
            DirectLabel(parent=self.noSecretChatAtAllAndNoWhitelist,
                        relief=None,
                        pos=(0, 0, 0.67),
                        text=OTPLocalizer.NoSecretChatAtAllAndNoWhitelistTitle,
                        textMayChange=0,
                        text_scale=0.08)
            DirectButton(self.noSecretChatAtAllAndNoWhitelist,
                         image=okButtonImage,
                         relief=None,
                         text=OTPLocalizer.NoSecretChatAtAllOK,
                         text_scale=0.05,
                         text_pos=(0.0, -0.1),
                         textMayChange=0,
                         pos=(0.0, 0.0, -0.64),
                         command=self.__handleNoSecretChatAtAllOK)
            buttons.removeNode()
        self.noSecretChatAtAllAndNoWhitelist.show()
        return

    def exitNoSecretChatAtAllAndNoWhitelist(self):
        self.noSecretChatAtAllAndNoWhitelist.hide()

    def enterTrueFriendTeaserPanel(self):
        self.previousStateBeforeTeaser = None
        place = base.cr.playGame.getPlace()
        if place:
            if place.fsm.hasStateNamed('stopped'):
                self.previousStateBeforeTeaser = place.fsm.getCurrentState(
                ).getName()
                place.fsm.request('stopped')
            else:
                self.notify.warning("Enter: %s has no 'stopped' state." %
                                    place)
        self.teaser = TeaserPanel.TeaserPanel(pageName='secretChat',
                                              doneFunc=self.handleOkTeaser)
        return

    def exitTrueFriendTeaserPanel(self):
        self.teaser.destroy()
        place = base.cr.playGame.getPlace()
        if place:
            if place.fsm.hasStateNamed('stopped'):
                if self.previousStateBeforeTeaser:
                    place.fsm.request(self.previousStateBeforeTeaser, force=1)
                else:
                    place.fsm.request('walk')
            else:
                self.notify.warning("Exit: %s has no 'stopped' state." % place)

    def handleOkTeaser(self):
        self.fsm.request('mainMenu')

    def __whisperScButtonPressed(self, avatarName, avatarId, playerId):
        if base.config.GetBool('want-qa-regression', 0):
            self.notify.info('QA-REGRESSION: CHAT: Whisper')
        messenger.send('wakeup')
        hasManager = hasattr(base.cr, 'playerFriendsManager')
        transientFriend = 0
        if hasManager:
            transientFriend = base.cr.playerFriendsManager.askTransientFriend(
                avatarId)
            if transientFriend:
                playerId = base.cr.playerFriendsManager.findPlayerIdFromAvId(
                    avatarId)
        if avatarId and not transientFriend:
            if self.fsm.getCurrentState().getName() == 'whisperSpeedChat':
                self.fsm.request('whisper', [avatarName, avatarId, playerId])
            else:
                self.fsm.request('whisperSpeedChat', [avatarId])
        elif playerId:
            if self.fsm.getCurrentState().getName(
            ) == 'whisperSpeedChatPlayer':
                self.fsm.request('whisper', [avatarName, avatarId, playerId])
            else:
                self.fsm.request('whisperSpeedChatPlayer', [playerId])

    def __whisperCancelPressed(self):
        self.fsm.request('mainMenu')

    def __handleOpenChatWarningOK(self):
        self.fsm.request('mainMenu')

    def __handleUnpaidChatWarningDone(self):
        place = base.cr.playGame.getPlace()
        if place:
            place.handleBookClose()
        self.fsm.request('mainMenu')

    def __handleUnpaidChatWarningContinue(self):
        self.fsm.request('mainMenu')

    def __handleUnpaidChatWarningPay(self):
        if base.cr.isWebPlayToken():
            self.fsm.request('leaveToPayDialog')
        else:
            self.fsm.request('mainMenu')

    def __handleNoSecretChatAtAllOK(self):
        self.fsm.request('mainMenu')

    def __handleNoSecretChatWarningOK(self, *args):
        password = self.passwordEntry.get()
        tt = base.cr.loginInterface
        okflag, message = tt.authenticateParentPassword(
            base.cr.userName, base.cr.password, password)
        if okflag:
            self.fsm.request('activateChat')
        elif message:
            self.fsm.request('problemActivatingChat')
            self.problemActivatingChat[
                'text'] = OTPLocalizer.ProblemActivatingChat % message
        else:
            self.noSecretChatWarning[
                'text'] = OTPLocalizer.NoSecretChatWarningWrongPassword
            self.passwordEntry['focus'] = 1
            self.passwordEntry.enterText('')

    def __handleNoSecretChatWarningCancel(self):
        self.fsm.request('mainMenu')

    def __handleActivateChatYes(self):
        password = self.passwordEntry.get()
        tt = base.cr.loginInterface
        if self.dcb1['indicatorValue']:
            base.cr.secretChatAllowed = 0
            mode = 0
        elif self.dcb2['indicatorValue']:
            base.cr.secretChatAllowed = 1
            base.cr.secretChatNeedsParentPassword = 1
            mode = 1
        else:
            base.cr.secretChatAllowed = 1
            base.cr.secretChatNeedsParentPassword = 0
            mode = 2
        okflag, message = tt.enableSecretFriends(base.cr.userName,
                                                 base.cr.password, password)
        if okflag:
            tt.resendPlayToken()
            self.fsm.request('secretChatActivated', [mode])
        else:
            if message == None:
                message = 'Parent Password was invalid.'
            self.fsm.request('problemActivatingChat')
            self.problemActivatingChat[
                'text'] = OTPLocalizer.ProblemActivatingChat % message
        return

    def __handleActivateChatMoreInfo(self):
        self.fsm.request('chatMoreInfo')

    def __handleActivateChatNo(self):
        self.fsm.request('mainMenu')

    def __handleSecretChatActivatedOK(self):
        self.fsm.request('mainMenu')

    def __handleSecretChatActivatedChangeOptions(self):
        self.fsm.request('activateChat')

    def __handleProblemActivatingChatOK(self):
        self.fsm.request('mainMenu')

    def messageSent(self):
        pass

    def deactivateChat(self):
        pass
class ToontownChatManager(ChatManager.ChatManager):
    notify = DirectNotifyGlobal.directNotify.newCategory('ToontownChatManager')

    def __init__(self, cr, localAvatar):
        gui = loader.loadModel('phase_3.5/models/gui/chat_input_gui')
        self.normalButton = DirectButton(image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=(0.0683, 0, -0.072), parent=base.a2dTopLeft, scale=1.179, relief=None, image_color=Vec4(1, 1, 1, 1), text=('', OTPLocalizer.ChatManagerChat, OTPLocalizer.ChatManagerChat), text_align=TextNode.ALeft, text_scale=TTLocalizer.TCMnormalButton, text_fg=Vec4(1, 1, 1, 1), text_shadow=Vec4(0, 0, 0, 1), text_pos=(-0.0525, -0.09), textMayChange=0, sortOrder=DGG.FOREGROUND_SORT_INDEX, command=self.__normalButtonPressed)
        self.normalButton.hide()
        self.openScSfx = loader.loadSfx('phase_3.5/audio/sfx/GUI_quicktalker.ogg')
        self.openScSfx.setVolume(0.6)
        self.scButton = DirectButton(image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=TTLocalizer.TCMscButtonPos, parent=base.a2dTopLeft, scale=1.179, relief=None, image_color=Vec4(0.75, 1, 0.6, 1), text=('', OTPLocalizer.GlobalSpeedChatName, OTPLocalizer.GlobalSpeedChatName), text_scale=TTLocalizer.TCMscButton, text_fg=Vec4(1, 1, 1, 1), text_shadow=Vec4(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, sortOrder=DGG.FOREGROUND_SORT_INDEX, command=self.__scButtonPressed, clickSound=self.openScSfx)
        self.scButton.hide()
        self.whisperFrame = DirectFrame(parent=base.a2dTopCenter, relief=None, image=DGG.getDefaultDialogGeom(), image_scale=(0.45, 0.45, 0.45), image_color=OTPGlobals.GlobalDialogColor, pos=(0, 0, -0.229), text=OTPLocalizer.ChatManagerWhisperTo, text_wordwrap=7.0, text_scale=TTLocalizer.TCMwhisperFrame, text_fg=Vec4(0, 0, 0, 1), text_pos=(0, 0.14), textMayChange=1, sortOrder=DGG.FOREGROUND_SORT_INDEX)
        self.whisperFrame.hide()
        self.whisperButton = DirectButton(parent=self.whisperFrame, image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=(-0.125, 0, -0.1), scale=1.179, relief=None, image_color=Vec4(1, 1, 1, 1), text=('',
         OTPLocalizer.ChatManagerChat,
         OTPLocalizer.ChatManagerChat,
         ''), image3_color=Vec4(0.6, 0.6, 0.6, 0.6), text_scale=TTLocalizer.TCMwhisperButton, text_fg=(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, command=self.__whisperButtonPressed)
        self.whisperScButton = DirectButton(parent=self.whisperFrame, image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=(0.0, 0, -0.1), scale=1.179, relief=None, image_color=Vec4(0.75, 1, 0.6, 1), text=('',
         OTPLocalizer.GlobalSpeedChatName,
         OTPLocalizer.GlobalSpeedChatName,
         ''), image3_color=Vec4(0.6, 0.6, 0.6, 0.6), text_scale=TTLocalizer.TCMwhisperScButton, text_fg=(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, command=self.__whisperScButtonPressed)
        self.whisperCancelButton = DirectButton(parent=self.whisperFrame, image=(gui.find('**/CloseBtn_UP'), gui.find('**/CloseBtn_DN'), gui.find('**/CloseBtn_Rllvr')), pos=(0.125, 0, -0.1), scale=1.179, relief=None, text=('', OTPLocalizer.ChatManagerCancel, OTPLocalizer.ChatManagerCancel), text_scale=0.05, text_fg=(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, command=self.__whisperCancelPressed)
        gui.removeNode()
        ChatManager.ChatManager.__init__(self, cr, localAvatar)
        self.defaultToWhiteList = base.config.GetBool('white-list-is-default', 1)
        self.chatInputSpeedChat = TTChatInputSpeedChat(self)
        self.normalPos = Vec3(0.25, 0, -0.196)
        self.whisperPos = Vec3(3.4, 0, -0.796)
        self.speedChatPlusPos = Vec3(-0.35, 0, 0.71)
        self.chatInputWhiteList = TTChatInputWhiteList()
        if self.defaultToWhiteList:
            self.chatInputNormal = self.chatInputWhiteList
            self.chatInputNormal.setPos(self.normalPos)
            self.chatInputNormal.desc = 'chatInputNormal'
        else:
            self.chatInputNormal = TTChatInputNormal(self)
        self.chatInputWhiteList.setPos(self.speedChatPlusPos)
        self.chatInputWhiteList.reparentTo(base.a2dTopLeft)
        self.chatInputWhiteList.desc = 'chatInputWhiteList'
        return

    def delete(self):
        ChatManager.ChatManager.delete(self)
        loader.unloadModel('phase_3.5/models/gui/chat_input_gui')
        self.normalButton.destroy()
        del self.normalButton
        self.scButton.destroy()
        del self.scButton
        del self.openScSfx
        self.whisperFrame.destroy()
        del self.whisperFrame
        self.whisperButton.destroy()
        del self.whisperButton
        self.whisperScButton.destroy()
        del self.whisperScButton
        self.whisperCancelButton.destroy()
        del self.whisperCancelButton
        self.chatInputWhiteList.destroy()
        del self.chatInputWhiteList

    def sendSCResistanceChatMessage(self, textId):
        messenger.send('chatUpdateSCResistance', [textId])
        self.announceSCChat()

    def sendSCSingingChatMessage(self, textId):
        messenger.send('chatUpdateSCSinging', [textId])
        self.announceSCChat()

    def sendSCSingingWhisperMessage(self, textId):
        pass

    def sendSCToontaskChatMessage(self, taskId, toNpcId, toonProgress, msgIndex):
        messenger.send('chatUpdateSCToontask', [taskId,
         toNpcId,
         toonProgress,
         msgIndex])
        self.announceSCChat()

    def sendSCToontaskWhisperMessage(self, taskId, toNpcId, toonProgress, msgIndex, whisperAvatarId, toPlayer):
        if toPlayer:
            base.talkAssistant.sendPlayerWhisperToonTaskSpeedChat(taskId, toNpcId, toonProgress, msgIndex, whisperAvatarId)
        else:
            messenger.send('whisperUpdateSCToontask', [taskId,
             toNpcId,
             toonProgress,
             msgIndex,
             whisperAvatarId])

    def enterOpenChatWarning(self):
        if self.openChatWarning == None:
            buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui')
            buttonImage = (buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr'))
            self.openChatWarning = DirectFrame(parent=aspect2dp, pos=(0.0, 0.1, 0.2), relief=None, image=DGG.getDefaultDialogGeom(), image_color=OTPGlobals.GlobalDialogColor, image_scale=(1.2, 1.0, 1.4), text=OTPLocalizer.OpenChatWarning, text_wordwrap=19, text_scale=TTLocalizer.TCMopenChatWarning, text_pos=(0.0, 0.575), textMayChange=0)
            DirectButton(self.openChatWarning, image=buttonImage, relief=None, text=OTPLocalizer.OpenChatWarningOK, text_scale=0.05, text_pos=(0.0, -0.1), textMayChange=0, pos=(0.0, 0.0, -0.55), command=self.__handleOpenChatWarningOK)
            buttons.removeNode()
        self.openChatWarning.show()
        normObs, scObs = self.isObscured()
        if not scObs:
            self.scButton.show()
        if not normObs:
            self.normalButton.show()
        return

    def enterMainMenu(self):
        self.chatInputNormal.setPos(self.normalPos)
        if self.chatInputWhiteList.isActive():
            self.notify.debug('enterMainMenu calling checkObscured')
            ChatManager.ChatManager.checkObscurred(self)
        else:
            ChatManager.ChatManager.enterMainMenu(self)

    def exitOpenChatWarning(self):
        self.openChatWarning.hide()
        self.scButton.hide()

    def enterUnpaidChatWarning(self):
        self.forceHidePayButton = False
        if base.cr.productName in ['DisneyOnline-UK',
         'JP',
         'DE',
         'BR',
         'FR']:
            directFrameText = OTPLocalizer.PaidParentPasswordUKWarning
            payButtonText = OTPLocalizer.PaidParentPasswordUKWarningSet
            directButtonText = OTPLocalizer.PaidParentPasswordUKWarningContinue
        else:
            directFrameText = OTPLocalizer.PaidNoParentPasswordWarning
            payButtonText = OTPLocalizer.PaidNoParentPasswordWarningSet
            directButtonText = OTPLocalizer.PaidNoParentPasswordWarningContinue
            if 'QuickLauncher' not in str(base.cr.launcher.__class__) and not base.cr.isPaid():
                directFrameText = OTPLocalizer.UnpaidNoParentPasswordWarning
                self.forceHidePayButton = True
        if self.unpaidChatWarning == None:
            guiButton = loader.loadModel('phase_3/models/gui/quit_button')
            buttonImage = (guiButton.find('**/QuitBtn_UP'), guiButton.find('**/QuitBtn_DN'), guiButton.find('**/QuitBtn_RLVR'))
            self.unpaidChatWarning = DirectFrame(parent=aspect2dp, pos=(0.0, 0.1, 0.4), relief=None, image=DGG.getDefaultDialogGeom(), image_color=OTPGlobals.GlobalDialogColor, image_scale=(1.2, 1.0, 0.8), text=directFrameText, text_wordwrap=TTLocalizer.TCMunpaidChatWarningWordwrap, text_scale=TTLocalizer.TCMunpaidChatWarning, text_pos=TTLocalizer.TCMunpaidChatWarningPos, textMayChange=0)
            self.payButton = DirectButton(self.unpaidChatWarning, image=buttonImage, relief=None, text=payButtonText, image_scale=(1.75, 1, 1.15), text_scale=TTLocalizer.TCMpayButton, text_pos=(0, -0.02), textMayChange=0, pos=TTLocalizer.TCMpayButtonPos, command=self.__handleUnpaidChatWarningPay)
            DirectButton(self.unpaidChatWarning, image=buttonImage, relief=None, text=directButtonText, textMayChange=0, image_scale=(1.75, 1, 1.15), text_scale=0.06, text_pos=(0, -0.02), pos=TTLocalizer.TCMdirectButtonTextPos, command=self.__handleUnpaidChatWarningContinue)
            guiButton.removeNode()
        if base.localAvatar.cantLeaveGame or self.forceHidePayButton:
            self.payButton.hide()
        else:
            self.payButton.show()
        if base.cr.productName not in ['ES',
         'JP',
         'DE',
         'BR',
         'FR']:
            self.unpaidChatWarning.show()
        else:
            place = base.cr.playGame.getPlace()
            if place:
                place.fsm.request('stopped')
            self.teaser = TeaserPanel.TeaserPanel('secretChat', self.__handleUnpaidChatWarningDone)
            if base.localAvatar.inTutorial:
                self.teaser.hidePay()
        normObs, scObs = self.isObscured()
        if not scObs:
            self.scButton.show()
        if not normObs:
            self.normalButton.show()
        return

    def exitUnpaidChatWarning(self):
        if self.unpaidChatWarning:
            self.unpaidChatWarning.hide()
        self.scButton.hide()

    def enterNoSecretChatAtAll(self):
        if self.noSecretChatAtAll == None:
            buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui')
            okButtonImage = (buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr'))
            self.noSecretChatAtAll = DirectFrame(parent=aspect2dp, pos=(0.0, 0.1, 0.2), relief=None, image=DGG.getDefaultDialogGeom(), image_color=OTPGlobals.GlobalDialogColor, image_scale=(1.4, 1.0, 1.1), text=OTPLocalizer.NoSecretChatAtAll, text_wordwrap=20, textMayChange=0, text_scale=0.06, text_pos=(0, 0.3))
            DirectLabel(parent=self.noSecretChatAtAll, relief=None, pos=(0, 0, 0.4), text=OTPLocalizer.NoSecretChatAtAllTitle, textMayChange=0, text_scale=0.08)
            DirectButton(self.noSecretChatAtAll, image=okButtonImage, relief=None, text=OTPLocalizer.NoSecretChatAtAllOK, text_scale=0.05, text_pos=(0.0, -0.1), textMayChange=0, pos=(0.0, 0.0, -0.4), command=self.__handleNoSecretChatAtAllOK)
            buttons.removeNode()
        self.noSecretChatAtAll.show()
        return

    def exitNoSecretChatAtAll(self):
        self.noSecretChatAtAll.hide()

    def enterNoSecretChatWarning(self, passwordOnly = 0):
        if not passwordOnly:
            warningText = OTPLocalizer.NoSecretChatWarning
        else:
            warningText = OTPLocalizer.ChangeSecretFriendsOptionsWarning
        if self.noSecretChatWarning == None:
            buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui')
            nameBalloon = loader.loadModel('phase_3/models/props/chatbox_input')
            okButtonImage = (buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr'))
            cancelButtonImage = (buttons.find('**/CloseBtn_UP'), buttons.find('**/CloseBtn_DN'), buttons.find('**/CloseBtn_Rllvr'))
            if base.cr.productName != 'Terra-DMC':
                okPos = (-0.22, 0.0, -0.35)
                textPos = (0, 0.25)
                okCommand = self.__handleNoSecretChatWarningOK
            else:
                self.passwordEntry = None
                okPos = (0, 0, -0.35)
                textPos = (0, 0.125)
                okCommand = self.__handleNoSecretChatWarningCancel
            self.noSecretChatWarning = DirectFrame(parent=aspect2dp, pos=(0.0, 0.1, 0.2), relief=None, image=DGG.getDefaultDialogGeom(), image_color=OTPGlobals.GlobalDialogColor, image_scale=(1.4, 1.0, 1.0), text=warningText, text_wordwrap=20, text_scale=0.055, text_pos=textPos, textMayChange=1)
            DirectButton(self.noSecretChatWarning, image=okButtonImage, relief=None, text=OTPLocalizer.NoSecretChatWarningOK, text_scale=0.05, text_pos=(0.0, -0.1), textMayChange=0, pos=okPos, command=okCommand)
            DirectLabel(parent=self.noSecretChatWarning, relief=None, pos=(0, 0, 0.35), text=OTPLocalizer.NoSecretChatWarningTitle, textMayChange=0, text_scale=0.08)
            if base.cr.productName != 'Terra-DMC':
                self.passwordLabel = DirectLabel(parent=self.noSecretChatWarning, relief=None, pos=(-0.07, 0.0, -0.2), text=OTPLocalizer.ParentPassword, text_scale=0.06, text_align=TextNode.ARight, textMayChange=0)
                self.passwordEntry = DirectEntry(parent=self.noSecretChatWarning, relief=None, image=nameBalloon, image1_color=(0.8, 0.8, 0.8, 1.0), scale=0.064, pos=(0.0, 0.0, -0.2), width=OTPGlobals.maxLoginWidth, numLines=1, focus=1, cursorKeys=1, obscured=1, command=self.__handleNoSecretChatWarningOK)
                DirectButton(self.noSecretChatWarning, image=cancelButtonImage, relief=None, text=OTPLocalizer.NoSecretChatWarningCancel, text_scale=0.05, text_pos=(0.0, -0.1), textMayChange=1, pos=(0.2, 0.0, -0.35), command=self.__handleNoSecretChatWarningCancel)
            buttons.removeNode()
            nameBalloon.removeNode()
        else:
            self.noSecretChatWarning['text'] = warningText
            if self.passwordEntry:
                self.passwordEntry['focus'] = 1
                self.passwordEntry.enterText('')
        self.noSecretChatWarning.show()
        return

    def exitNoSecretChatWarning(self):
        self.noSecretChatWarning.hide()

    def enterActivateChat(self):
        if self.activateChatGui == None:
            guiButton = loader.loadModel('phase_3/models/gui/quit_button')
            buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui')
            okButtonImage = (buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr'))
            cancelButtonImage = (buttons.find('**/CloseBtn_UP'), buttons.find('**/CloseBtn_DN'), buttons.find('**/CloseBtn_Rllvr'))
            moreButtonImage = (guiButton.find('**/QuitBtn_UP'), guiButton.find('**/QuitBtn_DN'), guiButton.find('**/QuitBtn_RLVR'))
            nameShopGui = loader.loadModel('phase_3/models/gui/nameshop_gui')
            circle = nameShopGui.find('**/namePanelCircle')
            self.activateChatGui = DirectFrame(parent=aspect2dp, pos=(0.0, 0.1, 0.2), relief=None, image=DGG.getDefaultDialogGeom(), image_color=OTPGlobals.GlobalDialogColor, image_scale=(1.8, 1.0, 1.6), text=OTPLocalizer.ActivateChat, text_align=TextNode.ALeft, text_wordwrap=33, text_scale=TTLocalizer.TCMactivateChatGui, text_pos=(-0.82, 0.58), textMayChange=0)
            innerCircle = circle.copyTo(hidden)
            innerCircle.setPos(0, 0, 0.2)
            self.c1b = circle.copyTo(self.activateChatGui, -1)
            self.c1b.setColor(0, 0, 0, 1)
            self.c1b.setPos(-0.8, 0, 0.29)
            self.c1b.setScale(0.4)
            c1f = circle.copyTo(self.c1b)
            c1f.setColor(1, 1, 1, 1)
            c1f.setScale(0.8)
            self.c2b = circle.copyTo(self.activateChatGui, -2)
            self.c2b.setColor(0, 0, 0, 1)
            self.c2b.setPos(-0.8, 0, 0.14)
            self.c2b.setScale(0.4)
            c2f = circle.copyTo(self.c2b)
            c2f.setColor(1, 1, 1, 1)
            c2f.setScale(0.8)
            self.c3b = circle.copyTo(self.activateChatGui, -2)
            self.c3b.setColor(0, 0, 0, 1)
            self.c3b.setPos(-0.8, 0, -0.01)
            self.c3b.setScale(0.4)
            c3f = circle.copyTo(self.c3b)
            c3f.setColor(1, 1, 1, 1)
            c3f.setScale(0.8)
            DirectLabel(self.activateChatGui, relief=None, text=OTPLocalizer.ActivateChatTitle, text_align=TextNode.ACenter, text_scale=0.07, text_pos=(0, 0.7), textMayChange=0)
            if base.cr.productName != 'JP':
                DirectButton(self.activateChatGui, image=moreButtonImage, image_scale=(1.25, 1.0, 1.0), relief=None, text=OTPLocalizer.ActivateChatMoreInfo, text_scale=0.06, text_pos=(0, -0.02), textMayChange=0, pos=(0.0, 0.0, -0.7), command=self.__handleActivateChatMoreInfo)
            self.dcb1 = HackedDirectRadioButton(parent=self.activateChatGui, relief=None, scale=0.1, boxImage=innerCircle, boxImageScale=2.5, boxImageColor=VBase4(0, 0.25, 0.5, 1), boxRelief=None, pos=(-0.745, 0, 0.297), command=self.__updateCheckBoxen, extraArgs=[1])
            self.dcb2 = HackedDirectRadioButton(parent=self.activateChatGui, relief=None, scale=0.1, boxImage=innerCircle, boxImageScale=2.5, boxImageColor=VBase4(0, 0.25, 0.5, 1), boxRelief=None, pos=(-0.745, 0, 0.147), command=self.__updateCheckBoxen, extraArgs=[2])
            self.dcb3 = HackedDirectRadioButton(parent=self.activateChatGui, relief=None, scale=0.1, boxImage=innerCircle, boxImageScale=2.5, boxImageColor=VBase4(0, 0.25, 0.5, 1), boxRelief=None, pos=(-0.745, 0, -0.003), command=self.__updateCheckBoxen, extraArgs=[3])
            DirectButton(self.activateChatGui, image=okButtonImage, relief=None, text=OTPLocalizer.ActivateChatYes, text_scale=0.05, text_pos=(0.0, -0.1), textMayChange=0, pos=(-0.35, 0.0, -0.27), command=self.__handleActivateChatYes)
            DirectButton(self.activateChatGui, image=cancelButtonImage, relief=None, text=OTPLocalizer.ActivateChatNo, text_scale=0.05, text_pos=(0.0, -0.1), textMayChange=0, pos=(0.35, 0.0, -0.27), command=self.__handleActivateChatNo)
            guiButton.removeNode()
            buttons.removeNode()
            nameShopGui.removeNode()
            innerCircle.removeNode()
        self.__initializeCheckBoxen()
        self.activateChatGui.show()
        return

    def __initializeCheckBoxen(self):
        if base.cr.secretChatAllowed and not base.cr.secretChatNeedsParentPassword:
            self.dcb1['indicatorValue'] = 0
            self.dcb2['indicatorValue'] = 0
            self.dcb3['indicatorValue'] = 1
        elif base.cr.secretChatAllowed and base.cr.secretChatNeedsParentPassword:
            self.dcb1['indicatorValue'] = 0
            self.dcb2['indicatorValue'] = 1
            self.dcb3['indicatorValue'] = 0
        else:
            self.dcb1['indicatorValue'] = 1
            self.dcb2['indicatorValue'] = 0
            self.dcb3['indicatorValue'] = 0

    def __updateCheckBoxen(self, value, checkBox):
        if value == 0:
            return
        if checkBox == 1:
            self.dcb2['indicatorValue'] = 0
            self.dcb3['indicatorValue'] = 0
        elif checkBox == 2:
            self.dcb1['indicatorValue'] = 0
            self.dcb3['indicatorValue'] = 0
        else:
            self.dcb1['indicatorValue'] = 0
            self.dcb2['indicatorValue'] = 0

    def exitActivateChat(self):
        self.activateChatGui.hide()

    def enterSecretChatActivated(self, mode = 2):
        if mode == 0:
            modeText = OTPLocalizer.SecretChatDeactivated
        elif mode == 1:
            modeText = OTPLocalizer.RestrictedSecretChatActivated
        else:
            modeText = OTPLocalizer.SecretChatActivated
        if self.secretChatActivated == None:
            guiButton = loader.loadModel('phase_3/models/gui/quit_button')
            optionsButtonImage = (guiButton.find('**/QuitBtn_UP'), guiButton.find('**/QuitBtn_DN'), guiButton.find('**/QuitBtn_RLVR'))
            buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui')
            buttonImage = (buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr'))
            self.secretChatActivated = DirectFrame(parent=aspect2dp, pos=(0.0, 0.1, 0.4), relief=None, image=DGG.getDefaultDialogGeom(), image_color=OTPGlobals.GlobalDialogColor, image_scale=(1.0, 1.0, 0.8), text=modeText, text_align=TextNode.ACenter, text_wordwrap=14, text_scale=TTLocalizer.TCMsecretChatActivated, text_pos=(0, 0.25))
            DirectButton(self.secretChatActivated, image=buttonImage, relief=None, text=OTPLocalizer.SecretChatActivatedOK, text_scale=0.05, text_pos=(0.0, -0.1), textMayChange=0, pos=(0.0, 0.0, -0.1), command=self.__handleSecretChatActivatedOK)
            buttons.removeNode()
            guiButton.removeNode()
        else:
            self.secretChatActivated['text'] = modeText
        self.secretChatActivated.show()
        return

    def exitSecretChatActivated(self):
        self.secretChatActivated.hide()

    def enterProblemActivatingChat(self):
        if self.problemActivatingChat == None:
            buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui')
            buttonImage = (buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr'))
            self.problemActivatingChat = DirectFrame(parent=aspect2dp, pos=(0.0, 0.1, 0.4), relief=None, image=DGG.getDefaultDialogGeom(), image_color=OTPGlobals.GlobalDialogColor, image_scale=(1.2, 1.0, 0.9), text='', text_align=TextNode.ALeft, text_wordwrap=18, text_scale=0.06, text_pos=(-0.5, 0.28), textMayChange=1)
            DirectButton(self.problemActivatingChat, image=buttonImage, relief=None, text=OTPLocalizer.ProblemActivatingChatOK, text_scale=0.05, text_pos=(0.0, -0.1), textMayChange=0, pos=(0.0, 0.0, -0.28), command=self.__handleProblemActivatingChatOK)
            buttons.removeNode()
        self.problemActivatingChat.show()
        return

    def exitProblemActivatingChat(self):
        self.problemActivatingChat.hide()

    def __normalButtonPressed(self):
        if base.config.GetBool('want-qa-regression', 0):
            self.notify.info('QA-REGRESSION: CHAT: Speedchat Plus')
        messenger.send('wakeup')
        self.fsm.request('normalChat')

    def __scButtonPressed(self):
        if base.config.GetBool('want-qa-regression', 0):
            self.notify.info('QA-REGRESSION: CHAT: Speedchat')
        messenger.send('wakeup')
        if self.fsm.getCurrentState().getName() == 'speedChat':
            self.fsm.request('mainMenu')
        else:
            self.fsm.request('speedChat')

    def __whisperButtonPressed(self, avatarName, avatarId, playerId):
        print 'Whisper button was pressed'
        messenger.send('wakeup')
        if playerId:
            playerInfo = base.cr.playerFriendsManager.getFriendInfo(playerId)
        if avatarId:
            self.enterWhisperChat(avatarName, avatarId)
        return

    def enterNormalChat(self):
        result = ChatManager.ChatManager.enterNormalChat(self)
        if result == None:
            self.notify.warning('something went wrong in enterNormalChat, falling back to main menu')
            self.fsm.request('mainMenu')
        return

    def enterWhisperChatPlayer(self, avatarName, playerId):
        result = ChatManager.ChatManager.enterWhisperChatPlayer(self, avatarName, playerId)
        self.chatInputNormal.setPos(self.whisperPos)
        if result == None:
            print 'failed!'
            self.notify.warning('something went wrong in enterWhisperChatPlayer, falling back to main menu')
            self.fsm.request('mainMenu')
        return

    def enterWhisperChat(self, avatarName, avatarId):
        result = ChatManager.ChatManager.enterWhisperChat(self, avatarName, avatarId)
        #self.chatInputNormal.setPos(0.238, 0, -0.267)
        self.fsm.request('mainMenu')
        return

    def enterNoSecretChatAtAllAndNoWhitelist(self):
        if self.noSecretChatAtAllAndNoWhitelist == None:
            buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui')
            okButtonImage = (buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr'))
            self.noSecretChatAtAllAndNoWhitelist = DirectFrame(parent=aspect2dp, pos=(0.0, 0.1, 0.05), relief=None, image=DGG.getDefaultDialogGeom(), image_color=OTPGlobals.GlobalDialogColor, image_scale=(1.4, 1.0, 1.58), text=OTPLocalizer.NoSecretChatAtAllAndNoWhitelist, text_wordwrap=20, textMayChange=0, text_scale=0.06, text_pos=(0, 0.55))
            DirectLabel(parent=self.noSecretChatAtAllAndNoWhitelist, relief=None, pos=(0, 0, 0.67), text=OTPLocalizer.NoSecretChatAtAllAndNoWhitelistTitle, textMayChange=0, text_scale=0.08)
            DirectButton(self.noSecretChatAtAllAndNoWhitelist, image=okButtonImage, relief=None, text=OTPLocalizer.NoSecretChatAtAllOK, text_scale=0.05, text_pos=(0.0, -0.1), textMayChange=0, pos=(0.0, 0.0, -0.64), command=self.__handleNoSecretChatAtAllOK)
            buttons.removeNode()
        self.noSecretChatAtAllAndNoWhitelist.show()
        return

    def exitNoSecretChatAtAllAndNoWhitelist(self):
        self.noSecretChatAtAllAndNoWhitelist.hide()

    def enterTrueFriendTeaserPanel(self):
        self.previousStateBeforeTeaser = None
        place = base.cr.playGame.getPlace()
        if place:
            if place.fsm.hasStateNamed('stopped'):
                self.previousStateBeforeTeaser = place.fsm.getCurrentState().getName()
                place.fsm.request('stopped')
            else:
                self.notify.warning("Enter: %s has no 'stopped' state." % place)
        self.teaser = TeaserPanel.TeaserPanel(pageName='secretChat', doneFunc=self.handleOkTeaser)
        return

    def exitTrueFriendTeaserPanel(self):
        self.teaser.destroy()
        place = base.cr.playGame.getPlace()
        if place:
            if place.fsm.hasStateNamed('stopped'):
                if self.previousStateBeforeTeaser:
                    place.fsm.request(self.previousStateBeforeTeaser, force=1)
                else:
                    place.fsm.request('walk')
            else:
                self.notify.warning("Exit: %s has no 'stopped' state." % place)

    def handleOkTeaser(self):
        self.fsm.request('mainMenu')

    def __whisperScButtonPressed(self, avatarName, avatarId, playerId):
        if base.config.GetBool('want-qa-regression', 0):
            self.notify.info('QA-REGRESSION: CHAT: Whisper')
        messenger.send('wakeup')
        hasManager = hasattr(base.cr, 'playerFriendsManager')
        transientFriend = 0
        if hasManager:
            transientFriend = base.cr.playerFriendsManager.askTransientFriend(avatarId)
            if transientFriend:
                playerId = base.cr.playerFriendsManager.findPlayerIdFromAvId(avatarId)
        if avatarId and not transientFriend:
            if self.fsm.getCurrentState().getName() == 'whisperSpeedChat':
                self.fsm.request('whisper', [avatarName, avatarId, playerId])
            else:
                self.fsm.request('whisperSpeedChat', [avatarId])
        elif playerId:
            if self.fsm.getCurrentState().getName() == 'whisperSpeedChatPlayer':
                self.fsm.request('whisper', [avatarName, avatarId, playerId])
            else:
                self.fsm.request('whisperSpeedChatPlayer', [playerId])

    def __whisperCancelPressed(self):
        self.fsm.request('mainMenu')

    def __handleOpenChatWarningOK(self):
        self.fsm.request('mainMenu')

    def __handleUnpaidChatWarningDone(self):
        place = base.cr.playGame.getPlace()
        if place:
            place.handleBookClose()
        self.fsm.request('mainMenu')

    def __handleUnpaidChatWarningContinue(self):
        self.fsm.request('mainMenu')

    def __handleUnpaidChatWarningPay(self):
        if base.cr.isWebPlayToken():
            self.fsm.request('leaveToPayDialog')
        else:
            self.fsm.request('mainMenu')

    def __handleNoSecretChatAtAllOK(self):
        self.fsm.request('mainMenu')

    def __handleNoSecretChatWarningOK(self, *args):
        password = self.passwordEntry.get()
        tt = base.cr.loginInterface
        okflag, message = tt.authenticateParentPassword(base.cr.userName, base.cr.password, password)
        if okflag:
            self.fsm.request('activateChat')
        elif message:
            self.fsm.request('problemActivatingChat')
            self.problemActivatingChat['text'] = OTPLocalizer.ProblemActivatingChat % message
        else:
            self.noSecretChatWarning['text'] = OTPLocalizer.NoSecretChatWarningWrongPassword
            self.passwordEntry['focus'] = 1
            self.passwordEntry.enterText('')

    def __handleNoSecretChatWarningCancel(self):
        self.fsm.request('mainMenu')

    def __handleActivateChatYes(self):
        password = self.passwordEntry.get()
        tt = base.cr.loginInterface
        if self.dcb1['indicatorValue']:
            base.cr.secretChatAllowed = 0
            mode = 0
        elif self.dcb2['indicatorValue']:
            base.cr.secretChatAllowed = 1
            base.cr.secretChatNeedsParentPassword = 1
            mode = 1
        else:
            base.cr.secretChatAllowed = 1
            base.cr.secretChatNeedsParentPassword = 0
            mode = 2
        okflag, message = tt.enableSecretFriends(base.cr.userName, base.cr.password, password)
        if okflag:
            tt.resendPlayToken()
            self.fsm.request('secretChatActivated', [mode])
        else:
            if message == None:
                message = 'Parent Password was invalid.'
            self.fsm.request('problemActivatingChat')
            self.problemActivatingChat['text'] = OTPLocalizer.ProblemActivatingChat % message
        return

    def __handleActivateChatMoreInfo(self):
        self.fsm.request('chatMoreInfo')

    def __handleActivateChatNo(self):
        self.fsm.request('mainMenu')

    def __handleSecretChatActivatedOK(self):
        self.fsm.request('mainMenu')

    def __handleSecretChatActivatedChangeOptions(self):
        self.fsm.request('activateChat')

    def __handleProblemActivatingChatOK(self):
        self.fsm.request('mainMenu')

    def messageSent(self):
        pass

    def deactivateChat(self):
        pass
class ToontownChatManager(ChatManager.ChatManager):
    notify = DirectNotifyGlobal.directNotify.newCategory('ToontownChatManager')

    def __init__(self, cr, localAvatar):
        gui = loader.loadModel('phase_3.5/models/gui/chat_input_gui')
        self.normalButton = DirectButton(
            image=(gui.find('**/ChtBx_ChtBtn_UP'),
                   gui.find('**/ChtBx_ChtBtn_DN'),
                   gui.find('**/ChtBx_ChtBtn_RLVR')),
            pos=(0.0683, 0, -0.072),
            parent=base.a2dTopLeft,
            scale=1.179,
            relief=None,
            image_color=Vec4(1, 1, 1, 1),
            text=('', OTPLocalizer.ChatManagerChat,
                  OTPLocalizer.ChatManagerChat),
            text_align=TextNode.ALeft,
            text_scale=TTLocalizer.TCMnormalButton,
            text_fg=Vec4(1, 1, 1, 1),
            text_shadow=Vec4(0, 0, 0, 1),
            text_pos=(-0.0525, -0.09),
            textMayChange=0,
            sortOrder=DGG.FOREGROUND_SORT_INDEX,
            command=self.__normalButtonPressed)
        self.normalButton.hide()
        self.openScSfx = loader.loadSfx(
            'phase_3.5/audio/sfx/GUI_quicktalker.ogg')
        self.openScSfx.setVolume(0.6)
        self.scButton = DirectButton(image=(gui.find('**/ChtBx_ChtBtn_UP'),
                                            gui.find('**/ChtBx_ChtBtn_DN'),
                                            gui.find('**/ChtBx_ChtBtn_RLVR')),
                                     pos=TTLocalizer.TCMscButtonPos,
                                     parent=base.a2dTopLeft,
                                     scale=1.179,
                                     relief=None,
                                     image_color=Vec4(0.75, 1, 0.6, 1),
                                     text=('',
                                           OTPLocalizer.GlobalSpeedChatName,
                                           OTPLocalizer.GlobalSpeedChatName),
                                     text_scale=TTLocalizer.TCMscButton,
                                     text_fg=Vec4(1, 1, 1, 1),
                                     text_shadow=Vec4(0, 0, 0, 1),
                                     text_pos=(0, -0.09),
                                     textMayChange=0,
                                     sortOrder=DGG.FOREGROUND_SORT_INDEX,
                                     command=self.__scButtonPressed,
                                     clickSound=self.openScSfx)
        self.scButton.hide()
        self.whisperFrame = DirectFrame(
            parent=base.a2dTopLeft,
            relief=None,
            image=DGG.getDefaultDialogGeom(),
            image_scale=(0.77, 0.70, 0.20),
            image_color=OTPGlobals.GlobalDialogColor,
            pos=(0.40, 0, -0.105),
            text=OTPLocalizer.ChatManagerWhisperTo,
            text_wordwrap=6.5,
            text_scale=TTLocalizer.TCMwhisperFrame,
            text_fg=Vec4(0, 0, 0, 1),
            text_pos=(0.18, 0.04),
            textMayChange=1,
            sortOrder=DGG.FOREGROUND_SORT_INDEX)
        self.whisperFrame.hide()
        self.whisperButton = DirectButton(
            parent=self.whisperFrame,
            image=(gui.find('**/ChtBx_ChtBtn_UP'),
                   gui.find('**/ChtBx_ChtBtn_DN'),
                   gui.find('**/ChtBx_ChtBtn_RLVR')),
            pos=(-0.33, 0, 0.033),
            scale=1.179,
            relief=None,
            image_color=Vec4(1, 1, 1, 1),
            text=('', OTPLocalizer.ChatManagerChat,
                  OTPLocalizer.ChatManagerChat, ''),
            image3_color=Vec4(0.6, 0.6, 0.6, 0.6),
            text_scale=TTLocalizer.TCMwhisperButton,
            text_fg=(0, 0, 0, 1),
            text_pos=(0, -0.09),
            textMayChange=0,
            command=self.__whisperButtonPressed)
        self.whisperScButton = DirectButton(
            parent=self.whisperFrame,
            image=(gui.find('**/ChtBx_ChtBtn_UP'),
                   gui.find('**/ChtBx_ChtBtn_DN'),
                   gui.find('**/ChtBx_ChtBtn_RLVR')),
            pos=(-0.195, 0, 0.033),
            scale=1.179,
            relief=None,
            image_color=Vec4(0.75, 1, 0.6, 1),
            text=('', OTPLocalizer.GlobalSpeedChatName,
                  OTPLocalizer.GlobalSpeedChatName, ''),
            image3_color=Vec4(0.6, 0.6, 0.6, 0.6),
            text_scale=TTLocalizer.TCMwhisperScButton,
            text_fg=(0, 0, 0, 1),
            text_pos=(0, -0.09),
            textMayChange=0,
            command=self.__whisperScButtonPressed)
        self.whisperCancelButton = DirectButton(
            parent=self.whisperFrame,
            image=(gui.find('**/CloseBtn_UP'), gui.find('**/CloseBtn_DN'),
                   gui.find('**/CloseBtn_Rllvr')),
            pos=(-0.06, 0, 0.033),
            scale=1.179,
            relief=None,
            text=('', OTPLocalizer.ChatManagerCancel,
                  OTPLocalizer.ChatManagerCancel),
            text_scale=0.05,
            text_fg=(0, 0, 0, 1),
            text_pos=(0, -0.09),
            textMayChange=0,
            command=self.__whisperCancelPressed)
        gui.removeNode()
        ChatManager.ChatManager.__init__(self, cr, localAvatar)
        self.chatInputSpeedChat = TTChatInputSpeedChat(self)
        self.normalPos = Vec3(0.25, 0, -0.196)
        self.whisperPos = Vec3(0.25, 0, -0.28)
        self.speedChatPlusPos = Vec3(-0.35, 0, 0.71)
        self.SCWhisperPos = Vec3(0, 0, 0)
        self.chatInputWhiteList = TTChatInputWhiteList()
        self.chatInputNormal = self.chatInputWhiteList
        self.chatInputNormal.setPos(self.normalPos)
        self.chatInputNormal.desc = 'chatInputNormal'
        self.chatInputWhiteList.setPos(self.speedChatPlusPos)
        self.chatInputWhiteList.reparentTo(base.a2dTopLeft)
        self.chatInputWhiteList.desc = 'chatInputWhiteList'

    def delete(self):
        ChatManager.ChatManager.delete(self)
        loader.unloadModel('phase_3.5/models/gui/chat_input_gui')
        self.normalButton.destroy()
        del self.normalButton
        self.scButton.destroy()
        del self.scButton
        del self.openScSfx
        self.whisperFrame.destroy()
        del self.whisperFrame
        self.whisperButton.destroy()
        del self.whisperButton
        self.whisperScButton.destroy()
        del self.whisperScButton
        self.whisperCancelButton.destroy()
        del self.whisperCancelButton
        self.chatInputWhiteList.destroy()
        del self.chatInputWhiteList

    def sendSCResistanceChatMessage(self, textId):
        messenger.send('chatUpdateSCResistance', [textId])
        self.announceSCChat()

    def sendSCToontaskChatMessage(self, taskId, toNpcId, toonProgress,
                                  msgIndex):
        messenger.send('chatUpdateSCToontask',
                       [taskId, toNpcId, toonProgress, msgIndex])
        self.announceSCChat()

    def sendSCToontaskWhisperMessage(self, taskId, toNpcId, toonProgress,
                                     msgIndex, whisperAvatarId):
        messenger.send(
            'whisperUpdateSCToontask',
            [taskId, toNpcId, toonProgress, msgIndex, whisperAvatarId])

    def enterMainMenu(self):
        self.chatInputNormal.setPos(self.normalPos)
        self.chatInputNormal.reparentTo(base.a2dTopLeft)
        if self.chatInputWhiteList.isActive():
            self.notify.debug('enterMainMenu calling checkObscured')
            ChatManager.ChatManager.checkObscurred(self)
        else:
            ChatManager.ChatManager.enterMainMenu(self)

    def enterNoTrueFriends(self):
        if self.noTrueFriends == None:
            buttons = loader.loadModel(
                'phase_3/models/gui/dialog_box_buttons_gui')
            okButtonImage = (buttons.find('**/ChtBx_OKBtn_UP'),
                             buttons.find('**/ChtBx_OKBtn_DN'),
                             buttons.find('**/ChtBx_OKBtn_Rllvr'))
            self.noTrueFriends = DirectFrame(
                parent=aspect2dp,
                pos=(0.0, 0.1, 0.2),
                relief=None,
                image=DGG.getDefaultDialogGeom(),
                image_color=OTPGlobals.GlobalDialogColor,
                image_scale=(1.4, 1.0, 1.1),
                text=OTPLocalizer.NoTrueFriends,
                text_wordwrap=20,
                textMayChange=0,
                text_scale=0.06,
                text_pos=(0, 0.3))
            DirectLabel(parent=self.noTrueFriends,
                        relief=None,
                        pos=(0, 0, 0.4),
                        text=OTPLocalizer.NoTrueFriendsTitle,
                        textMayChange=0,
                        text_scale=0.08)
            DirectButton(self.noTrueFriends,
                         image=okButtonImage,
                         relief=None,
                         text=OTPLocalizer.NoTrueFriendsOK,
                         text_scale=0.05,
                         text_pos=(0.0, -0.1),
                         textMayChange=0,
                         pos=(0.0, 0.0, -0.4),
                         command=self.__handleNoTrueFriendsOK)
            buttons.removeNode()
        self.noTrueFriends.show()
        return

    def exitNoTrueFriends(self):
        self.noTrueFriends.hide()

    def __normalButtonPressed(self):
        if base.config.GetBool('want-qa-regression', 0):
            self.notify.info('QA-REGRESSION: CHAT: Speedchat Plus')
        messenger.send('wakeup')
        if not base.cr.wantTypedChat():
            self.fsm.request('noSpeedchatPlus')
            return
        self.fsm.request('normalChat')

    def __scButtonPressed(self):
        messenger.send('wakeup')
        if self.fsm.getCurrentState().getName() == 'speedChat':
            self.fsm.request('mainMenu')
        else:
            self.fsm.request('speedChat')

    def __whisperButtonPressed(self, avatarName, avatarId):
        messenger.send('wakeup')
        if not base.cr.wantTypedChat():
            self.fsm.request('noSpeedchatPlus')
            return
        if avatarId:
            self.enterWhisperChat(avatarName, avatarId)
        self.whisperFrame.hide()

    def enterNormalChat(self):
        if not base.cr.wantTypedChat() or not base.localAvatar.getTutorialAck(
        ) or not ChatManager.ChatManager.enterNormalChat(self):
            self.fsm.request('mainMenu')

    def enterWhisperChat(self, avatarName, avatarId):
        if not base.cr.wantTypedChat():
            self.fsm.request('mainMenu')
            return
        result = ChatManager.ChatManager.enterWhisperChat(
            self, avatarName, avatarId)
        self.chatInputNormal.setPos(self.whisperPos)
        if result == None:
            self.notify.warning(
                'something went wrong in enterWhisperChat, falling back to main menu'
            )
            self.fsm.request('mainMenu')

    def enterNoSpeedchatPlus(self):
        if self.noSpeedchatPlus == None:
            buttons = loader.loadModel(
                'phase_3/models/gui/dialog_box_buttons_gui')
            okButtonImage = (buttons.find('**/ChtBx_OKBtn_UP'),
                             buttons.find('**/ChtBx_OKBtn_DN'),
                             buttons.find('**/ChtBx_OKBtn_Rllvr'))
            self.noSpeedchatPlus = DirectFrame(
                parent=aspect2dp,
                pos=(0.0, 0.1, 0.05),
                relief=None,
                image=DGG.getDefaultDialogGeom(),
                image_color=OTPGlobals.GlobalDialogColor,
                image_scale=(1.4, 1.0, 1.58),
                text=OTPLocalizer.NoSpeedchatPlus,
                text_wordwrap=20,
                textMayChange=0,
                text_scale=0.06,
                text_pos=(0, 0.55))
            DirectLabel(parent=self.noSpeedchatPlus,
                        relief=None,
                        pos=(0, 0, 0.67),
                        text=OTPLocalizer.NoSpeedchatPlusTitle,
                        textMayChange=0,
                        text_scale=0.08)
            DirectButton(self.noSpeedchatPlus,
                         image=okButtonImage,
                         relief=None,
                         text=OTPLocalizer.NoTrueFriendsOK,
                         text_scale=0.05,
                         text_pos=(0.0, -0.1),
                         textMayChange=0,
                         pos=(0.0, 0.0, -0.64),
                         command=self.__handleNoTrueFriendsOK)
            buttons.removeNode()
        self.noSpeedchatPlus.show()
        return

    def exitNoSpeedchatPlus(self):
        self.noSpeedchatPlus.hide()

    def __whisperScButtonPressed(self, avatarName, avatarId):
        messenger.send('wakeup')
        if avatarId:
            if self.fsm.getCurrentState().getName() == 'whisperSpeedChat':
                self.fsm.request('whisper', [avatarName, avatarId])
            else:
                self.fsm.request('whisperSpeedChat', [avatarId])

    def __whisperCancelPressed(self):
        self.fsm.request('mainMenu')

    def __handleNoTrueFriendsOK(self):
        self.fsm.request('mainMenu')

    def messageSent(self):
        pass
示例#8
0
 def __init__(self, cr, localAvatar):
     gui = loader.loadModel("phase_3.5/models/gui/chat_input_gui")
     self.normalButton = DirectButton(
         image=(gui.find("**/ChtBx_ChtBtn_UP"), gui.find("**/ChtBx_ChtBtn_DN"), gui.find("**/ChtBx_ChtBtn_RLVR")),
         pos=(0.0683, 0, -0.072),
         parent=base.a2dTopLeft,
         scale=1.179,
         relief=None,
         image_color=Vec4(1, 1, 1, 1),
         text=("", OTPLocalizer.ChatManagerChat, OTPLocalizer.ChatManagerChat),
         text_align=TextNode.ALeft,
         text_scale=TTLocalizer.TCMnormalButton,
         text_fg=Vec4(1, 1, 1, 1),
         text_shadow=Vec4(0, 0, 0, 1),
         text_pos=(-0.0525, -0.09),
         textMayChange=0,
         sortOrder=DGG.FOREGROUND_SORT_INDEX,
         command=self.__normalButtonPressed,
     )
     self.normalButton.hide()
     self.openScSfx = loader.loadSfx("phase_3.5/audio/sfx/GUI_quicktalker.ogg")
     self.openScSfx.setVolume(0.6)
     self.scButton = DirectButton(
         image=(gui.find("**/ChtBx_ChtBtn_UP"), gui.find("**/ChtBx_ChtBtn_DN"), gui.find("**/ChtBx_ChtBtn_RLVR")),
         pos=TTLocalizer.TCMscButtonPos,
         parent=base.a2dTopLeft,
         scale=1.179,
         relief=None,
         image_color=Vec4(0.75, 1, 0.6, 1),
         text=("", OTPLocalizer.GlobalSpeedChatName, OTPLocalizer.GlobalSpeedChatName),
         text_scale=TTLocalizer.TCMscButton,
         text_fg=Vec4(1, 1, 1, 1),
         text_shadow=Vec4(0, 0, 0, 1),
         text_pos=(0, -0.09),
         textMayChange=0,
         sortOrder=DGG.FOREGROUND_SORT_INDEX,
         command=self.__scButtonPressed,
         clickSound=self.openScSfx,
     )
     self.scButton.hide()
     self.whisperFrame = DirectFrame(
         parent=base.a2dTopLeft,
         relief=None,
         image=DGG.getDefaultDialogGeom(),
         image_scale=(0.77, 0.70, 0.20),
         image_color=OTPGlobals.GlobalDialogColor,
         pos=(0.40, 0, -0.105),
         text=OTPLocalizer.ChatManagerWhisperTo,
         text_wordwrap=6.5,
         text_scale=TTLocalizer.TCMwhisperFrame,
         text_fg=Vec4(0, 0, 0, 1),
         text_pos=(0.18, 0.01),
         textMayChange=1,
         sortOrder=DGG.FOREGROUND_SORT_INDEX,
     )
     self.whisperFrame.hide()
     self.whisperButton = DirectButton(
         parent=self.whisperFrame,
         image=(gui.find("**/ChtBx_ChtBtn_UP"), gui.find("**/ChtBx_ChtBtn_DN"), gui.find("**/ChtBx_ChtBtn_RLVR")),
         pos=(-0.33, 0, 0.033),
         scale=1.179,
         relief=None,
         image_color=Vec4(1, 1, 1, 1),
         text=("", OTPLocalizer.ChatManagerChat, OTPLocalizer.ChatManagerChat, ""),
         image3_color=Vec4(0.6, 0.6, 0.6, 0.6),
         text_scale=TTLocalizer.TCMwhisperButton,
         text_fg=(0, 0, 0, 1),
         text_pos=(0, -0.09),
         textMayChange=0,
         command=self.__whisperButtonPressed,
     )
     self.whisperScButton = DirectButton(
         parent=self.whisperFrame,
         image=(gui.find("**/ChtBx_ChtBtn_UP"), gui.find("**/ChtBx_ChtBtn_DN"), gui.find("**/ChtBx_ChtBtn_RLVR")),
         pos=(-0.195, 0, 0.033),
         scale=1.179,
         relief=None,
         image_color=Vec4(0.75, 1, 0.6, 1),
         text=("", OTPLocalizer.GlobalSpeedChatName, OTPLocalizer.GlobalSpeedChatName, ""),
         image3_color=Vec4(0.6, 0.6, 0.6, 0.6),
         text_scale=TTLocalizer.TCMwhisperScButton,
         text_fg=(0, 0, 0, 1),
         text_pos=(0, -0.09),
         textMayChange=0,
         command=self.__whisperScButtonPressed,
     )
     self.whisperCancelButton = DirectButton(
         parent=self.whisperFrame,
         image=(gui.find("**/CloseBtn_UP"), gui.find("**/CloseBtn_DN"), gui.find("**/CloseBtn_Rllvr")),
         pos=(-0.06, 0, 0.033),
         scale=1.179,
         relief=None,
         text=("", OTPLocalizer.ChatManagerCancel, OTPLocalizer.ChatManagerCancel),
         text_scale=0.05,
         text_fg=(0, 0, 0, 1),
         text_pos=(0, -0.09),
         textMayChange=0,
         command=self.__whisperCancelPressed,
     )
     gui.removeNode()
     ChatManager.ChatManager.__init__(self, cr, localAvatar)
     self.defaultToWhiteList = config.GetBool("white-list-is-default", 1)
     self.chatInputSpeedChat = TTChatInputSpeedChat(self)
     self.normalPos = Vec3(0.25, 0, -0.196)
     self.whisperPos = Vec3(0.25, 0, -0.28)
     self.speedChatPlusPos = Vec3(-0.35, 0, 0.71)
     self.chatInputWhiteList = TTChatInputWhiteList()
     if self.defaultToWhiteList:
         self.chatInputNormal = self.chatInputWhiteList
         self.chatInputNormal.setPos(self.normalPos)
         self.chatInputNormal.desc = "chatInputNormal"
     else:
         self.chatInputNormal = TTChatInputNormal(self)
     self.chatInputWhiteList.setPos(self.speedChatPlusPos)
     self.chatInputWhiteList.reparentTo(base.a2dTopLeft)
     self.chatInputWhiteList.desc = "chatInputWhiteList"
     return