示例#1
0
    def no_test_pokemon_search(self, mock_bot_send_message,
                               mock_bot_sender_action):
        msg = {
            'message': {
                'quick_reply': {
                    'payload': "PAYLOAD_RELATED_POKEMON"
                }
            }
        }
        sender = "fake_user"
        msgbody = msg['message']

        user = UserStatus(sender)
        user.set_status('STATE_POKEMON_SEARCH_OK')
        user.set_q('黃色電氣老鼠')
        user.set_english('pikachu')
        user.set_chinese('皮卡丘')

        # 真正跑測試的地方~
        celery_handle_message(msg, sender, msgbody)

        print("\033[0;32m%s\033[m" %
              json.dumps(mock_bot_send_message.call_args_list,
                         indent=4,
                         sort_keys=True,
                         ensure_ascii=False))
示例#2
0
    def test_joke(self, mock_bot_send_message, mock_bot_sender_action):
        msg = {"message": {"text": "笑話"}}
        sender = "fake_user"
        msgbody = msg['message']

        # 開始跑測試囉~
        celery_handle_message(msg, sender, msgbody)

        print("\033[0;32m%s\033[m" %
              json.dumps(mock_bot_send_message.call_args_list,
                         indent=4,
                         sort_keys=True,
                         ensure_ascii=False))
        user = UserStatus(sender)
        assert user.get_status() == 'new'
示例#3
0
    def handle_message(self, msg, sender, msgbody):
        """ 處理訊息的函式。

            Keyword Arguments: 
            msg -- (dictionary) Facebook 的 Message 格式
            sender -- (string) sender_id
            msgbody -- (dictionary) 特別把 message 的部份挑出來,方便處理

            Return:
            不回傳任何東西
        """
        # 這段應該是測試的 code...
        counter = int(redis_store.get('state::counter') or '0')
        counter += 1
        print(counter)
        redis_store.set('state::counter', str(counter))

        # 檢查 sender 現在的狀態(回答問題、問問題或是提供反饋)
        # 方法是從暫存的 redis 裡頭取出關於目前這個 sender 的所有資訊
        user = UserStatus(sender)

        # 時間間隔太久,一律視為新詢問
        # tdelta = datetime.now() - user.get_last_active()
        # if tdelta.total_seconds() >= 300:
        #    user.set_status('new')
        # user.set_last_active(datetime.now())

        # 從送進來的 msg 分析, 作為 input
        parsed_msg, template_params = self.intention_detector.parse_msg(user, msgbody)

        # 執行到下一個 state
        self.state_machine.run(self.intention_bot, user, parsed_msg, **template_params)
示例#4
0
    def handle_message(self, msg, sender, msgbody):
        """ 處理訊息的函式。

            Keyword Arguments: 
            msg -- (dictionary) Facebook 的 Message 格式
            sender -- (string) sender_id
            msgbody -- (dictionary) 特別把 message 的部份挑出來,方便處理

            Return:
            不回傳任何東西
        """
        # 這段應該是測試的 code...
        counter = int(redis_store.get('state::counter') or '0')
        counter += 1
        print(counter)
        redis_store.set('state::counter', str(counter))

        # 檢查 sender 現在的狀態(回答問題、問問題或是提供反饋)
        # 方法是從暫存的 redis 裡頭取出關於目前這個 sender 的所有資訊
        state = UserStatus(sender)

        # 時間間隔太久,一律視為新詢問
        tdelta = datetime.now() - state.get_last_active()
        if tdelta.total_seconds() >= 300:
            state.set_status('new')
        state.set_last_active(datetime.now())

        # 取得意圖
        intention_bot = self.intention_detector.get_intention_bot(sender, state, msgbody)

        # 處理意圖
        intention_bot.handle_message(msg, sender, state, msgbody)
示例#5
0
    def test_translate_english_to_chinese(self, mock_bot_send_message,
                                          mock_bot_sender_action):
        msg = {"message": {"text": "請問 avocado 的中文是什麼"}}
        sender = "fake_user"
        msgbody = msg['message']

        # 真正跑測試的地方~
        celery_handle_message(msg, sender, msgbody)

        # 檢查已讀是否送出
        assert mock_bot_sender_action.called

        print("\033[0;32m%s\033[m" %
              json.dumps(mock_bot_send_message.call_args_list,
                         indent=4,
                         sort_keys=True,
                         ensure_ascii=False))
        user = UserStatus(sender)
        assert user.get_status() == 'STATE_ENGLISH_TO_CHINESE_OK'
示例#6
0
    def test_pikachu_more(self, mock_bot_send_message, mock_bot_sender_action):
        msg = {"message": {"text": "pikachu"}}
        sender = "fake_user"
        msgbody = msg['message']

        # 真正跑測試的地方~
        celery_handle_message(msg, sender, msgbody)
        user = UserStatus(sender)
        assert user.get_status() == 'STATE_ENGLISH_TO_CHINESE_OK'

        # 接下來按下 "更多"
        msg = {"message": {"quick_reply": {"payload": 'PAYLOAD_MORE'}}}
        msgbody = msg['message']
        celery_handle_message(msg, sender, msgbody)
        print("\033[0;32m%s\033[m" %
              json.dumps(mock_bot_send_message.call_args_list,
                         indent=4,
                         sort_keys=True,
                         ensure_ascii=False))
示例#7
0
    def handle_postback(self, msg, sender, payload):
        """ 處理 postback 的函式。 """
        state = UserStatus(sender)
        p = re.match(r'([^:]*):(.*)', payload)
        payload = p.group(1)
        target = p.group(2)
        

        print("Handling payload: %s for target=%s" % (payload, target))
        intention_bot = self.intention_detector.get_postback_intention_bot(sender, state, payload, target)

        intention_bot.handle_message(msg, sender, state, {"payload": payload, "target": target})
示例#8
0
    def no_test_pokemon_search(self, mock_bot_send_message,
                               mock_bot_sender_action):
        # msg = {'message':{'text':'黃色電氣老鼠'}}
        payload = 'PAYLOAD_POKEMON_DESCRIPTION:797,習性'
        sender = "fake_user"
        from app.models import Term
        term = Term.query.filter_by(chinese='鐵火輝夜').first()
        print(term.descriptions.first().as_dict())
        print(term.id)

        user = UserStatus(sender)
        # user.set_status('STATE_POKEMON_SEARCH')

        # 真正跑測試的地方~
        celery_handle_postback({}, sender, payload)
        print("\033[0;32m%s\033[m" %
              json.dumps(mock_bot_send_message.call_args_list,
                         indent=4,
                         sort_keys=True,
                         ensure_ascii=False))