85 lines
3.0 KiB
Python
85 lines
3.0 KiB
Python
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()
|