Пишу бота в телеграмм на питоне, при помощи библиотеки aiogram, бот работает, запускается, но FSM машина состояний не запускается, что делать?

Рейтинг: 0Ответов: 1Опубликовано: 22.01.2023
from aiogram import Bot, types, Dispatcher
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.utils import executor
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher.filters import Text

from config23 import TOKEN

ID = None


class FSMAdmin(StatesGroup):
    name = State()
    date = State()


storage = MemoryStorage()

bot = Bot(token=TOKEN)
dp = Dispatcher(bot, storage=storage)

b1 = KeyboardButton('/Продолжить')
b2 = KeyboardButton('/загрузить')

kb_client = ReplyKeyboardMarkup(resize_keyboard=True)
form = ReplyKeyboardMarkup(resize_keyboard=True)

kb_client.add(b1)
form.add(b2)


@dp.message_handler(commands=['start', 'help'])
async def commands_start(message: types.Message):
    try:
        await bot.send_message(message.from_user.id, 'Привет, я бот, который поможет тебе в напоминании'
                                                     ' о чем-либо, для '
                                                     'продолжения работы нажми на кнопку.',
                               reply_markup=kb_client)
        await message.delete()
    except:
        await message.reply('Общение с ботом работает исключитьно через ЛС, напишите ему:'
                            '\nhttps://t.me/Reminderfunbot')


@dp.message_handler(commands=['Продолжить'])
async def prod(message: types.Message):
    await bot.send_message(message.from_user.id, 'Сейчас мы заполним согласно формату данные, которые мне необходимы '
                                                 'и в указанное время я оповещу тебя)\n'
                                                 'ВАЖНО: Если хотите, чтобы бот работал правильно, после нажатия на'
                                                 ' кнопку делайте только то, что от вас требует бот.',
                           reply_markup=form)


# @dp.message_handler(commands="загрузить", state="*")
async def cm_start(message: types.Message):
    if message.from_user.id == ID:
        await FSMAdmin.name.set()
        await message.reply('Напиши мне название мероприятия')


# @dp.message_handler(state=FSMAdmin.name)
async def load_name(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['name'] = message.text
    await FSMAdmin.next()
    await message.reply('Напиши дату')


# @dp.message_handler(state=FSMAdmin.date)
async def load_date(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['date'] = message.text

    async with state.proxy() as data:
        await message.reply(str(data))
    await state.finish()


# @dp.message_handler(state="*", commands='отмена')
# @dp.message_handler(Text(equals='', ignore_case=True), state="*")
async def cancel_handler(message: types.Message, state: FSMContext):
    current_state = await state.set_state()
    if current_state is None:
        return
    await state.finish()
    await message.reply('ОК')


def reg_handlers(dp: Dispatcher):
    dp.register_message_handler(cm_start, commands='загрузить', state=None)
    dp.register_message_handler(load_name, state=FSMAdmin.name)
    dp.register_message_handler(load_date, state=FSMAdmin.date)
    dp.register_message_handler(cancel_handler, state="*", commands='отмена')
    dp.register_message_handler(cancel_handler, Text(equals='', ignore_case=True), state="*")


if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)


Вот весь код, помогите пожалуйста :(

Ответы

▲ 0

Понял в чем проблема вот исправленный, рабочий код -

class FSMAdmin(StatesGroup):
    name = State()
    dataus = State()


@dp.message_handler(commands='Загрузить')
async def f_start(message: types.Message):
    await FSMAdmin.name.set()
    await message.answer('Напиши мне название мероприятия')


@dp.message_handler(state=FSMAdmin.name)
async def load_name(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['name'] = message.text
    await FSMAdmin.dataus.set()
    await message.reply('Напиши дату')


@dp.message_handler(state=FSMAdmin.dataus)
async def load_data(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['dataus'] = message.text
    async with state.proxy() as data:
        await message.reply(str(data))
    await state.finish()