Skip to content

Conversation

@KoenigMjr
Copy link
Contributor

Servus,
bei der Verwendung von parse_mode und der Verarbeitung von {MSG} mit Sonderzeichen (z.B. ">") hat sich das Plugin verschluckt, da hier die Zeichen u.U. als Formatierungs-Tags erkannt worden sind.
Zudem haben die fehlenden lat und lon-Felder im Packet (wenn Geomodul nicht aktiviert) immer für jeweils zwei WARNING Einträge im Log gesorgt.
Außerdem wird ein eigenes asynchrones Queueing eingeführt, um die blockierende Ausführung im Haupt-Router zu verhindern. Dadurch bleibt der Server auch bei Netzwerkverzögerungen oder API-Timeouts voll reaktionsfähig für weitere Packets. Dies ist notwendig, da z.T. mehrere Sekunden Wartezeit entstehen.

Wichtigste Änderungen

1. Asynchrone Verarbeitung & Stabilität

  • Warteschlange (Queue): Nachrichten werden jetzt asynchron über einen separaten Worker-Thread verarbeitet. Dies verhindert, dass der Hauptprozess bei Netzwerkverzögerungen oder langsamen API-Antworten blockiert wird.
  • Härtung der Queue: Die Queue wurde auf 100 Nachrichten begrenzt, um bei langanhaltenden Internetstörungen den Arbeitsspeicher zu schützen.
  • Graceful Shutdown: Eine neue Shutdown-Logik sorgt dafür, dass die Queue beim Beenden des Plugins kontrolliert geleert und der Thread sauber beendet wird.

2. Proaktive Fehlervermeidung (Telegram API)

  • Automatisches Escaping:
    • HTML: Nutzer-Inhalte werden sicher maskiert, während erlaubte Formatierungs-Tags (<b>, <i>, etc.) erhalten bleiben.
    • MarkdownV2: Sonderzeichen werden automatisch escaped, um API-Abbruchfehler (400 Bad Request) zu verhindern.
  • Längenbegrenzung: Nachrichten, die das Limit von 4.096 Zeichen überschreiten, werden automatisch gekürzt und markiert.
  • Koordinaten-Validierung: Eingehende Standorte werden vor dem Versand auf Typ und Wertebereich geprüft, um Abstürze durch fehlerhafte Geodaten zu vermeiden.
  • Verfeinerte Fehlerbehandlung: Die bestehende Retry-Logik (exponentieller Backoff & Rate-Limit-Handling) wurde beibehalten und um detaillierte Fehlerdiagnosen erweitert. Dies ermöglicht eine schnellere Fehlersuche bei Verbindungsproblemen.

3. Architektur-Konformität (Logging & Init)

  • Logging-Standard: Entfernung von logging.basicConfig. Das Plugin nutzt nun einen modul-basierten Logger (getLogger(name)). Damit wird die globale Logging-Konfiguration von BOSwatch nicht mehr überschrieben und das Plugin integriert sich nahtlos in die bestehende Log-Struktur.
  • Robuste Initialisierung: Durch eine Prüfung vor jedem Sendevorgang (_ensure_sender) werden Laufzeitfehler (AttributeErrors) verhindert, selbst wenn die Initialisierung während der Ladephase unvollständig war.

Verhaltensänderungen

  • Standort-Versand (Opt-In): Karten werden nur noch gesendet, wenn der Parameter coordinates: true in der Konfiguration gesetzt ist. Dies reduziert unnötige Log-Einträge (z.B. [WARNING ] field not found: lat) bei Alarmen ohne Geodaten.

Diese Opt-In-Regelung ist notwendig, um die WARNINGS zu umgehen. Bricht leider mit aktuellen configs (da nun Opt-in). Ich bekomme es aber leider nicht anders gelöst.
Da wir uns jedoch noch im Development befinden, denke ich nicht, dass es sehr viele User derzeit betrifft.

In der Hoffnung, dass es jetzt dann ausgereift ist :)

Updated the Telegram plugin to handle high-load scenarios and prevent
resource exhaustion. Key focus areas were message formatting,
concurrency management, and configuration resilience.

- Implement bounded message queue (max 100) with non-blocking drops to prevent memory leaks
- Add graceful shutdown logic with worker thread joining and queue draining
- Add self-healing initialization (`_ensure_sender`) to handle race conditions during startup
- Implement robust escaping/sanitization for HTML and MarkdownV2 parse modes
- Enforce Telegram's 4096 character limit with graceful truncation
- Enhance error diagnostics for API responses (Rate limiting, 4xx/5xx errors)
- Validate and sanitize GPS coordinates (range and type checking)
- Decouple logging from global config by using module-level logger

Behavioral Changes:
- BREAKING: Location messages now require `coordinates: true` in config (previously default)
- Messages are dropped with an error log when the queue is full (prevents system hang)
- Invalid HTML/Markdown characters are now automatically escaped to prevent API errors
Copy link
Member

@Schrolli91 Schrolli91 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants