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.
This commit is contained in:
machka-pasla
2025-08-04 14:29:01 +03:00
parent bcd95fb56c
commit b53e6a2cc3
4 changed files with 117 additions and 112 deletions
+83 -69
View File
@@ -1,69 +1,69 @@
# Telegram Bot Token and Admin IDs # Telegram Bot
BOT_TOKEN=your_bot_token_here BOT_TOKEN=
ADMIN_IDS=comma_separated_admin_ids ADMIN_IDS=
DEFAULT_LANGUAGE=ru
DEFAULT_CURRENCY_SYMBOL=RUB
SUPPORT_LINK=
SERVER_STATUS_URL=
TERMS_OF_SERVICE_URL=
POSTGRES_USER=postgres # Database
POSTGRES_PASSWORD=postgres POSTGRES_USER=user
POSTGRES_HOST=remnawave-tg-shop-db POSTGRES_PASSWORD=password
POSTGRES_HOST=db
POSTGRES_PORT=5432 POSTGRES_PORT=5432
POSTGRES_DB=postgres POSTGRES_DB=vpn_shop_db
# Localization and Display # Webhooks
DEFAULT_LANGUAGE="ru" # or "en" WEBHOOK_BASE_URL=
DEFAULT_CURRENCY_SYMBOL="RUB" # e.g., RUB, USD, EUR PANEL_WEBHOOK_SECRET=
# External Links # YooKassa
SUPPORT_LINK=https://t.me/your_support_link YOOKASSA_ENABLED=True
SERVER_STATUS_URL=https://status.yourdomain.tld/status/your_service YOOKASSA_SHOP_ID=
TERMS_OF_SERVICE_URL=https://example.com/tos YOOKASSA_SECRET_KEY=
SUBSCRIPTION_MINI_APP_URL= YOOKASSA_RETURN_URL=
START_COMMAND_DESCRIPTION= YOOKASSA_DEFAULT_RECEIPT_EMAIL=
# 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_VAT_CODE=1 YOOKASSA_VAT_CODE=1
YOOKASSA_PAYMENT_MODE=full_prepayment YOOKASSA_PAYMENT_MODE=full_prepayment
YOOKASSA_PAYMENT_SUBJECT=payment YOOKASSA_PAYMENT_SUBJECT=service
# CryptoBot Payment Gateway Configuration # CryptoPay
CRYPTOPAY_ENABLED=True
CRYPTOPAY_TOKEN= CRYPTOPAY_TOKEN=
CRYPTOPAY_NETWORK=mainnet CRYPTOPAY_NETWORK=mainnet
CRYPTOPAY_CURRENCY_TYPE=fiat CRYPTOPAY_CURRENCY_TYPE=fiat
CRYPTOPAY_ASSET=RUB CRYPTOPAY_ASSET=RUB
# API key for verifying Tribute webhook signatures
# Telegram Stars
STARS_ENABLED=True
# Telegram Tribute
TRIBUTE_ENABLED=True
TRIBUTE_API_KEY= TRIBUTE_API_KEY=
# Payment Method Toggles # Subscription Durations
YOOKASSA_ENABLED=True
STARS_ENABLED=True
TRIBUTE_ENABLED=True
CRYPTOPAY_ENABLED=True
# Subscription Options
1_MONTH_ENABLED=True 1_MONTH_ENABLED=True
RUB_PRICE_1_MONTH=150
STARS_PRICE_1_MONTH=0
TRIBUTE_LINK_1_MONTH=
3_MONTHS_ENABLED=True 3_MONTHS_ENABLED=True
RUB_PRICE_3_MONTHS=300
STARS_PRICE_3_MONTHS=0
TRIBUTE_LINK_3_MONTHS=
6_MONTHS_ENABLED=True 6_MONTHS_ENABLED=True
RUB_PRICE_6_MONTHS=500
STARS_PRICE_6_MONTHS=0
TRIBUTE_LINK_6_MONTHS=
12_MONTHS_ENABLED=True 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= TRIBUTE_LINK_12_MONTHS=
# Subscription Notifications # Subscription Notifications
@@ -72,38 +72,52 @@ SUBSCRIPTION_NOTIFY_ON_EXPIRE=True
SUBSCRIPTION_NOTIFY_AFTER_EXPIRE=True SUBSCRIPTION_NOTIFY_AFTER_EXPIRE=True
SUBSCRIPTION_NOTIFY_DAYS_BEFORE=3 SUBSCRIPTION_NOTIFY_DAYS_BEFORE=3
# Referral Bonus Days # Referral Bonuses (Inviter)
REFERRAL_BONUS_DAYS_1_MONTH=3 REFERRAL_BONUS_DAYS_1_MONTH=3
REFERRAL_BONUS_DAYS_3_MONTHS=7 REFERRAL_BONUS_DAYS_3_MONTHS=7
REFERRAL_BONUS_DAYS_6_MONTHS=15 REFERRAL_BONUS_DAYS_6_MONTHS=15
REFERRAL_BONUS_DAYS_12_MONTHS=30 REFERRAL_BONUS_DAYS_12_MONTHS=30
# Referral Bonuses (Referee)
REFEREE_BONUS_DAYS_1_MONTH=1 REFEREE_BONUS_DAYS_1_MONTH=1
REFEREE_BONUS_DAYS_3_MONTHS=3 REFEREE_BONUS_DAYS_3_MONTHS=3
REFEREE_BONUS_DAYS_6_MONTHS=7 REFEREE_BONUS_DAYS_6_MONTHS=7
REFEREE_BONUS_DAYS_12_MONTHS=15 REFEREE_BONUS_DAYS_12_MONTHS=15
# Panel API Configuration # Panel Integration
PANEL_API_URL=http://your_panel_api_url/api PANEL_API_URL=
PANEL_API_KEY=your_panel_api_key PANEL_API_KEY=
PANEL_WEBHOOK_SECRET= # secret used to verify panel webhook signatures
# User traffic limits (applied for all users)
# 0 means unlimited
USER_TRAFFIC_LIMIT_GB=0 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) # Trial Period
USER_SQUAD_UUIDS=uuid1,uuid2,uuid3
# Trial Settings
TRIAL_ENABLED=True TRIAL_ENABLED=True
TRIAL_DURATION_DAYS=5 TRIAL_DURATION_DAYS=3
TRIAL_TRAFFIC_LIMIT_GB=0 # 0 for unlimited TRIAL_TRAFFIC_LIMIT_GB=5.0
TRIAL_TRAFFIC_STRATEGY="NO_RESET"
# Web Server Settings (for handling webhooks) # Web Server
WEB_SERVER_HOST="0.0.0.0" WEB_SERVER_HOST=0.0.0.0
WEB_SERVER_PORT=8080 WEB_SERVER_PORT=8080
# Admin Panel Log Pagination
LOGS_PAGE_SIZE=10 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
+31
View File
@@ -188,6 +188,37 @@ class NotificationService:
# Send to log channel # Send to log channel
await self._send_to_log_channel(message) 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="⚠️ <b>Подозрительная попытка ввода промокода</b>\n\n"
"👤 Пользователь: {user_display}\n"
"🆔 ID: <code>{user_id}</code>\n"
"📝 Ввод: <pre>{suspicious_input}</pre>\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, async def send_custom_notification(self, message: str, to_admins: bool = False,
to_log_channel: bool = True, thread_id: Optional[int] = None): to_log_channel: bool = True, thread_id: Optional[int] = None):
+2 -21
View File
@@ -271,10 +271,6 @@
"admin_user_logs_error": "❌ Error loading user actions", "admin_user_logs_error": "❌ Error loading user actions",
"admin_direct_message_signature": "\n\n---\n💬 Message from administrator", "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": "👥 <b>User Statistics</b>\n\n📊 Total: <b>{total}</b>\n📈 Active today: <b>{active_today}</b>\n💳 With paid subscription: <b>{paid}</b>\n🆓 On trial period: <b>{trial}</b>\n😴 Inactive: <b>{inactive}</b>\n🚫 Banned: <b>{banned}</b>\n🎁 Via referral program: <b>{referral}</b>", "inline_user_stats_message": "👥 <b>User Statistics</b>\n\n📊 Total: <b>{total}</b>\n📈 Active today: <b>{active_today}</b>\n💳 With paid subscription: <b>{paid}</b>\n🆓 On trial period: <b>{trial}</b>\n😴 Inactive: <b>{inactive}</b>\n🚫 Banned: <b>{banned}</b>\n🎁 Via referral program: <b>{referral}</b>",
"inline_admin_user_stats_title": "👥 User Statistics", "inline_admin_user_stats_title": "👥 User Statistics",
"inline_admin_user_stats_desc": "Total: {total}, Active: {paid}", "inline_admin_user_stats_desc": "Total: {total}, Active: {paid}",
@@ -300,7 +296,8 @@
"log_payment_received": "{provider_emoji} <b>Payment Received</b>\n\n👤 User: {user_display}\n💰 Amount: <b>{amount} {currency}</b>\n📅 Period: <b>{months} mo.</b>\n🏦 Provider: {payment_provider}\n🕐 Time: {timestamp}", "log_payment_received": "{provider_emoji} <b>Payment Received</b>\n\n👤 User: {user_display}\n💰 Amount: <b>{amount} {currency}</b>\n📅 Period: <b>{months} mo.</b>\n🏦 Provider: {payment_provider}\n🕐 Time: {timestamp}",
"log_promo_activation": "🎁 <b>Promo Code Activated</b>\n\n👤 User: {user_display}\n🏷 Code: <code>{promo_code}</code>\n🎯 Bonus: <b>+{bonus_days}d</b>\n🕐 Time: {timestamp}", "log_promo_activation": "🎁 <b>Promo Code Activated</b>\n\n👤 User: {user_display}\n🏷 Code: <code>{promo_code}</code>\n🎯 Bonus: <b>+{bonus_days}d</b>\n🕐 Time: {timestamp}",
"log_trial_activation": "🆓 <b>Trial Activated</b>\n\n👤 User: {user_display}\n⏰ Valid until: <b>{end_date}</b>\n🕐 Time: {timestamp}", "log_trial_activation": "🆓 <b>Trial Activated</b>\n\n👤 User: {user_display}\n⏰ Valid until: <b>{end_date}</b>\n🕐 Time: {timestamp}",
"log_suspicious_promo": "⚠️ <b>Suspicious Promo Code Attempt</b>\n\n👤 User: {user_display}\n🆔 ID: <code>{user_id}</code>\n📝 Input: <pre>{suspicious_input}</pre>\n🕐 Time: {timestamp}",
"admin_general_cancel_operation": "Operation cancelled ❌", "admin_general_cancel_operation": "Operation cancelled ❌",
"admin_promo_codes_menu_bulk_create": "📦 Bulk Creation", "admin_promo_codes_menu_bulk_create": "📦 Bulk Creation",
"admin_bulk_promo_create_prompt": "📦 Bulk Promo Code Creation\n\nEnter data in format:\n<code>quantity|days|description</code>\n\nExample:\n<code>10|7|Weekly promo</code>", "admin_bulk_promo_create_prompt": "📦 Bulk Promo Code Creation\n\nEnter data in format:\n<code>quantity|days|description</code>\n\nExample:\n<code>10|7|Weekly promo</code>",
@@ -317,7 +314,6 @@
"admin_promo_edit_enter_validity_days": "⏰ Enter the number of validity days for the promo code (1-365):", "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: <b>{code}</b>\n🎁 Bonus days: <b>{days}</b>\n🔢 Max activations: <b>{max_act}</b>\n⏰ Valid until: <b>{validity}</b>", "admin_promo_updated_success": "✅ Promo code updated!\n\n🎟 Code: <b>{code}</b>\n🎁 Bonus days: <b>{days}</b>\n🔢 Max activations: <b>{max_act}</b>\n⏰ Valid until: <b>{validity}</b>",
"admin_promo_update_failed": "❌ Error updating promo code", "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_export_csv": "📄 Export to CSV",
"admin_logs_csv_export_started": "📄 Starting log 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_banned_users_list": "📋 Banned Users ({count}):\n\n{users}",
"admin_panel_stats_header": "Panel Statistics", "admin_panel_stats_header": "Panel Statistics",
"admin_bulk_promo_invalid_values": "❌ Invalid values: {error}",
"admin_bulk_promo_step1_quantity": "📦 <b>Bulk Promo Code Creation</b>\n\n<b>Step 1 of 4:</b> Quantity\n\nEnter the number of promo codes to create (1-1000):", "admin_bulk_promo_step1_quantity": "📦 <b>Bulk Promo Code Creation</b>\n\n<b>Step 1 of 4:</b> Quantity\n\nEnter the number of promo codes to create (1-1000):",
"admin_bulk_promo_step2_bonus_days": "📦 <b>Bulk Promo Code Creation</b>\n\n<b>Step 2 of 4:</b> Bonus Days\n\nQuantity: <b>{quantity}</b>\n\nEnter the number of bonus days (1-365):", "admin_bulk_promo_step2_bonus_days": "📦 <b>Bulk Promo Code Creation</b>\n\n<b>Step 2 of 4:</b> Bonus Days\n\nQuantity: <b>{quantity}</b>\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_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_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_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_unlimited_validity": "♾️ Unlimited",
"admin_bulk_promo_set_validity": "⏰ Set Period", "admin_bulk_promo_set_validity": "⏰ Set Period",
@@ -361,7 +355,6 @@
"admin_promo_step3_max_activations": "🎟 <b>Create Promo Code</b>\n\n<b>Step 3 of 4:</b> Max Activations\n\nCode: <b>{code}</b>\nBonus days: <b>{bonus_days}</b>\n\nEnter the maximum number of activations (1-10000):", "admin_promo_step3_max_activations": "🎟 <b>Create Promo Code</b>\n\n<b>Step 3 of 4:</b> Max Activations\n\nCode: <b>{code}</b>\nBonus days: <b>{bonus_days}</b>\n\nEnter the maximum number of activations (1-10000):",
"admin_promo_step4_validity": "🎟 <b>Create Promo Code</b>\n\n<b>Step 4 of 4:</b> Validity Period\n\nCode: <b>{code}</b>\nBonus days: <b>{bonus_days}</b>\nMax activations: <b>{max_activations}</b>\n\nChoose the validity period for the promo code:", "admin_promo_step4_validity": "🎟 <b>Create Promo Code</b>\n\n<b>Step 4 of 4:</b> Validity Period\n\nCode: <b>{code}</b>\nBonus days: <b>{bonus_days}</b>\nMax activations: <b>{max_activations}</b>\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_code_already_exists": "❌ A promo code with this code already exists",
"admin_promo_processing_error": "❌ Error processing promo code", "admin_promo_processing_error": "❌ Error processing promo code",
"admin_promo_unlimited_validity": "♾️ Unlimited", "admin_promo_unlimited_validity": "♾️ Unlimited",
@@ -370,8 +363,6 @@
"admin_promo_skip_description": "⏭️ Skip", "admin_promo_skip_description": "⏭️ Skip",
"admin_promo_description_too_long": "❌ Description must not exceed 200 characters", "admin_promo_description_too_long": "❌ Description must not exceed 200 characters",
"admin_promo_creating": "⏳ Creating promo code...", "admin_promo_creating": "⏳ Creating promo code...",
"admin_promo_created_success": "✅ Promo code created!\n\n🎟 Code: <b>{code}</b>\n🎁 Bonus days: <b>{days}</b>\n🔢 Max activations: <b>{max_act}</b>\n⏰ Valid until: <b>{validity}</b>",
"admin_promo_creation_failed": "❌ Error creating promo code: {error}",
"admin_panel_back_button": "⬅️ Back", "admin_panel_back_button": "⬅️ Back",
"admin_bulk_promo_creation_failed": "❌ Error creating promo codes: {error}", "admin_bulk_promo_creation_failed": "❌ Error creating promo codes: {error}",
@@ -401,8 +392,6 @@
"admin_user_subscription_expired": "Expired {end_date}", "admin_user_subscription_expired": "Expired {end_date}",
"admin_user_subscription_none": "No active subscription", "admin_user_subscription_none": "No active subscription",
"admin_user_logs_title": "📋 <b>User logs {user_id}</b>",
"admin_user_logs_empty": "No logs available",
"admin_user_logs_count": "Total entries: {count}", "admin_user_logs_count": "Total entries: {count}",
"admin_user_logs_entry": "📅 {timestamp}\n📝 {event_type}: {content}", "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_bulk_promo_unique_generation_failed": "Failed to create unique promo code",
"admin_suspicious_promo_attempt_notification": "⚠️ <b>Suspicious promo code attempt</b>\n\n👤 User: <b>@{user_username}</b> (ID: {user_id})\n📝 Name: <b>{user_first_name}</b>\n💬 Input text: <b>{promo_code_input}</b>",
"admin_suspicious_promo_attempt_notification_no_username": "⚠️ <b>Suspicious promo code attempt</b>\n\n👤 User ID: <b>{user_id}</b>\n📝 Name: <b>{user_first_name}</b>\n💬 Input text: <b>{promo_code_input}</b>",
"admin_promo_management_button": "🎟 Promo Management", "admin_promo_management_button": "🎟 Promo Management",
"admin_promo_management_title": "🎟 <b>Promo Code Management</b>\n\nSelect a promo code for detailed view:", "admin_promo_management_title": "🎟 <b>Promo Code Management</b>\n\nSelect a promo code for detailed view:",
"admin_promo_management_empty": "📭 No promo codes available", "admin_promo_management_empty": "📭 No promo codes available",
@@ -429,13 +415,10 @@
"admin_promo_status_inactive": "🚫 Inactive", "admin_promo_status_inactive": "🚫 Inactive",
"admin_promo_status_expired": "⏰ Expired", "admin_promo_status_expired": "⏰ Expired",
"admin_promo_status_used_up": "🔄 Used up", "admin_promo_status_used_up": "🔄 Used up",
"admin_promo_edit_button": "✏️ Edit",
"admin_promo_toggle_status_button": "🔄 On/Off", "admin_promo_toggle_status_button": "🔄 On/Off",
"admin_promo_delete_button": "🗑 Delete",
"admin_promo_view_activations_button": "📋 Activations", "admin_promo_view_activations_button": "📋 Activations",
"admin_promo_back_to_list_button": "⬅️ Back to list", "admin_promo_back_to_list_button": "⬅️ Back to list",
"admin_panel_stats_header": "Panel Statistics",
"admin_panel_online_label": "Online", "admin_panel_online_label": "Online",
"admin_panel_active_label": "Active", "admin_panel_active_label": "Active",
"admin_panel_disabled_label": "Disabled", "admin_panel_disabled_label": "Disabled",
@@ -466,8 +449,6 @@
"inline_system_description": "🟢 Online: {online}, 📊 Active: {active}", "inline_system_description": "🟢 Online: {online}, 📊 Active: {active}",
"inline_admin_help_title": "Commands help", "inline_admin_help_title": "Commands help",
"inline_admin_help_description": "Available commands: ref, stat, financial, system", "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_total_label": "Total",
"admin_user_stats_paid_subs_label": "With paid subscription", "admin_user_stats_paid_subs_label": "With paid subscription",
+1 -22
View File
@@ -271,10 +271,6 @@
"admin_user_logs_error": "❌ Ошибка загрузки действий пользователя", "admin_user_logs_error": "❌ Ошибка загрузки действий пользователя",
"admin_direct_message_signature": "\n\n---\n💬 Сообщение от администратора", "admin_direct_message_signature": "\n\n---\n💬 Сообщение от администратора",
"inline_referral_title": "🎁 Пригласить друга",
"inline_referral_description": "Поделиться реферальной ссылкой для получения бонусов",
"inline_user_stats_message": "📊 <b>Статистика Бота</b>\n👥 Пользователи\n\n📊 Всего: <b>{total}</b>\n💳 С платной подпиской: <b>{paid}</b>\n🆓 На пробном периоде: <b>{trial}</b>\n😴 Неактивных: <b>{inactive}</b>\n🚫 Заблокированных: <b>{banned}</b>\n🎁 Привлечено по реферальной программе: <b>{referral}</b>", "inline_user_stats_message": "📊 <b>Статистика Бота</b>\n👥 Пользователи\n\n📊 Всего: <b>{total}</b>\n💳 С платной подпиской: <b>{paid}</b>\n🆓 На пробном периоде: <b>{trial}</b>\n😴 Неактивных: <b>{inactive}</b>\n🚫 Заблокированных: <b>{banned}</b>\n🎁 Привлечено по реферальной программе: <b>{referral}</b>",
"inline_user_stats_description": "Всего: {total}, Платных: {active}", "inline_user_stats_description": "Всего: {total}, Платных: {active}",
"inline_admin_user_stats_title": "👥 Статистика пользователей", "inline_admin_user_stats_title": "👥 Статистика пользователей",
@@ -289,8 +285,6 @@
"inline_admin_system_stats_desc": "Онлайн: {online}, Офлайн: {offline}", "inline_admin_system_stats_desc": "Онлайн: {online}, Офлайн: {offline}",
"inline_admin_help_message": "🤖 <b>Inline режим бота</b>\n\n📱 <b>Доступные команды:</b>\n\n🎁 <b>реф/ref</b> - поделиться реферальной ссылкой\n👥 <b>стат/stat</b> - статистика пользователей\n💰 <b>финансы</b> - финансовая статистика\n🖥 <b>система</b> - системная статистика\n\n💡 Просто напишите @{bot_username} и начните вводить команду в любом чате!", "inline_admin_help_message": "🤖 <b>Inline режим бота</b>\n\n📱 <b>Доступные команды:</b>\n\n🎁 <b>реф/ref</b> - поделиться реферальной ссылкой\n👥 <b>стат/stat</b> - статистика пользователей\n💰 <b>финансы</b> - финансовая статистика\n🖥 <b>система</b> - системная статистика\n\n💡 Просто напишите @{bot_username} и начните вводить команду в любом чате!",
"inline_admin_help_title": "🤖 Inline помощь (Админ)",
"inline_admin_help_desc": "Доступны команды: реф, стат, финансы, система",
"inline_user_help_message": "🤖 <b>Inline режим бота</b>\n\n📱 <b>Доступные команды:</b>\n\n🎁 <b>реф/ref</b> - поделиться реферальной ссылкой\n\n💡 Просто напишите @{bot_username} и начните вводить 'реф' в любом чате!", "inline_user_help_message": "🤖 <b>Inline режим бота</b>\n\n📱 <b>Доступные команды:</b>\n\n🎁 <b>реф/ref</b> - поделиться реферальной ссылкой\n\n💡 Просто напишите @{bot_username} и начните вводить 'реф' в любом чате!",
"inline_user_help_title": "🤖 Inline помощь", "inline_user_help_title": "🤖 Inline помощь",
@@ -301,6 +295,7 @@
"log_payment_received": "{provider_emoji} <b>Получен платеж</b>\n\n👤 Пользователь: {user_display}\n💰 Сумма: <b>{amount} {currency}</b>\n📅 Период: <b>{months} мес.</b>\n🏦 Провайдер: {payment_provider}\n🕐 Время: {timestamp}", "log_payment_received": "{provider_emoji} <b>Получен платеж</b>\n\n👤 Пользователь: {user_display}\n💰 Сумма: <b>{amount} {currency}</b>\n📅 Период: <b>{months} мес.</b>\n🏦 Провайдер: {payment_provider}\n🕐 Время: {timestamp}",
"log_promo_activation": "🎁 <b>Активирован промокод</b>\n\n👤 Пользователь: {user_display}\n🏷 Код: <code>{promo_code}</code>\n🎯 Бонус: <b>+{bonus_days} дн.</b>\n🕐 Время: {timestamp}", "log_promo_activation": "🎁 <b>Активирован промокод</b>\n\n👤 Пользователь: {user_display}\n🏷 Код: <code>{promo_code}</code>\n🎯 Бонус: <b>+{bonus_days} дн.</b>\n🕐 Время: {timestamp}",
"log_trial_activation": "🆓 <b>Активирован триал</b>\n\n👤 Пользователь: {user_display}\n⏰ Действует до: <b>{end_date}</b>\n🕐 Время: {timestamp}", "log_trial_activation": "🆓 <b>Активирован триал</b>\n\n👤 Пользователь: {user_display}\n⏰ Действует до: <b>{end_date}</b>\n🕐 Время: {timestamp}",
"log_suspicious_promo": "⚠️ <b>Подозрительная попытка ввода промокода</b>\n\n👤 Пользователь: {user_display}\n🆔 ID: <code>{user_id}</code>\n📝 Ввод: <pre>{suspicious_input}</pre>\n🕐 Время: {timestamp}",
"admin_general_cancel_operation": "Операция отменена ❌", "admin_general_cancel_operation": "Операция отменена ❌",
"admin_promo_codes_menu_bulk_create": "📦 Массовое создание", "admin_promo_codes_menu_bulk_create": "📦 Массовое создание",
@@ -318,7 +313,6 @@
"admin_promo_edit_enter_validity_days": "⏰ Введите количество дней действия промокода (1-365):", "admin_promo_edit_enter_validity_days": "⏰ Введите количество дней действия промокода (1-365):",
"admin_promo_updated_success": "✅ Промокод обновлен!\n\n🎟 Код: <b>{code}</b>\n🎁 Бонусные дни: <b>{days}</b>\n🔢 Максимальные активации: <b>{max_act}</b>\n⏰ Действует до: <b>{validity}</b>", "admin_promo_updated_success": "✅ Промокод обновлен!\n\n🎟 Код: <b>{code}</b>\n🎁 Бонусные дни: <b>{days}</b>\n🔢 Максимальные активации: <b>{max_act}</b>\n⏰ Действует до: <b>{validity}</b>",
"admin_promo_update_failed": "❌ Ошибка обновления промокода", "admin_promo_update_failed": "❌ Ошибка обновления промокода",
"admin_promo_invalid_validity_days": "❌ Дни действия должны быть от 1 до 365",
"admin_logs_export_csv": "📄 Экспорт в CSV", "admin_logs_export_csv": "📄 Экспорт в CSV",
"admin_logs_csv_export_started": "📄 Начинаю экспорт логов в CSV...", "admin_logs_csv_export_started": "📄 Начинаю экспорт логов в CSV...",
@@ -339,7 +333,6 @@
"admin_banned_users_list": "📋 Заблокированные пользователи ({count}):\n\n{users}", "admin_banned_users_list": "📋 Заблокированные пользователи ({count}):\n\n{users}",
"admin_panel_stats_header": "Статистика панели", "admin_panel_stats_header": "Статистика панели",
"admin_bulk_promo_invalid_values": "❌ Неверные значения: {error}",
"admin_bulk_promo_step1_quantity": "📦 <b>Массовое создание промокодов</b>\n\n<b>Шаг 1 из 4:</b> Количество промокодов\n\nВведите количество промокодов для создания (1-1000):", "admin_bulk_promo_step1_quantity": "📦 <b>Массовое создание промокодов</b>\n\n<b>Шаг 1 из 4:</b> Количество промокодов\n\nВведите количество промокодов для создания (1-1000):",
"admin_bulk_promo_step2_bonus_days": "📦 <b>Массовое создание промокодов</b>\n\n<b>Шаг 2 из 4:</b> Бонусные дни\n\nКоличество: <b>{quantity}</b>\n\nВведите количество бонусных дней (1-365):", "admin_bulk_promo_step2_bonus_days": "📦 <b>Массовое создание промокодов</b>\n\n<b>Шаг 2 из 4:</b> Бонусные дни\n\nКоличество: <b>{quantity}</b>\n\nВведите количество бонусных дней (1-365):",
@@ -349,7 +342,6 @@
"admin_bulk_promo_invalid_quantity": "❌ Количество должно быть от 1 до 1000", "admin_bulk_promo_invalid_quantity": "❌ Количество должно быть от 1 до 1000",
"admin_bulk_promo_invalid_bonus_days": "❌ Бонусные дни должны быть от 1 до 365", "admin_bulk_promo_invalid_bonus_days": "❌ Бонусные дни должны быть от 1 до 365",
"admin_bulk_promo_invalid_max_activations": "❌ Максимальные активации должны быть от 1 до 10000", "admin_bulk_promo_invalid_max_activations": "❌ Максимальные активации должны быть от 1 до 10000",
"admin_bulk_promo_invalid_validity_days": "❌ Дни действия должны быть от 1 до 365",
"admin_bulk_promo_unlimited_validity": "♾️ Неограниченно", "admin_bulk_promo_unlimited_validity": "♾️ Неограниченно",
"admin_bulk_promo_set_validity": "⏰ Установить срок", "admin_bulk_promo_set_validity": "⏰ Установить срок",
@@ -362,7 +354,6 @@
"admin_promo_step3_max_activations": "🎟 <b>Создание промокода</b>\n\n<b>Шаг 3 из 4:</b> Максимальные активации\n\nКод: <b>{code}</b>\nБонусные дни: <b>{bonus_days}</b>\n\nВведите максимальное количество активаций (1-10000):", "admin_promo_step3_max_activations": "🎟 <b>Создание промокода</b>\n\n<b>Шаг 3 из 4:</b> Максимальные активации\n\nКод: <b>{code}</b>\nБонусные дни: <b>{bonus_days}</b>\n\nВведите максимальное количество активаций (1-10000):",
"admin_promo_step4_validity": "🎟 <b>Создание промокода</b>\n\n<b>Шаг 4 из 4:</b> Срок действия\n\nКод: <b>{code}</b>\nБонусные дни: <b>{bonus_days}</b>\nМакс. активации: <b>{max_activations}</b>\n\nВыберите срок действия промокода:", "admin_promo_step4_validity": "🎟 <b>Создание промокода</b>\n\n<b>Шаг 4 из 4:</b> Срок действия\n\nКод: <b>{code}</b>\nБонусные дни: <b>{bonus_days}</b>\nМакс. активации: <b>{max_activations}</b>\n\nВыберите срок действия промокода:",
"admin_promo_invalid_code_format": "❌ Код промокода должен содержать 3-30 символов (только буквы и цифры)",
"admin_promo_code_already_exists": "❌ Промокод с таким кодом уже существует", "admin_promo_code_already_exists": "❌ Промокод с таким кодом уже существует",
"admin_promo_processing_error": "❌ Ошибка обработки промокода", "admin_promo_processing_error": "❌ Ошибка обработки промокода",
"admin_promo_unlimited_validity": "♾️ Неограниченно", "admin_promo_unlimited_validity": "♾️ Неограниченно",
@@ -371,8 +362,6 @@
"admin_promo_skip_description": "⏭️ Пропустить", "admin_promo_skip_description": "⏭️ Пропустить",
"admin_promo_description_too_long": "❌ Описание не должно превышать 200 символов", "admin_promo_description_too_long": "❌ Описание не должно превышать 200 символов",
"admin_promo_creating": "⏳ Создаю промокод...", "admin_promo_creating": "⏳ Создаю промокод...",
"admin_promo_created_success": "✅ Промокод создан!\n\n🎟 Код: <b>{code}</b>\n🎁 Бонусные дни: <b>{days}</b>\n🔢 Максимальные активации: <b>{max_act}</b>\n⏰ Действует до: <b>{validity}</b>",
"admin_promo_creation_failed": "❌ Ошибка создания промокода: {error}",
"admin_panel_back_button": "⬅️ Назад", "admin_panel_back_button": "⬅️ Назад",
"admin_bulk_promo_creation_failed": "❌ Ошибка создания промокодов: {error}", "admin_bulk_promo_creation_failed": "❌ Ошибка создания промокодов: {error}",
@@ -402,8 +391,6 @@
"admin_user_subscription_expired": "Истекла {end_date}", "admin_user_subscription_expired": "Истекла {end_date}",
"admin_user_subscription_none": "Нет активной подписки", "admin_user_subscription_none": "Нет активной подписки",
"admin_user_logs_title": "📋 <b>Логи пользователя {user_id}</b>",
"admin_user_logs_empty": "Логи отсутствуют",
"admin_user_logs_count": "Всего записей: {count}", "admin_user_logs_count": "Всего записей: {count}",
"admin_user_logs_entry": "📅 {timestamp}\n📝 {event_type}: {content}", "admin_user_logs_entry": "📅 {timestamp}\n📝 {event_type}: {content}",
@@ -413,9 +400,6 @@
"admin_bulk_promo_unique_generation_failed": "Не удалось создать уникальный промокод", "admin_bulk_promo_unique_generation_failed": "Не удалось создать уникальный промокод",
"admin_suspicious_promo_attempt_notification": "⚠️ <b>Подозрительная попытка ввода промокода</b>\n\n👤 Пользователь: <b>@{user_username}</b> (ID: {user_id})\n📝 Имя: <b>{user_first_name}</b>\n💬 Введенный текст: <b>{promo_code_input}</b>",
"admin_suspicious_promo_attempt_notification_no_username": "⚠️ <b>Подозрительная попытка ввода промокода</b>\n\n👤 Пользователь ID: <b>{user_id}</b>\n📝 Имя: <b>{user_first_name}</b>\n💬 Введенный текст: <b>{promo_code_input}</b>",
"admin_promo_management_button": "🎟 Управление промокодами", "admin_promo_management_button": "🎟 Управление промокодами",
"admin_promo_management_title": "🎟 <b>Управление промокодами</b>\n\nВыберите промокод для детального просмотра:", "admin_promo_management_title": "🎟 <b>Управление промокодами</b>\n\nВыберите промокод для детального просмотра:",
"admin_promo_management_empty": "📭 Промокоды отсутствуют", "admin_promo_management_empty": "📭 Промокоды отсутствуют",
@@ -430,13 +414,10 @@
"admin_promo_status_inactive": "🚫 Неактивен", "admin_promo_status_inactive": "🚫 Неактивен",
"admin_promo_status_expired": "⏰ Истек", "admin_promo_status_expired": "⏰ Истек",
"admin_promo_status_used_up": "🔄 Исчерпан", "admin_promo_status_used_up": "🔄 Исчерпан",
"admin_promo_edit_button": "✏️ Редактировать",
"admin_promo_toggle_status_button": "🔄 Вкл/Выкл", "admin_promo_toggle_status_button": "🔄 Вкл/Выкл",
"admin_promo_delete_button": "🗑 Удалить",
"admin_promo_view_activations_button": "📋 Активации", "admin_promo_view_activations_button": "📋 Активации",
"admin_promo_back_to_list_button": "⬅️ К списку", "admin_promo_back_to_list_button": "⬅️ К списку",
"admin_panel_stats_header": "Статистика панели",
"admin_panel_online_label": "Онлайн", "admin_panel_online_label": "Онлайн",
"admin_panel_active_label": "Активных", "admin_panel_active_label": "Активных",
"admin_panel_disabled_label": "Отключенных", "admin_panel_disabled_label": "Отключенных",
@@ -467,8 +448,6 @@
"inline_system_description": "🟢 Онлайн: {online}, 📊 Активных: {active}", "inline_system_description": "🟢 Онлайн: {online}, 📊 Активных: {active}",
"inline_admin_help_title": "Помощь по командам", "inline_admin_help_title": "Помощь по командам",
"inline_admin_help_description": "Доступны команды: реф, стат, финансы, система", "inline_admin_help_description": "Доступны команды: реф, стат, финансы, система",
"inline_user_help_title": "Помощь по командам",
"inline_user_help_description": "Доступна команда: реф (реферальная ссылка)",
"admin_user_stats_total_label": "Всего", "admin_user_stats_total_label": "Всего",
"admin_user_stats_paid_subs_label": "С платной подпиской", "admin_user_stats_paid_subs_label": "С платной подпиской",