Recibiendo múltiples notificaciones sobre la misma respuesta

La primera vez que noté una segunda notificación para la misma respuesta sin que se agregara ningún enlace, cita o mención en la edición fue después de la edición en Topics from some categories do not appear on /latest - #36 by JammyDodger. Este caso es ligeramente diferente a mis pasos de reproducción a continuación, pero creo que el problema subyacente es el mismo.

La segunda publicación donde sucedió esto fue en Messages section for sidebar - #13 by nathank. Fue similar: la edición no agregó nada que resultara en una notificación; las citas ya estaban allí antes, y aun así fui notificado por segunda vez.

Aquí están los pasos para reproducir que encontré y que funcionaron [1]

Necesitas 3 usuarios: OP, notifiedUser, spammer

  1. OP crea un tema
  2. notifiedUser responde
  3. OP responde a la publicación de notified user
    notifiedUser es notificado sobre la respuesta (esperado)
  4. spammer responde a la publicación de notifiedUser. La respuesta contiene un enlace a otra publicación de notifiedUser y una cita de la publicación a la que se responde. (opcional: también puedes @mencionar a notifiedUser)
    notifiedUser es notificado sobre la respuesta (esperado)
    [En caso de que hayas agregado una @mención, la notificación es sobre la @mención (esperado)]
  5. notifiedUser lee las nuevas respuestas para marcar las notificaciones como leídas y navega de vuelta a otro lugar para que no perdamos una notificación.
  6. spammer edita la respuesta y corrige un error tipográfico (o agrega edit1)
    notifiedUser es notificado sobre ser citado (inesperado, ya fueron notificados sobre esta respuesta antes y la cita ya estaba allí, no hay necesidad de decírselo)
  7. spammer edita la respuesta de nuevo para corregir otro error tipográfico (o agrega edit2)
    notifiedUser es notificado sobre ser enlazado (inesperado, ya fueron notificados sobre esta respuesta antes y el enlace ya estaba allí, no hay necesidad de decírselo)

El video solo muestra los pasos finales 5-7. Spammer está a la izquierda, notifiedUser a la derecha


  1. al menos la mayor parte del tiempo, a veces incluso agregar una @mención en la edición no activa una nueva notificación ↩︎

3 Me gusta

En post_alerter.rb

Cambia las líneas 589-599 de:
 # 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

 A:
 # 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

Esto funcionará, pero me preocupa un poco porque hay otras notificaciones que pueden pasar por aquí. (notificaciones de plugins, por ejemplo, que quizás queramos suprimir)

@lindsey aquí hay una pregunta de producto: ¿cuándo deberíamos suprimir una notificación?

¿Supongo que la pequeña corrección es un paso adelante?

No estoy seguro. ¿No es esa una notificación de respuesta en mi video? Y, sin embargo, todavía hay una notificación sobre la cita y el enlace después. Por lo tanto, extender eso a otros tipos de notificaciones podría no ayudar aquí. Pero tal vez cubra otros casos extremos.
Me pregunto si el problema en mi reproducción es la notificación de “2 respuestas”. ¿Eso rompe la verificación de notificaciones existentes por esa respuesta cuando se edita la respuesta?

En general, esperaría que no hubiera notificaciones adicionales debido a una edición si todos los desencadenantes ya estuvieran en la publicación cuando la leí antes. Corregir una errata no relacionada con una mención/enlace/cita no debería generar una nueva notificación.
Creo que, en caso de que se reemplace un desencadenante, preferiría que la notificación existente y no leída se cambie (o se reemplace) en lugar de recibir una segunda. Eliminar la @mención en la publicación de un usuario para evitar ruido no debería resultar en una segunda notificación sobre la cita. Esperaría que la notificación sobre la @mención desapareciera.
Creo que el único caso en el que querría una nueva notificación es si una edición agrega un tipo de notificación más importante. Entonces, cuando alguien enlaza mi publicación y más tarde agrega una edición que me menciona (@menciona), tiene sentido avisarme porque ya no parecen estar hablando de algo que escribí, sino directamente a mí. Dado que una edición ya no impulsa el tema, las @menciones podrían ser una forma útil de alertar a los usuarios sobre las ediciones.

Creo que Moin describe lo ideal desde la perspectiva del usuario, pero creo que nos costaría acertar en esta parte:

Quizás podamos gestionar eso para las notificaciones dentro de la aplicación, pero no podemos retirar las notificaciones push o por correo electrónico. (En general, soy reacio a añadir más complejidad a las notificaciones, así que aunque a algunos no les importe que la notificación dentro de la aplicación y la de correo electrónico/push sean diferentes, preferiría que renunciáramos a esto).

Sin embargo, estoy de acuerdo con esto:

  • Si una publicación debe notificar a un usuario (por ejemplo, el autor de la publicación cita al Usuario A), notifique al usuario o usuarios relevantes (por ejemplo, el Usuario A recibe una notificación de que ha sido citado).
  • Si una edición de esa publicación no cambia a quién se debe notificar o por qué (por ejemplo, el autor de la publicación edita un error tipográfico), no notifique a nadie.
  • Si una edición de esa publicación sí cambia a quién se debe notificar (por ejemplo, el autor de la publicación menciona al Usuario B) o por qué (por ejemplo, el autor de la publicación menciona al Usuario A), notifique al usuario o usuarios afectados (por ejemplo, el Usuario B recibe una notificación de mención, el Usuario A recibe una notificación de mención).

@moin ¿te parece correcto?

1 me gusta

Sí, voy a cerrar mi PR aquí y llamarlo una característica.

Particularmente hay una brecha aquí:

  • @Moin le gustaría… que la notificación antigua se actualice
  • @lindsey le gustaría… nuevas notificaciones para información nueva editada en la publicación

La alineación completa aquí requiere un seguimiento bastante complejo… Estoy evaluando el tamaño del cambio, pero para ser honesto, no hacer nada por ahora es probablemente lo más fácil, porque el cambio terminará siendo muy frágil.

Extraer qué menciones son nuevas y cuáles son antiguas es algo que va a requerir o un analizador (no analizamos en ese punto) o una expresión regular frágil.

Moviendo esto a característica @Moin y cerrando mi PR por ahora.

Sobre todo, no quiero recibir otra notificación si no ha cambiado nada en la publicación que justifique una notificación. Corregir un error tipográfico no debería notificarme si ya he recibido una notificación solo porque se colapsaron 2 notificaciones sobre el mismo tema antes. Y nunca me di cuenta de esto durante años hasta que sucedió en diciembre.

Le pedí a ChatGPT que escribiera un resumen de lo que me dijo sobre este problema, cuando intenté encontrar pasos de reproducción basados en el código

Resumen: Por qué normalmente se evitan las notificaciones duplicadas y por qué falla aquí IA

Problema principal

La prevención de duplicados se basa en encontrar una notificación de respuesta que todavía esté acotada a la publicación editada, pero las notificaciones de respuesta se colapsan, destruyen o se vuelven a adjuntar a una publicación diferente.
Como resultado, la supresión en el momento de la edición no puede detectar de manera confiable que el usuario ya fue notificado sobre la respuesta.


Las notificaciones duplicadas se evitan en PostAlerter mediante:

  1. Rastrear a los usuarios ya notificados durante la creación de la publicación
notified = []
  1. Suprimir desencadenantes secundarios si existe una notificación de respuesta
if [:quoted, :linked, :mentioned, :chat_quoted].include?(type)
  return if existing_notifications.find { |n|
    n.notification_type == Notification.types[:replied]
  }
end

Esto tiene como objetivo evitar notificar a un usuario dos veces sobre la misma publicación.

  1. Colapsar notificaciones de respuesta
    Las notificaciones de respuesta (:replied) se colapsan por tema:
destroy_notifications(user, COLLAPSED_NOTIFICATION_TYPES, topic)

La notificación superviviente se vuelve a adjuntar a:

post = first_unread_post(user, topic)

por lo que la notificación ya no representa la publicación que la desencadenó originalmente. Como resultado, la lógica de supresión que depende de hacer coincidir post_number no puede detectar de manera confiable las notificaciones previas para las publicaciones editadas.


Por qué esto falla en el caso de reproducción

En el caso de reproducción:

  • Al usuario se le notifica sobre la respuesta inicialmente
  • Cuando existen varias respuestas, las notificaciones de respuesta se colapsan
  • La notificación colapsada:
    • puede que ya no exista para la publicación editada, o
    • existe con un post_number diferente
  • En la edición:
    • la lógica de respuesta no se ejecuta (new_record == false)
    • la comprobación de supresión solo busca una notificación :replied acotada a la publicación
    • no se encuentra ninguna → la supresión falla
  • La detección de citas/enlaces se ejecuta de nuevo y crea nuevas notificaciones

Desde la perspectiva del usuario:

“Ya me notificaron sobre esta respuesta.”

Desde la perspectiva del código:

“No existe ninguna notificación existente para esta publicación.”

Ambos son ciertos.

Cuando creo un tema mencionando a mi usuario de prueba en una categoría pública y lo muevo a una categoría privada después de unos minutos, la notificación también se elimina de la interfaz, aunque hayan recibido un correo electrónico sobre la @mención.
Así que las notificaciones dentro de la aplicación que se eliminan, a pesar de que se envió un correo electrónico, ya existen.

Todavía me parece un error que cuando mcwumbly añade una etiqueta a su tema, reciba una nueva notificación de que mi publicación fue enlazada. El enlace ya estaba allí cuando publicó el tema, y fui notificado de la cita. Nada ha cambiado aparte de la etiqueta. Entonces, ¿por qué se espera que una edición active una segunda notificación?

Además de los pasos en la primera publicación, también sucede con estos pasos:

  1. notifiedUser crea un tema
  2. El spammer responde como un tema enlazado. La publicación contiene un enlace por defecto, por lo que solo necesita añadir la mención (@) y la cita.
    notifiedUser es notificado sobre la mención (@) (esperado) y lee el tema
  3. El spammer añade una etiqueta al tema
    notifiedUser es notificado sobre ser citado en la publicación (inesperado, ya fue notificado y nada ha cambiado)
  4. El spammer edita el título del tema
    notifiedUser es notificado sobre ser enlazado en la publicación (inesperado, ya fue notificado antes y la publicación sigue sin cambiar)

2 Me gusta