使用 Laravel Echo 连接超时后关闭支持聊天
Close support chat after connection timeout with Laravel Echo
我正在构建一个支持聊天应用程序。它建立在 Laravel Echo through Pusher.js.
之上
有两个方面 - support/admin 和客户端。当客户开始聊天时,支持人员可以接受,他们可以一起聊天。它像它应该的那样工作,但有一件事。当客户端离线时(关闭浏览器、离开站点、失去互联网连接……)它应该等待大约几秒钟(以确保这不是一个错误)然后关闭聊天。所以当他大约一个小时后回来时,不会有任何活跃的聊天。
我正在使用简单的代码通过存在通道检查双方的在线状态:
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 会在用户离线或连接断开时 post 一些数据 - 例如,我的自定义 id
字段。正如我在开始时指出的那样,当用户错误地离线时,它应该有一些 "cooldown"。这将有助于在用户无法回复时关闭聊天。
你有遇到过类似的问题吗?如果是这样,你是如何解决的?或者 - 甚至可以用 Pusher.js 解决吗?
嗯,7 天过去了,这里没有答案,所以我认为我描述的方式是不可能的。但是可以有一个 "hacky" 方式:
创建一个每 10 分钟运行一次的 CRON 作业
脚本将从带有标志 active
或 pending
的数据库中获取所有聊天记录
当聊天没有最近消息时(过去 5-10 分钟没有消息),然后检查用户是否在线
从状态通道获取用户
$response = $pusher->get('/channels/chat/users');
if($response['status'] == 200) {
$users = json_decode($response['body'], true)['users'];
}
- 如果至少有一个在线,则跳过,否则等待一小段时间(5秒,只是为了确定),再次检查在线状态,当他们仍然离线时,关闭聊天。
还没有测试它,因为它还不是必需的。也许有人会觉得这有帮助。
我正在构建一个支持聊天应用程序。它建立在 Laravel Echo through Pusher.js.
之上有两个方面 - support/admin 和客户端。当客户开始聊天时,支持人员可以接受,他们可以一起聊天。它像它应该的那样工作,但有一件事。当客户端离线时(关闭浏览器、离开站点、失去互联网连接……)它应该等待大约几秒钟(以确保这不是一个错误)然后关闭聊天。所以当他大约一个小时后回来时,不会有任何活跃的聊天。
我正在使用简单的代码通过存在通道检查双方的在线状态:
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 会在用户离线或连接断开时 post 一些数据 - 例如,我的自定义 id
字段。正如我在开始时指出的那样,当用户错误地离线时,它应该有一些 "cooldown"。这将有助于在用户无法回复时关闭聊天。
你有遇到过类似的问题吗?如果是这样,你是如何解决的?或者 - 甚至可以用 Pusher.js 解决吗?
嗯,7 天过去了,这里没有答案,所以我认为我描述的方式是不可能的。但是可以有一个 "hacky" 方式:
创建一个每 10 分钟运行一次的 CRON 作业
脚本将从带有标志
active
或pending
的数据库中获取所有聊天记录
当聊天没有最近消息时(过去 5-10 分钟没有消息),然后检查用户是否在线
从状态通道获取用户
$response = $pusher->get('/channels/chat/users');
if($response['status'] == 200) {
$users = json_decode($response['body'], true)['users'];
}
- 如果至少有一个在线,则跳过,否则等待一小段时间(5秒,只是为了确定),再次检查在线状态,当他们仍然离线时,关闭聊天。
还没有测试它,因为它还不是必需的。也许有人会觉得这有帮助。