@poncholover

Телеграм бот запоминает первое введенное значение Х. Что не так с кодом?

Есть бот, в котором посредством инлайн-кнопок выбираем аргумент Х из трех вариантов Х1, Х2, Х3).
Далее текстом вводим значение YY (самих значений много, но они одинаковые для всех Х).
На выходе бот присылает нам документ, в зависимости от двух переменных.

Проблема в том, что бот запоминает только первое введенное значение Х, и для всех последующих значений Х присылает результаты для Х, которое было выбрано в самом начале.

Что не так с кодом? Асинхронность?

Код:
@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    keyboard = InlineKeyboardMarkup()
    keyboard.add(InlineKeyboardButton(text="X1", callback_data="X1"))
    keyboard.add(InlineKeyboardButton(text="X2", callback_data="X2"))
    keyboard.add(InlineKeyboardButton(text="X3", callback_data="X3"))
    await message.answer(f'<b>Привет!</b>', parse_mode='HTML', reply_markup=keyboard)

@dp.callback_query_handler()
async def nationality_choice(callback: types.CallbackQuery):
    if callback.data == 'X1':
        ms='Принято X1'
        await bot.send_message(callback.message.chat.id, ms, parse_mode='html')

        @dp.message_handler()
        async def reply_message_X1(message: types.Message):
            if message.text == 'YY':
                doc = open('X1YY.pdf', 'rb')
                await bot.send_document(message.chat.id, doc)

    elif callback.data == 'X2':
        ms = 'Принято Х2'
        await bot.send_message(callback.message.chat.id, ms, parse_mode='html')

        @dp.message_handler()
        async def reply_message_X2(message):
            if message.text == 'YY':
                doc = open('X2YY.pdf', 'rb')
                await bot.send_document(message.chat.id, doc)

    elif callback.data == 'X3':
        ms = 'Принято Х3'
        await bot.send_message(callback.message.chat.id, ms, parse_mode='html')

        @dp.message_handler()
        async def reply_message_X3(message):
            if message.text == 'YY':
                doc = open('X3YY.pdf', 'rb')
                await bot.send_document(message.chat.id, doc)

executor.start_polling(dp, skip_updates=True)
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
@dp.message_handler()
        async def reply_message_X1(message: types.Message):

Не надо описывать обработчики событий динамически, внутри других обработчиков. Поведение очень нетривиальное, и затрагивает ВСЕХ пользователей.
Набор обработчиков должен быть статичен. Вместо этого храни и проверяй, что до этого делал данный пользователь.
Почитай про finite state machine.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы