处理Strophe.js聊天应用中的在线状态

8

是否存在一种基于Strophe.js的聊天应用程序的在线状态处理现有解决方案?

我有一个简单的基于Strophe.js的聊天应用程序。我想仅显示在线用户并动态更改列表。我想知道是否存在任何现有解决方案(可能是Strophe插件)来处理这个问题。如果不存在这样的解决方案,那么实施它的最佳/最简单方法是什么?

2个回答

24
使用Strophe,您可以向服务器发送一个IQ请求您的花名册列表,如下所示:
iq = $iq({type: 'get'}).c('query', {xmlns: 'jabber:iq:roster'});
App.connection.sendIQ(iq, your_roster_callback_function);

这将查询您的服务器以获取您的花名册,并返回一个包含您花名册列表的对象。然后,您可以像这样迭代您的花名册:
your_roster_callback_function(iq){
  $(iq).find('item').each(function(){
    var jid = $(this).attr('jid'); // The jabber_id of your contact
    // You can probably put them in a unordered list and and use their jids as ids.
  });
  App.connection.addHandler(App.on_presence, null, "presence");
  App.connection.send($pres());
}

请注意,我添加了一个on_presence回调和connection.send($pres())。它的目的是让您在联系人的在线状态发生更改时获得更新。您的在线状态回调将如下所示:
on_presence(presence){
  var presence_type = $(presence).attr('type'); // unavailable, subscribed, etc...
  var from = $(presence).attr('from'); // the jabber_id of the contact
  if (presence_type != 'error'){
    if (presence_type === 'unavailable'){
      // Mark contact as offline
    }else{
      var show = $(presence).find("show").text(); // this is what gives away, dnd, etc.
      if (show === 'chat' || show === ''){
        // Mark contact as online
      }else{
        // etc...
      }
    }
  }
  return true;
}

您可以查看Strophe.js 文档获取更多信息。使用sendIQ,您可以添加更多参数,如错误回调等。

希望这有所帮助!

编辑:

请原谅我,我犯了一个错误。$(presence).attr('type')不能告诉您联系人是否在线,而是提供了出席类型。实际上,出席类型是告诉您联系人是否不可用,以及您是否已订阅、取消订阅等的信号。

XMPP文档中:

2.2.1. 存在类型
存在 stanza 的 'type' 属性是可选的。没有 'type' 属性的存在 stanza 用于向服务器发出在线和可用于通信的信号。如果包含,则 'type' 属性指定了缺少可用性、请求管理对另一个实体的存在的订阅、请求另一个实体的当前存在或与先前发送的存在 stanza 相关的错误。如果包括,'type' 属性必须具有以下值之一:
- unavailable -- 表示实体不再可用于通信。 - subscribe -- 发件人希望订阅收件人的存在。 - subscribed -- 发件人已允许收件人接收其存在。 - unsubscribe -- 发件人正在取消对另一个实体的存在的订阅。 - unsubscribed -- 订阅请求已被拒绝或先前授予的订阅已被取消。等等。 $(presence).find("show") 可以给你联系人的状态。来自文档:
2.2.2.1. Show
可选的 show 元素包含非人类可读的 XML 字符数据,指定实体或特定资源的特定可用性状态。存在 stanza 不能包含多个 show 元素。 show 元素不得具有任何属性。如果提供,则 XML 字符数据值必须是以下之一(通过 presence stanza 的适当命名空间子元素可以定义其他可用性类型):
- away -- 实体或资源暂时离开。 - chat -- 实体或资源积极参与聊天。 - dnd -- 实体或资源忙碌(dnd =“请勿打扰”)。 - xa -- 实体或资源长时间离开(xa =“长时间离开”)。
如果未提供 show 元素,则假定该实体在线并可用。

1
非常棒的回答。只有一个问题:在"type"属性中是否有可能值的列表?其他属性呢?这些属性我可以传递给Strophe.addHandler:ns、name、type、id、from、options。 - Pavel S.
嗨Pavel,我更新了我的答案,因为当我阅读你的评论时意识到我犯了一个错误。我也添加了对你的问题的答案,还有一个指向XMPP文档的链接。 - Vincent Paca
我已经按照您上面的代码片段操作,但似乎无法获取我的名单列表。我可能做错了什么? - Rudy Jessop
@RudyJessop,自从我上次查看以来已经过了好几年了,你在处理程序的末尾加上了return true,正如下面的答案所指出的那样。 :) - Vincent Paca

4
重要的一点需要注意,正如“Strophe.addHandler是否只读取响应中的第一个节点?”所说,如果您想读取更多的存在节点,请确保在结尾处返回true,因为:“如果处理程序需要再次调用,则应返回true;返回false将在它返回后删除处理程序。”
因此,我使用的解决方案应该类似于这样:
on_presence(presence){
   var presence_type = $(presence).attr('type'); // unavailable, subscribed, etc...
   var from = $(presence).attr('from'); // the jabber_id of the contact
   if (presence_type != 'error'){
     if (presence_type === 'unavailable'){
        // Mark contact as offline
     }else{
       var show = $(presence).find("show").text(); // this is what gives away, dnd, etc.
       if (show === 'chat' || show === ''){
         // Mark contact as online
       }else{
         // etc...
       }
     }
   }
   //RETURN TRUE!!!!!!!!!
   return true;
}

2
谢谢你的回答。这是正确的,每个使用Strophe的人都会犯这个错误一两次。然而,这与所有Strophe处理程序有关,不仅仅是出席处理程序。 - Pavel S.
1
我错过了返回true。感谢@RamRovi,这解决了我的问题 :) - Willy Lazuardi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接