Как можно назначить состояние конкретному пользователю?

Я разрабатываю телеграм-бота на Python с использованием aiogram 3, и это мой первый проект. Бот функционирует аналогично Дайвинчику. Когда один пользователь ставит лайк анкете другого, бот должен отправить текстовое сообщение пользователю, чей профиль был лайкнут. Вот часть кода: 
<pre><code class="python">async def like(tg_id_1: int, tg_id_2: int) -&gt; None:
    """
    :param tg_id_1: Поставивший лайк
    :param tg_id_2: Лайкнутый
    """
    await bot.send_message(
        tg_id_2,
        'Кому-то понравилась твоя анкета! Заканчивай с вопросом выше и посмотрим кто это'
    )
    # Здесь я хочу установить состояние (FSMContext) пользователю с ID tg_id_2,
    # при этом бот должен продолжать работу с пользователем tg_id_1.</code></pre> 
Как мне установить состояние (FSMContext) для другого пользователя, а не для текущего?
  • 22 декабря 2024 г. 15:13
Ответы на вопрос 2
В библиотеке Aiogram для работы с состояниями используется система состояния (Finite State Machine, FSM). Чтобы назначить состояние конкретному пользователю, вам нужно получить доступ к контексту состояний и использовать `set_state` для пользователя, который должен иметь новое состояние.

Ваша функция `like` будет выглядеть примерно так:

```python
from aiogram import Bot
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher import Dispatcher

# Здесь должен быть ваш бот и диспетчер
bot = Bot(token='YOUR_BOT_TOKEN')
dp = Dispatcher(bot)

async def like(tg_id_1: int, tg_id_2: int, state: FSMContext) -> None:
    """
    :param tg_id_1: Поставивший лайк
    :param tg_id_2: Лайкнутый
    :param state: FSMContext
    """
    await bot.send_message(
        tg_id_2,
        'Кому-то понравилась твоя анкета! Заканчивай с вопросом выше и посмотрим кто это'
    )
    
    # Устанавливаем состояние для tg_id_2
    await state.storage.set_state(user=tg_id_2, state='your_desired_state')

    # Вы можете продолжать работу с пользователем tg_id_1
```

Основные моменты, которые нужно учесть:

1. Помните, что `FSMContext`, который вы получаете в хэндлерах, связан с конкретным пользователем. Чтобы установить состояние для другого пользователя, нужно будет использовать методы `set_state` напрямую из хранения состояний.

2. Убедитесь, что вы правильно определили состояния в вашем проекте. Вам нужно описать класс состояния, который будет использоваться:

```python
from aiogram.dispatcher import FSMContext, State, StatesGroup

class MyStates(StatesGroup):
    waiting_for_answer = State()
    # Другие состояния...
```

3. Поскольку вы хотите устанавливать состояние для пользователя, который не является текущим пользователем (в данном примере `tg_id_2`), необходимо удостовериться, что состояние для него существует в хранилище состояний (например, Redis или MemoryStorage).

Если вы используете хранилище состояний, которое поддерживает несколько пользователей (что является, по сути, стандартным), это будет работать правильно.

Для более сложных случаев, когда вы хотите сохранять данные промежуточного состояния, вы также можете использовать `state.update_data()` для хранения и получения данных для конкретных пользователей.
Оригинальный бот работает с ДБ, т.е. каждой анкете можно присваивать айди пользователя. Т.е. при создании анкеты она должна попасть в ДБ типа: 
ID Anketa
25 Тут анкета (текст + ссылка (путь) к фото)

С этим уже нужно разобраться самим
Похожие вопросы