# HG changeset patch # User souliane # Date 1421355649 -3600 # Node ID 7d54ff2eeaf29961ddf11bdc2d63b9609bb4af95 # Parent 30895c49ebd2fd104c418aabbdbf1b40b7b1e8cd actually retrieve the MAM messages diff -r 30895c49ebd2 -r 7d54ff2eeaf2 sat_pubsub/mam.py --- a/sat_pubsub/mam.py Wed Jan 14 10:43:27 2015 +0100 +++ b/sat_pubsub/mam.py Thu Jan 15 22:00:49 2015 +0100 @@ -10,32 +10,71 @@ from zope.interface import implements +from twisted.words.xish import domish + +from sat_pubsub import const +from sat_pubsub.backend import PubSubResourceFromBackend +from wokkel.pubsub import NS_PUBSUB_EVENT + +from dateutil import parser + # TODO: change this when RSM and MAM are in wokkel -from sat.tmp.wokkel.rsm import RSMResponse +from sat.tmp.wokkel.rsm import RSMRequest from sat.tmp.wokkel.mam import MAMPrefs, IMAMResource +NS_CLIENT = 'jabber:client' + class MAMResource(object): implements(IMAMResource) - def onArchiveRequest(self, mam, rsm, requestor): + def __init__(self, backend): + self.backend = backend + + def onArchiveRequest(self, mam, requestor): """ @param mam: The MAM request. @type mam: L{MAMQueryReques} - @param rsm: The RSM request. - @type rsm: L{RSMRequest} - @param requestor: JID of the requestor. @type requestor: L{JID} @return: The RSM answer. @rtype: L{RSMResponse} """ - # TODO: send the archived messages - return RSMResponse() + ext_data = {} + if mam.form: + ext_data['filters'] = mam.form.fields.values() + if mam.rsm is None: + mam.rsm = RSMRequest(const.VAL_RSM_MAX_DEFAULT) + ext_data['rsm'] = mam.rsm + + d = self.backend.getItems(mam.node, requestor, mam.rsm.max, None, ext_data) + + def make_message(elt): + # XXX: http://xmpp.org/extensions/xep-0297.html#sect-idp629952 (rule 3) + message = domish.Element((NS_CLIENT, "message")) + event = message.addElement((NS_PUBSUB_EVENT, "event")) + items = event.addElement('items') + items["node"] = mam.node + items.addChild(elt) + return message + + def cb(elts): + msg_data = [] + rsm_elt = None + for elt in elts: + if elt.name == 'set': + rsm_elt = elt + elif elt.name == 'item': + date = parser.parse(''.join(elt.entry.published.children)) + msg_data.append([elt['id'], make_message(elt), date]) + return (msg_data, rsm_elt) + + d.addErrback(PubSubResourceFromBackend._mapErrors) + return d.addCallback(cb) def onPrefsGetRequest(self, requestor): """ diff -r 30895c49ebd2 -r 7d54ff2eeaf2 sat_pubsub/pgsql_storage.py --- a/sat_pubsub/pgsql_storage.py Wed Jan 14 10:43:27 2015 +0100 +++ b/sat_pubsub/pgsql_storage.py Thu Jan 15 22:00:49 2015 +0100 @@ -644,6 +644,20 @@ if authorized_groups: args.append(authorized_groups) + if 'filters' in ext_data: # MAM filters + for filter_ in ext_data['filters']: + if filter_.var == 'start': + source += " AND date>='{date}'".format(date=filter_.value) + if filter_.var == 'end': + source += " AND date<='{date}'".format(date=filter_.value) + if filter_.var == 'with': + jid_s = filter_.value + if '/' in jid_s: + source += " AND publisher='{pub}'".format(pub=filter_.value) + else: # assume the publisher field in DB is always a full JID + # XXX: need to escape the % with itself to avoid formatting error + source += " AND publisher LIKE '{pub}/%%'".format(pub=filter_.value) + query.append(source) order = "DESC" diff -r 30895c49ebd2 -r 7d54ff2eeaf2 sat_pubsub/tap.py --- a/sat_pubsub/tap.py Wed Jan 14 10:43:27 2015 +0100 +++ b/sat_pubsub/tap.py Thu Jan 15 22:00:49 2015 +0100 @@ -151,7 +151,7 @@ bs.roster = rc if const.FLAG_ENABLE_MAM: - mam_resource = mam.MAMResource() + mam_resource = mam.MAMResource(bs) mam_s = wokkel_mam.MAMService(mam_resource) mam_s.setHandlerParent(cs)