diff --git a/app/localization/locales/en.json b/app/localization/locales/en.json
index 88a7af66..905fbc8b 100644
--- a/app/localization/locales/en.json
+++ b/app/localization/locales/en.json
@@ -75,7 +75,7 @@
"LOADING": "⏳ Loading...",
"MAIN_MENU": "👤 {user_name}\n\n📱 Subscription: {subscription_status}\n\nChoose an option:\n",
"MAIN_MENU_ACTION_PROMPT": "Choose an option:",
- "MAIN_MENU_TEST_ACCESS_HEADER": "🧪 Test servers active: {servers}",
+ "MAIN_MENU_TEST_ACCESS_HEADER": "🧪 Test servers active: {count}",
"MAIN_MENU_TEST_ACCESS_TIMER": "⏳ Access active for {time_left}\n{bar}",
"MAIN_MENU_BUTTON": "🏠 Main menu",
"MANAGE_DEVICES_BUTTON": "🔧 Manage devices",
diff --git a/app/localization/locales/ru.json b/app/localization/locales/ru.json
index 6f0277b1..3071c652 100644
--- a/app/localization/locales/ru.json
+++ b/app/localization/locales/ru.json
@@ -202,7 +202,7 @@
"MAINTENANCE_MODE_API_ERROR": "\n🔧 Технические работы!\n\nСервис временно недоступен из-за проблем с подключением к серверам.\n\n⏰ Мы работаем над восстановлением. Попробуйте через несколько минут.\n\n🔄 Последняя проверка: {last_check}\n",
"MAIN_MENU": "👤 {user_name}\n \n📱 Подписка: {subscription_status}\n\nВыберите действие:\n",
"MAIN_MENU_ACTION_PROMPT": "Выберите действие:",
- "MAIN_MENU_TEST_ACCESS_HEADER": "🧪 Тестовые сервера активны: {servers}",
+ "MAIN_MENU_TEST_ACCESS_HEADER": "🧪 Тестовые сервера активны: {count}",
"MAIN_MENU_TEST_ACCESS_TIMER": "⏳ Доступ действует ещё: {time_left}\n{bar}",
"MAIN_MENU_BUTTON": "🏠 Главное меню",
"MANAGE_DEVICES_BUTTON": "🔧 Управление устройствами",
diff --git a/app/utils/promo_offer.py b/app/utils/promo_offer.py
index c7f62cb4..1d672912 100644
--- a/app/utils/promo_offer.py
+++ b/app/utils/promo_offer.py
@@ -1,6 +1,5 @@
from __future__ import annotations
-import html
import math
from datetime import datetime
from typing import Optional, Sequence
@@ -10,7 +9,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload
from app.database.crud.discount_offer import get_latest_claimed_offer_for_user
-from app.database.models import ServerSquad, SubscriptionTemporaryAccess, User
+from app.database.models import SubscriptionTemporaryAccess, User
def get_user_active_promo_discount_percent(user: Optional[User]) -> int:
@@ -198,49 +197,21 @@ async def build_test_access_hint(
bar = _build_progress_bar(seconds_left, total_seconds)
time_left_text = _format_time_left(seconds_left, getattr(texts, "language", "ru"))
- unique_squad_uuids: list[str] = []
- seen_squads: set[str] = set()
- for entry in active_entries:
- squad_uuid = getattr(entry, "squad_uuid", None)
- if squad_uuid and squad_uuid not in seen_squads:
- seen_squads.add(squad_uuid)
- unique_squad_uuids.append(squad_uuid)
-
- squad_display_names: list[str] = []
- if unique_squad_uuids:
- squads_result = await db.execute(
- select(ServerSquad.squad_uuid, ServerSquad.display_name).where(
- ServerSquad.squad_uuid.in_(unique_squad_uuids)
- )
- )
- names_map = {
- squad_uuid: html.escape(display_name)
- for squad_uuid, display_name in squads_result.all()
- if display_name
- }
- for squad_uuid in unique_squad_uuids:
- if squad_uuid in names_map:
- squad_display_names.append(names_map[squad_uuid])
- else:
- squad_display_names.append(html.escape(squad_uuid))
-
- if squad_display_names:
- servers_display = ", ".join(squad_display_names)
- elif unique_squad_uuids:
- servers_display = ", ".join(html.escape(squad_uuid) for squad_uuid in unique_squad_uuids)
- else:
- servers_display = str(len(active_entries))
+ unique_squads = {
+ entry.squad_uuid for entry in active_entries if getattr(entry, "squad_uuid", None)
+ }
+ count = len(unique_squads) or len(active_entries)
header_template = texts.t(
"MAIN_MENU_TEST_ACCESS_HEADER",
- "🧪 Test servers active: {servers}",
+ "🧪 Test servers active: {count}",
)
timer_template = texts.t(
"MAIN_MENU_TEST_ACCESS_TIMER",
"⏳ Access active for {time_left}\n{bar}",
)
- header = header_template.format(servers=servers_display)
+ header = header_template.format(count=count)
timer_line = timer_template.format(time_left=time_left_text, bar=bar)
return f"{header}\n{timer_line}"
diff --git a/locales/en.json b/locales/en.json
index a771e73e..f4df7a86 100644
--- a/locales/en.json
+++ b/locales/en.json
@@ -55,7 +55,7 @@
"LOADING": "⏳ Loading...",
"MAIN_MENU": "👤 {user_name}\n\n📱 Subscription: {subscription_status}\n\nChoose an option:\n",
"MAIN_MENU_ACTION_PROMPT": "Choose an option:",
- "MAIN_MENU_TEST_ACCESS_HEADER": "🧪 Test servers active: {servers}",
+ "MAIN_MENU_TEST_ACCESS_HEADER": "🧪 Test servers active: {count}",
"MAIN_MENU_TEST_ACCESS_TIMER": "⏳ Access active for {time_left}\n{bar}",
"MAIN_MENU_BUTTON": "🏠 Main menu",
"MANAGE_DEVICES_BUTTON": "🔧 Manage devices",
diff --git a/locales/ru.json b/locales/ru.json
index 18f0690c..0c2f6ac9 100644
--- a/locales/ru.json
+++ b/locales/ru.json
@@ -235,7 +235,7 @@
"MAINTENANCE_MODE_API_ERROR": "\n🔧 Технические работы!\n\nСервис временно недоступен из-за проблем с подключением к серверам.\n\n⏰ Мы работаем над восстановлением. Попробуйте через несколько минут.\n\n🔄 Последняя проверка: {last_check}\n",
"MAIN_MENU": "👤 {user_name}\n \n📱 Подписка: {subscription_status}\n\nВыберите действие:\n",
"MAIN_MENU_ACTION_PROMPT": "Выберите действие:",
- "MAIN_MENU_TEST_ACCESS_HEADER": "🧪 Тестовые сервера активны: {servers}",
+ "MAIN_MENU_TEST_ACCESS_HEADER": "🧪 Тестовые сервера активны: {count}",
"MAIN_MENU_TEST_ACCESS_TIMER": "⏳ Доступ действует ещё: {time_left}\n{bar}",
"MAIN_MENU_BUTTON": "🏠 Главное меню",
"MANAGE_DEVICES_BUTTON": "🔧 Управление устройствами",