基于Strophe.js聊天应用程序中处理存在(Handling presence in Strop

2019-07-31 03:09发布

是否有任何现有的解决方案提供存在处理基于Strophe.js聊天应用程序?

我有一个基于Strophe.js简单的聊天应用。 我想只显示谁是在线和dynamicaly改变列表中的用户。 我想知道是否存在其处理这个任何现有的溶液(可能的strophe插件)。 如果没有这样的事,有什么来实现它的最佳/最简单的方法是什么?

Answer 1:

通过使用的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”属性是可选的。 存在节不具有一个“类型”属性用于信号通知发送者是在线和可用于通信的服务器。 如果包括,在“类型”属性指定一个缺乏可用性,管理订阅其他实体的存在的请求,对其他实体的当前存在的请求,或与以前发送的存在节的错误。 如果包括,则“type”属性必须具有以下值之一:

  • 不可用 - 信号,该实体不再可用于通信。
  • 订阅 - 发送者希望订阅到收件人的存在。
  • 订阅 - 发送者已经允许收件人接收他们的存在。
  • 退订 - 发件人是从另一个实体的存在退订。
  • 退订 - 订阅请求已被拒绝或先前授予的订阅已取消。 等等...

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

2.2.2.1。 节目

可选元素包含指定的实体或特定资源的特定可用性状态非人类可读的XML字符数据。 存在节必须不包含多于一个的元件。 该元素必须不具备任何属性。 如果提供,XML字符数据值必须是以下(可以通过存在节的正确名称空间的子元素被定义附加的可获得的类型)中的一种:

  • 远 - 实体或资源暂时离开。
  • 聊天 - 实体或资源是在聊天积极兴趣。
  • DND - 实体或资源正忙(DND =“请勿打扰”)。
  • XA - 实体或资源是远较长时间(XA =“扩展离开”)。

如果没有提供展示元素,实体被认为是在线和可用。



Answer 2:

需要注意的一件重要的事情,是随着它是正确的,从Strophe.addHandler响应只读取第一个节点? 说,如果你想读的不仅仅是第一存在点多,确保在年底返回true,因为:“如果再次被调用的处理程序应该返回true;否则,返回假返回后,将删除处理。 “

因此,解决办法我以前应该是这个样子:

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;
}


文章来源: Handling presence in Strophe.js-based chat application