在基于Strophe.js的聊天应用程序中处理状态
Handling presence in Strophe.js-based chat application
是否有任何现有的解决方案可以为基于Strophe.js的聊天应用程序提供状态处理?
我有一个基于Strophe.js的简单聊天应用程序。我想只显示在线的用户,并动态更改列表。我想知道是否有任何现有的解决方案(可能是Strophe插件)可以处理这个问题。如果没有这样的东西,实现它的最佳/最简单的方法是什么?
使用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"属性是OPTIONAL。出席不具有"type"属性的节用于向发送者在线并且可用于通信的服务器。如果包含,"type"属性指定缺少可用性请求管理对另一实体的存在的订阅请求另一个实体的当前存在,或与先前发送的存在节。如果包含"type"属性必须具有以下值之一:
- 不可用—表示实体不再可用沟通
- subscribe--发件人希望订阅收件人在场
- subscribed--发件人已允许收件人接收他们的出席
- unsubscribe--发件人是取消订阅其他实体的存在
- 未订阅--订阅请求已被拒绝或先前已被授予订阅已取消。等等
$(presence).find("show")
会为您提供联系人的状态。来自文档:
2.2.2.1.显示
OPTIONAL元素包含非人类可读的XML字符指定实体或特定资源。存在节不得包含多个要素元素不得具有任何属性。如果提供,XML字符数据值必须是以下值之一(可以通过presence节的具有适当名称空间的子元素):
- away--实体或资源暂时不在
- 聊天——实体或资源对聊天非常感兴趣
- dnd--实体或资源正忙(dnd="请勿打扰")
- xa——实体或资源离开一段较长的时间(xa="离开")
如果未提供显示元素,则假定实体处于联机状态,并且可获得的
需要注意的一件重要事情是,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;
}
- 在MVVM视图模型中处理应用程序范围的元素
- 如何处理IOS网络应用程序中的空锚点
- 如何通过osascript处理同一应用程序的两个实例
- 在Node Webkit应用程序中从DOM单击按钮时运行批处理文件
- 如何在phonegap应用程序中处理Ajax json响应
- 在基于Strophe.js的聊天应用程序中处理状态
- 如何处理数据-Windows 8应用程序
- 简单客户端应用程序中的文件处理
- 如何处理可以'无法在Titanium应用程序上访问主机
- iOS版离线Jquery Mobile应用程序中处理导航的正确方法
- 如何在React应用程序中处理权限检查(Redux中的状态维护)
- Chrome应用程序可以注册协议处理程序吗
- 是什么处理Hello,Lungo应用程序中的导航
- 谷歌应用程序脚本:如何在没有用户交互的情况下调用绑定到处理程序的函数
- 如何处理在多页 HTML/jquery 应用程序中链接到脚本和 css 文件
- 在单页应用程序 (SPA) 中处理身份验证的最佳方法
- Jquery 事件处理程序未在 Rails 应用程序中触发
- 如何处理 Backbone .js应用程序中哈希更改的滚动位置
- 如何在JavaScript上处理金融应用程序的数字,它缺少整数类型
- 是否有一种方法为chrome打包应用程序处理Http BasicAuthentication