1

デフォルトでStanza.ioでサポートされていないXEP-0012を実装したいと考えています。

ドキュメントからプラグインを作成する方法に従っていますが、機能していません。

Heres私のコード(last.js):

'use strict';

module.exports = function (client) {

    client.disco.addFeature('jabber:iq:last');

    client.on('jabber:iq:last', function (iq) {
        client.sendIq(iq.resultReply({
            last: new Date().getTime()
        }));
    });

    client.getLastActivity = function (jid, cb) {
        return this.sendIq({
            to: jid,
            type: 'get',
            last: true
        }, cb);
    };

};

そして、私はそれを使用します:client.use(require('last'))

しかし、関数を呼び出すと、エラーが返されますbad request <bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error>

私は何が欠けていますか?

ありがとう

4

2 に答える 2

2

基本的に、カスタム スタンザを作成し、iqとして送信する必要があります。

this.client.use(this.setCustomMessage.bind(this));
setCustomMessage(client, stanzas) {
const lastActivity = stanzas.define({
    name: 'lastActivity',
    element: 'query',
    namespace: 'jabber:iq:last',
    fields: {
    seconds: stanzas.utils.attribute('seconds')
    }
});
stanzas.withIQ(iq => {
            stanzas.extend(iq, lastActivity);
        });
}

jid をIDとして持つユーザーの lastActivity を取得する

getLastActivity(userId, cb) {
        return this.client.sendIq({
            to: 'userId',
            type: 'get',
            id: 'last',
            query: true
        }, cb);
    }
}

最後のアクティビティの結果は、次の 2 つの方法で取得できます。promise からの応答を取得する

this.getLastActivity(userId).then(data => {
    if (data && data.query && data.query.seconds) {
    // Math.round(new Date())-(parseInt(data.query.seconds, 10)*1000) 
       will give last activity 
    }
});

また

client.on('iq', data => {
    if (data.query && data.query.seconds) {
    // Math.round(new Date())-(parseInt(data.query.seconds, 10)*1000) 
       will give last activity 
    }
});
于 2017-07-17T17:35:09.463 に答える