Плагины Stanza.io XEP-0012: последняя активность
Я хочу реализовать XEP-0012, когда по умолчанию его не поддерживает Stanza.io.
Я следую, как создать плагин из его документации, но он не работает.
Вот мой код (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>
что мне не хватает?
Спасибо
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);
});
}
и получить lastActivity пользователя, имеющего jid в качестве идентификатора
getLastActivity(userId, cb) {
return this.client.sendIq({
to: 'userId',
type: 'get',
id: 'last',
query: true
}, cb);
}
}
Вы можете получить результат последнего действия двумя способами: либо получить ответ от обещания
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
}
});
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);
});
};
добавьте этот код в ваш файл клиента
импортировать IqLastActivity из './PathToFile/iqLastActivity';
client.use (IqLastActivity);