один и тот же код не работает aiogram

У меня есть бот для регистрации и я добавил в нём команду бана. Хендлеры и функции для этой команды я скопировал с одного из моих прошлых проектов, где структура кода такая же, там команда идеально работает, а в моём новом боте, бот переходит на следующий state, но хэндлер для этого стейта не срабатывает.

@dp.message_handler(commands=['ban'], state=None)
async def check_admin(message:types.message, state:FSMContext):
    member = await bot.get_chat_member(message.chat.id, message.from_user.id)

    if isinstance(member, ChatMemberOwner):
        await message.answer("Please type the name of the person you want to ban.")
        await Ban.nickname_ask.set()
    else:
        await message.answer("You are not allowed to use this command.")

 @dp.message_handler(state=Ban.nickname_ask)
 async def name_ask(message:types.message, state:FSMContext):
     async with state.proxy() as data:
         data['nickname'] = message.text
     await Ban.ban_list_add.set()

@dp.message_handler(state=Ban.ban_list_add)
async def list_add(message:types.message, state:FSMContext):
    async with state.proxy() as data:
        await message.answer(f"User banned successfully: @{data['nickname']}")
        await add.add_name(data['nickname'])

Бот переходит в Ban.nickname_ask(), но хэндлер для него не срабатывает.


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

Автор решения: Ben Puls

Вы задаёте переход в состояние Ban.nickname_ask, выполняете какую-то логику и переходите в Ban.ban_list_add, а в этом состоянии от пользователя не требуется передача данных. Из-за этого бот ждёт, что пользователь напишет ещё что-то, чтобы написать ответ из состояния Ban.ban_list_add, поэтому логика в последнем состоянии не выполнится без ещё одного сообщения.

Чтобы это исправить достаточно переместить логику из последнего состояния, убрав его за ненадобностью, в предпоследнее:

@dp.message_handler(state=Ban.nickname_ask)
async def name_ask(message:types.message, state:FSMContext):
    nickname = message.text
    await message.answer(f"User banned successfully: @{nickname}")
    await add.add_name(nickname)

После этого можно выполнить любую логику или завершить FSM. В новом коде мы никуда не складываем данные, потому что они не будут переданы далее и будут обработаны на месте.

  • Пример работы машины конечных состояний в aiogram 2.x
  • Статья о работе FSM в aiogram 3.x.
→ Ссылка