async def использование if-else

Рейтинг: 0Ответов: 2Опубликовано: 25.01.2023

Хочу выдавать разную keyboard buttom для разных статусов юзеров. При добавлении if/else клавиатура в целом перестает отображаться, так же пытался сделать ветвление в клавиатуре, пробовал изменить SQL запрос. Скорее всего, вопрос простой, но сижу долго не могу понять в чем проблема:

@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    name = message.chat.first_name
    users = db.status(message)
    await db.add_new_sub(message)
    for user in users:
        if not user:
            await message.answer(f'Привет, {name}!',
                                 reply_markup=get_start_kb())

        else:
            await message.answer(f'Привет, {name}!',
                                 reply_markup=get_start_approve_kb())

функция status:

def status(message):
stat = cur.execute("SELECT * FROM users WHERE user_id=? AND status='Current_group_member'", (message.chat.id,))
return stat

Клавиатуры:

def get_start_kb() -> ReplyKeyboardMarkup:
kb = ReplyKeyboardMarkup(keyboard=[
    [KeyboardButton('О группе')],
    [KeyboardButton('Техническая поддержка')],
    [KeyboardButton('Купить подписку')],
],
    resize_keyboard=True,
    input_field_placeholder='Бот распознаёт только нажатие кнопок')
return kb


def get_start_approve_kb() -> ReplyKeyboardMarkup:
    kb = ReplyKeyboardMarkup(keyboard=[
        [KeyboardButton('О группе')],
        [KeyboardButton('Техническая поддержка')],
        [KeyboardButton('Состояние подписки')],
    ],
        resize_keyboard=True,
        input_field_placeholder='Бот распознаёт только нажатие кнопок')
    return kb

Ответы

▲ 0Принят
def status(message):
    stat = cur.execute("SELECT * FROM users WHERE user_id=? AND status = 'Current_group_member'", (message.chat.id,)).fetchone()
    return stat

Данное изменение помогло решить проблему, так же убрал цикл for

▲ 0

Не обязательно создавать новую клавиатуру под каждый статус пользователя, достаточно создать одну которая будет отображаться по разному зависимости от статуса.

Вот пример кода клавиатуры с использованием aiogram v3.0.0b6

def menu_keyboard(user):
    level = 0
    builder = InlineKeyboardBuilder()
    builder.add(
        InlineKeyboardButton(text='🎾 Начать раздачу',
                             callback_data=MenuCd(
                                 level=level,
                                 callback='start_giveaway').pack()
                             ),
        InlineKeyboardButton(text='💰 Баланс',
                             callback_data='balance'
                             ),
        InlineKeyboardButton(text='🎯 Активные раздачи',
                             callback_data=MenuCd(
                                 level=level,
                                 callback='active_giveaway').pack()
                             )
    )
    builder.adjust(2)
    if not user.subscription:
        builder.row(
            InlineKeyboardButton(text='💵 Купить подписку',
                                 callback_data=MenuCd(
                                     level=level,
                                     callback='buy_subscription'
                                 ).pack()
                                 )
        )
    else:
        builder.row(
            InlineKeyboardButton(text='💵 Продлить подписку',
                                 callback_data=MenuCd(
                                     level=level,
                                     callback='buy_subscription'
                                 ).pack()
                                 )
        )

    if user.status == 'admin':
        builder.row(
            InlineKeyboardButton(text='⚙️ Админка',
                                 callback_data='admin_menu')
        )

    return builder.as_markup()

Пример использования:

async def start(message: types.Message | types.CallbackQuery,
                db_requests: DbRequests):
    user = await db_requests.get_user(user_id=message.from_user.id)
    config_db = await db_requests.get_config()
    buttons = await db_requests.get_advert_buttons()

    if not user:
        user = await db_requests.add_user(
            user_id=message.from_user.id,
            full_name=message.from_user.full_name,
            username=message.from_user.username,
        )
        logging.info(f'Added user {message.from_user.full_name}')

    if user.full_name != message.from_user.full_name \
            or user.username != message.from_user.username:
        user = await db_requests.update_user(
            user_id=message.from_user.id,
            update_fields={
                "full_name": message.from_user.full_name,
                "username": message.from_user.username,
            }
        )

    markup = menu_keyboard(user)

    if isinstance(message, types.Message):
        await message.answer('💎', reply_markup=advert_keyboard(buttons))
        await message.answer_photo(config_db.image_url,
                                   '\n'.join(start_message(user, message)),
                                   reply_markup=markup
                                   )

    elif isinstance(message, types.CallbackQuery):
        call = message
        await call.message.edit_reply_markup(markup)

    else:
        pass