Mercurial > xmpp-account-manager
diff strophe.mam.js @ 24:6c620e9f7d2c
Add support for retrieving all MAM messages, and for downloading it in a XEP-0227-like format.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Sun, 23 Dec 2018 15:39:51 +0100 |
parents | |
children | 599b324fac2b |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/strophe.mam.js @@ -0,0 +1,82 @@ +/* XEP-0313: Message Archive Management + * Copyright (C) 2012 Kim Alvefur + * Copyright (C) 2018 Emmanuel Gil Peyrot + * + * This file is MIT/X11 licensed. Please see the + * LICENSE.txt file in the source package for more information. + * + * Modified by: Chris Tunbridge (github.com/Destreyf/) + * Updated to support v0.3 of the XMPP XEP-0313 standard + * http://xmpp.org/extensions/xep-0313.html + * + */ +//import { $iq, Strophe } from 'strophe.js'; + +Strophe.addConnectionPlugin('mam', { + _c: null, + _p: [ 'with', 'start', 'end' ], + init: function (conn) { + this._c = conn; + Strophe.addNamespace('MAM', 'urn:xmpp:mam:2'); + Strophe.addNamespace('Forward', 'urn:xmpp:forward:0'); + }, + query: function (jid, options) { + var _c = this._c; + var _p = this._p; + var attr = { + type:'set', + to:jid + }; + options = options || {}; + var queryid = options.queryid; + if (queryid) { + delete options.queryid; + } else { + queryid = _c.getUniqueId(); + } + var iq = $iq(attr).c('query', {xmlns: Strophe.NS.MAM, queryid: queryid}).c('x',{xmlns:'jabber:x:data', type:'submit'}); + + iq.c('field',{var:'FORM_TYPE', type:'hidden'}).c('value').t(Strophe.NS.MAM).up().up(); + for (var i = 0; i < _p.length; i++) { + var pn = _p[i]; + var p = options[pn]; + delete options[pn]; + if (p) { + iq.c('field',{var:pn}).c('value').t(p).up().up(); + } + } + iq.up(); + + var onMessage = options.onMessage; + delete options.onMessage; + var onComplete = options.onComplete; + delete options.onComplete; + iq.cnode(new Strophe.RSM(options).toXML()); + + var handler = _c.addHandler(function (message) { + // TODO: check the emitter too! + var result = message.firstChild; + if (!result || result.namespaceURI !== Strophe.NS.MAM || result.localName !== 'result' || result.getAttributeNS(null, 'queryid') !== queryid) + return true; + var id = result.getAttributeNS(null, 'id'); + var forwarded = result.firstChild; + if (!forwarded || forwarded.namespaceURI !== Strophe.NS.Forward || forwarded.localName !== 'forwarded') + return true; + var delay = null; + var childMessage = null; + for (var child of forwarded.childNodes.values()) { + if (child.namespaceURI === 'urn:xmpp:delay' && child.localName === 'delay' && delay === null) + delay = child; + else if (child.namespaceURI === 'jabber:client' && child.localName === 'message' && childMessage === null) + childMessage = child; + } + if (childMessage !== null && delay !== null) + onMessage(childMessage, delay, id); + return true; + }, Strophe.NS.MAM, 'message', null); + return _c.sendIQ(iq, function(){ + _c.deleteHandler(handler); + onComplete.apply(this, arguments); + }); + } +});