async def использование if-else
Хочу выдавать разную 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
Ответы (2 шт):
Автор решения: CarambaGE
→ Ссылка
def status(message):
stat = cur.execute("SELECT * FROM users WHERE user_id=? AND status = 'Current_group_member'", (message.chat.id,)).fetchone()
return stat
Данное изменение помогло решить проблему, так же убрал цикл for
Автор решения: Trafalgar
→ Ссылка
Не обязательно создавать новую клавиатуру под каждый статус пользователя, достаточно создать одну которая будет отображаться по разному зависимости от статуса.
Вот пример кода клавиатуры с использованием 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