Files
2026-07-06 13:30:48 +03:00

70 lines
2.2 KiB
Python

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")),
)