このコードを見始めたのですが、大きな問題は「期待値」にあると感じています。
- これはプッシュ通知に関するものですか?(そうであれば、PWAまたはDiscourse Hubアプリのどちらを使用していますか?)
- 「通知されない」と言うとき、それは「プッシュ通知でのメンションについて通知されない」という意味ですか?
- オンライン中に@メンションについてプッシュ通知で通知されることが期待されていますか?
私が既知の問題と見なす大きな問題群があり、これらは改善できます。
- PWAでは、24時間以内に3回プッシュを試みて失敗した場合(メッセージディストリビューターへの接続やその他の理由で)、サブスクリプションを無効にし、ユーザーに何もアラートを出しません。
- Hubでは、Discourseホストのお客様のみがプッシュ通知を利用できます。
- チャットメッセージの編集時にプッシュ通知が送信されないというシーケンスの問題がいくつかあります。これは、トランザクション内でプッシュ通知を発生させるためです。
- 設定可能ですが、分かりにくい1分間の「デバウンス」があります。「プッシュ通知の時間枠」です。これは、
@mentionがあり、私が60秒以内にアプリにアクセスした場合、@mentionがない、という事態を引き起こします。 - ユーザーがフォローしていないチャンネルで@メンションしても、メンションは届きません。(設計による)
正直なところ、@lindsey / @j.jaffeux / @pmusaraj、大声で言うと、長年にわたってチャット通知に関して人々が抱えてきた問題や私たちが目にしてきた苦情の大部分を取り除くことになると思います。
- @メンション通知は常にすぐにプッシュする(サイトのデフォルト)。遅延を望むサイトは設定可能。
- @メンション通知はすべてのチャンネルから常にプッシュする。明示的にミュートしたチャンネル(または表示権限のないチャンネル)のみ除外する。これはフォーラムでの動作と一致する。
update_message.rbに、トランザクション内でメッセージをパブリッシュする奇妙な処理がある。(マルチスレッド環境ではこれが失われる可能性がある)- PWAでサブスクリプションを無効にしてしまった場合、プッシュ通知が設定されていないことを示すバナーをPWAに表示し、設定を促す。サブスクリプションの無効化を1日後ではなく、1週間後/2週間後にするなど。
- プッシュタグはチャンネルごとに重複排除されます(例:
hostname-chat-mention-general)。これはメンションにとっては理想的ではありません。なぜなら、チャンネルごとに集約されてしまい、同じチャンネルで異なる時間に4人の異なるユーザーからメンションされた場合に混乱を招く可能性があるからです。 - ユーザーがオンラインであっても常に通知をプッシュする(デフォルト)。ユーザーがこの動作を上書きしたい場合は、許可する。
- これらすべてをまとめるのは、Discourse IDが設定されているすべてのサイトで、Discourse ID経由でプッシュ通知をファーストクラスでサポートすることです。これにより、Hub全体で一貫した感触が得られます。
基本的に、デフォルトで「おっと、通知すべきではなかった」というロジックの多くを取り除くことです。
Discourseのアップグレードで完全にオフになることについては、セルフホストの場合、プッシュゲートウェイへの接続の問題が原因である可能性は確かにあります。アップグレードが一部のサーバーで数日かかる場合もあれば、何らかの理由で24時間イントラネットになる場合もあります。
関連コード(Gemini 3 proによる)
PWAサブスクリプションが無効になる件
24時間で3回失敗した後にサブスクリプションを無効にするロジックは、handle_generic_errorメソッドにあります。
プッシュ通知のデバウンス/オンラインチェック
ユーザーがオンラインかどうかをチェックし、プッシュ通知をスキップするロジックはここに集中しています。これは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で明示的にフィルタリングし、チャンネルをフォローしていないユーザーへの通知を防いでいます。
チャット: プッシュ通知タグ
チャンネルごとに通知を重複排除する(集約する)タグ生成ロジックはここに定義されています。