zov-tech/bot/config.py
wasrusgen 546c62f13f feat: ежедневные уведомления о годовщинах договоров
- Backend: новый GET /api/daily_reminders (внутренний, Bearer-токен)
  сканирует Measurements, находит клиентов у которых сегодня годовщина
  contract_date (по МСК), дедуплицирует по manager+client_key
- Backend config: поле internal_secret (INTERNAL_SECRET)
- Bot: фоновая задача _anniversary_scheduler — каждый день в 09:00 МСК
  вызывает эндпоинт и рассылает менеджерам HTML-сообщение с годовщиной
- Bot config: поля internal_secret + backend_url (BACKEND_URL)
- deploy/.env.example: добавлены INTERNAL_SECRET

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 23:00:56 +03:00

61 lines
2.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from dataclasses import dataclass
from pathlib import Path
import os
from dotenv import load_dotenv
load_dotenv(Path(__file__).parent / ".env")
@dataclass(frozen=True)
class Config:
bot_token: str
admin_tg_id: int
anthropic_api_key: str
anthropic_model: str
sheet_id: str
google_credentials_path: str
miniapp_url: str
webhook_url: str
webhook_host: str
webhook_port: int
webhook_path: str
active_period_days: int
grace_period_days: int
# Внутренний токен для вызовов бота → бэкенда
internal_secret: str
# URL бэкенда (внутри Docker: http://backend:8000)
backend_url: str
@property
def use_webhook(self) -> bool:
return bool(self.webhook_url)
def _required(key: str) -> str:
val = os.getenv(key)
if not val:
raise RuntimeError(f"Не задана обязательная переменная окружения: {key}")
return val
def load_config() -> Config:
return Config(
bot_token=_required("BOT_TOKEN"),
admin_tg_id=int(_required("ADMIN_TG_ID")),
# Опциональны на MVP-этапе. Сервисы, которые их используют, проверят сами при инициализации.
anthropic_api_key=os.getenv("ANTHROPIC_API_KEY", ""),
anthropic_model=os.getenv("ANTHROPIC_MODEL", "claude-haiku-4-5-20251001"),
sheet_id=os.getenv("SHEET_ID", ""),
google_credentials_path=os.getenv("GOOGLE_CREDENTIALS_PATH", "./credentials.json"),
miniapp_url=os.getenv("MINIAPP_URL", "https://example.github.io/zov-tech/"),
webhook_url=os.getenv("WEBHOOK_URL", ""),
webhook_host=os.getenv("WEBHOOK_HOST", "0.0.0.0"),
webhook_port=int(os.getenv("WEBHOOK_PORT", "8080")),
webhook_path=os.getenv("WEBHOOK_PATH", "/tg/webhook"),
active_period_days=int(os.getenv("ACTIVE_PERIOD_DAYS", "90")),
grace_period_days=int(os.getenv("GRACE_PERIOD_DAYS", "14")),
internal_secret=os.getenv("INTERNAL_SECRET", ""),
backend_url=os.getenv("BACKEND_URL", "http://backend:8000"),
)