@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)
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
@dp.message_handler()
        async def reply_message_X1(message: types.Message):

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

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

Войти через центр авторизации
Похожие вопросы
25 окт. 2024, в 22:20
3000 руб./за проект
25 окт. 2024, в 21:46
7500 руб./за проект
25 окт. 2024, в 21:45
2000 руб./в час