from typing import Dict, Optional from pydantic import field_validator from pydantic_settings import BaseSettings, SettingsConfigDict __all__ = ("settings",) class Settings(BaseSettings): """Конфигурация основных режимов и параметров с валидацией""" model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", extra="ignore", case_sensitive=False, ) # Режимы и базовые параметры PYTHONUNBUFFERED: str = "1" API_ID: Optional[int] = None API_HASH: Optional[str] = None SOURCE_CHANNEL: Optional[int] = None BOT_TOKEN: Optional[str] = None BOT_USERNAME: Optional[str] = None PHONE_NUMBER: Optional[str] = None PASSWORD: Optional[str] = None ACCOUNT_MODE: bool = True # True = аккаунт, False = бот MSG_PHOTO: bool = True # True = фото, False = inline PERIOD: int = 3600 # Файл по умолчанию для отправки DEFAULT_PHOTO: str = "assets/image.jpg" TEXT_MESSAGE: str = ( "Приветствую, меня зовут Инокендий\n" "#флуд #ролевая #геншинимпакт #геншин #flood #rp #genshin" ) # Словарь групп: {chat_id: reply_to_message_id} GROUP_IDS: Dict[int, Optional[int]] = {} # ================== Валидаторы ================== @field_validator('PYTHONUNBUFFERED') def validate_unbuffered(cls, v: str) -> str: if v not in ('0', '1'): raise ValueError("PYTHONUNBUFFERED должен быть '0' или '1'") return v @field_validator('ACCOUNT_MODE') def validate_account_mode(cls, v: bool) -> bool: if not isinstance(v, bool): raise ValueError("ACCOUNT_MODE должен быть булевым: True = аккаунт, False = бот") return v @field_validator('PERIOD') def validate_period(cls, v: int) -> int: if v <= 0: raise ValueError("PERIOD должен быть положительным числом") return v @field_validator('API_ID') def validate_api_id(cls, v: int) -> int: if v is None or v <= 0: raise ValueError("API_ID должен быть положительным числом") return v @field_validator('GROUP_IDS', mode='before') def parse_group_ids(cls, v): """ Конвертирует строку вида "-1003057872759:0,-1002417346920:2" в словарь {chat_id: reply_to_message_id} """ if isinstance(v, str): try: return {int(k): int(val) for k, val in (x.split(":") for x in v.split(","))} except Exception: raise ValueError( "Неправильный формат GROUP_IDS. " "Пример: -100123:0,-100456:2" ) return v # Экземпляр класса settings: Settings = Settings()