处理基于Strophe.js的聊天应用程序中的状态

Pav*_* S. 8 javascript xmpp strophe

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

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

Vin*_*aca 24

通过使用Strophe,您可以将IQ发送到您的服务器,询问您的名单列表,如下所示:

iq = $iq({type: 'get'}).c('query', {xmlns: 'jabber:iq:roster'});
App.connection.sendIQ(iq, your_roster_callback_function);
Run Code Online (Sandbox Code Playgroud)

这将查询您的服务器的名单,并返回包含您的名单列表的对象.然后,您可以遍历您的名单,如:

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());
}
Run Code Online (Sandbox Code Playgroud)

请注意,我添加了一个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;
}
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助!

编辑:

原谅我,我犯了一个错误.$(presence).attr('type')如果联系人在线或不在线,则不会给您,但它会为您提供在线状态.在线状态实际上是一个信号,告诉您联系人是否不可用,或者您是否已订阅,取消订阅等联系人.

XMPP文档中:

2.2.1.存在的类型

存在节的'type'属性是可选的.不具有"类型"属性的存在节用于向服务器发信号通知发送方在线并且可用于通信.如果包括,在"类型"属性指定一个缺乏可用性,管理订阅其他实体的存在的请求,对其他实体的当前存在的请求,或与以前发送的存在节的错误.如果包含,'type'属性必须具有以下值之一:

  • 不可用 - 表示该实体不再可用于通信.
  • 订阅 - 发件人希望订阅收件人的存在.
  • 订阅 - 发件人已允许收件人接收他们的存在.
  • 取消订阅 - 发件人取消订阅其他实体的存在.
  • unsubscribed - 订阅请求已被拒绝或先前已授予的订阅已被取消.等等...

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

2.2.2.1.节目

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

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

如果未提供show元素,则假定该实体在线且可用.