Exemplo n.º 1
0
def handle_text_message(event):
    text = event.message.text
    print(text)

    if isinstance(event.source, SourceUser):
        talk_type = 'user'
        talk_id = event.source.user_id
        profile = line_bot_api.get_profile(event.source.user_id)
        display_name = "{}さん".format(profile.display_name)
    elif isinstance(event.source, SourceGroup):
        talk_type = 'group'
        talk_id = event.source.group_id
        display_name = 'このグループ'
    elif isinstance(event.source, SourceRoom):
        talk_type = 'room'
        talk_id = event.source.room_id
        display_name = 'このルーム'

    if text == 'オセロ':
        message_stack = []
        turn = random.randint(1, 2)
        reversi = Reversi(turn)
        data = select_from_table(talk_id)
        if data:
            r = Reversi()
            r.insert(data)  # reversi.guideを参照したいために (時間の都合上)
            reversi.guide = r.guide
        if turn == 2:
            ai_p = reversi.best(reversi.ai_turn)
            reversi.put_piece(ai_p, reversi.ai_turn)
            y, x = divmod(ai_p, 8)
            ai_putmessage = TextSendMessage(
                text="{}{}".format(chr(97 + y), x + 1))
            message_stack.append(ai_putmessage)
        putable = reversi.able_to_put()
        text = your_turn_format.format(display_name, (first_attack) if
                                       (turn == 1) else (second_attack))
        turn_notice_message = TextSendMessage(text=text)
        message_stack.append(turn_notice_message)
        data = reversi.extract()
        insert_to_table(talk_id, data)
        print("/boards/{}/{}".format(data, 1040))
        imagemap = make_reversi_imagemap(data, putable)
        message_stack.append(imagemap)
        try:
            line_bot_api.reply_message(event.reply_token, message_stack)
        except Exception as e:
            print(e.error.details)

    elif text == 'reload' or text == 'リロード':
        data = select_from_table(talk_id)
        reversi = Reversi()
        reversi.insert(data)
        putable = reversi.able_to_put()
        imagemap = make_reversi_imagemap(data, putable)
        line_bot_api.reply_message(event.reply_token, [imagemap])

    elif input_format.match(text):
        message_stack = []
        x, y = text
        x = ord(x) - 97  # str:[a-h] -> int:[0-7]
        y = int(y) - 1  # int:[0-7]
        p = y * 8 + x
        print(p, talk_id, display_name)
        data = select_from_table(talk_id)
        reversi = Reversi()
        reversi.insert(data)
        reversi.put_piece(p, reversi.turn)
        ai_p = reversi.best(reversi.ai_turn)
        print(ai_p, (reversi.board == 0).sum())
        if ai_p == -1:
            if (reversi.board == 0).sum() != 0:
                message_stack.append(ai_passmessage)
        else:
            reversi.put_piece(ai_p, reversi.ai_turn)
            y, x = divmod(ai_p, 8)
            ai_putmessage = TextSendMessage(
                text="{}{}".format(chr(97 + x), y + 1))
            message_stack.append(ai_putmessage)
        putable = reversi.able_to_put()
        data = reversi.extract()
        insert_to_table(talk_id, data)
        imagemap = make_reversi_imagemap(data, putable)
        message_stack.append(imagemap)
        while not reversi.able_to_put() and reversi.able_to_put(
                reversi.ai_turn):
            message_stack.append(your_passmessage)
            ai_p = reversi.best(reversi.ai_turn)
            reversi.put_piece(ai_p, reversi.ai_turn)
            y, x = divmod(ai_p, 8)
            ai_putmessage = TextSendMessage(
                text="{}{}".format(chr(97 + x), y + 1))
            message_stack.append(ai_putmessage)

            putable = reversi.able_to_put()
            data = reversi.extract()
            insert_to_table(talk_id, data)
            imagemap = make_reversi_imagemap(data, putable)
            message_stack.append(imagemap)
        else:
            if not reversi.able_to_put():
                score1 = (reversi.board == 1).sum()
                score2 = (reversi.board == 2).sum()
                turn = reversi.turn
                judge = False
                draw = False
                if score1 == score2:
                    draw = True
                elif (score1 > score2 and turn == 1) or (score2 > score1
                                                         and turn == 2):
                    judge = True
                else:
                    judge = False
                if draw:
                    finish_message = TextSendMessage(
                        text=draw_format.format(score1, score2))
                    update_reversi_result(talk_id, 3)
                else:
                    finish_message = TextSendMessage(
                        text=finish_format.format(score1, score2, (
                            win_string) if judge else (lose_string)))
                    update_reversi_result(talk_id, 1 if judge else 2)
                message_stack.append(finish_message)
        line_bot_api.reply_message(event.reply_token, message_stack)

    elif text == 'guide on' or text == 'guide off' or text == 'guide switch':
        data = select_from_table(talk_id)
        reversi = Reversi()
        reversi.insert(data)
        if 'on' in text:
            reversi.guide = True
        if 'off' in text:
            reversi.guide = False
        if 'switch' in text:
            reversi.guide = not reversi.guide
        data = reversi.extract()
        insert_to_table(talk_id, data)
        putable = reversi.able_to_put()
        imagemap = make_reversi_imagemap(data, putable)
        line_bot_api.reply_message(event.reply_token, [imagemap])

    elif text == 'オセロ help' or text == 'オセロ ヘルプ':
        line_bot_api.reply_message(event.reply_token, [help_message])

    elif text == '戦績確認':
        results = select_reversi_result(talk_id)
        if results:
            result_message = TextSendMessage(
                text="{}の戦績\nwin: {}\nlose: {}\ndraw: {}".format(
                    display_name, *results))
        else:
            result_message = TextSendMessage(text="記録がありません")
        line_bot_api.reply_message(event.reply_token, [result_message])

    elif text == 'myid' or text == 'mid':
        line_bot_api.reply_message(event.reply_token,
                                   TextSendMessage(text=talk_id))

    elif text == '@bye':
        if isinstance(event.source, SourceGroup):
            line_bot_api.leave_group(event.source.group_id)
        elif isinstance(event.source, SourceRoom):
            line_bot_api.leave_room(event.source.room_id)
        else:
            line_bot_api.reply_message(event.reply_token,
                                       TextSendMessage(text="?"))

    else:
        if isinstance(event.source, SourceUser):
            line_bot_api.reply_message(
                event.reply_token, TextSendMessage(text=event.message.text))