annotate sat_pubsub/mam.py @ 282:7d54ff2eeaf2

actually retrieve the MAM messages
author souliane <souliane@mailoo.org>
date Thu, 15 Jan 2015 22:00:49 +0100
parents 30895c49ebd2
children a776544d84e5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
280
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
1 #!/usr/bin/python
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
2 #-*- coding: utf-8 -*-
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
3
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
4 """
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
5 XMPP Message Archive Management protocol.
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
6
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
7 This protocol is specified in
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
8 U{XEP-0313<http://xmpp.org/extensions/xep-0313.html>}.
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
9 """
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
10
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
11 from zope.interface import implements
281
30895c49ebd2 fixes the imports from sat.tmp
souliane <souliane@mailoo.org>
parents: 280
diff changeset
12
282
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
13 from twisted.words.xish import domish
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
14
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
15 from sat_pubsub import const
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
16 from sat_pubsub.backend import PubSubResourceFromBackend
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
17 from wokkel.pubsub import NS_PUBSUB_EVENT
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
18
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
19 from dateutil import parser
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
20
281
30895c49ebd2 fixes the imports from sat.tmp
souliane <souliane@mailoo.org>
parents: 280
diff changeset
21 # TODO: change this when RSM and MAM are in wokkel
282
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
22 from sat.tmp.wokkel.rsm import RSMRequest
281
30895c49ebd2 fixes the imports from sat.tmp
souliane <souliane@mailoo.org>
parents: 280
diff changeset
23 from sat.tmp.wokkel.mam import MAMPrefs, IMAMResource
280
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
24
282
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
25 NS_CLIENT = 'jabber:client'
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
26
280
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
27
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
28 class MAMResource(object):
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
29
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
30 implements(IMAMResource)
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
31
282
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
32 def __init__(self, backend):
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
33 self.backend = backend
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
34
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
35 def onArchiveRequest(self, mam, requestor):
280
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
36 """
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
37
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
38 @param mam: The MAM <query/> request.
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
39 @type mam: L{MAMQueryReques<wokkel.mam.MAMQueryRequest>}
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
40
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
41 @param requestor: JID of the requestor.
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
42 @type requestor: L{JID<twisted.words.protocols.jabber.jid.JID>}
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
43
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
44 @return: The RSM answer.
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
45 @rtype: L{RSMResponse<wokkel.rsm.RSMResponse>}
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
46 """
282
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
47 ext_data = {}
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
48 if mam.form:
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
49 ext_data['filters'] = mam.form.fields.values()
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
50 if mam.rsm is None:
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
51 mam.rsm = RSMRequest(const.VAL_RSM_MAX_DEFAULT)
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
52 ext_data['rsm'] = mam.rsm
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
53
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
54 d = self.backend.getItems(mam.node, requestor, mam.rsm.max, None, ext_data)
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
55
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
56 def make_message(elt):
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
57 # XXX: http://xmpp.org/extensions/xep-0297.html#sect-idp629952 (rule 3)
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
58 message = domish.Element((NS_CLIENT, "message"))
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
59 event = message.addElement((NS_PUBSUB_EVENT, "event"))
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
60 items = event.addElement('items')
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
61 items["node"] = mam.node
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
62 items.addChild(elt)
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
63 return message
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
64
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
65 def cb(elts):
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
66 msg_data = []
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
67 rsm_elt = None
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
68 for elt in elts:
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
69 if elt.name == 'set':
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
70 rsm_elt = elt
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
71 elif elt.name == 'item':
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
72 date = parser.parse(''.join(elt.entry.published.children))
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
73 msg_data.append([elt['id'], make_message(elt), date])
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
74 return (msg_data, rsm_elt)
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
75
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
76 d.addErrback(PubSubResourceFromBackend._mapErrors)
7d54ff2eeaf2 actually retrieve the MAM messages
souliane <souliane@mailoo.org>
parents: 281
diff changeset
77 return d.addCallback(cb)
280
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
78
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
79 def onPrefsGetRequest(self, requestor):
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
80 """
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
81
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
82 @param requestor: JID of the requestor.
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
83 @type requestor: L{JID<twisted.words.protocols.jabber.jid.JID>}
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
84
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
85 @return: The current settings.
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
86 @rtype: L{wokkel.mam.MAMPrefs}
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
87 """
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
88 # TODO: return the actual current settings
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
89 return MAMPrefs()
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
90
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
91 def onPrefsSetRequest(self, prefs, requestor):
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
92 """
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
93
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
94 @param prefs: The new settings to set.
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
95 @type prefs: L{wokkel.mam.MAMPrefs}
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
96
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
97 @param requestor: JID of the requestor.
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
98 @type requestor: L{JID<twisted.words.protocols.jabber.jid.JID>}
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
99
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
100 @return: The settings that have actually been set.
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
101 @rtype: L{wokkel.mam.MAMPrefs}
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
102 """
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
103 # TODO: set the new settings and return them
798cb8962c0b MAM (XEP-0313) support: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
104 return MAMPrefs()