No description
  • Python 69%
  • HTML 20%
  • CSS 6%
  • PHP 2.9%
  • JavaScript 1.3%
  • Other 0.8%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-26 19:53:04 +01:00
assets/logo Carreau 0.8.3: Vorschau zeigt, ob das Poster mitgeht 2026-10-04 17:49:20 +02:00
carreau Carreau 0.8.5: Ort bp = Bürgerpark 2026-10-05 08:54:16 +02:00
deploy Carreau 0.8.4: Poster vorab sichern, nach Versand löschen; signal-cli ohne Anhänge 2026-10-04 18:38:51 +02:00
docs Carreau 0.8.5: Ort bp = Bürgerpark 2026-10-05 08:54:16 +02:00
termine Carreau 0.8.0: Termine für die Website, WordPress-Plugin 2026-10-01 18:27:15 +02:00
tests Carreau 0.8.5: Ort bp = Bürgerpark 2026-10-05 08:54:16 +02:00
tools feature ausbau 2026-10-01 12:57:15 +02:00
wordpress/carreau-termine 0.8.1 Filter für Seiten 2026-10-01 19:03:39 +02:00
.gitignore Projektstart: README, Ablaufplan, Entscheidungen, Logo 2026-09-29 10:07:27 +02:00
README.md Carreau 0.8.5: Ort bp = Bürgerpark 2026-10-05 08:54:16 +02:00
requirements.txt Pakete aktualisiert: fastapi 0.162.0 (behebt starlette-CVEs), tzdata 2026.5 2026-10-26 19:53:04 +01:00

Carreau

Signal-Bot des Pétanque-Club Messidor Saarbrücken e.V.: Er liest die Spieltage aus einem Kalender und erinnert die Signal-Gruppe automatisch daran – als Text, als Poster-Bild und auf Wunsch mit Umfrage.

Stand: 05.10.2026 · Carreau 0.8.5 · Phase 1–2 abgeschlossen, Phase 3 läuft: Bot installiert, erste automatische Ankündigung erfolgreich · erste echte Erinnerung geplant für Sonntag, 15.11.2026

Was der Bot kann (Ziel)

  • Erinnerungen aus dem Kalender: Für jeden Spieltag eine Sammelnachricht am Sonntag davor und eine am Spieltag selbst, mit allen Paarungen des Tages.
  • Einmalige Nachrichten: Text oder Umfrage für einen festen Zeitpunkt vorplanen, bis zum Versand änderbar (Seite „Einmalig“).
  • Vorlagen mit Platzhaltern: Texte wie beim Serienbrief, z. B. {datum}, {spiele}, {uhrzeit}, {ort}.
  • Poster als Bild (0.6.0): Vorankündigung und „Heute“ im Stil „Anzeigetafel“, Pokal-Variante in Rot; wird auf dem Server mit Chromium aus den Kalenderdaten erzeugt, lange Namen werden automatisch verkleinert. Einrichtung: docs/anleitung-poster.md.
  • Flohmarkt: Schicht-Aufruf 14 Tage vorher und Kuchen-Umfrage am Sonntag davor (eigener Kalender).
  • Umfragen: echte Signal-Umfragen aus Vorlagen, z. B. „Wer kann für diesen Samstag Kuchen backen?“.
  • Übersicht (0.7.0): was als Nächstes rausgeht, eine Karte pro Termin mit Poster, Hinweise zu Tippfehlern im Kalender; einzelne Nachrichten auslassen oder nur diesmal anders formulieren.
  • Vorschau am Morgen: am Sendetag Text und Poster vorab an den Admin.
  • Änderungen nach der Ankündigung: Carreau merkt verlegte oder abgesagte Termine und schlägt eine Nachricht an die Gruppe vor.
  • Befehle in der Gruppe (0.7.0): !naechster, !termine, !hilfe; !ergebnis folgt.
  • Web-Oberfläche: fürs Handy, nur für den Admin, hinter der YunoHost-Anmeldung.
  • Termine auf der Website (0.8.0): Spieltage mit Paarungen und Vereinstermine auf pc-messidor.de über das WordPress-Plugin „Carreau Termine“, mit Filter nach Mannschaft → docs/anleitung-website-termine.md.
  • Mehrere Gruppen: zunächst eine, ausgelegt für bis zu 5.

Architektur

flowchart LR
    handy["Handy-Kalender<br/>(DAVx⁵ / iOS)"] -- CalDAV --> baikal["Baïkal<br/>Kalender-Server"]
    baikal -- CalDAV --> bot["Carreau<br/>Bot + Web-Oberfläche"]
    bot -- "Terminliste (pcmtermine.dompasero.de)" --> wp["WordPress<br/>pc-messidor.de"]
    bot -- JSON-RPC --> scli["signal-cli<br/>gekoppeltes Gerät"]
    scli <--> signal(("Signal-Gruppe"))
    iphone["Bot-iPhone<br/>Hauptgerät des Kontos"] -. koppelt .-> scli

Alles außer dem Handy und dem Bot-iPhone läuft auf dem YunoHost-Server (netcup).

Baustein Aufgabe Status
Baïkal (YunoHost-App) Kalender, gepflegt vom Handy ✅ läuft, 29 Spieltage importiert
signal-cli Signal-Anbindung als gekoppeltes Gerät ✅ läuft
Carreau (dieses Repo) Zeitplan, Vorlagen, Umfragen, Oberfläche, einmalige Nachrichten (0.5.0), Poster (0.6.0), neue Übersicht, Vorschau, Änderungen und Befehle (0.7.0), Website-Termine (0.8.0), Update-Hinweise für signal-cli und Python-Pakete ✅ läuft (Testmodus)
WordPress + Plugin „Carreau Termine“ (wordpress/) Termine auf der Website, holt sie von pcmtermine.dompasero.de 0.8.0, Einrichtung offen

Ablauf

Phase Zeitraum Inhalt
0 29.9.–4.10. Vorbereitung: Backup, Serverdaten, Bot-iPhone absichern
1 5.–11.10. signal-cli installieren und mit dem Bot-iPhone koppeln
2 12.–18.10. Baïkal einrichten, Handy verbinden, Termine übernehmen
3 19.10.–1.11. Bot-Grundversion, Tests nur in der Testgruppe
4 2.–8.11. Poster, Umfrage, Befehle
5 9.–15.11. Go-live in der echten Gruppe

Details mit Aufgaben und Prüfpunkten: docs/ablaufplan.md · Entscheidungen: docs/entscheidungen.md

Termine eintragen: docs/kalender-eintragen.md · Updates: signal-cli · Carreau und Python-Pakete · auf 0.7.0 – Carreau meldet beides montags selbst per Signal.

Sicherheit

Die Daten von signal-cli enthalten die Schlüssel des Bot-Kontos. Wer sie hat, kann als Bot schreiben. Sie gehören nie in dieses Repo (siehe .gitignore), sondern nur verschlüsselt ins Server-Backup. Dasselbe gilt für Passwörter und App-Passwörter (Baïkal, YunoHost).

Inhalt

carreau/       der Bot: Planer, Kalender, Signal, Web-Oberfläche
tests/         automatische Tests
deploy/        Dienst-Dateien und Konfigurationsbeispiel für den Server
docs/          Ablaufplan, Entscheidungen, Anleitungen je Phase
termine/       SBV-Termine 2026/27 als CSV und ICS
tools/         Hilfsskripte (z. B. Kalender-Import)
wordpress/     Plugin „Carreau Termine“ für pc-messidor.de
assets/logo/   Vereinslogo (dunkler und heller Hintergrund), Kachelbild carreau-kachel.png (rot, 512 × 512; blaue Variante daneben)

Entwicklung

python3 -m venv .venv && . .venv/bin/activate
pip install -r requirements.txt pytest httpx radicale
python -m pytest -q
python -m carreau.updates     # Pakete auf neue Versionen und Sicherheitslücken prüfen

Die Integrationstests starten einen echten CalDAV-Server (Radicale) und eine nachgebaute signal-cli-Schnittstelle; es wird nichts an Signal geschickt.