from dataclasses import dataclass from os import getenv from pathlib import Path from zoneinfo import ZoneInfo from dotenv import load_dotenv load_dotenv() @dataclass(frozen=True) class Config: bot_token: str allowed_user_ids: set[int] vault_path: Path daily_notes_dir: str note_path_format: str message_time_format: str telegram_proxy: str | None reminder_min_seconds: int reminder_max_seconds: int reminder_start_hour: int reminder_end_hour: int reminder_timezone: ZoneInfo def _required(name: str) -> str: value = getenv(name) if not value: raise RuntimeError(f"Не задана переменная окружения {name}") return value def _user_ids(value: str) -> set[int]: return {int(user_id.strip()) for user_id in value.split(",") if user_id.strip()} def _hours_to_seconds(value: str) -> int: return int(float(value) * 60 * 60) # return int(float(value)) def _hour(name: str, default: str) -> int: hour = int(getenv(name, default)) if not 0 <= hour <= 23: raise RuntimeError(f"{name} должен быть числом от 0 до 23") return hour def load_config() -> Config: reminder_start_hour = _hour("REMINDER_START_HOUR", "7") reminder_end_hour = _hour("REMINDER_END_HOUR", "23") if reminder_start_hour >= reminder_end_hour: raise RuntimeError("REMINDER_START_HOUR должен быть меньше REMINDER_END_HOUR") return Config( bot_token=_required("BOT_TOKEN"), allowed_user_ids=_user_ids(_required("ALLOWED_USER_IDS")), vault_path=Path(_required("OBSIDIAN_VAULT_PATH")).expanduser().resolve(), daily_notes_dir=getenv("DAILY_NOTES_DIR", "03 Journal"), note_path_format=getenv("NOTE_PATH_FORMAT", "%Y/%m/%d.%m.%y.md"), message_time_format=getenv("MESSAGE_TIME_FORMAT", "%H:%M"), telegram_proxy=getenv("TELEGRAM_PROXY"), reminder_min_seconds=_hours_to_seconds(getenv("REMINDER_MIN_HOURS", "2")), reminder_max_seconds=_hours_to_seconds(getenv("REMINDER_MAX_HOURS", "3")), reminder_start_hour=reminder_start_hour, reminder_end_hour=reminder_end_hour, reminder_timezone=ZoneInfo(getenv("REMINDER_TIMEZONE", "Europe/Moscow")), )