""" Конфигурация IntradBot. Все параметры читаются из переменных окружения (.env через docker-compose). При старте проверяются обязательные переменные — если не заданы, падаем сразу. """ import os import sys def _require(name: str) -> str: """Читает переменную окружения. Если не задана — завершает процесс с понятной ошибкой.""" value = os.environ.get(name, "").strip() if not value: print(f"[FATAL] Обязательная переменная окружения не задана: {name}", file=sys.stderr) sys.exit(1) return value def _optional(name: str, default: str = "") -> str: return os.environ.get(name, default).strip() def _int(name: str, default: int) -> int: try: return int(os.environ.get(name, default)) except (ValueError, TypeError): return default # ── Обязательные ────────────────────────────────────────────────────────────── TOKEN = _require("TELEGRAM_TOKEN") API_KEY = _require("INTRADESK_API_KEY") CHANNEL_ID = _int("CHANNEL_ID", 0) # ── Необязательные ──────────────────────────────────────────────────────────── BASE_TASK_URL = _optional("BASE_TASK_URL", "https://cleverparking.intradesk.ru/task/list/") DB_FILE = _optional("DB_FILE", "/app/data/intradbot.db") WEBHOOK_SECRET = _optional("WEBHOOK_SECRET") PORT = _int("PORT", 8080) PUBLIC_URL = _optional("PUBLIC_URL") GIF_URL = _optional("GIF_URL", "https://media.tenor.com/OzN-0kxqXAgAAAAi/cat.gif") # Пароль для дашборда (Basic Auth). Пустая строка — дашборд открыт. DASHBOARD_PASSWORD = _optional("DASHBOARD_PASSWORD") # Секрет для подписи ссылок Mini App MINIAPP_SECRET = _optional("MINIAPP_SECRET", WEBHOOK_SECRET or TOKEN[:20]) # ── Бизнес-параметры (вынесены из кода) ────────────────────────────────────── # ID сотрудников доступных для назначения исполнителем (через запятую в .env) # Пример: EXECUTOR_USER_IDS=2227907,631481,525111 _executor_ids_raw = _optional("EXECUTOR_USER_IDS", "2227907,631481,525111") EXECUTOR_USER_IDS: list[int] = [ int(x.strip()) for x in _executor_ids_raw.split(",") if x.strip().isdigit() ] # Фильтр активных заявок для дашборда # Пример: ACTIVE_TASKS_FILTER=(status ne 68045) and (executorgroup eq 243025) ACTIVE_TASKS_FILTER = _optional( "ACTIVE_TASKS_FILTER", "(status ne 68045) and (executorgroup eq 243025)" )