xmpp - Strope.js - 如何获得一组名单及其成员?

标签 xmpp ejabberd strophe

使用此 Strope 命令时:

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 和 Strope 作为客户端。

最佳答案

我建议使用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);
    }
}

这是一个通过插件获取Roster的函数,结果是一个包含对象的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

关于xmpp - Strope.js - 如何获得一组名单及其成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48430158/

相关文章:

javascript - ejabberd——在 ejabberd 上设置昵称在我登录之前不会反射(reflect)在 Pidgin/Empathy 上

websocket - 使用node-xmpp-bosh将消息转发到另一台机器上的xmpp服务器

Python os.system 内联工作但不作为变量

http - 在 Erlang 列表(eJabberd HTTP header )中按键查找特定元组

python - xmppy。文件描述符超出选择范围

erlang - ejabberd 和自定义名册

centos7 - 使用 LetsEncrypt 证书进行 Ejabbed

javascript - 断开连接的客户端在带有 websockets 的 Openfire 服务器上保持在线

android - aSmack XMPP 库不工作

IOS - Android 的 Smack API 库可以用于 IOS 连接到 Ejabberd 服务器吗?