【问题标题】:Handling presence in Strophe.js-based chat application在基于 Strophe.js 的聊天应用程序中处理存在
【发布时间】:2012-08-17 06:37:33
【问题描述】:

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

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

【问题讨论】:

    标签: javascript xmpp strophe


    【解决方案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 documentation 了解更多信息。使用 sendIQ,您可以添加更多参数,例如错误回调等。

    希望这会有所帮助!

    编辑:

    原谅我,我犯了一个错误。 $(presence).attr('type') 不会告诉你联系人是否在线,但会告诉你存在类型。状态类型实际上是一种信号,它告诉您联系人是否不可用,或者您是否订阅、取消订阅等。

    XMPP Documentation

    2.2.1。存在类型

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

    • unavailable -- 表示实体不再可用的信号 沟通。
    • subscribe -- 发送者希望订阅 收件人的存在。
    • subscribed -- 发件人已允许 接收者接收他们的存在。
    • 取消订阅 -- 发件人是 取消订阅另一个实体的存在。
    • 取消订阅-- 订阅请求已被拒绝或先前授予 订阅已被取消。等等……

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

    2.2.2.1。显示

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

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

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

    【讨论】:

    • 很棒的答案。还有一个问题:“类型”属性中是否有任何可能值列表?还有其他人呢?那些,我可以传递给 Strophe.addHandler: ns, name, type, id, from, options
    • 嗨 Pavel,我更新了我的答案,因为我意识到我在阅读您的评论时犯了一个错误。我也添加了您的问题的答案,以及 XMPP 文档的链接。
    • 我已经关注了您上面的 sn-ps 我似乎无法获得我的花名册列表。我可能做错了什么
    • @RudyJessop 自从我回来检查以来已经有好几年了,正如我下面的答案所指出的那样,您的处理程序末尾有 return true。 :)
    【解决方案2】:

    需要注意的重要一点是,正如Is it right that Strophe.addHandler reads only first node from response? 所说,如果您想读取的不仅仅是第一个存在节点,请确保在最后返回 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;
    }
    

    【讨论】:

    • 感谢您的回答。这是真的,每个使用 Strophe 的人都会犯一两次这个错误。但是,它与所有 Strophe 处理程序有关,而不仅仅是存在处理程序。
    • 我错过了返回 true。谢谢@RamRovi 这解决了我的问题:)
    猜你喜欢
    • 1970-01-01
    • 2017-11-25
    • 2023-01-20
    • 2017-05-14
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多