from __future__ import annotations import os from dataclasses import dataclass from pathlib import Path def _parse_allowed_ids(raw: str) -> frozenset[int]: ids: set[int] = set() for part in raw.split(","): part = part.strip() if not part: continue try: ids.add(int(part)) except ValueError: continue return frozenset(ids) @dataclass(frozen=True) class Settings: telegram_bot_token: str ha_api_base_url: str poll_interval_sec: int data_dir: Path allowed_telegram_ids: frozenset[int] @property def db_path(self) -> Path: return self.data_dir / "bot.db" def load_settings() -> Settings: token = os.getenv("TELEGRAM_BOT_TOKEN", "").strip() if not token: raise RuntimeError("TELEGRAM_BOT_TOKEN is required") base_url = os.getenv("HA_API_BASE_URL", "").strip().rstrip("/") if not base_url: raise RuntimeError("HA_API_BASE_URL is required") poll_raw = os.getenv("POLL_INTERVAL_SEC", "30").strip() try: poll_interval = max(10, int(poll_raw)) except ValueError: poll_interval = 30 data_dir = Path(os.getenv("DATA_DIR", "./data")).resolve() data_dir.mkdir(parents=True, exist_ok=True) allowed = _parse_allowed_ids(os.getenv("ALLOWED_TELEGRAM_IDS", "")) return Settings( telegram_bot_token=token, ha_api_base_url=base_url, poll_interval_sec=poll_interval, data_dir=data_dir, allowed_telegram_ids=allowed, )