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

2024-03-22

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

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


通过使用 Strope,您可以将 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;
}

你可以检查Strope.js文档 http://strophe.im/strophejs/doc/1.0.2/files2/strophe-js.html#Strophe.Connection.sendIQ了解更多信息。使用 sendIQ,您可以添加更多参数,例如错误回调等。

希望这可以帮助!

Edit:

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

In the XMPP 文档 http://xmpp.org/rfcs/rfc3921.html:

2.2.1.存在类型

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

  • 不可用——表示该实体不再可用 沟通。
  • 订阅——发送者希望订阅 收件人的存在。
  • 已订阅——发件人已允许 接收者接收他们的存在。
  • 取消订阅——发件人是 取消订阅另一个实体的存在。
  • 取消订阅—— 订阅请求已被拒绝或先前已授予 订阅已被取消。 ETC...

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

2.2.2.1.展示

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

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

如果未提供 show 元素,则假定实体处于在线状态并且 可用的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理基于 Strope.js 的聊天应用程序中的状态 的相关文章

  • 如何实现 JavaScript 对象被垃圾回收时触发的函数?

    实际上 垃圾被收集 销毁或以其他方式超出范围 我想要做的是 当调用了 bind 方法的对象被销毁时 取消绑定非 DOM 元素上的事件处理程序 编辑 我又查看了我的代码 并决定我真正需要它的唯一地方是当不再需要包含该对象的模块时 这通常发生在
  • 需要帮助从数组中为国家/地区着色,保留其余默认颜色

    我需要一些帮助从我创建的数组中获取数据 然后仅对数组中存在的国家 地区进行着色 而不在数组中的其余国家 地区我希望保留为默认颜色 我正在使用 D3 来完成所有这些工作 并且我非常确定我可以通过 D3 实现我需要的目标 但不确定如何实现 我想
  • 错误找不到“pages”目录。请在项目根目录下创建一个”

    以前我的项目设置是 public next src pages components assets next config js 这工作正常 但我将结构更改为以下 public src client next config js jscon
  • Javascript:混合构造函数模式和揭示模块模式

    有什么方法可以让 Javascript 类扩展通过揭示模块模式创建的对象吗 我尝试了下面的代码 但是有没有办法实现同样的事情 sv MergeQuestionViewModel function this sv QuestionDetail
  • 如何修复网站 iframe 错误?

    当我访问此网址时 警告 推荐使用一些广告拦截器 网页链接加载良好 没有错误 但是 当我尝试通过加载同一页面时iframe在我的html代码中 出现错误 我的html代码
  • 在 javascript 中访问 ajax POST 响应

    我正在从 javascript 函数发出 ajax POST 请求 function UpdateMetrics ajax type POST url MyHandler ashx Param1 value1 data contentTyp
  • React JS - 单击时更改颜色并将默认颜色放在所有其他颜色上

    我有 x 个渲染数文章预览依赖于 API 调用的组件 div div Object keys images map index i gt return div div
  • 根据用户区域设置过滤字符串列表

    当使用 AngularJS 1 6 处理 JavaScript 项目时 我有一个要过滤的字符串列表 例如 假设我的列表包含 rbol cig e a nido and tubo 当过滤西班牙语字符串时 如果我过滤 u 我会期望两者cig e
  • 使用JQuery检查元素是否有边框?

    所以我正在玩 el css 尝试确定元素是否有边框 我用 css border style solid 设置边框 这是可行的 但实际上它设置了 4 种单独的样式 border right style border left style bo
  • 使用 javascript 将 html 文本渲染为位图,无需服务器端代码

    我需要使用 javascript 代码来转换 html 中的文章 帖子 以便最终用户以位图的形式查看 有没有办法在没有服务器端代码的情况下做到这一点 example p testing text here p 您可以使用例如html2can
  • Child_process 处理带有回车符 (\r) 的 STDOUT 流

    我正在编写一个简单的应用程序 它允许工作中的内部系统请求从远程服务器到使用 REST 调用发起的另一个远程服务器的复制过程 使用 rsync 我已经对express框架足够熟悉 并且刚刚开始尝试child process库 并偶然发现了一个
  • JSON对象的长度[重复]

    这个问题在这里已经有答案了 该函数生成一个包含 json 对象的数组 var estoque function unpack estoque tnm total estoque vl id tid st tnm tnm split tota
  • 使用 jquery 通配符检查 cookie 名称

    我有一个生成动态 cookie 的表单 例如 webform 62 1234356 62 1234356 可以是任意数字 我需要使用一些通配符检查来检查名称以 webform 开头的 cookie 是否存在 下面不起作用 if cookie
  • 在overlayImage中应用滤镜的方法在哪里?

    我想在overlayImage中应用一个过滤器 唯一的方法是在渲染后在整个画布上应用过滤器 对此没有内置支持 但很容易 破解 var overlayImageUrl load overlay image first fabric Image
  • Sequelize.js - “不关联到”

    我在从数据库获取完整数据时遇到一些问题 那是我的模型 User module exports function sequelize DataTypes return sequelize define user id type DataTyp
  • 水平平滑滚动 100px

    Heyjo problem 一周以来我一直在寻找 javascript 或 jQuery 代码 以便在我的网站上实现滚动按钮 我失败的那一刻是按钮应该多次工作的时候 他的任务不是滚动到专用元素 而是应该向左滚动 例如 100px 此外 滚动
  • Cosmos DB 中的 MaxItemCount 源选项属性不起作用

    我正在尝试编写一个运行 SQL 查询的简单存储过程 并且我想通过使用 MaxItemCount 属性来限制结果 查询生成 3 个文档 但我只想返回 1 个文档 我使用 MaxItemCount 属性强制执行此限制 但这似乎不起作用 func
  • D3v6 嵌套图 - 嵌套 join()?

    我想可视化每个节点的 孩子 洞察力 我猜 D3v6 join 函数可以嵌套 不幸的是我找不到任何例子 下面的代码片段包含一个具有 3 个节点和子节点作为属性的outerGraph 到目前为止 这些孩子还没有被使用 相反 innerGraph
  • 为什么从浏览器上传到 S3 时出现 403 错误?

    因此 我尝试查看此处之前的答案 但似乎没有任何效果 我正在使用 Dropzone 它似乎发出 OPTIONS 请求来获取所有允许的 CORS 相关信息 但它似乎没有正确返回 因此 通过查看 Chrome 开发工具 我有以下请求标头 Host
  • 在角度控制器中监听文档事件

    如何捕获角度控制器中的事件 我有文档级事件 所以我需要在角度控制器中捕获事件 这可能吗 Update 我有独立的 js 文件来处理来自相机的一些操作 document addEventListener myCameraEvent handl

随机推荐