8

是否有任何现有的解决方案可以为基于 Strophe.js 的聊天应用程序提供状态处理?

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

4

2 回答 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。存在类型

存在节的“类型”属性是可选的。不具有“类型”属性的存在节用于向服务器发出信号,表明发送者在线并且可用于通信。如果包含,'type' 属性指定缺乏可用性、管理订阅另一个实体的存在的请求、对另一个实体当前存在的请求或与先前发送的存在节相关的错误。如果包含,“类型”属性必须具有以下值之一:

  • 不可用——表示实体不再可用于通信。
  • subscribe -- 发件人希望订阅收件人的出席信息。
  • subscribed -- 发件人已允许收件人收到他们的出席信息。
  • unsubscribe -- 发件人正在取消订阅另一个实体的存在。
  • unsubscribed -- 订阅请求已被拒绝或先前授予的订阅已被取消。ETC...

它为$(presence).find("show")您提供联系人的状态。从文档:

2.2.2.1。显示

OPTIONAL 元素包含非人类可读的 XML 字符数据,用于指定实体或特定资源的特定可用性状态。一个存在节不能包含一个以上的元素。元素不得具有任何属性。如果提供,XML 字符数据值必须是以下之一(可以通过存在节的适当命名空间的子元素定义其他可用性类型):

  • away -- 实体或资源暂时离开。
  • 聊天——实体或资源对聊天很感兴趣。
  • dnd -- 实体或资源正忙(dnd = “请勿打扰”)。
  • xa -- 实体或资源长时间离开 (xa = "eXtended Away")。

如果未提供显示元素,则假定实体在线且可用。

于 2012-08-22T13:56:58.967 回答
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;
}
于 2013-07-23T00:31:59.707 回答