Бот игнорирует и не обрабатывает ответ. Телеграм Бот - Камень, Ножницы, Бумага

Все функции работают без ошибки но бот не обрабатывает выбор игрока и игрока2, а просто игнорирует после начала игры. Не понимаю что не так, даже chatgpt не смог исправить, всё равно игнорирует выбор игрока из 3 вариантов(камень, ножницы, бумага) но работает Сдаться.

import json
import os
from telebot import types
from config import BOT_TOKEN


bot = telebot.TeleBot(BOT_TOKEN)

# Загрузка файла profiles.json
if os.path.exists('profiles.json'):
    with open('profiles.json', 'r') as f:
        try:
            profiles = json.load(f)
        except json.JSONDecodeError:
            profiles = {}
else:
    profiles = {}

#сохранение данных в файл profiles.json
def save_profiles():
    with open('profiles.json', 'w') as f:
        json.dump(profiles, f, indent=4)

# /start
@bot.message_handler(commands=['start'])
def start(message):
    user_id = str(message.from_user.id)
    if user_id not in profiles:
        profiles[user_id] = {'wins': 0, 'losses': 0, 'draws': 0}
        save_profiles()

    args = message.text.split()
    if len(args) > 1:
        # переход по уникальной ссылке
        game_id = args[1]
        if game_id in profiles:
            if 'opponent' not in profiles[game_id]:
                profiles[game_id]['opponent'] = user_id
                profiles[user_id]['opponent'] = game_id
                save_profiles()

                # меню выбора
                markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
                btn1 = types.KeyboardButton("Камень")
                btn2 = types.KeyboardButton("Ножницы")
                btn3 = types.KeyboardButton("Бумага")
                btn4 = types.KeyboardButton("Сдаться")
                markup.add(btn1, btn2, btn3, btn4)

                # Уведомляем обоих игроков
                bot.send_message(message.chat.id, "Игра началась! Выберите ваш вариант:", reply_markup=markup)
                bot.send_message(game_id, "Игра началась! Выберите ваш вариант:", reply_markup=markup)
                return
            else:
                bot.send_message(message.chat.id, "Ошибка: Игра уже началась.")
                return
        else:
            bot.send_message(message.chat.id, "Ошибка: Неверный идентификатор игры.")
            return

    # Если не был найден game_id, показываем меню
    show_main_menu(message.chat.id)

# Функция для отображения основного меню
def show_main_menu(chat_id):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    btn1 = types.KeyboardButton("Начать игру")
    btn2 = types.KeyboardButton("Мой профиль")
    markup.add(btn1, btn2)
    
    bot.send_message(chat_id, "Добро пожаловать в игру 'Камень, ножницы, бумага'!", reply_markup=markup)

# нажатия на кнопки меню
@bot.message_handler(func=lambda message: True)
def menu_handler(message):
    user_id = str(message.from_user.id)
    
    if message.text == "Начать игру":
        link = f"https://t.me/{bot.get_me().username}?start={user_id}"
        profiles[user_id]['game_id'] = user_id
        save_profiles()
        bot.send_message(message.chat.id, f"Отправьте эту ссылку вашему другу для начала игры:\n{link}")
    
    elif message.text == "Мой профиль":
        wins = profiles[user_id]['wins']
        losses = profiles[user_id]['losses']
        draws = profiles[user_id]['draws']
        bot.send_message(message.chat.id, f"Ваш профиль:\nПобеды: {wins}\nПоражения: {losses}\nНичьи: {draws}")

    elif message.text == "Сдаться":
        surrender_game(message)

# выбор варианта (камень, ножницы, бумага)
@bot.message_handler(func=lambda message: message.text in ["Камень", "Ножницы", "Бумага", "Сдаться"])
def play_round(message):
    user_id = str(message.from_user.id)
    choice = message.text

    if user_id in profiles:
        if 'opponent' in profiles[user_id]:
            opponent_id = profiles[user_id]['opponent']

            if choice == "Сдаться":
                surrender_game(message)
                return

            if 'choice' not in profiles[user_id]:
                profiles[user_id]['choice'] = choice
                bot.send_message(message.chat.id, "Принято! Ваш выбор зафиксирован.")

                if 'choice' in profiles[opponent_id]:
                    opponent_choice = profiles[opponent_id]['choice']

                    result = determine_winner(choice, opponent_choice)

                    if result == "win":
                        profiles[user_id]['wins'] += 1
                        profiles[opponent_id]['losses'] += 1
                        bot.send_message(message.chat.id, f"Вы выиграли! Противник выбрал {opponent_choice}.")
                        bot.send_message(opponent_id, f"Вы проиграли! Противник выбрал {choice}.")
                    elif result == "lose":
                        profiles[user_id]['losses'] += 1
                        profiles[opponent_id]['wins'] += 1
                        bot.send_message(message.chat.id, f"Вы проиграли! Противник выбрал {opponent_choice}.")
                        bot.send_message(opponent_id, f"Вы выиграли! Противник выбрал {choice}.")
                    else:
                        profiles[user_id]['draws'] += 1
                        profiles[opponent_id]['draws'] += 1
                        bot.send_message(message.chat.id, f"Ничья! Вы оба выбрали {choice}.")
                        bot.send_message(opponent_id, f"Ничья! Вы оба выбрали {choice}.")

                    del profiles[user_id]['choice']
                    del profiles[opponent_id]['choice']
                    del profiles[user_id]['opponent']
                    del profiles[opponent_id]['opponent']
                    save_profiles()

                    show_main_menu(message.chat.id)
                    show_main_menu(opponent_id)
                else:
                    bot.send_message(message.chat.id, "Ждем выбора противника...")
            else:
                bot.send_message(message.chat.id, "Вы уже сделали свой выбор.")
        else:
            bot.send_message(message.chat.id, "Игра не началась или противник не присоединился.")
    else:
        bot.send_message(message.chat.id, "Игра не началась или вы не участвуете в игре.")

# команда сдаться
def surrender_game(message):
    user_id = str(message.from_user.id)
    opponent_id = profiles[user_id].get('opponent')
    
    if opponent_id:
        profiles[user_id]['losses'] += 1
        profiles[opponent_id]['wins'] += 1
        
        bot.send_message(message.chat.id, "Вы сдались! Противник выиграл.")
        bot.send_message(opponent_id, "Противник сдался! Вы выиграли.")
        
        del profiles[user_id]['opponent']
        del profiles[opponent_id]['opponent']
        save_profiles()

        show_main_menu(message.chat.id)
        show_main_menu(opponent_id)
    else:
        bot.send_message(message.chat.id, "Игра не началась или вы не участвуете в игре.")

# определения победителя
def determine_winner(choice1, choice2):
    if choice1 == choice2:
        return "draw"
    if (choice1 == "Камень" and choice2 == "Ножницы") or \
       (choice1 == "Ножницы" and choice2 == "Бумага") or \
       (choice1 == "Бумага" and choice2 == "Камень"):
        return "win"
    return "lose"


bot.polling()

Ответы (1 шт):

Автор решения: kretoffer

У тебя есть два message_handler'а, по этому срабатывает только 1. Размести второй message_handler (который отвечает за варианты выбора) в коде выше первого, это должно помочь

→ Ссылка