Как управлять состоянием пользователя в Telegram-боте без использования FSM

Ответ

Управлять состоянием пользователя без FSM (Finite State Machine) можно, сохраняя его вручную в каком-либо хранилище. Это подходит для простых сценариев, где не требуется сложная логика переходов между состояниями.

Способы хранения состояния:

  1. Словарь в памяти (In-memory Dictionary): Подходит только для отладки. Данные теряются при перезапуске бота.
  2. Кэш (Redis): Быстрый и эффективный способ. Состояние хранится в виде пар user_id:state с возможностью установки времени жизни (TTL).
  3. База данных (SQLite, PostgreSQL): Надёжный способ для хранения долгоживущих состояний и связанных с ними данных.

Пример на aiogram с хранением в словаре:

from aiogram import Bot, Dispatcher, types

# ВАЖНО: Этот способ не подходит для продакшена, т.к. данные теряются при перезапуске
user_states = {}

bot = Bot(token="YOUR_API_TOKEN")
dp = Dispatcher(bot)

# Шаг 1: Запускаем диалог и устанавливаем состояние
@dp.message_handler(commands=['register'])
async def start_registration(message: types.Message):
    user_id = message.from_user.id
    user_states[user_id] = "waiting_for_name"
    await message.answer("Введите ваше имя:")

# Шаг 2: Обрабатываем сообщение в зависимости от текущего состояния
@dp.message_handler()
async def process_message(message: types.Message):
    user_id = message.from_user.id
    current_state = user_states.get(user_id)

    if current_state == "waiting_for_name":
        name = message.text
        await message.answer(f"Отлично, {name}! Теперь введите ваш возраст.")
        # Переводим пользователя в следующее состояние
        user_states[user_id] = "waiting_for_age"

    elif current_state == "waiting_for_age":
        age = message.text
        await message.answer(f"Регистрация завершена! Ваш возраст: {age}")
        # Очищаем состояние после завершения диалога
        del user_states[user_id]

Преимущества:

  • Простота реализации для коротких диалогов.
  • Полный контроль над логикой хранения.

Недостатки:

  • Код быстро усложняется с ростом числа состояний.
  • Требуется вручную реализовывать логику переходов и очистки состояний.

Для сложных ботов использование встроенных механизмов FSM (aiogram.fsm) является предпочтительным.