Задать вопрос
@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
  • Вопрос задан
  • 1582 просмотра
Подписаться 1 Простой 3 комментария
Решения вопроса 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. Копайте туда, пробуйте, экспериментируйте.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы