Как запустить FSM state с юзером из чата в Aiogram 3?

Бот отправляет в чат кнопку с запросом проголосовать

@router.message(Command("startvoting", prefix="/!"))
async def start_voting(message: Message):
    await message.answer(start_voting_announce, reply_markup=vote_button())

По нажатию отправляет участнику сообщение в лс, но сама сессия голосования начинается в группе

@router.callback_query(F.data == 'vote')
async def vote(call: CallbackQuery, bot: Bot, state: FSMContext):
    user_id = call.from_user.id
    await bot.send_message(user_id, vote_session_message)
    await state.set_state(Voting.cast_vote)
    await call.answer()

Можно ли каким то образом задать, где будет запущен state?


Ответы (1 шт):

Автор решения: whyte322

В общем реализовал через передачу в кнопку deep link

from aiogram.utils.deep_linking import create_start_link

@router.callback_query(F.data == 'vote')
async def vote(call: CallbackQuery, bot: Bot, state: FSMContext):
link = await create_start_link(call.bot, 'vote', encode=True)
        await call.answer(
            url=link
        )

FSM стейт запускаю уже в чате с юзером при старте бота с диплинка:

@router.message(CommandStart(deep_link=True))
async def vote(message: Message, state: FSMContext, command: CommandObject):
    decode = decode_payload(command.args)
    if decode == 'vote':
        await message.answer(vote_session_message)
        await state.set_state(Voting.cast_vote)
→ Ссылка