Как реализовать возможность вызова любого состояния в FSM командой. Не по порядку

Изучаю aiogram и решил сделать простого бота для набивания практики. Пользователь после команды math_task1 получает значение двух чисел, сумму которых надо найти, а после команды math_task2 надо найти разность и отправить боту. Так вот: если после первой команды, кнопкой, сразу выбрать вторую, вводить 2 числа, то если отправить разность выданных чисел засчитывает за ошибку. Тоже будет если перезапустить бота командой start. Если наоборот сперва math_task2, потом сразу math_task1 отправить сумму, засчитает за ошибку. Добавил машину состояний. Пока не до конца понял, в ней что нельзя идти не по порядку? Т.е из первого строго во второе, никак не сразу в третье? или сразу второе, потом первое. потом третье.

class Math_task(StatesGroup):
    Math_task1=State()
    Math_task2=State()

Это собственно выбор команды

@dp.message_handler(commands=['Choice_level'],state=None)
async def Choice_level_cmd(message:types.Message):
await bot.send_message(message.from_user.id,text='Выберите уровень',
                        parse_mode="HTML",
                       reply_markup=lkb)

Это для кнопки BACK

@dp.message_handler(commands=['BACK'],state='*')
async def back_cmd(message: types.Message, state: FSMContext) -> None:
    # await bot.send_message(message.from_user.id,text='Начинаем')
    await message.reply(text='Вернул в меню',
                        reply_markup=lkb)

Это первая команда и состояние.

@dp.message_handler(commands=['math_task1'], state=Math_task.Math_task1)
async def math_task1(message:types.Message,state: FSMContext):

await message.answer(text=f'Найти сумму {a}, 
{b}',reply_markup=back_keyboard)
# await message.answer(reply_markup=back_keyboard)
c=a+b
print(c)
@dp.message_handler(state=Math_task.Math_task1)
async def math_task1_1(message: types.Message):
    global a,b
    c=a+b
    if str(message.text) == str(c):
        await message.answer("Правильно")
        a = random.randrange(0, 100)
        b = random.randrange(0, 100)
        await message.answer(text=f'Найти сумму {a}, {b}')

    if  str(message.text) != str(c) and str(message.text)!='/BACK' and 
        str(message.text)!='/math_task2':
        await message.answer('Неправильно, пробуй еще.')
        a = random.randrange(0, 100)
        b = random.randrange(0, 100)
        print(a, b, 'math_task1')
        print(c)
        await message.answer(text=f'Найти сумму {a}, {b}')
        print(a, b, 'math_task1')
        print(c)
        print(message.text)
    if  str(message.text)=='/BACK':
        await state.finish()




@dp.message_handler(commands=['math_task2'], state=Math_task.Math_task2)
async def math_task1(message:types.Message,state: FSMContext):
a = random.randrange(0, 100)
b = random.randrange(0, 100)
await message.answer(text=f'Найти разность {a}, 
{b}',reply_markup=back_keyboard)
# await message.answer(reply_markup=back_keyboard)
c=a-b
print(c)
@dp.message_handler()
async def math_task1(message: types.Message):
    if  str(message.text) == str(c):
        await message.answer("Правильно")
        a = random.randrange(0, 100)
        b = random.randrange(0, 100)
        await message.answer(text=f'Найти разность {a}, {b}')

    if  str(message.text) != str(c) and str(message.text)!='/BACK' and 
        str(message.text)!='/math_task2':
        await message.answer('Неправильно, пробуй еще.')
        a = random.randrange(0, 100)
        b = random.randrange(0, 100)
        print(a, b, 'math_task1')
        print(c)
        await message.answer(text=f'Найти разность {a}, {b}')
        print(a, b, 'math_task1')
        print(c)
        print(message.text)
    if  str(message.text)=='/BACK':
        await state.finish()

в команде BACK, 2 кнопки, теперь при нажатии на math_task2 никакой реакции нет. т.е бот не видит команду. Вопрос: как в Choice_level прописать возможность вызова состояния Math_task1=State() либо Math_task2=State() в любом порядке


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