Я начал изучать этот код, но чувствую, что основная проблема связана с «ожиданиями»:
- Речь идёт об уведомительных сообщениях (push-уведомлениях)? (Если да, используете ли вы PWA или приложение Discourse Hub?)
- Когда люди говорят «не получают уведомлений», имеют ли они в виду «не получают уведомлений об упоминаниях в push-уведомлении»?
- Ожидается ли получение уведомления об @упоминании через push-уведомление, когда вы уже онлайн?
Существует целый ряд проблем, которые я считаю известными, и которые мы можем улучшить.
- В PWA, если мы пытаемся отправить push-уведомление 3 раза за 24 часа и не удаёмся (из-за проблем с подключением к распределителю сообщений или по другим причинам), мы отключаем подписки и не уведомляем пользователя ни о чём.
- В Hub push-уведомления доступны только клиентам, размещённым на хостинге Discourse.
- Существуют проблемы с последовательностью, когда уведомление может быть потеряно при редактировании сообщения в чате, так как мы инициируем push-уведомление внутри транзакции.
- У нас есть 1-минутное «дебаунсирование», которое настраивается, но запутывает. Мне только что упомянули, но я не получил push-уведомление.
push notification time window. Это привело к следующему: @упоминание, я случайно зашёл в приложение в течение 60 секунд — и никакого @упоминания. - Если вы @упоминаете пользователя в канале, на который он не подписан, он не получит упоминание. (по дизайну)
Честно говоря, @lindsey / @j.jaffeux / @pmusaraj, мне кажется, что «громкое заявление» скорее всего приведёт к устранению подавляющего большинства проблем и жалоб, с которыми мы сталкивались за годы в отношении уведомлений чата.
- Всегда отправлять push-уведомления об @упоминаниях немедленно (стандартная настройка сайта); сайты, желающие задержку, могут её настроить.
- Всегда отправлять push-уведомления об @упоминаниях из ВСЕХ каналов, исключая только каналы, которые пользователи явно отключили (или на которые у них нет прав доступа); это соответствует поведению на форуме.
- В
update_message.rbесть что-то странное, что публикует сообщение внутри транзакции. (в многопоточных средах это может быть потеряно) - Если мы отключили подписку в PWA, покажите в PWA баннер: «Push-уведомления не настроены, хотите их настроить?». Возможно, отключать подписку только через 1–2 недели, а не через 1 день.
- Теги push-уведомлений дублируются по каналу: hostname-chat-mention-general … это не идеально для упоминаний, так как мы группируем их по каналу, что может запутать, если 4 разных человека упомянули вас в разное время на одном канале.
- Всегда отправлять push-уведомления, даже если пользователь онлайн (по умолчанию) — разрешить пользователям отключать это поведение, если они хотят.
- Вишенкой на торте стала бы поддержка полноценных push-уведомлений на всех сайтах для пользователей с настроенным Discourse ID (через Discourse ID). Это обеспечило бы Hub единообразный опыт во всём.
По сути, нужно убрать большую часть логики «ой, мы не должны были вас уведомлять» по умолчанию.
Полное отключение при обновлении Discourse у самохостеров может быть связано с проблемами подключения к шлюзу push-уведомлений. Возможно, обновления на некоторых серверах занимают дни, или, возможно, на 24 часа возникает проблема с интранетом.
Соответствующий код (через Gemini 3 pro)
Отключение подписок PWA
Логика отключения подписок после 3 неудачных попыток за 24 часа находится в методе handle_generic_error.
Дебаунсирование push-уведомлений / проверка онлайн-статуса
Логика проверки, находится ли пользователь онлайн («дебаунсирование»), и пропуска push-уведомления находится здесь. Она зависит от SiteSetting.push_notification_time_window_mins.
Чат: проблемы с последовательностью транзакций
Сервис UpdateMessage оборачивает шаг publish в транзакцию базы данных. Это может вызвать гонки, когда задача уведомления пытается прочитать сообщение до фиксации транзакции.
- plugins/chat/app/services/chat/update_message.rb (блок транзакции)
- plugins/chat/app/services/chat/update_message.rb (шаг публикации)
Чат: упоминания на каналах, на которые пользователь не подписан
Код явно фильтрует записи по following: true при обработке упоминаний для публичных каналов, предотвращая уведомления для пользователей, не подписанных на канал.
Чат: теги push-уведомлений
Логика генерации тегов, которая дублирует уведомления по каналу (группируя их), определена здесь: