Empecé a echar un vistazo a este código, pero creo que un gran problema está en torno a las “expectativas”
- ¿Se trata de notificaciones push? (si es así, ¿estás usando PWA o la aplicación Discourse Hub?)
- Cuando la gente dice “no ser notificada”, ¿quieren decir “no ser notificada sobre menciones en una notificación push”?
- ¿Es la expectativa ser notificado sobre una @mención a través de una notificación push cuando ya estás en línea?
Hay una gran familia de lo que yo consideraría problemas conocidos que podemos mejorar.
- En PWA, si intentamos enviar 3 veces en 24 horas y fallamos (debido a la conectividad con el distribuidor de mensajes o cualquier otra cosa), eliminaremos las suscripciones y no alertaremos al usuario sobre nada.
- En Hub, las notificaciones push solo están disponibles para los clientes alojados en Discourse.
- Hay algunos problemas de secuenciación por los cuales una notificación puede perderse en la edición de un mensaje de chat porque generamos una notificación push dentro de una transacción.
- Tenemos un “Debounce” de 1 minuto que es configurable, pero confuso. Acabo de ser mencionado pero no recibí una notificación push. Ventana de tiempo de notificación push. Esto causó: @mención, visito la aplicación en 60 segundos. Sin @mención.
- Si mencionas a un usuario en un canal que no está siguiendo, no recibirá la mención. (por diseño)
Para ser honesto @lindsey / @j.jaffeux / @pmusaraj, siento que “hacer ruido” probablemente resultaría en eliminar la gran mayoría de los problemas que tiene la gente y las quejas que hemos visto a lo largo de los años con respecto a las notificaciones de chat.
- Enviar siempre las notificaciones de @mención de inmediato (predeterminado del sitio); los sitios que deseen un retraso pueden configurarlo.
- Enviar siempre las notificaciones de @mención desde TODOS los canales, excluyendo solo los canales que los usuarios silencian explícitamente (o para los que no tienen permiso para ver), esto se alinea con el comportamiento en el foro.
- Hay algo extraño en
update_message.rbque publica un mensaje dentro de una transacción. (en entornos multihilo esto puede perderse) - Si hemos cancelado una suscripción en una PWA, muestra un banner en la PWA diciendo: las notificaciones push no están configuradas, ¿quieres configurarlas? Quizás solo cancelarlas después de 1 semana / 2 semanas en lugar de 1 día.
- Las etiquetas de push se deducen por canal, hostname-chat-mention-general… esto no es ideal para las menciones porque colapsamos por canal y eso puede ser confuso si 4 personas diferentes te mencionaron en diferentes momentos en el canal.
- Enviar siempre notificaciones push incluso si el usuario está en línea (predeterminado): permitir a los usuarios anular este comportamiento si lo desean.
- Una guinda del pastel sería admitir notificaciones push de primera clase en todos los sitios para las personas que tienen configurada la ID de Discourse (a través de Discourse ID): esto le daría a Hub una sensación consistente en todo.
Básicamente, eliminar gran parte de la lógica de “ups, no deberíamos haberte notificado” por defecto.
Desactivado por completo en la actualización de Discourse, para los autoalojados sin duda puede deberse a problemas de conectividad con la puerta de enlace de push. Quizás las actualizaciones en algunos servidores tardan días, tal vez sea una intranet durante 24 horas por alguna razón.
Código relevante (a través de Gemini 3 pro)
Eliminación de suscripciones PWA
La lógica que elimina las suscripciones después de 3 fallos en 24 horas se encuentra en el método handle_generic_error.
Limitar/Verificar en línea de la notificación push
La lógica que comprueba si un usuario está en línea (“debounce”) y omite la notificación push se encuentra centralmente aquí. Esto depende de SiteSetting.push_notification_time_window_mins.
Chat: Problemas de secuenciación de transacciones
El servicio UpdateMessage envuelve el paso publish dentro de una transacción de base de datos. Esto puede causar condiciones de carrera en las que el trabajo de notificación intenta leer el mensaje antes de que se confirme la transacción.
- plugins/chat/app/services/chat/update_message.rb (Bloque de transacción)
- plugins/chat/app/services/chat/update_message.rb (Paso de publicación)
Chat: Menciones en canales no seguidos
El código filtra explícitamente following: true al procesar menciones para canales públicos, evitando notificaciones para usuarios que no siguen el canal.
Chat: Etiquetas de notificación push
La lógica de generación de etiquetas que elimina duplicados de notificaciones por canal (colapsándolas) se define aquí: