Ожидание ответа от пользователя Aiogram. TimeOut

@dp.message_handler(content_types=types.ContentTypes.NEW_CHAT_MEMBERS)
async def new_chat_member(message: types.Message, state: FSMContext):
    global text, new_member
    text = '1234'
    new_member = message.new_chat_members[0]
    data = image.generate(text)
    await message.answer_photo(photo=data)
    await Form.captcha.set()


@dp.message_handler(state=Form.captcha)
async def process_captcha_check(message: types.Message, state: FSMContext):
    if message.text == text:
        await state.update_data(captcha_message = True)
        await message.answer("Ты умный, капчу разгадал")
        await state.finish()

При входе юзера в чат бот отсылает ему картинку с каптчей. Тут же идёт переход в другое состояние где ожидается отправка капчи. Как сделать так, что если в течении 30 секунд нет ответа от пользователя, бот кикает его с чата?


Ответы (1 шт):

Автор решения: oleksandrigo

Штош. Лучше поздно, чем никогда.

class Form(StatesGroup):
    captcha = State()


@dp.message_handler()
async def new_chat_member(message: types.Message, state: FSMContext):
    global text, new_member
    text = '1234'
    new_member = message.new_chat_members[0]
    data = image.generate(text)
    await message.answer_photo(photo=data)
    await Form.captcha.set()

    # Ждем 30 сек. Потом проверяем менялся ли стейт. Если да то ничего не происходит.
    # Если стейт тот же значит юзер не перешёл в хендлер ниже
    await asyncio.sleep(30)

    if await state.get_state() == "Form:captcha":
        # так как вы просили просто кик, то после бана сразу же разбан
        # ибо чистого кика нету
        await bot.ban_chat_member(chat_id=message.chat.id, user_id=message.from_user.id)
        await bot.unban_chat_member(chat_id=message.chat.id, user_id=message.from_user.id)


@dp.message_handler(state=Form.captcha)
async def process_captcha_check(message: types.Message, state: FSMContext):
    if message.text == text:
        await state.update_data(captcha_message=True)
        await message.answer("Ты умный, капчу разгадал")
        await state.finish()
→ Ссылка