Telegram бот не переходит на следующий state

Рейтинг: 0Ответов: 1Опубликовано: 30.06.2023

Я создаю чат-бота, который дает вам пример по математике на Python, используя библиотеку Aiogram. Я создаю чат-бота, который дает вам пример по математике на Python, используя библиотеку Sinogram. Это работает следующим образом, когда вы пишете команду /start, она предлагает выбрать 3 режима: умножение, деление и все сразу (1,2,3). Затем он предлагает, количество разрядов вам нужно. Затем он задает вам пример, допустим 121 * 121. Если вы ответите неправильно, например, 15 641, то вы проиграли, если 14 641, то вы выиграли (классика). Пока что я вставил только первый режим. У меня готовы второй и третий, но я вставлю их в самый последний момент.

Когда я тестировал бота, возникла проблема со состоянием wait_count (количество разрядов). В консоль он не пишет мне никаких ошибок, только предупреждение:

/home/user/Documents/library/projects/python/trener/main.py:31: FSMStorageWarning: You haven’t set any storage yet so no states and no data will be saved.
You can connect Memory Storage for debug purposes or non-essential data.
await state.update_data(type=int(sms.text))
/home/user/Documents/library/projects/python/trener/main.py:33: FSMStorageWarning: You haven’t set any storage yet so no states and no data will be saved.
You can connect Memory Storage for debug purposes or non-essential data.
await state.set_state(number.wait_count.state)

Я не смотря на предупреждение, я перешел к боту. И когда я уже дошел до состояния wait_count, после того как я ввел 2, он мне перезагрузил состояние и опять задал один и тот же вопрос. Я попытался удалить строки 40-45 и оставить 43 (временно), но это все равно не выходит (Я думал, что он просто не может из состояния взять информацию). Также я пробовал добавлять MemoryStorage (как в предупреждении), тогда он вообще не отвечал. Помоги мне, пожалуйста. Вот код:

import random
from aiogram import Bot,Dispatcher,executor,types
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
bot = Bot("<token>")
dp = Dispatcher(bot=bot)

def umn(ras):
    n1=random.randint(int("1"+"0"*(ras-1)),int("10"+"0"*(ras-1)))
    n2=random.randint(int("1"+"0"*(ras-1)),int("10"+"0"*(ras-1)))
    inp = str(n1)+"*"+str(n2)
    rest = n1*n2
    return inp,rest
class number(StatesGroup):
    wait_type = State()
    wait_count = State()
    wait_answer = State()
@dp.message_handler(commands=['start'])
async def start(mes:types.Message,state:FSMContext):
    await bot.send_message(mes.from_user.id,"""Добро пожаловать в математическую игру Миссия Невыполнима. Здесь вы можете потренировать свои мозги под умножежение, сложение, вычитание. Выберете режим:
Введите 1 для умножения.
Введите 2 для сложения - вычитания.
Введите 3 для нереально трудного режима все в перемешку""")
    await state.set_state(number.wait_type.state)
@dp.message_handler()
async def type(mes: types.Message,state: FSMContext):
    if mes.text=="":
        await mes.answer("Поле пустое, попробуйте еще раз:")
        return
    await state.update_data(type=int(mes.text))
    await mes.answer("Сколько разрядов вам для первого раза?")
    await state.set_state(number.wait_count.state)
@dp.message_handler()
async def count(mes: types.Message,state: FSMContext):
    if mes.text=="":
        await mes.answer("Поле пустое, попробуйте еще раз:")
        return
    await state.update_data(count=int(mes.text))
    global inp
    user_type = state.get_data()["type"]
    if user_type == 1:
        inp = umn(mes.text)
    else:
        inp= "Sorry"
    await mes.answer(inp[0])
    await state.set_state(number.wait_answer.state)
@dp.message_handler()
async def answer(mes: types.Message,state: FSMContext):
    if mes.text=="":
        await mes.answer("Поле пустое, попробуйте еще раз:")
        return
    if int(mes.text)==inp[1]:
        await mes.answer("T")
    else:
        await mes.answer("F")
    await state.finish()
if __name__ == '__main__':
    executor.start_polling(dp)

Ответы

▲ 1Принят

https://zelenka.guru/threads/3769612/

В хэндлере нужно прописать текущее состояние