Задача 8: классификация и обработчики — живой прогон, cron, archive change

This commit is contained in:
2026-09-14 04:50:50 +00:00
parent 7550aff102
commit 8bff6f9aa4
14 changed files with 257 additions and 28 deletions
+34 -1
View File
@@ -45,10 +45,43 @@ try:
except ImportError:
load_dotenv = None
# Каталог скрипта → .env рядом с проектом
def _load_env_file(path):
"""Загрузить KEY=VALUE из .env-файла, не перезаписывая уже заданные env.
stdlib-фолбэк python-dotenv (в проекте нет сторонних зависимостей).
"""
p = Path(path)
if not p.exists():
return
try:
lines = p.read_text(encoding="utf-8").splitlines()
except OSError:
return
for line in lines:
line = line.strip()
if not line or line.startswith("#") or "=" not in line:
continue
key, _, val = line.partition("=")
key = key.strip()
val = val.strip().strip('"').strip("'")
if key and key not in os.environ:
os.environ[key] = val
# Каталог скрипта → .env рядом с проектом (+ radicale/.env для RADICALE_PASS)
BASE_DIR = Path(__file__).resolve().parents[1]
if load_dotenv:
load_dotenv(BASE_DIR / ".env", override=False)
# radicale/.env — фактический источник RADICALE_PASS (проектного .env нет)
load_dotenv(BASE_DIR / "radicale" / ".env", override=False)
else:
_load_env_file(BASE_DIR / ".env")
_load_env_file(BASE_DIR / "radicale" / ".env")
# Токен Telegram живёт в /opt/vesti/.env (проект-источник бота @dedinit_vesti);
# опционально: если файл есть, берём VESTI_BOT_TOKEN/TELEGRAM_CHAT_ID оттуда.
vesti_env = Path("/opt/vesti/.env")
if vesti_env.exists():
_load_env_file(vesti_env)
EMAIL_ROOT = Path(os.getenv("EMAIL_ROOT", "/opt/hermes/email"))