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
的用户的 lastActivitygetLastActivity(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 在 ReactJS 中发送带有客户属性的消息