Files
patrickandClaude Sonnet 5.5 347f55cf7c
test / pytest (3.11) (push) Canceled after 0s
test / pytest (3.13) (push) Canceled after 0s
feat: Phase 6c baseline, ack, host alarms, outage notice, send limit, privacy mode, UI link
Includes atomic migrations, per-rule reminder semantics, first-run helper script
and the note on the undecided UI chat idea.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 03:06:23 +01:00

32 lines
1.2 KiB
Python

from typing import Callable
from ..chat import BACKEND_MATRIX, BACKEND_TELEGRAM
from ..constants import (ALERTS_SEND_LIMIT, CONTENT_MODE_FULL, CONTENT_MODE_SHORT, DEFAULT_SEND_LIMIT,
MATRIX_CONTENT_MODE, MAX_SEND_LIMIT, MIN_SEND_LIMIT, TELEGRAM_CONTENT_MODE, UI_BASE_URL)
CONTENT_MODE_KEYS = {BACKEND_TELEGRAM: TELEGRAM_CONTENT_MODE, BACKEND_MATRIX: MATRIX_CONTENT_MODE}
ALERTS_PATH = "/alerts"
ALERT_ANCHOR = "alert-"
def content_mode_provider(store) -> Callable[[str], str]:
def mode(backend: str) -> str:
key = CONTENT_MODE_KEYS.get(backend)
return CONTENT_MODE_SHORT if key and store.get(key) == CONTENT_MODE_SHORT else CONTENT_MODE_FULL
return mode
def send_limit_provider(store) -> Callable[[], int]:
return lambda: min(store.get_int(ALERTS_SEND_LIMIT, DEFAULT_SEND_LIMIT, MIN_SEND_LIMIT), MAX_SEND_LIMIT)
def base_url_provider(store) -> Callable[[], str | None]:
return lambda: store.get(UI_BASE_URL) or None
def alert_link(base_url: str | None, alert_id: int | None = None) -> str | None:
if not base_url:
return None
base = base_url.rstrip("/")
return f"{base}{ALERTS_PATH}#{ALERT_ANCHOR}{alert_id}" if alert_id is not None else f"{base}{ALERTS_PATH}"