From b53e6a2cc35907c7a9536c672593a31c1b976fe8 Mon Sep 17 00:00:00 2001 From: machka-pasla Date: Mon, 4 Aug 2025 14:29:01 +0300 Subject: [PATCH] Update .env.example and enhance notification service for suspicious promo attempts - Revised the .env.example file to include new configuration options for Telegram bot settings, database credentials, and payment gateways, ensuring clarity and ease of use. - Implemented a new method in the NotificationService to notify admins of suspicious promo code attempts, enhancing security and monitoring capabilities. - Updated localization files to include messages related to suspicious promo code attempts in both English and Russian, improving admin awareness and response. --- .env.example | 152 +++++++++++++++------------ bot/services/notification_service.py | 31 ++++++ locales/en.json | 23 +--- locales/ru.json | 23 +--- 4 files changed, 117 insertions(+), 112 deletions(-) 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": "С платной подпиской",