@Nikita235

Проблема с машиной состояний в aiogram. Как это можно исправить?

У меня возникла неприятная ситуация: запускаю машину состояний и отвечаю на последовательность вопросов, но предположим, не захотел отвечать до конца и вызвал другую команду из арсенала бота. Бот реагирует так:он продолжает присылать вопросы из FSM, а чуть позже зависает. Помогает только перезагрузка.

Вот мой код:
class Protest(StatesGroup):
    full_name = State()
    teem_name = State()
    enemy = State()
    date = State()
    time = State()
    cause = State()


@dp.message_handler(commands=["protest"], state=None)
async def start_protest(message: types.Message):
    await Protest.full_name.set()
    await message.answer("Введите Ваше ФИО:")


@dp.message_handler(state=Protest.full_name)
async def name_protest(message: types.Message, state=FSMContext):
    async with state.proxy() as data:
        data["full_name"] = message.text
    await Protest.next()
    await message.answer("Введите название Вашей команды:")


@dp.message_handler(state=Protest.teem_name)
async def teem_name_protest(message: types.Message, state=FSMContext):
    await Protest.next()
    async with state.proxy() as data:
        data["teem_name"] = message.text
    await message.answer("Введите название команды соперника")

@dp.message_handler(state=Protest.enemy)
async def enemy_teem(message: types.Message, state=FSMContext):
    await Protest.next()
    async with state.proxy() as data:
        data["enemy"] = message.text
    calendar, step = DetailedTelegramCalendar(min_date=date.today(), locale="ru").build()
    await bot.send_message(message.chat.id,
                           f"Выберите дату проведения матча:",
                           reply_markup=calendar)


@dp.callback_query_handler(DetailedTelegramCalendar.func(), state=Protest.date)
async def inline_kb_answer_callback_handler(query, state=FSMContext):
    result, key, step = DetailedTelegramCalendar(locale="ru").process(query.data)

    if not result and key:
        await bot.edit_message_text(f"Выберите дату проведения матча",
                                    query.message.chat.id,
                                    query.message.message_id,
                                    reply_markup=key)
    elif result:
        await bot.edit_message_text(f"Вы выбрали: {result}. Напишите время проведения матча",
                                    query.message.chat.id,
                                    query.message.message_id)

        await Protest.next()
        async with state.proxy() as data:
            data["date"] = result


dp.message_handler(state=Protest.time)
async def time_match(message: types.Message, state=FSMContext):
    async with state.proxy() as data:
        data["time"] = message.text
    await Protest.next()
    await message.answer("Назовите причину Вашего протеста")


@dp.message_handler(state=Protest.cause)
async def cause_protest(message: types.Message, state=FSMContext):
    async with state.proxy() as data:
        data["cause"] = message.text
    await protest_db.sql_add_command(state)
    await state.finish()
    await message.answer("Ваш протест будет рассмотрен")


Как исправить подобное? У меня были мысли на счет try except, но я не уверен
  • Вопрос задан
  • 339 просмотров
Пригласить эксперта
Ответы на вопрос 1
gnifajio
@gnifajio
Совершенствуюсь каждый день
Чтобы избежать этой проблемы, вы можете пометить каждую команду, которая вызывает машину состояний, с помощью @dp.message_handler(state=None). Таким образом, если пользователь вызывает эту команду, машина состояний будет начинаться сначала, а не продолжать с текущего состояния.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы