Настройка что Бот печатет AIOGRAM 3 @flags.chat_action("typing") ChatActionMiddleware
Продолжаю изучение aiogram 3 (делаем TG бота), интересное нашел тут https://habr.com/ru/articles/733732/ Очень хочу научиться делать что бот печатает, когда пользователь чтото нажал и пока готовится ответ ... в целом по посту выше получилось и это работает для обработок пунктов меню (start, help и прочее), если там чтото делается долго (можно sleep поставить), то появляется что бот печатает ... очень круто. Но никак не могу сделать так, чтобы это же работало с при нажатии на inline кнопки. В итоге при нажатии на пункт меню (например отчеты) работает отображение что бот печатает ...:
обработка нажатия кнопки меню - report
@router.message(Command("report"))
@flags.chat_action("typing")
async def report_handler(msg: Message):
asyncio.sleep(3)
mainLogger.info('User press command <report>')
await msg.answer('Строим отчеты ...')
...
А вот при добавлении такого же флага для хэндлера нажатия кнопки, статут печатает не работает никак:
@router.callback_query(F.data == "btnOrdersToday")
@flags.chat_action("typing")
async def btnOrdersToday_handler(clbck: CallbackQuery, state: FSMContext):
asyncio.sleep(3)
mainLogger.info('User press <btnOrdersToday> ')
...
В чем может быть проблема?
Ответы (2 шт):
Вероятно, вы не подключили ChatActionMiddleware
, подключение описано перед использованием @flags.chat_action
в этом абзаце описание подключения ChatActionMiddleware
UPD:
asyncio.sleep(3)
асинхронный - следует указать какawait
- В место строк экшенов, например "typing", лучше будет использовать константы из ChatAction, например
@flags.chat_action(ChatAction.TYPING)
Изучил документацию, и выяснил, что ChatActionMiddleware
работает только с объектами message
, и не работает с callback_query
.
В итоге решил по другому, через конструкцию:
async with ChatActionSender.typing(bot=bot, chat_id=message.chat.id):
# Do something...
# Perform some long calculations
await message.answer(result)