Ответы пользователя по тегу AIOgram
  • Как записать в FSM state свое значение или как словить callback и записать его в state?

    @twistfire92
    Python backend developer
    Уберите global переменную choosed_category

    @router.callback_query(F.data == 'shirt_shorts')
    async def ss(callback: CallbackQuery, state: FSMContext):
        await state.set_data({"choosed_category": shirt_shorts}) # прокидываем в state нужные данные
        # либо await state.update_data(choosed_category=shirt_shorts)
        await callback.answer()
        await callback.message.answer('Ты выбрал(а) категорию Футболка / Шорты \n' + txt.calculation)
        await state.set_state(CalculateCost.choosing_cost)
    
    ....
    
    @router.message(CalculateCost.choosing_cost)
    async def calculate(message: Message, state: FSMContext):
        state_data = await state.get_data()
        choosed_category = state_data["choosed_category]
        ....

    По-хорошему все 4 функции с обработкой калбеков можно сократить в одну, но это уже не тема вопроса
    Ответ написан
    3 комментария
  • Телеграм бот. Библиотека aiogram. Как построить многоуровневую ReplyKeyboardMarkup клавиатуру?

    @twistfire92
    Python backend developer
    Да, такую задачу (а именно чтобы нельзя было с любого участка в телеграм боте ввести название определенной кнопки) можно реализовать используя state из возможностей FSM в aiogram. Под каждый раздел меню устанавливать соответствующее состояние (state) для пользователя. И если пользователь введет название кнопки не относящееся к текущему состоянию, не реагировать. Но это чревато тем, что если где-то будет какая-то ошибка в логике установки состояний, пользователь окажется в ситуации, когда нажимает на кнопку, а бот не реагирует. Возможно поможет начать все сначала через /start, но это совсем не user friendly.

    Но лично мое мнение - удобнее делать многоуровневую Inline клавиатуру. И выглядит она красивее.
    Ответ написан
    Комментировать