diff --git a/.env.example b/.env.example
index c2e417c..4c9e53b 100644
--- a/.env.example
+++ b/.env.example
@@ -1,69 +1,69 @@
-# Telegram Bot Token and Admin IDs
-BOT_TOKEN=your_bot_token_here
-ADMIN_IDS=comma_separated_admin_ids
+# Telegram Bot
+BOT_TOKEN=
+ADMIN_IDS=
+DEFAULT_LANGUAGE=ru
+DEFAULT_CURRENCY_SYMBOL=RUB
+SUPPORT_LINK=
+SERVER_STATUS_URL=
+TERMS_OF_SERVICE_URL=
-POSTGRES_USER=postgres
-POSTGRES_PASSWORD=postgres
-POSTGRES_HOST=remnawave-tg-shop-db
+# Database
+POSTGRES_USER=user
+POSTGRES_PASSWORD=password
+POSTGRES_HOST=db
POSTGRES_PORT=5432
-POSTGRES_DB=postgres
+POSTGRES_DB=vpn_shop_db
-# Localization and Display
-DEFAULT_LANGUAGE="ru" # or "en"
-DEFAULT_CURRENCY_SYMBOL="RUB" # e.g., RUB, USD, EUR
+# Webhooks
+WEBHOOK_BASE_URL=
+PANEL_WEBHOOK_SECRET=
-# External Links
-SUPPORT_LINK=https://t.me/your_support_link
-SERVER_STATUS_URL=https://status.yourdomain.tld/status/your_service
-TERMS_OF_SERVICE_URL=https://example.com/tos
-SUBSCRIPTION_MINI_APP_URL=
-START_COMMAND_DESCRIPTION=
-
-# Webhook Base URL (used for Telegram and payment providers)
-WEBHOOK_BASE_URL=https://webhooks.yourdomain.tld
-
-# YooKassa Payment Gateway Configuration
-YOOKASSA_SHOP_ID=your_shop_id
-YOOKASSA_SECRET_KEY=your_secret_key
-YOOKASSA_RETURN_URL=https://t.me/your_bot
-YOOKASSA_DEFAULT_RECEIPT_EMAIL=your_email@example.com
+# YooKassa
+YOOKASSA_ENABLED=True
+YOOKASSA_SHOP_ID=
+YOOKASSA_SECRET_KEY=
+YOOKASSA_RETURN_URL=
+YOOKASSA_DEFAULT_RECEIPT_EMAIL=
YOOKASSA_VAT_CODE=1
YOOKASSA_PAYMENT_MODE=full_prepayment
-YOOKASSA_PAYMENT_SUBJECT=payment
+YOOKASSA_PAYMENT_SUBJECT=service
-# CryptoBot Payment Gateway Configuration
+# CryptoPay
+CRYPTOPAY_ENABLED=True
CRYPTOPAY_TOKEN=
CRYPTOPAY_NETWORK=mainnet
CRYPTOPAY_CURRENCY_TYPE=fiat
CRYPTOPAY_ASSET=RUB
-# API key for verifying Tribute webhook signatures
+
+# Telegram Stars
+STARS_ENABLED=True
+
+# Telegram Tribute
+TRIBUTE_ENABLED=True
TRIBUTE_API_KEY=
-# Payment Method Toggles
-YOOKASSA_ENABLED=True
-STARS_ENABLED=True
-TRIBUTE_ENABLED=True
-CRYPTOPAY_ENABLED=True
-
-# Subscription Options
+# Subscription Durations
1_MONTH_ENABLED=True
-RUB_PRICE_1_MONTH=150
-STARS_PRICE_1_MONTH=0
-TRIBUTE_LINK_1_MONTH=
-
3_MONTHS_ENABLED=True
-RUB_PRICE_3_MONTHS=300
-STARS_PRICE_3_MONTHS=0
-TRIBUTE_LINK_3_MONTHS=
-
6_MONTHS_ENABLED=True
-RUB_PRICE_6_MONTHS=500
-STARS_PRICE_6_MONTHS=0
-TRIBUTE_LINK_6_MONTHS=
-
12_MONTHS_ENABLED=True
-RUB_PRICE_12_MONTHS=900
-STARS_PRICE_12_MONTHS=0
+
+# Prices in RUB
+RUB_PRICE_1_MONTH=
+RUB_PRICE_3_MONTHS=
+RUB_PRICE_6_MONTHS=
+RUB_PRICE_12_MONTHS=
+
+# Prices in Telegram Stars
+STARS_PRICE_1_MONTH=
+STARS_PRICE_3_MONTHS=
+STARS_PRICE_6_MONTHS=
+STARS_PRICE_12_MONTHS=
+
+# Tribute Payment Links
+TRIBUTE_LINK_1_MONTH=
+TRIBUTE_LINK_3_MONTHS=
+TRIBUTE_LINK_6_MONTHS=
TRIBUTE_LINK_12_MONTHS=
# Subscription Notifications
@@ -72,38 +72,52 @@ SUBSCRIPTION_NOTIFY_ON_EXPIRE=True
SUBSCRIPTION_NOTIFY_AFTER_EXPIRE=True
SUBSCRIPTION_NOTIFY_DAYS_BEFORE=3
-# Referral Bonus Days
+# Referral Bonuses (Inviter)
REFERRAL_BONUS_DAYS_1_MONTH=3
REFERRAL_BONUS_DAYS_3_MONTHS=7
REFERRAL_BONUS_DAYS_6_MONTHS=15
REFERRAL_BONUS_DAYS_12_MONTHS=30
+
+# Referral Bonuses (Referee)
REFEREE_BONUS_DAYS_1_MONTH=1
REFEREE_BONUS_DAYS_3_MONTHS=3
REFEREE_BONUS_DAYS_6_MONTHS=7
REFEREE_BONUS_DAYS_12_MONTHS=15
-# Panel API Configuration
-PANEL_API_URL=http://your_panel_api_url/api
-PANEL_API_KEY=your_panel_api_key
-PANEL_WEBHOOK_SECRET= # secret used to verify panel webhook signatures
-
-# User traffic limits (applied for all users)
-# 0 means unlimited
+# Panel Integration
+PANEL_API_URL=
+PANEL_API_KEY=
USER_TRAFFIC_LIMIT_GB=0
-USER_TRAFFIC_STRATEGY="NO_RESET"
+USER_TRAFFIC_STRATEGY=NO_RESET
+USER_SQUAD_UUIDS=
-# Default Internal Squads for Users (Optional, comma-separated UUIDs)
-USER_SQUAD_UUIDS=uuid1,uuid2,uuid3
-
-# Trial Settings
+# Trial Period
TRIAL_ENABLED=True
-TRIAL_DURATION_DAYS=5
-TRIAL_TRAFFIC_LIMIT_GB=0 # 0 for unlimited
-TRIAL_TRAFFIC_STRATEGY="NO_RESET"
+TRIAL_DURATION_DAYS=3
+TRIAL_TRAFFIC_LIMIT_GB=5.0
-# Web Server Settings (for handling webhooks)
-WEB_SERVER_HOST="0.0.0.0"
+# Web Server
+WEB_SERVER_HOST=0.0.0.0
WEB_SERVER_PORT=8080
-
-# Admin Panel Log Pagination
LOGS_PAGE_SIZE=10
+
+# Mini App
+SUBSCRIPTION_MINI_APP_URL=
+
+# Customization
+START_COMMAND_DESCRIPTION=
+
+# Logging
+LOG_CHAT_ID=
+LOG_THREAD_ID=
+LOG_NEW_USERS=True
+LOG_PAYMENTS=True
+LOG_PROMO_ACTIVATIONS=True
+LOG_TRIAL_ACTIVATIONS=True
+LOG_SUSPICIOUS_ACTIVITY=True
+
+# Inline Thumbnails
+INLINE_REFERRAL_THUMBNAIL_URL=https://cdn-icons-png.flaticon.com/512/1077/1077114.png
+INLINE_USER_STATS_THUMBNAIL_URL=https://cdn-icons-png.flaticon.com/512/681/681494.png
+INLINE_FINANCIAL_STATS_THUMBNAIL_URL=https://cdn-icons-png.flaticon.com/512/2769/2769339.png
+INLINE_SYSTEM_STATS_THUMBNAIL_URL=https://cdn-icons-png.flaticon.com/512/2920/2920277.png
diff --git a/bot/services/notification_service.py b/bot/services/notification_service.py
index ee9e963..f367acd 100644
--- a/bot/services/notification_service.py
+++ b/bot/services/notification_service.py
@@ -188,6 +188,37 @@ class NotificationService:
# Send to log channel
await self._send_to_log_channel(message)
+
+ async def notify_suspicious_promo_attempt(
+ self, user_id: int, suspicious_input: str,
+ username: Optional[str] = None, first_name: Optional[str] = None):
+ """Send notification about a suspicious promo code attempt."""
+ if not self.settings.LOG_SUSPICIOUS_ACTIVITY:
+ return
+
+ admin_lang = self.settings.DEFAULT_LANGUAGE
+ _ = lambda k, **kw: self.i18n.gettext(
+ admin_lang, k, **kw) if self.i18n else k
+
+ user_display = first_name or f"ID {user_id}"
+ if username:
+ user_display += f" (@{username})"
+
+ message = _(
+ "log_suspicious_promo",
+ default="⚠️ Подозрительная попытка ввода промокода\n\n"
+ "👤 Пользователь: {user_display}\n"
+ "🆔 ID: {user_id}\n"
+ "📝 Ввод:
{suspicious_input}\n"
+ "🕐 Время: {timestamp}",
+ user_display=hd.quote(user_display),
+ user_id=user_id,
+ suspicious_input=hd.quote(suspicious_input),
+ timestamp=datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S %Z"))
+
+ # Send to log channel and admins
+ await self._send_to_log_channel(message)
+ await self._send_to_admins(message)
async def send_custom_notification(self, message: str, to_admins: bool = False,
to_log_channel: bool = True, thread_id: Optional[int] = None):
diff --git a/locales/en.json b/locales/en.json
index a691568..4729f8a 100644
--- a/locales/en.json
+++ b/locales/en.json
@@ -271,10 +271,6 @@
"admin_user_logs_error": "❌ Error loading user actions",
"admin_direct_message_signature": "\n\n---\n💬 Message from administrator",
-
- "inline_referral_title": "🎁 Invite a Friend",
- "inline_referral_description": "Share referral link to get bonuses",
-
"inline_user_stats_message": "👥 User Statistics\n\n📊 Total: {total}\n📈 Active today: {active_today}\n💳 With paid subscription: {paid}\n🆓 On trial period: {trial}\n😴 Inactive: {inactive}\n🚫 Banned: {banned}\n🎁 Via referral program: {referral}",
"inline_admin_user_stats_title": "👥 User Statistics",
"inline_admin_user_stats_desc": "Total: {total}, Active: {paid}",
@@ -300,7 +296,8 @@
"log_payment_received": "{provider_emoji} Payment Received\n\n👤 User: {user_display}\n💰 Amount: {amount} {currency}\n📅 Period: {months} mo.\n🏦 Provider: {payment_provider}\n🕐 Time: {timestamp}",
"log_promo_activation": "🎁 Promo Code Activated\n\n👤 User: {user_display}\n🏷 Code: {promo_code}\n🎯 Bonus: +{bonus_days}d\n🕐 Time: {timestamp}",
"log_trial_activation": "🆓 Trial Activated\n\n👤 User: {user_display}\n⏰ Valid until: {end_date}\n🕐 Time: {timestamp}",
-
+ "log_suspicious_promo": "⚠️ Suspicious Promo Code Attempt\n\n👤 User: {user_display}\n🆔 ID: {user_id}\n📝 Input: {suspicious_input}\n🕐 Time: {timestamp}",
+
"admin_general_cancel_operation": "Operation cancelled ❌",
"admin_promo_codes_menu_bulk_create": "📦 Bulk Creation",
"admin_bulk_promo_create_prompt": "📦 Bulk Promo Code Creation\n\nEnter data in format:\nquantity|days|description\n\nExample:\n10|7|Weekly promo",
@@ -317,7 +314,6 @@
"admin_promo_edit_enter_validity_days": "⏰ Enter the number of validity days for the promo code (1-365):",
"admin_promo_updated_success": "✅ Promo code updated!\n\n🎟 Code: {code}\n🎁 Bonus days: {days}\n🔢 Max activations: {max_act}\n⏰ Valid until: {validity}",
"admin_promo_update_failed": "❌ Error updating promo code",
- "admin_promo_invalid_validity_days": "❌ Validity days must be from 1 to 365",
"admin_logs_export_csv": "📄 Export to CSV",
"admin_logs_csv_export_started": "📄 Starting log export to CSV...",
@@ -338,7 +334,6 @@
"admin_banned_users_list": "📋 Banned Users ({count}):\n\n{users}",
"admin_panel_stats_header": "Panel Statistics",
- "admin_bulk_promo_invalid_values": "❌ Invalid values: {error}",
"admin_bulk_promo_step1_quantity": "📦 Bulk Promo Code Creation\n\nStep 1 of 4: Quantity\n\nEnter the number of promo codes to create (1-1000):",
"admin_bulk_promo_step2_bonus_days": "📦 Bulk Promo Code Creation\n\nStep 2 of 4: Bonus Days\n\nQuantity: {quantity}\n\nEnter the number of bonus days (1-365):",
@@ -348,7 +343,6 @@
"admin_bulk_promo_invalid_quantity": "❌ Quantity must be between 1 and 1000",
"admin_bulk_promo_invalid_bonus_days": "❌ Bonus days must be between 1 and 365",
"admin_bulk_promo_invalid_max_activations": "❌ Max activations must be between 1 and 10000",
- "admin_bulk_promo_invalid_validity_days": "❌ Validity days must be between 1 and 365",
"admin_bulk_promo_unlimited_validity": "♾️ Unlimited",
"admin_bulk_promo_set_validity": "⏰ Set Period",
@@ -361,7 +355,6 @@
"admin_promo_step3_max_activations": "🎟 Create Promo Code\n\nStep 3 of 4: Max Activations\n\nCode: {code}\nBonus days: {bonus_days}\n\nEnter the maximum number of activations (1-10000):",
"admin_promo_step4_validity": "🎟 Create Promo Code\n\nStep 4 of 4: Validity Period\n\nCode: {code}\nBonus days: {bonus_days}\nMax activations: {max_activations}\n\nChoose the validity period for the promo code:",
- "admin_promo_invalid_code_format": "❌ Promo code must contain 3-30 characters (letters and numbers only)",
"admin_promo_code_already_exists": "❌ A promo code with this code already exists",
"admin_promo_processing_error": "❌ Error processing promo code",
"admin_promo_unlimited_validity": "♾️ Unlimited",
@@ -370,8 +363,6 @@
"admin_promo_skip_description": "⏭️ Skip",
"admin_promo_description_too_long": "❌ Description must not exceed 200 characters",
"admin_promo_creating": "⏳ Creating promo code...",
- "admin_promo_created_success": "✅ Promo code created!\n\n🎟 Code: {code}\n🎁 Bonus days: {days}\n🔢 Max activations: {max_act}\n⏰ Valid until: {validity}",
- "admin_promo_creation_failed": "❌ Error creating promo code: {error}",
"admin_panel_back_button": "⬅️ Back",
"admin_bulk_promo_creation_failed": "❌ Error creating promo codes: {error}",
@@ -401,8 +392,6 @@
"admin_user_subscription_expired": "Expired {end_date}",
"admin_user_subscription_none": "No active subscription",
- "admin_user_logs_title": "📋 User logs {user_id}",
- "admin_user_logs_empty": "No logs available",
"admin_user_logs_count": "Total entries: {count}",
"admin_user_logs_entry": "📅 {timestamp}\n📝 {event_type}: {content}",
@@ -412,9 +401,6 @@
"admin_bulk_promo_unique_generation_failed": "Failed to create unique promo code",
- "admin_suspicious_promo_attempt_notification": "⚠️ Suspicious promo code attempt\n\n👤 User: @{user_username} (ID: {user_id})\n📝 Name: {user_first_name}\n💬 Input text: {promo_code_input}",
- "admin_suspicious_promo_attempt_notification_no_username": "⚠️ Suspicious promo code attempt\n\n👤 User ID: {user_id}\n📝 Name: {user_first_name}\n💬 Input text: {promo_code_input}",
-
"admin_promo_management_button": "🎟 Promo Management",
"admin_promo_management_title": "🎟 Promo Code Management\n\nSelect a promo code for detailed view:",
"admin_promo_management_empty": "📭 No promo codes available",
@@ -429,13 +415,10 @@
"admin_promo_status_inactive": "🚫 Inactive",
"admin_promo_status_expired": "⏰ Expired",
"admin_promo_status_used_up": "🔄 Used up",
- "admin_promo_edit_button": "✏️ Edit",
"admin_promo_toggle_status_button": "🔄 On/Off",
- "admin_promo_delete_button": "🗑 Delete",
"admin_promo_view_activations_button": "📋 Activations",
"admin_promo_back_to_list_button": "⬅️ Back to list",
- "admin_panel_stats_header": "Panel Statistics",
"admin_panel_online_label": "Online",
"admin_panel_active_label": "Active",
"admin_panel_disabled_label": "Disabled",
@@ -466,8 +449,6 @@
"inline_system_description": "🟢 Online: {online}, 📊 Active: {active}",
"inline_admin_help_title": "Commands help",
"inline_admin_help_description": "Available commands: ref, stat, financial, system",
- "inline_user_help_title": "Commands help",
- "inline_user_help_description": "Available command: ref (referral link)",
"admin_user_stats_total_label": "Total",
"admin_user_stats_paid_subs_label": "With paid subscription",
diff --git a/locales/ru.json b/locales/ru.json
index d87ecfa..2d1c7dd 100644
--- a/locales/ru.json
+++ b/locales/ru.json
@@ -271,10 +271,6 @@
"admin_user_logs_error": "❌ Ошибка загрузки действий пользователя",
"admin_direct_message_signature": "\n\n---\n💬 Сообщение от администратора",
-
- "inline_referral_title": "🎁 Пригласить друга",
- "inline_referral_description": "Поделиться реферальной ссылкой для получения бонусов",
-
"inline_user_stats_message": "📊 Статистика Бота\n👥 Пользователи\n\n📊 Всего: {total}\n💳 С платной подпиской: {paid}\n🆓 На пробном периоде: {trial}\n😴 Неактивных: {inactive}\n🚫 Заблокированных: {banned}\n🎁 Привлечено по реферальной программе: {referral}",
"inline_user_stats_description": "Всего: {total}, Платных: {active}",
"inline_admin_user_stats_title": "👥 Статистика пользователей",
@@ -289,8 +285,6 @@
"inline_admin_system_stats_desc": "Онлайн: {online}, Офлайн: {offline}",
"inline_admin_help_message": "🤖 Inline режим бота\n\n📱 Доступные команды:\n\n🎁 реф/ref - поделиться реферальной ссылкой\n👥 стат/stat - статистика пользователей\n💰 финансы - финансовая статистика\n🖥 система - системная статистика\n\n💡 Просто напишите @{bot_username} и начните вводить команду в любом чате!",
- "inline_admin_help_title": "🤖 Inline помощь (Админ)",
- "inline_admin_help_desc": "Доступны команды: реф, стат, финансы, система",
"inline_user_help_message": "🤖 Inline режим бота\n\n📱 Доступные команды:\n\n🎁 реф/ref - поделиться реферальной ссылкой\n\n💡 Просто напишите @{bot_username} и начните вводить 'реф' в любом чате!",
"inline_user_help_title": "🤖 Inline помощь",
@@ -301,6 +295,7 @@
"log_payment_received": "{provider_emoji} Получен платеж\n\n👤 Пользователь: {user_display}\n💰 Сумма: {amount} {currency}\n📅 Период: {months} мес.\n🏦 Провайдер: {payment_provider}\n🕐 Время: {timestamp}",
"log_promo_activation": "🎁 Активирован промокод\n\n👤 Пользователь: {user_display}\n🏷 Код: {promo_code}\n🎯 Бонус: +{bonus_days} дн.\n🕐 Время: {timestamp}",
"log_trial_activation": "🆓 Активирован триал\n\n👤 Пользователь: {user_display}\n⏰ Действует до: {end_date}\n🕐 Время: {timestamp}",
+ "log_suspicious_promo": "⚠️ Подозрительная попытка ввода промокода\n\n👤 Пользователь: {user_display}\n🆔 ID: {user_id}\n📝 Ввод: {suspicious_input}\n🕐 Время: {timestamp}",
"admin_general_cancel_operation": "Операция отменена ❌",
"admin_promo_codes_menu_bulk_create": "📦 Массовое создание",
@@ -318,7 +313,6 @@
"admin_promo_edit_enter_validity_days": "⏰ Введите количество дней действия промокода (1-365):",
"admin_promo_updated_success": "✅ Промокод обновлен!\n\n🎟 Код: {code}\n🎁 Бонусные дни: {days}\n🔢 Максимальные активации: {max_act}\n⏰ Действует до: {validity}",
"admin_promo_update_failed": "❌ Ошибка обновления промокода",
- "admin_promo_invalid_validity_days": "❌ Дни действия должны быть от 1 до 365",
"admin_logs_export_csv": "📄 Экспорт в CSV",
"admin_logs_csv_export_started": "📄 Начинаю экспорт логов в CSV...",
@@ -339,7 +333,6 @@
"admin_banned_users_list": "📋 Заблокированные пользователи ({count}):\n\n{users}",
"admin_panel_stats_header": "Статистика панели",
- "admin_bulk_promo_invalid_values": "❌ Неверные значения: {error}",
"admin_bulk_promo_step1_quantity": "📦 Массовое создание промокодов\n\nШаг 1 из 4: Количество промокодов\n\nВведите количество промокодов для создания (1-1000):",
"admin_bulk_promo_step2_bonus_days": "📦 Массовое создание промокодов\n\nШаг 2 из 4: Бонусные дни\n\nКоличество: {quantity}\n\nВведите количество бонусных дней (1-365):",
@@ -349,7 +342,6 @@
"admin_bulk_promo_invalid_quantity": "❌ Количество должно быть от 1 до 1000",
"admin_bulk_promo_invalid_bonus_days": "❌ Бонусные дни должны быть от 1 до 365",
"admin_bulk_promo_invalid_max_activations": "❌ Максимальные активации должны быть от 1 до 10000",
- "admin_bulk_promo_invalid_validity_days": "❌ Дни действия должны быть от 1 до 365",
"admin_bulk_promo_unlimited_validity": "♾️ Неограниченно",
"admin_bulk_promo_set_validity": "⏰ Установить срок",
@@ -362,7 +354,6 @@
"admin_promo_step3_max_activations": "🎟 Создание промокода\n\nШаг 3 из 4: Максимальные активации\n\nКод: {code}\nБонусные дни: {bonus_days}\n\nВведите максимальное количество активаций (1-10000):",
"admin_promo_step4_validity": "🎟 Создание промокода\n\nШаг 4 из 4: Срок действия\n\nКод: {code}\nБонусные дни: {bonus_days}\nМакс. активации: {max_activations}\n\nВыберите срок действия промокода:",
- "admin_promo_invalid_code_format": "❌ Код промокода должен содержать 3-30 символов (только буквы и цифры)",
"admin_promo_code_already_exists": "❌ Промокод с таким кодом уже существует",
"admin_promo_processing_error": "❌ Ошибка обработки промокода",
"admin_promo_unlimited_validity": "♾️ Неограниченно",
@@ -371,8 +362,6 @@
"admin_promo_skip_description": "⏭️ Пропустить",
"admin_promo_description_too_long": "❌ Описание не должно превышать 200 символов",
"admin_promo_creating": "⏳ Создаю промокод...",
- "admin_promo_created_success": "✅ Промокод создан!\n\n🎟 Код: {code}\n🎁 Бонусные дни: {days}\n🔢 Максимальные активации: {max_act}\n⏰ Действует до: {validity}",
- "admin_promo_creation_failed": "❌ Ошибка создания промокода: {error}",
"admin_panel_back_button": "⬅️ Назад",
"admin_bulk_promo_creation_failed": "❌ Ошибка создания промокодов: {error}",
@@ -402,8 +391,6 @@
"admin_user_subscription_expired": "Истекла {end_date}",
"admin_user_subscription_none": "Нет активной подписки",
- "admin_user_logs_title": "📋 Логи пользователя {user_id}",
- "admin_user_logs_empty": "Логи отсутствуют",
"admin_user_logs_count": "Всего записей: {count}",
"admin_user_logs_entry": "📅 {timestamp}\n📝 {event_type}: {content}",
@@ -413,9 +400,6 @@
"admin_bulk_promo_unique_generation_failed": "Не удалось создать уникальный промокод",
- "admin_suspicious_promo_attempt_notification": "⚠️ Подозрительная попытка ввода промокода\n\n👤 Пользователь: @{user_username} (ID: {user_id})\n📝 Имя: {user_first_name}\n💬 Введенный текст: {promo_code_input}",
- "admin_suspicious_promo_attempt_notification_no_username": "⚠️ Подозрительная попытка ввода промокода\n\n👤 Пользователь ID: {user_id}\n📝 Имя: {user_first_name}\n💬 Введенный текст: {promo_code_input}",
-
"admin_promo_management_button": "🎟 Управление промокодами",
"admin_promo_management_title": "🎟 Управление промокодами\n\nВыберите промокод для детального просмотра:",
"admin_promo_management_empty": "📭 Промокоды отсутствуют",
@@ -430,13 +414,10 @@
"admin_promo_status_inactive": "🚫 Неактивен",
"admin_promo_status_expired": "⏰ Истек",
"admin_promo_status_used_up": "🔄 Исчерпан",
- "admin_promo_edit_button": "✏️ Редактировать",
"admin_promo_toggle_status_button": "🔄 Вкл/Выкл",
- "admin_promo_delete_button": "🗑 Удалить",
"admin_promo_view_activations_button": "📋 Активации",
"admin_promo_back_to_list_button": "⬅️ К списку",
- "admin_panel_stats_header": "Статистика панели",
"admin_panel_online_label": "Онлайн",
"admin_panel_active_label": "Активных",
"admin_panel_disabled_label": "Отключенных",
@@ -467,8 +448,6 @@
"inline_system_description": "🟢 Онлайн: {online}, 📊 Активных: {active}",
"inline_admin_help_title": "Помощь по командам",
"inline_admin_help_description": "Доступны команды: реф, стат, финансы, система",
- "inline_user_help_title": "Помощь по командам",
- "inline_user_help_description": "Доступна команда: реф (реферальная ссылка)",
"admin_user_stats_total_label": "Всего",
"admin_user_stats_paid_subs_label": "С платной подпиской",