0

サポートチャットアプリケーションを構築しています。Pusher.js を介して Laravel Echo 上に構築されています。

サポート/管理者とクライアントの 2 つの側面があります。クライアントがチャットを開始すると、サポートはそれを受け入れることができ、一緒にチャットできます。正常に動作していますが、1 つだけ問題があります。クライアントがオフラインになると (ブラウザーを閉じる、サイトを離れる、インターネット接続が失われるなど)、(間違いではないことを確認するために) 数秒待ってから、チャットを閉じます。そのため、彼が約 1 時間後に戻ってきたとき、アクティブなチャットはありません。

簡単なコードを使用して、プレゼンス チャネルで両側のオンライン ステータスを確認しています。

this.presence = Echo.join('chat');

this.presence
    .listen('.pusher:subscription_error', (result) => {
        if(this.debug) {
            console.log(result);
        }
    })
    .listen('.pusher:member_added', (result) => {
        if(!!result.info.is_admin) {
            this.presence_users.push(result.info);
        }
    })
    .listen('.pusher:member_removed', (result) => {
        let found = _.find(this.presence_users, ['id', result.id]);
        let index = this.presence_users.indexOf(found);

        this.presence_users.splice(index, 1);
    })
    .here((result) => {
        this.presence_users = _.filter(result, ['is_admin', true]);
    });

サポート側では少し異なりますが、ロジックは同じです (心配する必要はありません。ユーザーidはデータベースからではなく id、一意の md5 識別子です)。

プレゼンス チャネルは正常に機能しています。しかし、インターネット上のどこにも見つからないのですが、connection_timeoutURL を設定するにはどうすればよいですか? ユーザーがオフラインになったとき、または接続が失われたときに Pusher.js がデータを投稿する URL である可能性があると思います-idたとえば、私のカスタムフィールド。冒頭で述べたように、ユーザーが誤ってオフラインになった場合、「クールダウン」が必要です。これは、ユーザーが応答できない場合にチャットを閉じるのに役立ちます。

同様の問題の経験はありますか?もしそうなら、どのように解決しましたか?または - Pusher.js で解決することさえ可能ですか?

4

1 に答える 1

0

さて、7 日が経過し、ここで回答がないので、私が説明した方法では不可能だと思います。しかし、「ハッキーな」方法が存在する可能性があります。

  1. 10 分ごとに実行される CRON ジョブを作成する

  2. スクリプトは、フラグactiveまたはフラグを使用してデータベースからすべてのチャットを取得しますpending

  3. チャットに最近のメッセージがない場合 (過去 5 ~ 10 分間のメッセージがない場合)、ユーザーがオンラインかどうかを確認します。

  4. プレゼンス チャネルからユーザーを取得する

$response = $pusher->get('/channels/chat/users');
if($response['status'] == 200) {
    $users = json_decode($response['body'], true)['users'];
}
  1. 少なくとも 1 人がオンラインの場合はスキップし、それ以外の場合は短時間 (念のため 5 秒) 待ってからオンライン ステータスを再度確認し、まだオフラインの場合はチャットを閉じます。

まだ必要ではないため、テストしていません。多分誰かがこれが役立つと思うでしょう。

于 2019-10-17T07:30:15.493 に答える