Сохранение состояний после нажатия кнопок в ТМ

Hidsan

Новичок
Пользователь
Ноя 29, 2024
2
0
1
Коллеги, добрый день!

Пишу чат-бот для телеграмма и столкнулся с такой проблемой.
В чем суть бота:
Пользователь нажимает кнопку. Его спрашивают “введите имя”. Он вводит текст. Этот текст далее ищется в файле эксель. Если уникальных значений больше 1, то пользователю выдаются кнопки с вариантами выбора. После того, как он выбрал выполняется повторный поиск с точным значением, создаётся датафрейм и передаётся в след. функцию. Во второй функции идет проверка по уникальным значениям из другого столбца (без участия пользователя). Если во втором столбце уникальных больше 1, то так же спрашивает пользователя и просит выбрать. Вот тут и загвоздка. Когда пользователь выбирает нужное значение, состояние не передаётся в обработчик нажатия кнопки и, соответственно, я не могу использовать сохраненный ранее датафрейм чтобы сделать фильтр во втором столбце и сохранить второй вариант датафрейма. Вот пример кода второй фильтрации.

Python:
async def process_callback_fp_1(message: types.Message, state: FSMContext):
    data = await state.get_data()
    filtered_df_state_1 = data.get('filtered_df_state_1')
    print(f'Данные в filtered_df_state_1 у функ. process_callback_fp_1 {filtered_df_state_1}.')
    if not filtered_df_state_1.empty:
        unique_values = filtered_df_state_1.iloc[:, 14].unique()
        poisk_term = filtered_df_state_1.iloc[:, 18].unique()
        filtered_df_state_1.to_excel('filtered_df_state_1.xlsx', index=False)
        await state.update_data(filtered_df_state_2=filtered_df_state_1)
        data2 = await state.get_data()
        print(f'Проверка дата2: {data2}.')
        # Проверка на единственное значение
        if len(unique_values) == 1:
            print(f'Одно уникальное значение "Куда доставить" у process_callback_fp_1.')
            await process_callback_fp_2(filtered_df_state_1, state)  # Отправляем датафрейм в функцию
        # Если больше одного уникального значения
        elif len(unique_values) > 1:
            print(f'Уникальные значения у process_callback_fp_1 больше 1: {unique_values}')
            buttons = [InlineKeyboardButton(text=str(value),
                                            callback_data=f'select2_{value}') for value in unique_values]
            # Создаем инлайн клавиатуру с кнопками
            inline_kb = InlineKeyboardMarkup(inline_keyboard=[buttons])
            # print(f'Type of message: {type(message)}')
            await message.answer("Выберите одно из уникальных значений:", reply_markup=inline_kb)
    else:
        print("Поиск ничего не дал, попробуйте другой запрос.")
        #await callback_query.message.answer("Поиск ничего не дал, попробуйте другой запрос.")
# Обработка выбора пользователя если при втором поиске > 1 варианта
@router.callback_query(lambda callback_query: callback_query.data.startswith('select2_'))
async def process_callback_button_for_2(callback_query: types.CallbackQuery, state: FSMContext):
    selected_value = callback_query.data.split('select2_')[1]  # Извлекаем значение после 'select_'
    data = await state.get_data()
    print(f'Данные в process_callback_button_for_2 {data}.')
    print(f'Данные в callback_query {callback_query.data}.')
    await callback_query.answer()  # Подтверждение нажатия
    print(f'Отправляем в process_selected_value_2: {selected_value}')
    await process_selected_value_2(selected_value, state)
#
# Обработка выбора пользователя если при втором поиске > 1 варианта
async def process_selected_value_2(selected_value: str, state: FSMContext):
    # Логика обработки для выбранного значения
    data = await state.get_data()
    print(f'Данные в data функц process_selected_value_2: {data}.')
 

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
434
119
43
а где декоратор для process_selected_value_2?
 

Hidsan

Новичок
Пользователь
Ноя 29, 2024
2
0
1
а где декоратор для process_selected_value_2?
А зачем он нужен? Функция process_callback_fp_1 : Если уникальных значений больше 1, то пользователю предлагают выбор в виде инлайн кнопок и результат выбора обрабатывается в process_callback_button_for_2. Этот результат отправляется в process_selected_value_2. Так вот даже в process_callback_button_for_2 не передается состояние из функции process_callback_fp_1 и я не понимаю почему. Оно куда-то теряется.
 

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
434
119
43
А зачем он нужен?
Да, он не нужен, просто твой комментарий "# Обработка выбора пользователя если при втором поиске > 1 варианта" сбивает с толку, т.к. продублирован с process_callback_button_for_2 на process_selected_value_2.

await state.update_data(filtered_df_state_2=filtered_df_state_1)
тут что-то непонятно с параметрами у тебя. Нужно передавать новые данные как словарь.
 

Форум IT Специалистов