Update config.py
This commit is contained in:
@@ -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}")
|
||||
|
||||
Reference in New Issue
Block a user