один и тот же код не работает 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 шт):
Вы задаёте переход в состояние 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. В новом коде мы никуда не складываем данные, потому что они не будут переданы далее и будут обработаны на месте.