是否存在基于Strophe.js提供聊天应用的状态处理的现有解决方案?
我有基于Strophe.js的简单聊天应用程序。我只想显示在线和动态更改列表的用户。我想知道是否有任何现有的解决方案(可能是Strophe插件)来处理这个问题。如果没有这样的东西,那么实现它的最佳/最简单方法是什么?
答案 0 :(得分:23)
通过使用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')
不会给您,但它会为您提供在线状态。在线状态实际上是一个信号,告诉您联系人是否不可用,或者您是否已订阅,取消订阅等等。
<强> 2.2.1。存在类型
存在节的'type'属性是可选的。存在 不具有'type'属性的节用于发信号 发件人在线且可用于通信的服务器。 如果包含,'type'属性指定缺乏可用性,a 请求管理对另一个实体的存在的订阅,a 请求另一个实体的当前存在,或与之相关的错误 以前发送的存在节。如果包含,则为“type”属性 必须具有以下值之一:
- 不可用 - 表示该实体不再可用 通讯。
- 订阅 - 发件人希望订阅 收件人的存在。
- 订阅 - 发件人已允许 收件人接受他们的存在。
- 取消订阅 - 发件人是 取消订阅其他实体的存在。
- 取消订阅 - 订阅请求已被拒绝或先前已被授予 订阅已被取消。等...
$(presence).find("show")
为您提供联系人的状态。来自文档:
<强> 2.2.2.1。显示强>
OPTIONAL元素包含非人类可读的XML字符 指定实体或特定可用性状态的数据 具体资源。存在节不得包含多个 元件。元素不得拥有任何属性。 如果提供,则XML字符数据值必须是以下之一 (可以通过a定义其他可用性类型 存在节的正确命名空间子元素:
- away - 实体或资源暂时离开。
- chat - 实体或资源对聊天很感兴趣。
- dnd - 实体或资源正忙(dnd =“请勿打扰”)。
- xa - 实体或资源长时间离开(xa =“eXtended Away”)。
如果未提供show元素,则假定该实体在线并且 可用。
答案 1 :(得分:4)
需要注意的一点是,正如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;
}