Закрыть чат поддержки после тайм-аута соединения с Laravel Echo - PullRequest
0 голосов
/ 09 октября 2019

Я создаю приложение поддержки чата. Он построен на Laravel Echo через Pusher.js.

Есть две стороны - поддержка / администратор и клиент. Когда клиент запускает чат, служба поддержки может принять его, и они могут общаться вместе. Работает так, как должно быть, но есть одна вещь. Когда клиент переходит в автономный режим (закрывает браузер, покидает сайт, теряет интернет-соединение ...), ему нужно подождать несколько секунд (чтобы убедиться, что это не было ошибкой), а затем закрыть чат. Поэтому, когда он вернется через час, активного чата не будет.

Я проверяю онлайн-статус обеих сторон с помощью канала присутствия с простым кодом:

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_timeout URL? Я просто думаю, что это может быть URL, где Pusher.js будет публиковать некоторые данные, когда пользователь отключается или соединение теряется - например, мое настраиваемое поле id. Как я отметил в начале, у него должно быть некоторое время восстановления, когда пользователь по ошибке отключается от сети. Это поможет закрыть чат, когда пользователь не сможет ответить.

Есть ли у вас какие-либо проблемы с подобной проблемой? Если да, то как ты решил это? Или - возможно ли это решить с помощью Pusher.js?

1 Ответ

0 голосов
/ 17 октября 2019

Ну, прошло 7 дней, а ответа здесь нет, так что я думаю, что это невозможно, как я описываю. Но может быть «хакерский» способ:

  1. Создать задание CRON, которое запускается каждые 10 минут

  2. Скрипт получит все чаты из базы данныхс флагом active или pending

  3. Если в чате нет последних сообщений (ничего за последние 5-10 минут), то проверьте, есть ли пользователи в сети

  4. Получить пользователей из канала присутствия

$response = $pusher->get('/channels/chat/users');
if($response['status'] == 200) {
    $users = json_decode($response['body'], true)['users'];
}
Если в сети хотя бы один из них, пропустите, в противном случае подождите некоторое время (5 секунд, просто чтобы убедиться), проверьте статус онлайн еще раз и, когда они все еще не подключены, закройте чат.

Еще не проверял, так как пока не требуется. Может быть, кто-то найдет это полезным.

...