Strophe.js - 如何获得一组名册及其成员?
Strophe.js - How to get a group of rosters with its members?
当使用这个 Strophe 命令时:
var iq = $iq({type: 'get'}).c('query', {xmlns: 'jabber:iq:roster'});
connection.sendIQ(iq)
我将此作为成功回调:
<iq xmlns="jabber:client" xml:lang="pt-br" to="user01@localhost/100164477219111523302818" from="user01@localhost" type="result" id="82480785-c170-48d1-a180-bcadbff957d2:sendIQ">
<query xmlns="jabber:iq:roster">
<item subscription="both" jid="user02@localhost">
<group>Roster01</group>
<group>Roster02</group>
</item>
<item subscription="both" jid="admin@localhost">
<group>Roster01</group>
<group>Roster02</group>
</item>
<item subscription="both" jid="grupo02@conference.localhost">
<group>Roster02</group>
</item>
<item subscription="both" jid="grupo01@conference.localhost">
<group>Roster01</group>
</item>
</query>
</iq>
我想知道的是,是否有某种方法可以将此回调按组及其成员分组。如果没有,我怎么用 Javascript 来做呢?示例:
- 名册 01 有 admin、user02 和 grupo01
- 花名册 02 有 admin、user02 和 grupo02
我使用 ejabberd 作为 XMPP 服务器,使用 Ionic 3 和 Strophe 作为客户端。
我建议使用 strophejs-plugin-roster 使事情变得更容易:
// connect Strophe
connection = new Strophe.Connection(url);
connection.connect(my_jid, my_pwd, onConnect);
...
function onConnect(status) {
if (status == Strophe.Status.CONNECTED) {
...
// pass connection to roster plugin
connection.roster.init(connection);
}
}
这是一个通过插件获取名册的函数,结果是一个包含对象的 JS 数组(而不是 XML...):
function getRoster() {
connection.roster.get(function (roster) {
console.log(' >roster:', roster);
for (var i in roster) {
console.log(' >buddy '+i+':');
console.log(' >'+roster[i].name+" ("+roster[i].jid+' -->'+roster[i].subscription);
console.log(' >', roster[i].groups);
}
// get buddies belonging to group1 and group2 (see below)
console.log(' >roster-group1:', getRosterGroup(roster, 'group1'));
console.log(' >roster-group2:', getRosterGroup(roster, 'group2'));
});
}
下面的功能筛选好友:
function getRosterGroup(roster, group) {
var reduced = roster.reduce(function(filtered, item) {
if (item.groups.indexOf(group)!==-1) {
filtered.push(item);
}
return filtered;
}, []);
return reduced;
}
这是一个有效的 Plunker:http://plnkr.co/edit/XloJABSGHZvLTp3Js2KI?p=preview
当使用这个 Strophe 命令时:
var iq = $iq({type: 'get'}).c('query', {xmlns: 'jabber:iq:roster'});
connection.sendIQ(iq)
我将此作为成功回调:
<iq xmlns="jabber:client" xml:lang="pt-br" to="user01@localhost/100164477219111523302818" from="user01@localhost" type="result" id="82480785-c170-48d1-a180-bcadbff957d2:sendIQ">
<query xmlns="jabber:iq:roster">
<item subscription="both" jid="user02@localhost">
<group>Roster01</group>
<group>Roster02</group>
</item>
<item subscription="both" jid="admin@localhost">
<group>Roster01</group>
<group>Roster02</group>
</item>
<item subscription="both" jid="grupo02@conference.localhost">
<group>Roster02</group>
</item>
<item subscription="both" jid="grupo01@conference.localhost">
<group>Roster01</group>
</item>
</query>
</iq>
我想知道的是,是否有某种方法可以将此回调按组及其成员分组。如果没有,我怎么用 Javascript 来做呢?示例:
- 名册 01 有 admin、user02 和 grupo01
- 花名册 02 有 admin、user02 和 grupo02
我使用 ejabberd 作为 XMPP 服务器,使用 Ionic 3 和 Strophe 作为客户端。
我建议使用 strophejs-plugin-roster 使事情变得更容易:
// connect Strophe
connection = new Strophe.Connection(url);
connection.connect(my_jid, my_pwd, onConnect);
...
function onConnect(status) {
if (status == Strophe.Status.CONNECTED) {
...
// pass connection to roster plugin
connection.roster.init(connection);
}
}
这是一个通过插件获取名册的函数,结果是一个包含对象的 JS 数组(而不是 XML...):
function getRoster() {
connection.roster.get(function (roster) {
console.log(' >roster:', roster);
for (var i in roster) {
console.log(' >buddy '+i+':');
console.log(' >'+roster[i].name+" ("+roster[i].jid+' -->'+roster[i].subscription);
console.log(' >', roster[i].groups);
}
// get buddies belonging to group1 and group2 (see below)
console.log(' >roster-group1:', getRosterGroup(roster, 'group1'));
console.log(' >roster-group2:', getRosterGroup(roster, 'group2'));
});
}
下面的功能筛选好友:
function getRosterGroup(roster, group) {
var reduced = roster.reduce(function(filtered, item) {
if (item.groups.indexOf(group)!==-1) {
filtered.push(item);
}
return filtered;
}, []);
return reduced;
}
这是一个有效的 Plunker:http://plnkr.co/edit/XloJABSGHZvLTp3Js2KI?p=preview