diff --git a/app/handlers/subscription.py b/app/handlers/subscription.py index 8794688e..5845e34d 100644 --- a/app/handlers/subscription.py +++ b/app/handlers/subscription.py @@ -62,15 +62,88 @@ async def show_subscription_info( await callback.answer() return + from app.database.crud.subscription import check_and_update_subscription_status + subscription = await check_and_update_subscription_status(db, subscription) + subscription_service = SubscriptionService() await subscription_service.sync_subscription_usage(db, subscription) await db.refresh(subscription) - info_text = await get_subscription_info_text(subscription, texts, db_user, db) + current_time = datetime.utcnow() + + if subscription.status == "expired" or subscription.end_date <= current_time: + actual_status = "expired" + status_display = "Истекла" + status_emoji = "🔴" + elif subscription.status == "active" and subscription.end_date > current_time: + if subscription.is_trial: + actual_status = "trial_active" + status_display = "Тестовая" + status_emoji = "🎁" + else: + actual_status = "paid_active" + status_display = "Активна" + status_emoji = "💎" + else: + actual_status = "unknown" + status_display = "Неизвестно" + status_emoji = "❓" + + if subscription.end_date <= current_time: + days_left = 0 + time_left_text = "истёк" + warning_text = "" + else: + delta = subscription.end_date - current_time + days_left = delta.days + hours_left = delta.seconds // 3600 + + if days_left > 1: + time_left_text = f"{days_left} дн." + warning_text = "" + elif days_left == 1: + time_left_text = f"{days_left} дн." + warning_text = "\n⚠️ истекает завтра!" + elif hours_left > 0: + time_left_text = f"{hours_left} ч." + warning_text = "\n⚠️ истекает сегодня!" + else: + minutes_left = (delta.seconds % 3600) // 60 + time_left_text = f"{minutes_left} мин." + warning_text = "\n🔴 истекает через несколько минут!" + + subscription_type = "Триал" if subscription.is_trial else "Платная" + + if subscription.traffic_limit_gb == 0: + traffic_used_display = f"∞ (безлимит) / {subscription.traffic_used_gb:.1f} ГБ" + else: + traffic_used_display = f"{subscription.traffic_used_gb:.1f} / {subscription.traffic_limit_gb} ГБ" + + devices_used = await get_current_devices_count(db_user) + + + message = f"""👤 {db_user.full_name} +━━━━━━━━━━━━━━━━━ +💰 Баланс: {settings.format_price(db_user.balance_kopeks)} +📱 Подписка: {status_emoji} {status_display}{warning_text} +━━━━━━━━━━━━━━━━━ + +📱 Информация о подписке +🎭 Тип: {subscription_type} +📅 Действует до: {subscription.end_date.strftime("%d.%m.%Y %H:%M")} +⏰ Осталось: {time_left_text} +📈 Трафик: {traffic_used_display} +🌍 Серверы: {len(subscription.connected_squads)} стран +📱 Устройства: {devices_used} / {subscription.device_limit}""" + + if hasattr(subscription, 'subscription_url') and subscription.subscription_url: + if actual_status in ['trial_active', 'paid_active']: + message += f"\n\n🔗 Ссылка для подключения:\n{subscription.subscription_url}" + message += f"\n\n📱 Скопируйте ссылку и добавьте в ваше VPN приложение" await callback.message.edit_text( - info_text, + message, reply_markup=get_subscription_keyboard( db_user.language, has_subscription=True,