Как реализовать возможность вызова любого состояния в 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() в любом порядке