From 61e05181ef94800feef2350bb7f54d10dd923249 Mon Sep 17 00:00:00 2001 From: Whyverum Date: Mon, 8 Dec 2025 16:43:58 +0700 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=BE=D0=BA=D1=80=D1=83=D0=B6=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- configs/config.py | 65 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 configs/config.py 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",)