from __future__ import annotations import os from dataclasses import dataclass from pathlib import Path from dotenv import load_dotenv BASE_DIR = Path(__file__).resolve().parents[2] ENV_FILE = BASE_DIR / ".env" load_dotenv(ENV_FILE) @dataclass(slots=True) class Settings: bot_token: str bot_parse_mode: str app_env: str log_level: str tz: str exchange_enabled: bool exchange_name: str exchange_base_url: str exchange_api_key: str exchange_api_secret: str exchange_timeout_sec: int exchange_testnet: bool default_symbol: str db_host: str db_port: int db_name: str db_user: str db_password: str def is_demo_mode(self) -> bool: return "demo" in self.exchange_base_url.lower() def _parse_bool(raw_value: str, default: bool = False) -> bool: value = (raw_value or "").strip().lower() if not value: return default return value in {"1", "true", "yes", "on"} def _parse_int(raw_value: str, default: int) -> int: value = (raw_value or "").strip() if not value: return default return int(value) def load_settings() -> Settings: bot_token = os.getenv("BOT_TOKEN", "").strip() if not bot_token: raise RuntimeError("BOT_TOKEN is not set in app/.env") return Settings( bot_token=bot_token, bot_parse_mode=os.getenv("BOT_PARSE_MODE", "HTML").strip() or "HTML", app_env=os.getenv("APP_ENV", "dev").strip() or "dev", log_level=os.getenv("LOG_LEVEL", "INFO").strip().upper() or "INFO", tz=os.getenv("TZ", "Europe/Minsk").strip() or "Europe/Minsk", exchange_enabled=_parse_bool(os.getenv("EXCHANGE_ENABLED", "false")), exchange_name=os.getenv("EXCHANGE_NAME", "dzengi").strip() or "dzengi", exchange_base_url=os.getenv("EXCHANGE_BASE_URL", "").strip(), exchange_api_key=os.getenv("EXCHANGE_API_KEY", "").strip(), exchange_api_secret=os.getenv("EXCHANGE_API_SECRET", "").strip(), exchange_timeout_sec=_parse_int(os.getenv("EXCHANGE_TIMEOUT_SEC", "10"), 10), exchange_testnet=_parse_bool(os.getenv("EXCHANGE_TESTNET", "false")), default_symbol=os.getenv("DEFAULT_SYMBOL", "BTC/USD_LEVERAGE").strip() or "BTC/USD_LEVERAGE", db_host=os.getenv("DB_HOST", "localhost").strip() or "localhost", db_port=_parse_int(os.getenv("DB_PORT", "5432"), 5432), db_name=os.getenv("DB_NAME", "dzentra_bot").strip() or "dzentra_bot", db_user=os.getenv("DB_USER", "dzentra_bot").strip() or "dzentra_bot", db_password=os.getenv("DB_PASSWORD", "").strip(), )