Recebendo múltiplas notificações sobre a mesma resposta

A primeira vez que notei uma segunda notificação para a mesma resposta sem que um link, citação ou menção fossem adicionados na edição foi após a edição em Topics from some categories do not appear on /latest - #36 by JammyDodger. Este caso é ligeiramente diferente das minhas etapas de reprodução abaixo, mas acho que o problema subjacente é o mesmo.

A segunda postagem onde isso aconteceu foi em Messages section for sidebar - #13 by nathank. Foi semelhante: a edição não adicionou nada que resultasse em uma notificação — as citações já estavam lá antes — e ainda assim fui notificado uma segunda vez.

Aqui estão as etapas para reproduzir que encontrei e que funcionaram [1]

Você precisa de 3 usuários: OP, notifiedUser, spammer

  1. OP cria um tópico
  2. notifiedUser responde
  3. OP responde à postagem de notified user
    notifiedUser é notificado sobre a resposta (esperado)
  4. spammer responde à postagem de notifiedUser. A resposta contém um link para outra postagem de notifiedUser e uma citação da postagem à qual você está respondendo. (opcional: você também pode @mencionar notifiedUser)
    notifiedUser é notificado sobre a resposta (esperado)
    [Caso você tenha adicionado uma @menção, a notificação é sobre a @menção (esperado)]
  5. notifiedUser lê as novas respostas para marcar as notificações como lidas e navega de volta para outro lugar para que não percamos uma notificação.
  6. spammer edita a resposta e corrige um erro de digitação (ou adiciona edit1)
    notifiedUser é notificado sobre ser citado (inesperado, eles já foram notificados sobre esta resposta antes e a citação já estava lá, não há necessidade de avisá-los)
  7. spammer edita a resposta novamente para corrigir outro erro de digitação (ou adiciona edit2)
    notifiedUser é notificado sobre ser linkado (inesperado, eles já foram notificados sobre esta resposta antes e o link já estava lá, não há necessidade de avisá-los)

O vídeo mostra apenas as etapas finais 5-7. Spammer à esquerda, notifiedUser à direita


  1. pelo menos na maioria das vezes, às vezes até adicionar uma @menção na edição não aciona uma nova notificação ↩︎

3 curtidas

Em post_alerter.rb

Mude as linhas 589-599 de:
 # linked, quoted, mentioned, chat_quoted podem ser suprimidos se você já tiver uma notificação de resposta
 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

 Para:
 # linked, quoted, mentioned, chat_quoted podem ser suprimidos se você já tiver qualquer notificação sobre esta
 postagem
 if [
      Notification.types[:quoted],
      Notification.types[:linked],
      Notification.types[:mentioned],
      Notification.types[:chat_quoted],
    ].include?(type)
   return if existing_notifications.any?
 end

Isso funcionará, mas estou um pouco preocupado porque há outras notificações que podem passar despercebidas aqui. (notificações de plugins, por exemplo, que talvez queiramos suprimir)

@lindsey, há uma questão de produto aqui: quando devemos suprimir uma notificação?

Acho que a pequena correção é um passo à frente?

Não tenho certeza. Isso não é uma notificação de resposta no meu vídeo? E, no entanto, ainda há uma notificação sobre a citação e o link depois. Portanto, estender isso para outros tipos de notificação pode não ajudar aqui. Mas talvez cubra outros casos extremos.
Será que o problema na minha reprodução é a notificação de “2 respostas”? Isso quebra a verificação de notificações existentes por aquela resposta quando a resposta é editada?

Em geral, eu esperaria nenhuma notificação adicional por causa de uma edição se todos os gatilhos já estivessem na postagem quando eu a li antes. Corrigir um erro de digitação não relacionado a menção/link/citação não deveria resultar em uma nova notificação.
Acho que, no caso de um gatilho ser substituído, eu preferiria que a notificação existente e não lida fosse alterada (ou substituída) em vez de receber uma segunda. Remover a @menção na postagem de um usuário para evitar ruído não deveria resultar em uma segunda notificação sobre a citação. Eu esperaria que a notificação sobre a @menção desaparecesse.
Acho que o único caso em que eu gostaria de uma nova notificação é se uma edição adicionasse um tipo de notificação mais importante. Então, quando alguém linkou minha postagem e mais tarde adiciona uma edição que me @menciona, faz sentido me avisar porque eles parecem não estar mais falando sobre algo que escrevi, mas diretamente comigo. Como uma edição não eleva mais o tópico, as @menções podem ser uma maneira útil de alertar os usuários sobre edições.

Acho que Moin descreve o ideal da perspectiva do usuário, mas acho que teríamos dificuldade em acertar esta parte:

Talvez possamos gerenciar isso para notificações no aplicativo, mas não podemos cancelar o envio de notificações push ou notificações por e-mail. (Em geral, sou hesitante em adicionar mais complexidade às notificações, então, embora alguns possam se contentar com notificações diferentes no aplicativo e por e-mail/push, eu preferiria que evitássemos isso.)

Concordo com isto, no entanto:

  • Se uma postagem deve notificar um usuário (por exemplo, o autor da postagem cita o Usuário A), notifique o(s) usuário(s) relevante(s) (por exemplo, o Usuário A recebe uma notificação de que foi citado).
  • Se uma edição nessa postagem não alterar quem deve ser notificado ou por quê (por exemplo, o autor da postagem edita um erro de digitação), não notifique ninguém.
  • Se uma edição nessa postagem alterar quem deve ser notificado (por exemplo, o autor da postagem menciona o Usuário B) ou por quê (por exemplo, o autor da postagem menciona o Usuário A), notifique o(s) usuário(s) impactado(s) (por exemplo, o Usuário B recebe uma notificação de menção, o Usuário A recebe uma notificação de menção).

@moin isso parece correto para você?

1 curtida

Sim, vou fechar meu PR aqui e chamar isso de funcionalidade.

Particularmente, há uma lacuna aqui:

  • @Moin gostaria que… a notificação antiga fosse atualizada
  • @lindsey gostaria de… novas notificações para novas informações editadas na postagem

O alinhamento completo aqui exige um rastreamento bem complexo… Estou avaliando o tamanho da mudança, mas, para ser sincero, não fazer nada por enquanto é provavelmente o mais fácil, pois a mudança acabará sendo muito frágil.

Extrair quais menções são novas e quais são antigas é algo que exigirá um analisador (nós não analisamos nesse ponto) ou uma expressão regular frágil.

Movendo isso para funcionalidade @Moin e fechando meu PR por enquanto.

Acima de tudo, não quero receber outra notificação se nada mudou na postagem que justificasse uma notificação. Corrigir um erro de digitação não deve me notificar se eu já fui notificado apenas porque 2 notificações sobre o mesmo tópico foram colapsadas antes. E eu nunca percebi isso por anos até que aconteceu em dezembro.

Pedi ao ChatGPT para escrever um resumo do que ele me disse sobre esse problema, quando tentei encontrar etapas de reprodução com base no código

Resumo: Por que as notificações duplicadas são normalmente evitadas e por que falha aqui IA

Problema central

A prevenção de duplicatas depende de encontrar uma notificação de resposta que ainda esteja escopada para a postagem editada, mas as notificações de resposta são colapsadas, destruídas ou reanexadas a uma postagem diferente.
Como resultado, a supressão no momento da edição não consegue detectar de forma confiável que o usuário já foi notificado sobre a resposta.


As notificações duplicadas são evitadas em PostAlerter por:

  1. Rastreamento de usuários já notificados durante a criação da postagem
notified = []
  1. Supressão de gatilhos secundários se uma notificação de resposta existir
if [:quoted, :linked, :mentioned, :chat_quoted].include?(type)
  return if existing_notifications.find { |n|
    n.notification_type == Notification.types[:replied]
  }
end

Isso visa evitar notificar um usuário duas vezes sobre a mesma postagem.

  1. Colapso das notificações de resposta
    Notificações de resposta (:replied) são colapsadas por tópico:
destroy_notifications(user, COLLAPSED_NOTIFICATION_TYPES, topic)

A notificação sobrevivente é reanexada a:

post = first_unread_post(user, topic)

para que a notificação não represente mais a postagem que a acionou originalmente. Como resultado, a lógica de supressão que depende da correspondência de post_number não consegue detectar notificações anteriores para postagens editadas.


Por que isso falha no caso de reprodução

Na reprodução:

  • O usuário é notificado sobre a resposta inicialmente
  • Quando várias respostas existem, as notificações de resposta são colapsadas
  • A notificação colapsada:
    • pode não existir mais para a postagem editada, ou
    • existe com um post_number diferente
  • Na edição:
    • a lógica de resposta não é executada (new_record == false)
    • a verificação de supressão procura apenas uma notificação :replied com escopo de postagem
    • nenhuma é encontrada → a supressão falha
  • A detecção de citação/link é executada novamente e cria novas notificações

Da perspectiva do usuário:

“Eu já fui notificado sobre esta resposta.”

Da perspectiva do código:

“Não há notificação existente para esta postagem.”

Ambos estão corretos.

Quando crio um tópico mencionando meu usuário de teste em uma categoria pública e o movo para uma categoria privada após alguns minutos, a notificação também é removida da interface - mesmo que eles tenham recebido um e-mail sobre a @menção.
Portanto, notificações no aplicativo que são excluídas, mesmo que um e-mail tenha sido enviado, já existem.

Ainda parece um erro que quando o mcwumbly adiciona uma tag ao tópico dele (topic), eu receba uma nova notificação de que minha postagem foi linkada. O link já estava lá quando ele postou o tópico, e eu fui notificado sobre a citação. Nada mudou além da tag. Então, por que é esperado que uma edição acione uma segunda notificação?

Além das etapas na primeira postagem, isso também acontece com as seguintes etapas:

  1. notifiedUser cria um tópico
  2. spammer responde como um tópico linkado. A postagem contém um link por padrão, então você só precisa adicionar a menção (@) e a citação.
    notifiedUser é notificado sobre a menção (@) (esperado) e lê o tópico
  3. spammer adiciona uma tag ao tópico
    notifiedUser é notificado sobre ser citado na postagem (inesperado, eles já foram notificados e nada mudou)
  4. spammer edita o título do tópico
    notifiedUser é notificado sobre ser linkado na postagem (inesperado, eles já foram notificados antes, e a postagem ainda não mudou)

1 curtida