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>
32 lines
1.2 KiB
Python
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}"
|