通过使用 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 元素,则假定实体处于在线状态并且
可用的。