Как ожидать следущее сообщение без FSM на aiogram

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

скажите: ЧЕМ ТЕБЕ НЕ НРАВИТСЯ FSM? а на нём нельзя работать на группе с несколькоми пользователями тоисть чел пишет в группу /start и пишет текст, все работает. НО ЕСЛИ один чел пишет /start и ДРУГОЙ чел пишет текст то сообщение ВООБЩЕ не обрабатывается

class Form(StatesGroup):
    a = State()    

async def a(msg):
    await Form.a.set()
    await msg.answer('Напишите текст')

async def b(msg, state):
    await state.finish()
    await msg.answer('Текст получен')

dp.register_message_handler(a, commands=['start'])
executor.start_polling(dp)

можно сделать так:

async def a(msg):
    dp.register_message_handler(b)
    await msg.answer('Напишите текст')

async def b(msg):
    await msg.answer('Текст получен')

dp.register_message_handler(a, commands=['start'])
executor.start_polling(dp)

но я не нашёл способ ОТМЕНИТЬ регистрацию обработчика и поэтому текст будет обрабатываться БЕСКОНЕЧНО на telebot есть next_step_handler НО ЧТО ДЕЛАТЬ В АИОГРАМЕ?

Ответы

▲ 0Принят

Как начёт такого варианта?

async def start(message: Message):
    await message.answer('Напишите текст')
    # храним состояние пользователя в переменной
    user_state[message.from_user.id] = 'waiting_for_text'

async def handle_text(message: Message):
    user_id = message.from_user.id
    # проверяем, ждем ли мы от пользователя текст
    if user_state.get(user_id) == 'waiting_for_text':
        await message.answer('Текст получен')
        # меняем состояние пользователя
        user_state[user_id] = 'text_received'
    else:
        pass

dp.register_message_handler(start, commands=['start'])
dp.register_message_handler(handle_text, func=lambda message: user_state.get(message.from_user.id) == 'waiting_for_text')
executor.start_polling(dp)