дело в том что ты вызываешь bot.register_next_step_handler в цикле for и каждый раз когда цикл создает новую клавиатуру и вызывает bot.send_message он также регестрирует нект степ хендлер. Это приводит к тому, что любое сообщение юзера бот запускает все циклы
короче, мне лень было это писать самому, поэтому я попросилл чат жпт реворкнуть архитектуру и он накидал вот это
@bot.message_handler(content_types=['text'])
def start_test(message):
if message.text == 'Начать тест':
user_data = {
'user_score': 0,
'user_num': 1
}
ask_question(message, user_data)
def ask_question(message, user_data):
num = user_data['user_num']
if num > 5:
# Завершаем тест
bot.send_message(message.chat.id, f'Тест завершен. Ваш счет: {user_data["user_score"]}')
return
quest = get_quest(num)
answers = get_answers(num).split('|')
answers.sort()
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
for j in answers:
btn = types.KeyboardButton(j)
markup.add(btn)
mess = f"<b>{num}. {quest}</b>\n\nA.{answers[0]}\n\nB.{answers[1]}\n\nC.{answers[2]}\n\nD.{answers[3]}"
bot.send_message(message.chat.id, mess, reply_markup=markup, parse_mode='html')
user_data['user_num'] += 1
bot.register_next_step_handler(message, check_answer, user_data)
def check_answer(message, user_data):
right = get_right(user_data['user_num'])
if message.text == right:
user_data['user_score'] += 1
bot.send_message(message.chat.id, 'Идем дальше')
ask_question(message, user_data)