@Forward1232

Почему не вызывается if в хэндлере?

@dp.callback_query_handler(text='qwe')
async def plt(call: CallbackQuery):
    if 'abc' in call.message:
        await call.message('Привет')


Почему не выполняется 'abc'

Пытался исправить

@dp.callback_query_handler()
async def plt(call: CallbackQuery):
    if 'polt' in call.data:
        await call.message.edit_text('Красава', reply_markup=pltv)
        if 'amf' in call.data:
            await call.message.answer('Ура', reply_markup=btnp_all)


Так тоже не работает :(
Мне надо что бы 'amf' выполнялся только тогда когда выполнен 'polt'
  • Вопрос задан
  • 58 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Это обработка нажатий на виртуальные кнопки?
Каждое нажатие - это отдельный вызов обработчика.
Обработчик, получивший polt, ещё ничего не знает об amf.
Обработчик, получивший amf, уже ничего не будет знать о polt.

Тебе нужно сохранять состояние для разных пользователей. Например, вести коллекцию пользователей, нажавших polt. Вообще тебе стоит почитать про конечные автоматы - теория будет звучать несколько заумно, но идея проста как две копейки.

Состояние - это когда для объекта выполняется какое-то условие. Например, в нашем случае у пользователя есть два состояния - "не нажал на polt", "нажал на polt".
Между состояниями есть переходы. В нашем случае есть один переход, который должен вызываться нажатием на polt.

Отсюда вывод: мы для всех известных нам пользователей должны хранить их состояние. Обработчик callback_query_handler() должен при получении команды смотреть на их состояние и выполнять действия в завимости от сочетания команды и состояния. Действия могут включать в себя в т.ч. переход в другое состояние.

Хранить состояния можешь пока что в словаре (dict), где ключ - id пользователя, а значение - код состояния. Но словарь будет потерян при перезапускке бота, так что потом тебе придётся освоить хранение в БД.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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