diff --git a/configs/config.py b/configs/config.py new file mode 100644 index 0000000..78765e1 --- /dev/null +++ b/configs/config.py @@ -0,0 +1,65 @@ +# config.py +from pathlib import Path +from typing import Optional + +from pydantic import field_validator +from pydantic_settings import BaseSettings, SettingsConfigDict + + +class _Settings(BaseSettings): + model_config = SettingsConfigDict( + env_file=".env", + env_file_encoding="utf-8", + extra="ignore", + case_sensitive=False, + validate_default=True, + ) + + BOT_TOKEN: Optional[str] = None + PREFIX: Optional[str] = '!' + + WELCOME_CHANNEL_ID: int = 0 + ADMIN_ROLE_NAME: str = "Администратор" + + WARNINGS_FILE: Path = Path("warnings.json") + REMINDERS_FILE: Path = Path("reminders.json") + BLACKLIST_FILE: Path = Path("blacklist.json") + + LOG_FILE_NAME: Path = Path("bot.log") + LOG_LEVEL: str = "info" + + @field_validator("BOT_TOKEN") + def validate_bot_token(cls, v: Optional[str]) -> str: + if not v: + raise ValueError("Не задан BOT_TOKEN (проверь .env или переменные окружения)") + return v + + @field_validator("WELCOME_CHANNEL_ID") + def validate_channel_id(cls, v: int) -> int: + if v <= 0: + raise ValueError("WELCOME_CHANNEL_ID должен быть положительным ID канала") + return v + + @field_validator("ADMIN_ROLE_NAME") + def validate_admin_role_name(cls, v: str) -> str: + if not v.strip(): + raise ValueError("ADMIN_ROLE_NAME не может быть пустым") + return v + + @field_validator("LOG_LEVEL") + def validate_log_level(cls, v: str) -> str: + allowed: set[str] = {"debug", "info", "warning", "error", "critical"} + if v.lower() not in allowed: + raise ValueError(f"LOG_LEVEL должен быть одним из: {', '.join(allowed)}") + return v.lower() + + @field_validator("WARNINGS_FILE", "REMINDERS_FILE", "BLACKLIST_FILE", "LOG_FILE_NAME", mode="before") + def validate_paths(cls, v) -> Optional[Path]: + return Path(v) if isinstance(v, str) else v + + +# Создаём экземпляр класса настроек +settings = _Settings() + +# Настройка экспорта в модули +__all__ = ("settings",)