Stanza.io 插件 XEP-0012:上次活动

Posted

技术标签:

【中文标题】Stanza.io 插件 XEP-0012:上次活动【英文标题】:Stanza.io plugins XEP-0012: Last Activity 【发布时间】:2016-12-15 05:08:26 【问题描述】:

当 Stanza.io 默认不支持 XEP-0012 时,我想实现它。

我正在关注如何从其文档中创建插件,但它不起作用。

这是我的代码(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>

我错过了什么?

谢谢

【问题讨论】:

我不知道,但理论上你需要完整的 XMLNS (jabber:iq:last) 而不仅仅是“last” 【参考方案1】:

我们基本上需要创建一个自定义节并将其作为 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);
    

你可以通过两种方式获取上一个Activity的结果: 要么得到承诺的回应

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 
    
);

【讨论】:

【参考方案2】:
module.exports = function (client, stanzas) 

// 1. Create and register our custom `mystanza` stanza type

const helpers = stanzas.utils;

const IqLastActivity = stanzas.define(
    name: 'query',
    element: 'query',
    namespace: 'jabber:iq:last',
    fields: 
        seconds: helpers.attribute('seconds')
    
);

stanzas.withIq((Iq) => 
    stanzas.extend(Iq, IqLastActivity);
);

// eslint-disable-next-line no-param-reassign
client.lastActivityByIq = (data) => 
    client.sendIq(data);
;
client.on('iq', (iq) => 
    if (iq.query) 
        client.emit('iq:last', iq);
    
);

client.on('iq:last', (iq) => 
       console.log('iq:last', iq);
);
;

将此代码添加到您的客户端文件中

从'./PathToFile/iqLastActivity'导入IqLastActivity;

client.use(IqLastActivity);

【讨论】:

以上是关于Stanza.io 插件 XEP-0012:上次活动的主要内容,如果未能解决你的问题,请参考以下文章

使用stanza.io将自定义属性添加到不在服务器上的存档表中存储消息的消息

Stanza.io 无法创建 WebRTC 答案

Stanza.io 在 ReactJS 中发送带有客户属性的消息

如何使用 stanza.io 客户端和 ejabberd 服务器在线显示?

如何在 Nativescript 中实现 XMPP 通信?

ejabberd 上所有用户的最后活动