from functools import lru_cache
from pathlib import Path
from pydantic import AliasChoices, Field
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
"""Настройки tgclient-mcp, всё через env с префиксом TGCLIENT_ (см. .env.example)."""
model_config = SettingsConfigDict(env_prefix="TGCLIENT_", env_file=".env", extra="ignore")
# алиасы: краткий TGCLIENT_DB_PATH / TGCLIENT_SESSION_TTL (как в .env.example);
# pydantic-settings не применяет env_prefix к AliasChoices — имена полные
database_path: Path = Field(
default=Path("/data/tgclient.db"),
validation_alias=AliasChoices(
"TGCLIENT_DB_PATH", "TGCLIENT_DATABASE_PATH",
"tgclient_db_path", "tgclient_database_path",
),
)
# пусто = MCP доступен только персональным ключам / cookie-сессиям;
# задан — супер-токен для скриптов, MCP, curl (handbook mcp.md: бэкдор)
admin_token: str = ""
# Креды приложения Telegram: один набор на деплой (api_id — приложение);
# пусто — добавление аккаунтов недоступно, тулы отвечают 503-подобной ошибкой.
api_id: int = 0
api_hash: str = ""
# Лимиты
max_active_accounts: int = 30 # аккаунтов на пользователя
media_max_bytes: int = 20 * 1024 * 1024 # cap download/upload через MCP
write_limit_n: int = 20 # мутаций на аккаунт за окно
write_limit_window: float = 60.0
# gnexus-auth (SSO): задан client_id — браузерная авторизация через SSO
auth_base_url: str = ""
auth_client_id: str = ""
auth_client_secret: str = ""
auth_redirect_uri: str = ""
auth_webhook_secret: str = ""
auth_allowlist: str = "" # пусто = любой залогиненный
session_ttl_seconds: int = Field(
default=7 * 24 * 3600,
validation_alias=AliasChoices(
"TGCLIENT_SESSION_TTL", "TGCLIENT_SESSION_TTL_SECONDS",
"tgclient_session_ttl", "tgclient_session_ttl_seconds",
),
)
# Gnexus Synapse: пустой api_key = интеграция выключена
synapse_url: str = ""
synapse_api_key: str = ""
synapse_default_source: str = "tgclient-mcp"
synapse_timeout: float = 10.0
@lru_cache
def get_settings() -> Settings:
return Settings()