Ich habe angefangen, mir diesen Code anzusehen, aber ich denke, ein großes Problem liegt bei den „Erwartungen“.
- Geht es um Push-Benachrichtigungen? (Wenn ja, verwenden Sie PWA oder die Discourse Hub App?)
- Wenn Leute sagen, sie „werden nicht benachrichtigt“, meinen sie dann „werden nicht über Erwähnungen in einer Push-Benachrichtigung benachrichtigt“?
- Ist die Erwartung, über eine @Erwähnung per Push-Benachrichtigung benachrichtigt zu werden, wenn man bereits online ist?
Es gibt eine große Familie von Problemen, die ich als bekannte Probleme betrachten würde, die wir verbessern können.
- In der PWA, wenn wir 3 Mal innerhalb von 24 Stunden versuchen zu pushen und scheitern (aufgrund der Verbindung zum Nachrichtendistributor oder aus anderen Gründen), beenden wir Abonnements und benachrichtigen den Benutzer über nichts.
- In Hub sind Push-Benachrichtigungen nur für Discourse-gehostete Kunden verfügbar.
- Es gibt einige Sequenzierungsprobleme, bei denen eine Benachrichtigung bei der Bearbeitung einer Chat-Nachricht verloren gehen kann, da wir eine Push-Benachrichtigung innerhalb einer Transaktion auslösen.
- Wir haben einen „Debounce“ von 1 Minute, der konfigurierbar, aber verwirrend ist. Ich wurde gerade erwähnt, habe aber keine PN erhalten.
push notification time window. Dies führte dazu: @Erwähnung, ich besuche die App innerhalb von 60 Sekunden. Keine @Erwähnung. - Wenn Sie einen Benutzer in einem Kanal erwähnen, dem er nicht folgt, erhält er die Erwähnung nicht. (By Design)
Ehrlich gesagt, @lindsey / @j.jaffeux / @pmusaraj, ich habe das Gefühl, dass „laut werden“ wahrscheinlich die überwiegende Mehrheit der Probleme und Beschwerden beseitigen würde, die wir im Laufe der Jahre bezüglich Chat-Benachrichtigungen gesehen haben.
- Push-Benachrichtigungen für @Erwähnungen immer sofort senden (Site-Standard), Sites, die eine Verzögerung wünschen, können dies konfigurieren.
- Push-Benachrichtigungen für @Erwähnungen immer von ALLEN Kanälen senden, nur Kanäle ausschließen, die Benutzer explizit stummgeschaltet haben (oder für die sie keine Berechtigung haben), dies entspricht dem Verhalten im Forum.
- Es gibt etwas Seltsames in
update_message.rb, das eine Nachricht innerhalb einer Transaktion veröffentlicht. (In Multi-Thread-Umgebungen kann dies verloren gehen) - Wenn wir ein Abonnement in einer PWA beendet haben, zeigen Sie ein Banner in der PWA an, das besagt: Push-Benachrichtigungen sind nicht konfiguriert, möchten Sie sie konfigurieren? Vielleicht erst nach 1 Woche / 2 Wochen beenden, anstatt nach 1 Tag.
- Push-Tags werden pro Kanal dedupliziert, hostname-chat-mention-general … dies ist für Erwähnungen nicht ideal, da wir pro Kanal zusammenfassen, was verwirrend sein kann, wenn 4 verschiedene Personen Sie zu verschiedenen Zeiten im Kanal erwähnt haben.
- Push-Benachrichtigungen immer senden, auch wenn der Benutzer online ist (Standard) – Benutzern erlauben, dieses Verhalten bei Bedarf zu überschreiben.
- Ein Sahnehäubchen auf all dem wäre die Unterstützung erstklassiger Push-Benachrichtigungen auf allen Websites für Benutzer, die eine Discourse ID konfiguriert haben (über Discourse ID) – Dies würde Hub ein konsistentes Gefühl über alles hinweg verleihen.
Im Grunde genommen die ganze „Ups, wir hätten Sie nicht benachrichtigen sollen“-Logik standardmäßig entfernen.
Bei einem Discourse-Upgrade komplett deaktiviert, für Self-Hosters kann dies definitiv auf Verbindungsprobleme mit dem Push-Gateway zurückzuführen sein. Vielleicht dauern Upgrades auf einigen Servern Tage, vielleicht ist es aus irgendeinem Grund 24 Stunden lang ein Intranet.
Relevanter Code (via Gemini 3 pro)
PWA-Abonnements werden beendet
Die Logik, die Abonnements nach 3 Fehlern innerhalb von 24 Stunden beendet, befindet sich in der Methode handle_generic_error.
Push-Benachrichtigungs-Debounce / Online-Prüfung
Die Logik, die prüft, ob ein Benutzer online ist („Debounce“) und die Push-Benachrichtigung überspringt, befindet sich zentral hier. Dies hängt von SiteSetting.push_notification_time_window_mins ab.
Chat: Transaktionssequenzierungsprobleme
Der Dienst UpdateMessage fasst den publish-Schritt in einer Datenbanktransaktion zusammen. Dies kann zu Race Conditions führen, bei denen der Benachrichtigungsjob versucht, die Nachricht zu lesen, bevor die Transaktion committet wird.
- plugins/chat/app/services/chat/update_message.rb (Transaktionsblock)
- plugins/chat/app/services/chat/update_message.rb (Publish-Schritt)
Chat: Erwähnungen in nicht gefolgten Kanälen
Der Code filtert explizit nach following: true, wenn Erwähnungen für öffentliche Kanäle verarbeitet werden, wodurch verhindert wird, dass Benutzer, die dem Kanal nicht folgen, Benachrichtigungen erhalten.
Chat: Push-Benachrichtigungs-Tags
Die Tag-Generierungslogik, die Benachrichtigungen pro Kanal dedupliziert (zusammenfasst), ist hier definiert: