fix: show subscription picker for traffic/connect buttons with multiple subs

When user has >1 active subscription and clicks "Докупить трафик" or
"Подключиться" from main menu, now shows inline subscription picker
instead of just an alert. User selects subscription, then proceeds
to the corresponding flow. Removed redundant parse_mode (set globally).
This commit is contained in:
c0mrade
2026-03-25 15:26:42 +03:00
parent 382e29d3dd
commit a39e3554d8
2 changed files with 71 additions and 0 deletions
+36
View File
@@ -36,6 +36,42 @@ async def handle_connect_subscription(
return
texts = get_texts(db_user.language)
# В режиме мульти-тарифов без явного sub_id в callback — показываем выбор подписки.
if settings.is_multi_tariff_enabled() and callback.data == 'subscription_connect':
from app.database.crud.subscription import get_active_subscriptions_by_user_id
active_subs = await get_active_subscriptions_by_user_id(db, db_user.id)
if len(active_subs) > 1:
from datetime import UTC, datetime
from app.database.crud.tariff import get_tariff_by_id as _get_tariff
keyboard = []
for sub in sorted(active_subs, key=lambda s: s.id):
tariff_name = ''
if sub.tariff_id:
_t = await _get_tariff(db, sub.tariff_id)
tariff_name = _t.name if _t else f'#{sub.id}'
else:
tariff_name = f'Подписка #{sub.id}'
days_left = max(0, (sub.end_date - datetime.now(UTC)).days) if sub.end_date else 0
keyboard.append(
[
types.InlineKeyboardButton(
text=f'🔗 {tariff_name} ({days_left}д.)',
callback_data=f'sl:{sub.id}',
)
]
)
keyboard.append([types.InlineKeyboardButton(text='◀️ Назад', callback_data='back_to_menu')])
await callback.message.edit_text(
'🔗 <b>Подключиться</b>\n\nВыберите подписку:',
reply_markup=types.InlineKeyboardMarkup(inline_keyboard=keyboard),
)
await callback.answer()
return
subscription, sub_id = await _resolve_subscription(callback, db_user, db, state)
if subscription is None:
return
+35
View File
@@ -55,9 +55,44 @@ async def _resolve_subscription(callback, db_user, db, state=None):
async def handle_add_traffic(callback: types.CallbackQuery, db_user: User, db: AsyncSession, state: FSMContext = None):
from app.config import settings
from app.database.crud.subscription import get_active_subscriptions_by_user_id
from app.database.crud.tariff import get_tariff_by_id
texts = get_texts(db_user.language)
# В режиме мульти-тарифов без явного sub_id в callback — показываем выбор подписки.
if settings.is_multi_tariff_enabled() and callback.data == 'buy_traffic':
active_subs = await get_active_subscriptions_by_user_id(db, db_user.id)
if len(active_subs) > 1:
from app.database.crud.tariff import get_tariff_by_id as _get_tariff
keyboard = []
for sub in sorted(active_subs, key=lambda s: s.id):
if sub.is_trial:
continue
tariff_name = ''
if sub.tariff_id:
_t = await _get_tariff(db, sub.tariff_id)
tariff_name = _t.name if _t else f'#{sub.id}'
else:
tariff_name = f'Подписка #{sub.id}'
days_left = max(0, (sub.end_date - datetime.now(UTC)).days) if sub.end_date else 0
keyboard.append(
[
types.InlineKeyboardButton(
text=f'📊 {tariff_name} ({days_left}д.)',
callback_data=f'st:{sub.id}',
)
]
)
keyboard.append([types.InlineKeyboardButton(text='◀️ Назад', callback_data='back_to_menu')])
await callback.message.edit_text(
'📊 <b>Докупить трафик</b>\n\nВыберите подписку:',
reply_markup=types.InlineKeyboardMarkup(inline_keyboard=keyboard),
)
await callback.answer()
return
subscription, sub_id = await _resolve_subscription(callback, db_user, db, state)
if subscription is None:
return