From e1a7e9e6223e2d2b4b664fef486b05f92a44afaf Mon Sep 17 00:00:00 2001 From: Fr1ngg Date: Sat, 9 Aug 2025 07:02:00 +0300 Subject: [PATCH] Update config.py --- config.py | 261 +++++++++++++++++++++++------------------------------- 1 file changed, 109 insertions(+), 152 deletions(-) diff --git a/config.py b/config.py index ee0d73e7..5ee0e3f1 100644 --- a/config.py +++ b/config.py @@ -1,172 +1,129 @@ import os -from dataclasses import dataclass, field +from dataclasses import dataclass from typing import List -import logging - -try: - from dotenv import load_dotenv - load_dotenv() - print("✅ .env файл загружен успешно") -except ImportError: - print("⚠️ python-dotenv не установлен. Используются системные переменные окружения.") -except Exception as e: - print(f"⚠️ Ошибка загрузки .env файла: {e}") - -logger = logging.getLogger(__name__) @dataclass class Config: - # Bot settings - BOT_TOKEN: str = field(default="") - DATABASE_URL: str = field(default="sqlite+aiosqlite:///bot.db") + # Bot configuration + BOT_TOKEN: str + BOT_USERNAME: str - # RemnaWave API settings - REMNAWAVE_URL: str = field(default="") - REMNAWAVE_TOKEN: str = field(default="") - SUBSCRIPTION_BASE_URL: str = field(default="") + # Database + DATABASE_URL: str - # Admin settings - ADMIN_IDS: List[int] = field(default_factory=list) - SUPPORT_USERNAME: str = field(default="support") + # RemnaWave API + REMNAWAVE_URL: str + REMNAWAVE_TOKEN: str + SUBSCRIPTION_BASE_URL: str - # Bot settings - DEFAULT_LANGUAGE: str = field(default="ru") - BOT_USERNAME: str = field(default="") # ИМЯ БОТА ДЛЯ РЕФЕРАЛЬНЫХ ССЫЛОК + # Admin configuration + ADMIN_IDS: List[int] + SUPPORT_USERNAME: str + DEFAULT_LANGUAGE: str - # Trial subscription settings - TRIAL_ENABLED: bool = field(default=False) - TRIAL_DURATION_DAYS: int = field(default=3) - TRIAL_TRAFFIC_GB: int = field(default=2) - TRIAL_SQUAD_UUID: str = field(default="") + # Trial subscription + TRIAL_ENABLED: bool + TRIAL_DURATION_DAYS: int + TRIAL_TRAFFIC_GB: int + TRIAL_SQUAD_UUID: str + # Referral system + REFERRAL_FIRST_REWARD: float + REFERRAL_REFERRED_BONUS: float + REFERRAL_THRESHOLD: float + REFERRAL_PERCENTAGE: float + + # Конфигурация мониторинга подписок + MONITOR_ENABLED: bool = True + MONITOR_CHECK_INTERVAL: int = 3600 # 1 час + MONITOR_DAILY_CHECK_HOUR: int = 10 # 10:00 утра + MONITOR_WARNING_DAYS: int = 3 # предупреждать за 3 дня - MONITOR_WARNING_DAYS: int = field(default=3) - MONITOR_CHECK_INTERVAL: int = field(default=3600) # 1 час - MONITOR_DAILY_CHECK_HOUR: int = field(default=9) # 9 утра - - # Referral program settings - REFERRAL_FIRST_REWARD: float = field(default=150.0) # Первая награда - REFERRAL_REFERRED_BONUS: float = field(default=150.0) # Бонус приглашенному - REFERRAL_THRESHOLD: float = field(default=300.0) # Порог для получения бонуса - REFERRAL_PERCENTAGE: float = field(default=0.25) # 25% с платежей - -def parse_admin_ids(admin_ids_str: str) -> List[int]: - """Parse admin IDs from string""" - if not admin_ids_str: - return [] - - try: - # Support both comma and space separated - ids_str = admin_ids_str.replace(',', ' ').strip() - return [int(id_str.strip()) for id_str in ids_str.split() if id_str.strip().isdigit()] - except ValueError as e: - logger.error(f"Error parsing admin IDs: {e}") - return [] - -def str_to_bool(value: str) -> bool: - """Convert string to boolean""" - if isinstance(value, bool): - return value - return value.lower() in ('true', '1', 'yes', 'on', 'enabled') + LUCKY_GAME_ENABLED: bool = True + LUCKY_GAME_REWARD: float = 50.0 # Размер награды за выигрыш + LUCKY_GAME_NUMBERS: int = 30 # Общее количество чисел (1-30) + LUCKY_GAME_WINNING_COUNT: int = 3 # Количество выигрышных чисел def load_config() -> Config: - """Load configuration from environment variables""" - # Дебаг: проверяем что переменные загружены - print(f"🔍 BOT_USERNAME из env: '{os.getenv('BOT_USERNAME', 'НЕ НАЙДЕН')}'") - print(f"🔍 REFERRAL_FIRST_REWARD из env: '{os.getenv('REFERRAL_FIRST_REWARD', 'НЕ НАЙДЕН')}'") - - config = Config( - # Bot settings - BOT_TOKEN=os.getenv("BOT_TOKEN", ""), - DATABASE_URL=os.getenv("DATABASE_URL", "sqlite+aiosqlite:///bot.db"), - - # RemnaWave API settings - REMNAWAVE_URL=os.getenv("REMNAWAVE_URL", ""), - REMNAWAVE_TOKEN=os.getenv("REMNAWAVE_TOKEN", ""), - SUBSCRIPTION_BASE_URL=os.getenv("SUBSCRIPTION_BASE_URL", ""), - - # Admin settings - ADMIN_IDS=parse_admin_ids(os.getenv("ADMIN_IDS", "")), - SUPPORT_USERNAME=os.getenv("SUPPORT_USERNAME", "support"), - - # Bot settings - DEFAULT_LANGUAGE=os.getenv("DEFAULT_LANGUAGE", "ru"), - BOT_USERNAME=os.getenv("BOT_USERNAME", ""), # ИСПРАВЛЕНО: берется из env - - # Trial settings - TRIAL_ENABLED=str_to_bool(os.getenv("TRIAL_ENABLED", "false")), - TRIAL_DURATION_DAYS=int(os.getenv("TRIAL_DURATION_DAYS", "3")), - TRIAL_TRAFFIC_GB=int(os.getenv("TRIAL_TRAFFIC_GB", "2")), - TRIAL_SQUAD_UUID=os.getenv("TRIAL_SQUAD_UUID", ""), - - MONITOR_WARNING_DAYS=int(os.getenv("MONITOR_WARNING_DAYS", "3")), - MONITOR_CHECK_INTERVAL=int(os.getenv("MONITOR_CHECK_INTERVAL", "3600")), - MONITOR_DAILY_CHECK_HOUR=int(os.getenv("MONITOR_DAILY_CHECK_HOUR", "9")), - - # Referral settings - REFERRAL_FIRST_REWARD=float(os.getenv("REFERRAL_FIRST_REWARD", "150.0")), - REFERRAL_REFERRED_BONUS=float(os.getenv("REFERRAL_REFERRED_BONUS", "150.0")), - REFERRAL_THRESHOLD=float(os.getenv("REFERRAL_THRESHOLD", "300.0")), - REFERRAL_PERCENTAGE=float(os.getenv("REFERRAL_PERCENTAGE", "0.25")), - ) - - print(f"✅ Config BOT_USERNAME: '{config.BOT_USERNAME}'") - print(f"✅ Config REFERRAL_FIRST_REWARD: {config.REFERRAL_FIRST_REWARD}") - - return config - -def load_config_manual_dotenv() -> Config: - """Load config with manual .env parsing""" - - # Загружаем .env файл вручную если python-dotenv не доступен - env_path = ".env" - if os.path.exists(env_path): + def parse_admin_ids(admin_ids_str: str) -> List[int]: + if not admin_ids_str: + return [] try: - with open(env_path, 'r', encoding='utf-8') as f: - for line in f: - line = line.strip() - if line and not line.startswith('#') and '=' in line: - key, value = line.split('=', 1) - # Убираем кавычки если есть - value = value.strip('"\'') - os.environ[key] = value - print(f"✅ Файл {env_path} загружен вручную") - except Exception as e: - print(f"⚠️ Ошибка загрузки {env_path}: {e}") + return [int(id_str.strip()) for id_str in admin_ids_str.split(',') if id_str.strip()] + except (ValueError, AttributeError): + return [] - return load_config() + def get_bool(key: str, default: bool = False) -> bool: + value = os.getenv(key, '').lower() + return value in ('true', '1', 'yes', 'on') + + def get_int(key: str, default: int = 0) -> int: + try: + return int(os.getenv(key, str(default))) + except (ValueError, TypeError): + return default + + def get_float(key: str, default: float = 0.0) -> float: + try: + return float(os.getenv(key, str(default))) + except (ValueError, TypeError): + return default + + return Config( + # Bot configuration + BOT_TOKEN=os.getenv('BOT_TOKEN', ''), + BOT_USERNAME=os.getenv('BOT_USERNAME', ''), + + # Database + DATABASE_URL=os.getenv('DATABASE_URL', 'sqlite+aiosqlite:///bot.db'), + + # RemnaWave API + REMNAWAVE_URL=os.getenv('REMNAWAVE_URL', ''), + REMNAWAVE_TOKEN=os.getenv('REMNAWAVE_TOKEN', ''), + SUBSCRIPTION_BASE_URL=os.getenv('SUBSCRIPTION_BASE_URL', ''), + + # Admin configuration + ADMIN_IDS=parse_admin_ids(os.getenv('ADMIN_IDS', '')), + SUPPORT_USERNAME=os.getenv('SUPPORT_USERNAME', 'support'), + DEFAULT_LANGUAGE=os.getenv('DEFAULT_LANGUAGE', 'ru'), + + # Trial subscription + TRIAL_ENABLED=get_bool('TRIAL_ENABLED', False), + TRIAL_DURATION_DAYS=get_int('TRIAL_DURATION_DAYS', 3), + TRIAL_TRAFFIC_GB=get_int('TRIAL_TRAFFIC_GB', 2), + TRIAL_SQUAD_UUID=os.getenv('TRIAL_SQUAD_UUID', ''), + + # Referral system + REFERRAL_FIRST_REWARD=get_float('REFERRAL_FIRST_REWARD', 150.0), + REFERRAL_REFERRED_BONUS=get_float('REFERRAL_REFERRED_BONUS', 150.0), + REFERRAL_THRESHOLD=get_float('REFERRAL_THRESHOLD', 300.0), + REFERRAL_PERCENTAGE=get_float('REFERRAL_PERCENTAGE', 0.25), + + MONITOR_ENABLED=get_bool('MONITOR_ENABLED', True), + MONITOR_CHECK_INTERVAL=get_int('MONITOR_CHECK_INTERVAL', 3600), # 1 час по умолчанию + MONITOR_DAILY_CHECK_HOUR=get_int('MONITOR_DAILY_CHECK_HOUR', 10), # 10 утра + MONITOR_WARNING_DAYS=get_int('MONITOR_WARNING_DAYS', 3), # за 3 дня + + # Игра удачи + LUCKY_GAME_ENABLED=get_bool('LUCKY_GAME_ENABLED', True), + LUCKY_GAME_REWARD=get_float('LUCKY_GAME_REWARD', 50.0), + LUCKY_GAME_NUMBERS=get_int('LUCKY_GAME_NUMBERS', 30), + LUCKY_GAME_WINNING_COUNT=get_int('LUCKY_GAME_WINNING_COUNT', 3) + ) def debug_environment(): - """Debug environment variables loading""" - print("\n=== DEBUG ENVIRONMENT VARIABLES ===") - - # Ключевые переменные для проверки - key_vars = [ - 'BOT_TOKEN', 'BOT_USERNAME', 'REMNAWAVE_URL', 'REMNAWAVE_TOKEN', - 'ADMIN_IDS', 'REFERRAL_FIRST_REWARD', 'REFERRAL_THRESHOLD' + env_vars = [ + 'BOT_TOKEN', 'BOT_USERNAME', 'DATABASE_URL', + 'REMNAWAVE_URL', 'REMNAWAVE_TOKEN', 'ADMIN_IDS', + 'REFERRAL_FIRST_REWARD', 'REFERRAL_THRESHOLD', + 'MONITOR_ENABLED', 'MONITOR_CHECK_INTERVAL', + 'LUCKY_GAME_ENABLED', 'LUCKY_GAME_REWARD' ] - for var in key_vars: - value = os.getenv(var, 'НЕ УСТАНОВЛЕНА') - print(f"{var}: {value}") - - print("=" * 40) - - # Проверяем файл .env - if os.path.exists('.env'): - print("📁 Файл .env найден") - try: - with open('.env', 'r') as f: - lines = f.readlines() - print(f"📄 Строк в .env: {len(lines)}") - for i, line in enumerate(lines[:5], 1): # Первые 5 строк - if 'TOKEN' not in line: # Не показываем токены - print(f" {i}: {line.strip()}") - except Exception as e: - print(f"❌ Ошибка чтения .env: {e}") - else: - print("❌ Файл .env не найден в текущей директории") - print(f"📍 Текущая директория: {os.getcwd()}") - - print("=" * 40 + "\n") + print("📋 Environment variables:") + for var in env_vars: + value = os.getenv(var, 'NOT SET') + if 'TOKEN' in var and value != 'NOT SET': + value = value[:10] + "..." if len(value) > 10 else value + print(f" {var}: {value}")