@thenewdaniels

Aiogram 3 как Установить state для определенного пользователя?

В интернете нашёл только данный вариант кода:

state = dp.current_state(chat=chat_id, user=user_id)
await state.set_state(User.accepted)

Где:
dp - объект класса Dispatcher
chat_id - id чата, который должен быть равен id пользователя, если это переписка с пользователем
User.accepted - состояние в которое мы хотим привести пользователя

Такой код не будет выполнен, т.к по всей видимости такой способ был вырезан из aiogram 3.
Так в итоге каким образом установить state для определенного пользователя? Для Aiogram 3
  • Вопрос задан
  • 526 просмотров
Решения вопроса 1
@thenewdaniels Автор вопроса
Спасибо всем за помощь. В решении мне помогла вот такая конструкция:
for user in users:
        user_id = user[0]
        chat_id = user[0]
        state_with: FSMContext = FSMContext(
            #bot=bot,  # объект бота
            storage=dp.storage,  # dp - экземпляр диспатчера
            key=StorageKey(
                chat_id=chat_id,  # если юзер в ЛС, то chat_id=user_id
                user_id=user_id,
                bot_id=bot.id))
            await state_with.update_data() # обновить дату для пользователя
            await state_with.set_state(quizStates.temp1)  # пример присвоения стейта


В таком случае в state_with будет хранится состояние того человека, user_id которого указан в key
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@twistfire92
Python backend developer
Можете заглянуть в исходники aiogram, найти там класс FSMContext, экземпляр которого пробрасывается в вашу функцию, и поизучать это все.
Один из аргументов функции __init__ этого класса имеет тип StorageKey, который в свою очередь содержит информацию о чате, пользователе, боте и пр.
Я думаю вам стоит копать в эту сторону, создать руками отдельный инстанс FSMContext (назовем его custom_state), куда передадите отдельный инстанс StorageKey с нужными вам параметрами. Вторым параметром у FSMContext буедет выступать ваш Storage. Либо MemoryStorage, либо RedisStorage (либо у вас свой кастомный какой-то). Туда пробрасывайте тот Storage, который используете.

И вот уже у этого отдельного инстанса custom_state вызывайте метод set_state()

P.S. Сам такое не проворачивал, ответ написал опираясь на исходники aiogram. Копайте туда, пробуйте, экспериментируйте.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы