#!/usr/bin/env bash # Morgenmeldung (07:00, mc2-morgenmeldung.timer): schickt die nachts gesammelten Meldungen als # EINE Telegram-Nachricht. notify.sh parkt zwischen 00:00 und 06:59 alles Nicht-Dringende in der # Nacht-Warteschlange; ohne diesen Lauf käme es nie an (so geschehen vom 21.08. bis 24.09.2026). # # Scheitert Telegram dreimal, bleibt der Stapel liegen und kommt mit der nächsten Morgenmeldung — # verloren geht nichts. Leere Warteschlange = keine Nachricht. set -uo pipefail QUEUE="${MC_NIGHT_QUEUE:-$HOME/.hermes/night-queue.txt}" ARBEIT="$QUEUE.senden" SRC_DIR="$(cd "$(dirname "$0")" && pwd)" MAX_ZEICHEN="${MC_MORGENMELDUNG_MAX:-3500}" # Telegram erlaubt 4096 Zeichen je Nachricht VERSUCHE="${MC_MORGENMELDUNG_VERSUCHE:-3}" PAUSE="${MC_MORGENMELDUNG_PAUSE:-60}" [ -s "$QUEUE" ] || [ -s "$ARBEIT" ] || exit 0 # Warteschlange übernehmen. mv ist atomar: Was notify.sh währenddessen anhängt, landet entweder # noch im übernommenen Stapel oder in einer frischen Warteschlange. Ein Stapel, der beim letzten # Mal nicht rausging, steht vorne. if [ -s "$QUEUE" ]; then mv "$QUEUE" "$QUEUE.uebernahme" && cat "$QUEUE.uebernahme" >> "$ARBEIT" && rm -f "$QUEUE.uebernahme" fi ANZAHL="$(grep -c '^- ' "$ARBEIT" || true)" [ "$ANZAHL" = "1" ] && WORT="Meldung" || WORT="Meldungen" TEXT="$(head -c "$MAX_ZEICHEN" "$ARBEIT")" if [ "$(wc -c < "$ARBEIT")" -gt "$MAX_ZEICHEN" ]; then TEXT="$TEXT … gekürzt. Alle Meldungen stehen im Cockpit unter Meldungen." fi NACHRICHT="Guten Morgen, Commander. Heute Nacht gab es $ANZAHL $WORT: $TEXT" for ((i = 1; i <= VERSUCHE; i++)); do # Als 07:00 senden (außerhalb der Nachtruhe); NO_ANNOUNCE, weil jede Meldung schon einzeln im # Briefkasten liegt. if MC_NOTIFY_STRICT=1 MC_NOTIFY_NO_ANNOUNCE=1 MC_NOTIFY_STUNDE=07 \ bash "$SRC_DIR/notify.sh" -s "[Morgenmeldung]" "$NACHRICHT"; then mv -f "$ARBEIT" "$QUEUE.zuletzt-gesendet" exit 0 fi [ "$i" -lt "$VERSUCHE" ] && sleep "$PAUSE" done echo "Morgenmeldung: Telegram nicht erreichbar, $ANZAHL $WORT bleiben für den nächsten Lauf liegen." >&2 exit 1