61 lines
1.6 KiB
Python
61 lines
1.6 KiB
Python
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,
|
|
)
|