@Nekech

Как исправить ошибку в машине состояний aiogram?

Пишу болта для телеграмм канал, нужно добавить все мини-игры(орел и решка, и кубик)
Все делаю через машину состояний, и эти две игру начинают у меня "конфликтовать"
Например
Я нажимаю на кнопку "Кубик", дальше он просит внести ставку и пишет выбрать число от 1 до 6, после того как пользователь напишет свое число, бот должен написать 'Победа' или же 'Проигрыш'(в зависимости от того угадал пользователь или нет)
Но все идет по- другому после того как пользователь выбирает число, бот пишет, что его ставка принята и просит выбрать сторону(он берет это из игры орел и решка)
Как это исправить?
class FSMstavka(StatesGroup):
    cash = State()
    random_num = State()
    number = State()
    ston = State()
    srav = State()


@dp.callback_query_handler(text = 'or',state=None)
async def stavka(callback: types.CallbackQuery):
    await FSMstavka.cash.set()
    await callback.message.answer(f'Введи сумму ставки!(Минимальная ставка - 1р. Максимальная - 10р.)')
    await callback.answer()

@dp.message_handler(content_types=['text'],state=FSMstavka.cash)
async def cash(message: types.Message, state: FSMstavka):
    async with state.proxy() as data:
        data['cash'] = int(message.text)
        с = data['cash']
        if с >= 1 and с <= 10:
             await message.answer(f'Твоя ставка {с}! Теперь выбери сторону')
             await FSMstavka.next()
        else:
             await message.answer('Такую сумму поставить нельзя! Сделай ставку снова')


@dp.message_handler(state=FSMstavka.random_num)
async def random_nun(message: types.Message, state: FSMstavka):
    async with state.proxy() as data:
        c = data['cash']
        myseq = ['Орел', 'Решка']
        choice(myseq)
        #с = random.randint(0,1)
        await FSMstavka.next()
        if message.text == choice(myseq):
            c = c * 2
            await message.answer(f'Победа,твой выигрыш {c}')
        else:
            await message.answer('Проигрыш')
    await state.finish()





class FSMkub(StatesGroup):
    money = State()
    random_number = State()

@dp.callback_query_handler(text = 'k',state=None)
async def stav(callback: types.CallbackQuery):
    await FSMkub.money.set()
    await callback.message.answer(f'Введи сумму ставки!')
    await callback.answer()

@dp.message_handler(content_types=['text'],state=FSMkub.money)
async def money(message: types.Message, state: FSMkub):
    async with state.proxy() as data:
        data['money'] = int(message.text)
        s = data['money']
        if s > 0:
             await message.answer(f'Твоя ставка {s}! Теперь выбери число')
             await FSMstavka.next()
        else:
             await message.answer('Такую сумму поставить нельзя! Сделай ставку снова')

@dp.message_handler(state=FSMkub.random_number)
async def random_nun(message: types.Message, state: FSMkub):
    async with state.proxy() as data:
        s = data['money']
        ku = random.randint(0,5)
        await FSMstavka.next()
        if int(message.text) == ku:
            s = s * 6
            await message.answer(f'Победа,твой выигрыш{s}')
        else:
            await message.answer('Проигрыш')
    await state.finish()
  • Вопрос задан
  • 59 просмотров
Решения вопроса 1
SoreMix
@SoreMix
yellow
Ошибка в использовании FSMstavka.next() везде.
При обычном использовании FSM, оно переключает состояние на следующее, которое должно определять следующий шаг. В логике Вашей программы одно состояние отвечает за отдельную игру, которые никак не связаны между собой. Переключение на следующий стейт в каждой игре просто не нужно.
Плюс, ругается на две функции random_nun

Как минимум убрать
await FSMstavka.next()
в random_nun

А в функции money заменить FSMstavka.next() на FSMkub.next()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы