Exemple #1
0
def callback_query_handler(bot: Client, query: CallbackQuery):
    data = json.loads(query.data)
    game = get_game(query.inline_message_id, data)
    if data["type"] == "P":  # Player
        if game.player1["id"] == query.from_user.id:
            bot.answer_callback_query(query.id,
                                      "Wait for opponent!",
                                      show_alert=True)
        elif game.player1["id"] != query.from_user.id:
            game.player2 = {
                "type": "P",
                "id": query.from_user.id,
                "name": query.from_user.first_name
            }

            message_text = "{}({})  {}  {}({})\n\n{} **{} ({})**".format(
                mention(game.player1["name"],
                        game.player1["id"]), emojis.X, emojis.vs,
                mention(game.player2["name"], game.player2["id"]),
                emojis.O, emojis.game,
                mention(game.player1["name"], game.player1["id"]), emojis.X)

            bot.edit_inline_text(query.inline_message_id,
                                 message_text,
                                 reply_markup=InlineKeyboardMarkup(
                                     game.board_keys))
    elif data["type"] == "K":  # Keyboard
        if data["end"]:
            bot.answer_callback_query(query.id,
                                      "Match has ended!",
                                      show_alert=True)

            return

        if (game.whose_turn and query.from_user.id != game.player1["id"]) \
                or (not game.whose_turn and query.from_user.id != game.player2["id"]):
            bot.answer_callback_query(query.id, "Not your turn!")

            return

        if game.fill_board(query.from_user.id, data["coord"]):
            game.whose_turn = not game.whose_turn

            if game.check_winner():
                message_text = "{}({})  {}  {}({})\n\n{} **{} won!**".format(
                    mention(game.player1["name"],
                            game.player1["id"]), emojis.X, emojis.vs,
                    mention(game.player2["name"], game.player2["id"]),
                    emojis.O, emojis.trophy,
                    mention(game.winner["name"], game.winner["id"]))
            elif game.is_draw():
                message_text = "{}({})  {}  {}({})\n\n{} **Draw!**".format(
                    mention(game.player1["name"],
                            game.player1["id"]), emojis.X, emojis.vs,
                    mention(game.player2["name"], game.player2["id"]),
                    emojis.O, emojis.draw)
            else:
                message_text = "{}({})  {}  {}({})\n\n{} **{} ({})**".format(
                    mention(game.player1["name"],
                            game.player1["id"]), emojis.X, emojis.vs,
                    mention(game.player2["name"],
                            game.player2["id"]), emojis.O, emojis.game,
                    mention(game.player1["name"], game.player1["id"])
                    if game.whose_turn else mention(game.player2["name"],
                                                    game.player2["id"]),
                    emojis.X if game.whose_turn else emojis.O)

            bot.edit_inline_text(query.inline_message_id,
                                 message_text,
                                 reply_markup=InlineKeyboardMarkup(
                                     game.board_keys))
        else:
            bot.answer_callback_query(query.id, "This one is already taken!")
    elif data["type"] == "R":  # Reset
        game = reset_game(game)

        message_text = "{}({})  {}  {}({})\n\n{} **{} ({})**".format(
            mention(game.player1["name"],
                    game.player1["id"]), emojis.X, emojis.vs,
            mention(game.player2["name"], game.player2["id"]),
            emojis.O, emojis.game,
            mention(game.player1["name"], game.player1["id"]), emojis.X)

        bot.edit_inline_text(query.inline_message_id,
                             message_text,
                             reply_markup=InlineKeyboardMarkup(
                                 game.board_keys))
    elif data["type"] == "C":  # Contact
        if data["action"] == "email":
            bot.edit_message_text(query.from_user.id,
                                  query.message.message_id,
                                  "*****@*****.**",
                                  reply_markup=InlineKeyboardMarkup([[
                                      InlineKeyboardButton(
                                          emojis.back + " Back",
                                          json.dumps({
                                              "type": "C",
                                              "action": "email-back"
                                          }))
                                  ]]))
        elif data["action"] == "email-back":
            bot.edit_message_text(
                query.from_user.id,
                query.message.message_id,
                "Feel free to share your thoughts on XO bot with me.",
                reply_markup=CONTACT_KEYS)
def handle_callback_query(bot: Client, query: CallbackQuery):
    if query.data == 'start':
        bot.edit_inline_text(query.inline_message_id, 'توضیحات بازی', reply_markup=IKM([('پایان', 'end')]))
    elif query.data == 'end':
        bot.edit_inline_text(query.inline_message_id, 'بازی تمام شد!!')