使用Websocket和Pusher显示连接用户登录状态

时间:2015-03-18 19:02:41

标签: php pusher

我是第一次使用Pusher构建聊天室Web应用程序。我在Pusher的文档中阅读了很多内容,以了解它是如何工作的。我的问题更多的是机制而不是代码。

所以我想做的是,当用户连接并加入presence-channel时,可以显示谁在线。我想为用户(如Skype)显示状态标志(绿色=在线,黄色=离开),所有登录的用户都可以实时查看状态之间的变化。

我见过this question,如果我理解,每个用户都必须加入私人频道才能更好地管理其客户端事件。那么如何管理private-channel的更改状态事件并在presence-channel中显示,或者如何在两个频道之间进行通信?

1 个答案:

答案 0 :(得分:3)

您不需要单独的频道来构建用户状态。

现在实现这一目标的最佳方法是使用类似idle.js的内容检测用户状态,然后在状态通道(可能是client-status-updated)上触发有关用户状态信息的事件(例如{"user_id":SOME_ID, "status":"away"})。

注意:对于客户端事件,事件名称上需要client-前缀

您可以使用client events执行此操作,这可以在现有的现有状态通道上完成。但是,您应该知道,通过使用客户端事件,这意味着任何经过身份验证的用户都可能触发状态事件并建议它完全由另一个用户使用。因此,通过服务器执行此操作会更安全,该服务器可以设置来自正在设置状态的用户的偶数。

但是,我并没有真正看到“hack”设置其他用户状态的好处。

以下是使用在线信道和客户端事件的示例。

<script src="libs/idle.js"></script>
<script src="//js.pusher.com/2.2/pusher.min.js"></script>
<script>
var pusher = new Pusher(APP_KEY);
var presence = pusher.subscribe('presence-online');

// Basic online/offline
presence.bind('pusher:subscription_succeeded', function(members) {
  members.each(addUser);
});

presence.bind('pusher:member_added', addUser);
presence.bind('pusher:member_removed' removeUser);

function addUser(member) {
  // Online - add to UI
}

function removeUser(member) {
  // Offline - remove from UI
  // Consider doing this in a setTimeout
  // in case the user comes back online again
}

// User state
var idle = new Idle({
  onHidden:    function() { sendUserStatus('hidden'); },
  onVisible:   function() { sendUserStatus('visible'); },
  onAway:      function() { sendUserStatus('away'); },
  onAwayBack:  function() { sendUserStatus('hidden'); },
  awayTimeout: 30000 //away with 30 seconds of inactivity
}).start();

function sendUserStatus(status) {
  var userStatusUpdate = {
    "user_id": presence.members.me.id, // current user unique ID
    "status": status
  };
  presence.trigger('client-status-updated', userStatusUpdate);
}

presence.bind('client-status-updated', function(update) {
  var userId = update.user_id;
  var status = user.status;
  // Update UI to reflect user status
});
</script>