HarisNvr
@HarisNvr
Начинающий кодер Python

Обработка команды и callback одновременно в одной функции, как реализовать?

Есть бот, у которого одна из функций это вычисление пропорций в смесях. Идея такая - одна и та же ассинхронная функция принимает как команду /proportions так и callback "another_proportion" (коллбек срабатывает с кнопки в ответе если пользователю после получения ответа нужно посчитать ещё одну пропорцию)

@admin_router.callback_query(F.data == 'another_proportion')
@admin_router.message(Command('proportions'))
@check_is_admin
async def proportions(
        message: Message,
        state: FSMContext,
        callback: CallbackQuery = None,
        keep_last_msg: bool = False
):
    """
    Handles the 'proportions' command. Receive a str value from admin and
    triggers the calculate_proportion function.

    :param callback:
    :param state:
    :param keep_last_msg:
    :param message:
    :return: None
    """

    if callback:
        message = callback.message

    if not keep_last_msg:
        await message.delete()
        await sleep(DEL_TIME)

    await state.set_state(ProportionStates.waiting_for_proportion_input)
    sent_message = await message.answer(
        text='Введите через пробел: '
             '\nПропорции компонентов '
             '<b>A</b> и <b>B</b>, '
             'и общую массу - <b>C</b>'
    )

    await record_message_id_to_db(sent_message)


Попробовал много вариантов - пока что не подошло ничего. Код сверху сыпится на моменте:

await message.delete()
AttributeError: 'CallbackQuery' object has no attribute 'delete'


Плюс у меня прописан декоратор:

def check_is_admin(function):
    """
    A decorator that checks whether the user is an admin.

    :param function: The function to be decorated.
    :return: The decorated function.
    """

    @wraps(function)
    async def wrapper(message: Message, *args, **kwargs):
        await record_message_id_to_db(message)

        if message.chat.id in ADMIN_IDS:
            return await function(message, *args, **kwargs)
        else:
            await chepuha(message)

    return wrapper


Но с ним можно разобраться позже. Если кто-то уже реализовывал подобное - расскажите пожалуйста как.
  • Вопрос задан
  • 82 просмотра
Решения вопроса 1
HarisNvr
@HarisNvr Автор вопроса
Начинающий кодер Python
В итоге забил и создал вторую функцию для обработки callback:

@admin_router.message(Command('proportions'))
@check_is_admin
async def proportions(
        message: Message,
        state: FSMContext,
        keep_last_msg: bool = False
):

    """
    Handles the 'proportions' command. Receive a str value from admin and
    triggers the calculate_proportion function.

    :param state:
    :param keep_last_msg:
    :param message:
    :return: None
    """

    if not keep_last_msg:
        await message.delete()
        await sleep(DEL_TIME)

    await state.set_state(ProportionStates.waiting_for_proportion_input)
    sent_message = await message.answer(
        text='Введите через пробел: '
             '\nПропорции компонентов '
             '<b>A</b> и <b>B</b>, '
             'и общую массу - <b>C</b>'
    )

    await record_message_id_to_db(sent_message)


@admin_router.callback_query(F.data == 'another_proportion')
async def callback_proportion(callback: CallbackQuery, state: FSMContext):
    await callback.answer()
    await proportions(callback.message, state=state, keep_last_msg=True)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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