Задать вопрос
@neoficialniy

Как в aiogram при рассылке-приглашении с кнопками принять/отказаться передать данные в хендлер, который ловит кнопку принять??

Есть рассылка пользователям с кнопками принять/отказаться. Нужно как-то передать данные с id события, чтобы если пользователь нажимает Принять, мы понимали, по какому именно мероприятию он принял и заносили его в нашу БД как участника определенного мероприятия
state.update_data а потом state.get_data и async with state.proxy() as data: data['EVENT_ID'] = event_id - не работаютю В лучшем случае передаётся пустой словарь

Функция рассылки с кнопками, вызываю её как обычную функцию:

@dp.message_handler(IsPrivateMsg())
async def msg_send_all(event_id, state: FSMContext):
    text = get_text(event_id)
    await state.update_data(EVENT=int(event_id))    
    # async with state.proxy() as data:    # это то, что я уже пробовал
    #     data['EVENT_ID'] = event_id       # это то, что я уже пробовал
    users = get_users()
    for user_id in users:
        try:
            await bot.send_message(chat_id=user_id,
                                   text=text,
                                   reply_markup=ikb_users())
            await sleep(0.3)
        except Exception:
            pass


Хендлер, который ловит нажатие на кнопку Подтверждение:
@dp.callback_query_handler(IsPrivateCb(), text='sign_up', state='*')
async def cb_add_confirm(callback: types.CallbackQuery, state: FSMContext):
   await callback.message.delete()   
   try:
        a1 = await state.get_data()
        a2 = a1.get('EVENT')
        print(a2)  # в консоли выводит None
    except Exception:
        pass

    add_participant(callback.message.from_user.id, event_id)
    await state.finish()
  • Вопрос задан
  • 56 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
SoreMix
@SoreMix
yellow
ID ивента сильно большое? Если нет, киньте его просто в кнопку, разделив каким нибудь символом. Потом вытащите в хендлере этот ID. Так и париться с fsm не надо, и появляется поддержка сразу нескольких ивентов. А так у вас стейты запутаны, ID ивента ставите в FSM администратора, и потом пытаетесь его достать из FSM юзера. По идее можно указать конкретно, стейт из какого чата вы хотите достать:
https://docs.aiogram.dev/en/latest/_modules/aiogra...

InlineKeyboardButton('Принять', callback_data=f'sign_up_{eventid}')

....


@dp.callback_query_handler(lambda callback: callback.data.startswith('sign_up_'))
async def cb_add_confirm(callback: types.CallbackQuery):
    event_id = callback.data.split('_')[-1]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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