La première fois que j’ai remarqué une deuxième notification pour la même réponse sans qu’aucun lien, citation ou mention n’ait été ajouté lors de la modification, c’était après la modification sur Topics from some categories do not appear on /latest - #36 by JammyDodger. Ce cas est légèrement différent de mes étapes de reproduction ci-dessous, mais je pense que le problème sous-jacent est le même.
Le deuxième message où cela s’est produit était sur Messages section for sidebar - #13 by nathank. C’était similaire : la modification n’a rien ajouté qui entraînerait une notification - les citations étaient toutes deux présentes auparavant - et pourtant, j’ai été notifié une deuxième fois.
Voici les étapes pour reproduire que j’ai trouvées et qui ont fonctionné [1]
Vous avez besoin de 3 utilisateurs : OP, notifiedUser, spammer
OP crée un sujet
notifiedUser répond
OP répond au message de notified user notifiedUser est notifié de la réponse (attendu)
spammer répond au message de notifiedUser. La réponse contient un lien vers un autre message de notifiedUser et une citation du message auquel vous répondez. (facultatif : vous pouvez également @mention notifiedUser) notifiedUser est notifié de la réponse (attendu) [Si vous avez ajouté une @mention, la notification concerne la @mention (attendu)]
notifiedUser lit les nouvelles réponses pour marquer les notifications comme lues et navigue ailleurs afin que nous ne manquions pas une notification.
spammer modifie la réponse et corrige une faute de frappe (ou ajoute edit1) notifiedUser est notifié d’être cité (inattendu, ils ont déjà été notifiés de cette réponse et la citation était déjà là, pas besoin de leur dire)
spammer modifie à nouveau la réponse pour corriger une autre faute de frappe (ou ajoute edit2) notifiedUser est notifié d’être lié (inattendu, ils ont déjà été notifiés de cette réponse et le lien était déjà là, pas besoin de leur dire)
La vidéo ne montre que les étapes finales 5 à 7. Spammer est à gauche, notifiedUser à droite
au moins la plupart du temps, parfois même l’ajout d’une @mention lors de la modification ne déclenche pas de nouvelle notification ↩︎
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
Cela fonctionnera, mais je m’inquiète un peu car il y a d’autres notifications qui pourraient passer ici. (les notifications des plugins par exemple, que nous pourrions vouloir supprimer)
@lindsey il y a une question de produit ici, quand devrions-nous supprimer une notification ?
Je suppose que le petit correctif est un pas en avant ?
Je ne suis pas sûr. N’est-ce pas une notification de réponse dans ma vidéo ? Et pourtant, il y a toujours une notification concernant la citation et le lien ensuite. Donc, étendre cela à d’autres types de notifications pourrait ne pas aider ici. Mais peut-être que cela couvre d’autres cas limites.
Je me demande si le problème dans ma reproduction est la notification “2 réponses”. Cela casse-t-il la vérification des notifications existantes par cette réponse lorsque la réponse est modifiée ?
En général, je m’attendrais à ce qu’il n’y ait pas de notification supplémentaire à cause d’une modification si tous les déclencheurs étaient déjà présents dans le message lorsque je l’ai lu auparavant. La correction d’une faute de frappe sans rapport avec une mention/@mention, un lien ou une citation ne devrait pas entraîner une nouvelle notification.
Je pense qu’en cas de remplacement d’un déclencheur, je préférerais que la notification existante et non lue soit modifiée (ou remplacée) plutôt que d’en recevoir une seconde. Supprimer la @mention dans le message d’un utilisateur pour éviter le bruit ne devrait pas entraîner une seconde notification concernant la citation. Je m’attendrais à ce que la notification concernant la @mention disparaisse.
Je pense que le seul cas où je voudrais une nouvelle notification est si une modification ajoute un type de notification plus important. Donc, si quelqu’un a cité mon message et ajoute ensuite une modification qui me @mentionne, il est logique de me le signaler car il semble ne plus parler de quelque chose que j’ai écrit, mais directement à moi. Puisqu’une modification ne fait plus remonter le sujet, les @mentions pourraient être un moyen utile d’alerter les utilisateurs sur les modifications.
Je pense que Moin décrit l’idéal du point de vue de l’utilisateur, mais je pense que nous aurions du mal à bien gérer cette partie :
Peut-être pourrions-nous gérer cela pour les notifications dans l’application, mais nous ne pouvons pas annuler l’envoi de notifications push ou d’e-mails. (En général, j’hésite à ajouter plus de complexité aux notifications, donc même si certains pourraient accepter que la notification dans l’application et celle par e-mail/push soient différentes, je préférerais que nous nous en passions.)
Cependant, je suis d’accord avec ceci :
Si un message doit notifier un utilisateur (par exemple, l’auteur du message cite l’utilisateur A), notifier l’utilisateur(s) concerné(s) (par exemple, l’utilisateur A reçoit une notification qu’il a été cité).
Si une modification de ce message ne change pas qui doit être notifié ou pourquoi (par exemple, l’auteur du message corrige une faute de frappe), ne notifier personne.
Si une modification de ce message change qui doit être notifié (par exemple, l’auteur du message mentionne l’utilisateur B) ou pourquoi (par exemple, l’auteur du message mentionne l’utilisateur A), notifier l’utilisateur(s) impacté(s) (par exemple, l’utilisateur B reçoit une notification de mention, l’utilisateur A reçoit une notification de mention).
Oui, je vais fermer ma demande de tirage (PR) ici et qualifier cela de fonctionnalité.
Il y a particulièrement une lacune ici :
@Moin aimerait… que l’ancienne notification soit mise à jour
@lindsey aimerait… de nouvelles notifications pour les nouvelles informations modifiées dans la publication
Un alignement complet ici nécessiterait un suivi assez complexe… J’évalue la taille du changement, mais honnêtement, ne rien faire pour l’instant est probablement le plus simple, car le changement finira par être très fragile.
Extraire quelles mentions sont nouvelles et lesquelles sont anciennes va nécessiter soit un analyseur (nous n’analysons pas à ce stade), soit une expression régulière fragile.
Je déplace ceci vers la fonctionnalité @Moin et je ferme ma PR pour l’instant.
Par-dessus tout, je ne veux plus recevoir de notification si rien n’a changé dans la publication qui justifierait une notification. Corriger une coquille ne devrait pas me notifier si j’ai déjà été notifié simplement parce que 2 notifications concernant le même sujet ont été regroupées auparavant. Et je n’ai jamais remarqué cela pendant des années jusqu’à ce que cela se produise en décembre.
J’ai demandé à ChatGPT de rédiger un résumé de ce qu’il m’a dit à propos de ce problème, lorsque j’ai essayé de trouver des étapes de reproduction basées sur le code
Résumé : Pourquoi les notifications en double sont normalement empêchées, et pourquoi cela échoue iciIA
Problème principal
La prévention des doublons repose sur la recherche d’une notification de réponse qui est toujours liée à la publication modifiée, mais les notifications de réponse sont regroupées, détruites ou rattachées à une publication différente.
Par conséquent, la suppression au moment de l’édition ne peut pas détecter de manière fiable que l’utilisateur a déjà été notifié de la réponse.
Les notifications en double sont empêchées dans PostAlerter par :
Le suivi des utilisateurs déjà notifiés lors de la création de la publication
notified = []
La suppression des déclencheurs secondaires si une notification de réponse existe
if [:quoted, :linked, :mentioned, :chat_quoted].include?(type)
return if existing_notifications.find { |n|
n.notification_type == Notification.types[:replied]
}
end
Ceci est destiné à éviter de notifier un utilisateur deux fois pour la même publication.
Le regroupement des notifications de réponse
Les notifications de réponse (:replied) sont regroupées par sujet :
de sorte que la notification ne représente plus la publication qui l’a déclenchée à l’origine. Par conséquent, la logique de suppression qui repose sur la correspondance de post_number ne peut pas détecter de manière fiable les notifications antérieures pour les publications modifiées.
Pourquoi cela échoue dans le cas de reproduction
Dans le cas de reproduction :
L’utilisateur est notifié de la réponse initialement
Lorsque plusieurs réponses existent, les notifications de réponse sont regroupées
La notification regroupée :
peut ne plus exister pour la publication modifiée, ou
existe avec un post_number différent
Lors de la modification :
la logique de réponse ne s’exécute pas (new_record == false)
la vérification de suppression ne recherche qu’une notification :replied liée à la publication
aucune n’est trouvée → la suppression échoue
La détection de citation/lien s’exécute à nouveau et crée de nouvelles notifications
Du point de vue de l’utilisateur :
« J’ai déjà été notifié de cette réponse. »
Du point de vue du code :
« Il n’y a pas de notification existante pour cette publication. »
Lorsque je crée un sujet mentionnant mon utilisateur de test dans une catégorie publique et que je le déplace vers une catégorie privée après quelques minutes, la notification est également supprimée de l’interface - même s’ils ont reçu un e-mail concernant la @mention.
Donc, des notifications dans l’application qui sont supprimées, même si un e-mail a été envoyé, existent déjà.
J’ai toujours l’impression que c’est un bogue lorsque mcwumbly ajoute une étiquette à son sujet, je reçois une nouvelle notification indiquant que mon message a été lié. Le lien était déjà présent lorsqu’il a publié le sujet, et j’ai été notifié de la citation. Rien n’a changé à part l’étiquette. Alors, pourquoi s’attend-on à ce qu’une modification déclenche une deuxième notification ?
En plus des étapes du premier message, cela se produit également avec les étapes suivantes :
notifiedUser crée un sujet
Un spammeur répond en tant que sujet lié. Le message contient un lien par défaut, vous n’avez donc qu’à ajouter la mention @ et la citation.
-> notifiedUser est notifié de la mention @ (attendu) et lit le sujet
Le spammeur ajoute une étiquette au sujet
-> notifiedUser est notifié d’avoir été cité dans le message (inattendu, il a déjà été notifié et rien n’a changé)
Le spammeur modifie le titre du sujet
-> notifiedUser est notifié d’avoir été lié dans le message (inattendu, il a déjà été notifié, et le message n’a toujours pas changé)