Das erste Mal, als ich eine zweite Benachrichtigung für dieselbe Antwort bemerkte, ohne dass beim Bearbeiten ein Link, ein Zitat oder eine Erwähnung hinzugefügt wurde, war nach der Bearbeitung unter Topics from some categories do not appear on /latest - #36 by JammyDodger. Dieser Fall unterscheidet sich geringfügig von meinen unten aufgeführten Reproduktionsschritten, aber ich denke, das zugrunde liegende Problem ist dasselbe.
Der zweite Beitrag, bei dem dies geschah, war unter Messages section for sidebar - #13 by nathank. Es war ähnlich: Die Bearbeitung fügte nichts hinzu, was eine Benachrichtigung ausgelöst hätte – die Zitate waren beide schon vorher da – und trotzdem wurde ich ein zweites Mal benachrichtigt.
Hier sind die Schritte zur Reproduktion, die ich gefunden habe und die funktioniert haben [1]
Sie benötigen 3 Benutzer: OP, notifiedUser, spammer
OP erstellt ein Thema
notifiedUser antwortet
OP antwortet auf den Beitrag von notifiedUser notifiedUser wird über die Antwort benachrichtigt (erwartet)
spammer antwortet auf den Beitrag von notifiedUser. Die Antwort enthält einen Link zu einem anderen Beitrag von notifiedUser und ein Zitat aus dem Beitrag, auf den Sie antworten. (optional: Sie können auch notifiedUser @erwähnen) notifiedUser wird über die Antwort benachrichtigt (erwartet) [Falls Sie eine @Erwähnung hinzugefügt haben, bezieht sich die Benachrichtigung auf die @Erwähnung (erwartet)]
notifiedUser liest die neuen Antworten, um die Benachrichtigungen als gelesen zu markieren, und navigiert woanders hin, damit wir keine Benachrichtigung verpassen.
spammer bearbeitet die Antwort und korrigiert einen Tippfehler (oder fügt edit1 hinzu) notifiedUser wird über das Zitieren benachrichtigt (unerwartet, sie wurden bereits über diese Antwort benachrichtigt und das Zitat war schon vorher da, es besteht kein Grund, sie erneut zu informieren)
spammer bearbeitet die Antwort erneut, um einen weiteren Tippfehler zu korrigieren (oder fügt edit2 hinzu) notifiedUser wird über das Verlinken benachrichtigt (unerwartet, sie wurden bereits über diese Antwort benachrichtigt und der Link war schon vorher da, es besteht kein Grund, sie erneut zu informieren)
Das Video zeigt nur die letzten Schritte 5-7. Spammer ist links, notifiedUser ist rechts
zumindest meistens, manchmal löst selbst das Hinzufügen einer @Erwähnung bei der Bearbeitung keine neue Benachrichtigung aus ↩︎
Change lines 589-599 from:
# linked, quoted, mentioned, chat_quoted may be suppressed if you already have a reply notification
if [
Notification.types[:quoted],
Notification.types[:linked],
Notification.types[:mentioned],
Notification.types[:chat_quoted],
].include?(type)
if existing_notifications.find { |n| n.notification_type == Notification.types[:replied] }
return
end
end
To:
# linked, quoted, mentioned, chat_quoted may be suppressed if you already have any notification about this
post
if [
Notification.types[:quoted],
Notification.types[:linked],
Notification.types[:mentioned],
Notification.types[:chat_quoted],
].include?(type)
return if existing_notifications.any?
end
Dies wird funktionieren, aber ich mache mir etwas Sorgen, da hier noch andere Benachrichtigungen durchrutschen können. (z.B. Plugin-Benachrichtigungen, die wir möglicherweise unterdrücken möchten)
@lindsey Hier gibt es eine Produktfrage: Wann sollten wir eine Benachrichtigung unterdrücken?
Ich bin mir nicht sicher. Ist das nicht eine Antwortbenachrichtigung in meinem Video? Und trotzdem gibt es noch eine Benachrichtigung über das Zitat und den Link danach. Das auf andere Benachrichtigungstypen auszudehnen, hilft hier also möglicherweise nicht. Aber vielleicht deckt es andere Grenzfälle ab.
Ich frage mich, ob das Problem in meiner Reproduktion die Benachrichtigung „2 Antworten“ ist. Macht das die Überprüfung auf vorhandene Benachrichtigungen durch diese Antwort kaputt, wenn die Antwort bearbeitet wird?
Im Allgemeinen würde ich bei einer Bearbeitung keine zusätzliche Benachrichtigung erwarten, wenn alle Auslöser bereits im Beitrag vorhanden waren, als ich ihn gelesen habe. Die Korrektur eines Tippfehlers, der nichts mit Erwähnung/Link/Zitat zu tun hat, sollte nicht zu einer neuen Benachrichtigung führen.
Ich denke, falls ein Auslöser ersetzt wird, würde ich es vorziehen, wenn die vorhandene, ungelesene Benachrichtigung geändert (oder ersetzt) wird, anstatt eine zweite zu erhalten. Das Entfernen der @Erwähnung in einem Beitrag eines Benutzers, um Lärm zu vermeiden, sollte nicht zu einer zweiten Benachrichtigung über das Zitat führen. Ich würde erwarten, dass die Benachrichtigung über die @Erwähnung verschwindet.
Ich denke, der einzige Fall, in dem ich eine neue Benachrichtigung wünschen würde, ist, wenn eine Bearbeitung einen wichtigeren Benachrichtigungstyp hinzufügt. Wenn also jemand meinen Beitrag verlinkt und später eine Bearbeitung hinzufügt, die mich @erwähnt, ist es sinnvoll, mir dies mitzuteilen, da sie scheinbar nicht mehr über etwas sprechen, das ich geschrieben habe, sondern direkt mit mir. Da eine Bearbeitung das Thema nicht mehr nach oben bringt, könnten @Erwähnungen eine hilfreiche Möglichkeit sein, Benutzer auf Bearbeitungen aufmerksam zu machen.
Ich denke, Moin beschreibt das Ideal aus Benutzersicht, aber ich glaube, wir hätten Schwierigkeiten, diesen Teil richtig hinzubekommen:
Vielleicht könnten wir das für In-App-Benachrichtigungen schaffen, aber wir können Push-Benachrichtigungen oder E-Mail-Benachrichtigungen nicht zurücksenden. (Im Allgemeinen bin ich zögerlich, Benachrichtigungen mehr Komplexität hinzuzufügen, daher würde ich es vorziehen, darauf zu verzichten, auch wenn einige damit einverstanden wären, dass In-App und E-Mail/Push für die Benachrichtigung unterschiedlich sind.)
Dem stimme ich jedoch zu:
Wenn ein Beitrag einen Benutzer benachrichtigen soll (z. B. der Beitragsautor zitiert Benutzer A), benachrichtigen Sie den/die entsprechenden Benutzer (z. B. Benutzer A erhält eine Benachrichtigung, dass er zitiert wurde).
Wenn eine Bearbeitung dieses Beitrags nicht ändert, wer benachrichtigt werden sollte oder warum (z. B. der Beitragsautor bearbeitet einen Tippfehler), benachrichtigen Sie niemanden.
Wenn eine Bearbeitung dieses Beitrags ändert, wer benachrichtigt werden sollte (z. B. der Beitragsautor erwähnt Benutzer B) oder warum (z. B. der Beitragsautor erwähnt Benutzer A), benachrichtigen Sie den/die betroffenen Benutzer (z. B. Benutzer B erhält eine Erwähnungsbenachrichtigung, Benutzer A erhält eine Erwähnungsbenachrichtigung).
Ja, ich werde meinen PR hier schließen und dies als ein Feature bezeichnen.
Insbesondere gibt es hier eine Lücke:
@Moin möchte … alte Benachrichtigung aktualisiert haben
@lindsey möchte … neue Benachrichtigungen für neue Informationen, die in den Beitrag eingefügt wurden
Eine vollständige Abstimmung hier erfordert eine ziemlich komplexe Nachverfolgung… Ich bewerte gerade den Umfang der Änderung, aber ehrlich gesagt ist es im Moment wahrscheinlich am einfachsten, einfach nichts zu tun, da die Änderung sehr fragil sein wird.
Das Extrahieren, welche Erwähnungen neu und welche alt sind, erfordert entweder einen Parser (wir parsen zu diesem Zeitpunkt nicht) oder ein fragiles Regex.
Ich verschiebe dies in die Features @Moin und schließe meinen PR vorerst.
Vor allem möchte ich keine weitere Benachrichtigung erhalten, wenn sich am Beitrag nichts geändert hat, was eine Benachrichtigung verursachen würde. Die Korrektur eines Tippfehlers sollte mich nicht benachrichtigen, wenn ich bereits benachrichtigt wurde, nur weil zuvor 2 Benachrichtigungen zum selben Thema zusammengefasst wurden. Und das ist mir jahrelang nie aufgefallen, bis es im Dezember passierte.
Ich habe ChatGPT gebeten, eine Zusammenfassung dessen zu schreiben, was es mir zu diesem Problem mitgeteilt hat, als ich versuchte, Reproduktionsschritte basierend auf dem Code zu finden.
Zusammenfassung: Warum doppelte Benachrichtigungen normalerweise verhindert werden und warum es hier fehlschlägtKI
Kernproblem
Die Vermeidung von Duplikaten stützt sich auf das Auffinden einer Antwortbenachrichtigung, die noch auf den bearbeiteten Beitrag beschränkt ist, aber Antwortbenachrichtigungen werden zusammengefasst, zerstört oder einem anderen Beitrag zugeordnet.
Infolgedessen kann die Unterdrückung zum Zeitpunkt der Bearbeitung nicht zuverlässig erkennen, dass der Benutzer bereits über die Antwort benachrichtigt wurde.
Doppelte Benachrichtigungen werden in PostAlerter verhindert durch:
Verfolgung von Benutzern, die bereits bei der Beitragserstellung benachrichtigt wurden
notified = []
Unterdrücken sekundärer Auslöser, wenn eine Antwortbenachrichtigung existiert
if [:quoted, :linked, :mentioned, :chat_quoted].include?(type)
return if existing_notifications.find { |n|
n.notification_type == Notification.types[:replied]
}
end
Dies soll vermeiden, dass ein Benutzer zweimal über denselben Beitrag benachrichtigt wird.
Zusammenfassen von Antwortbenachrichtigungen
Antwortbenachrichtigungen (:replied) werden pro Thema zusammengefasst:
Die überlebende Benachrichtigung wird erneut angehängt an:
post = first_unread_post(user, topic)
sodass die Benachrichtigung nicht mehr den Beitrag darstellt, der sie ursprünglich ausgelöst hat. Infolgedessen kann die Unterdrückungslogik, die auf dem Abgleich von post_number beruht, frühere Benachrichtigungen für bearbeitete Beiträge nicht zuverlässig erkennen.
Warum dies im Reproduktionsfall fehlschlägt
Im Reproduktionsfall:
Der Benutzer wird zunächst über die Antwort benachrichtigt
Wenn mehrere Antworten existieren, werden Antwortbenachrichtigungen zusammengefasst
Die zusammengefasste Benachrichtigung:
existiert möglicherweise nicht mehr für den bearbeiteten Beitrag, oder
existiert mit einer anderen post_number
Bei der Bearbeitung:
Die Antwortlogik wird nicht ausgeführt (new_record == false)
Die Unterdrückungsprüfung sucht nur nach einer beitragsspezifischen :replied-Benachrichtigung
Es wird keine gefunden → Die Unterdrückung schlägt fehl
Die Zitat-/Link-Erkennung läuft erneut und erstellt neue Benachrichtigungen
Aus Sicht des Benutzers:
„Ich wurde bereits über diese Antwort benachrichtigt.“
Aus Sicht des Codes:
„Es gibt keine vorhandene Benachrichtigung für diesen Beitrag.“
Wenn ich ein Thema erstelle, in dem ich meinen Testbenutzer in einer öffentlichen Kategorie erwähne, und es nach ein paar Minuten in eine private Kategorie verschiebe, wird die Benachrichtigung auch aus der Oberfläche entfernt – obwohl er eine E-Mail über die @Erwähnung erhalten hat.
In-App-Benachrichtigungen, die gelöscht werden, obwohl eine E-Mail gesendet wurde, existieren also bereits.