Mercurial > libervia-backend
annotate sat/plugins/plugin_xep_0313.py @ 3011:93da7c6f8e0c
plugin XEP-0198: retrieve missing messages + send buffered ones on hot reconnection:
Missing one2one messages are now retrieved with MAM on hot reconnection, and buffered ones
(which have most probably not been received by the server) are resent at the end of the
reconnection workflow. IQ results are not re-sent on hot reconnection, as they don't make
sense anymore with a new session.
fix 330
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 17 Jul 2019 09:28:35 +0200 |
parents | 32b6893240e0 |
children | 1f74cd0f22c3 |
rev | line source |
---|---|
1934
2daf7b4c6756
use of /usr/bin/env instead of /usr/bin/python in shebang
Goffi <goffi@goffi.org>
parents:
1776
diff
changeset
|
1 #!/usr/bin/env python2 |
1277 | 2 # -*- coding: utf-8 -*- |
3 | |
4 # SAT plugin for Message Archive Management (XEP-0313) | |
2771 | 5 # Copyright (C) 2009-2019 Jérôme Poisson (goffi@goffi.org) |
1766 | 6 # Copyright (C) 2013-2016 Adrien Cossa (souliane@mailoo.org) |
1277 | 7 |
8 # This program is free software: you can redistribute it and/or modify | |
9 # it under the terms of the GNU Affero General Public License as published by | |
10 # the Free Software Foundation, either version 3 of the License, or | |
11 # (at your option) any later version. | |
12 | |
13 # This program is distributed in the hope that it will be useful, | |
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 # GNU Affero General Public License for more details. | |
17 | |
18 # You should have received a copy of the GNU Affero General Public License | |
19 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
20 | |
21 from sat.core.constants import Const as C | |
22 from sat.core.i18n import _ | |
23 from sat.core.log import getLogger | |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
24 from sat.core import exceptions |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
25 from sat.tools.common import data_format |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
26 from twisted.words.protocols.jabber import jid |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
27 from twisted.internet import defer |
1277 | 28 from zope.interface import implements |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
29 from datetime import datetime |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
30 from dateutil import tz |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
31 from wokkel import disco |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
32 from wokkel import data_form |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
33 import uuid |
1277 | 34 |
2413
70399d1acb47
tmp: removed sat.tmp hierarchy and fixed references to it as it is now an independant sat_tmp repository
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
35 # XXX: mam and rsm come from sat_tmp.wokkel |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
36 from wokkel import rsm |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
37 from wokkel import mam |
1285
ed2c718bfe03
tmp, plugins: fixes the imports fron sat.tmp
souliane <souliane@mailoo.org>
parents:
1284
diff
changeset
|
38 |
1277 | 39 |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
40 log = getLogger(__name__) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
41 |
1277 | 42 PLUGIN_INFO = { |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
43 C.PI_NAME: u"Message Archive Management", |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
44 C.PI_IMPORT_NAME: u"XEP-0313", |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
45 C.PI_TYPE: u"XEP", |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
46 C.PI_PROTOCOLS: [u"XEP-0313"], |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
47 C.PI_DEPENDENCIES: [u"XEP-0059", u"XEP-0359"], |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
48 C.PI_MAIN: u"XEP_0313", |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
49 C.PI_HANDLER: u"yes", |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
50 C.PI_DESCRIPTION: _(u"""Implementation of Message Archive Management"""), |
1277 | 51 } |
52 | |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
53 MAM_PREFIX = u"mam_" |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
54 FILTER_PREFIX = MAM_PREFIX + "filter_" |
2930
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
55 KEY_LAST_STANZA_ID = u"last_stanza_id" |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
56 MESSAGE_RESULT = "/message/result[@xmlns='{mam_ns}' and @queryid='{query_id}']" |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
57 MESSAGE_STANZA_ID = '/message/stanza-id[@xmlns="{ns_stanza_id}"]' |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
58 |
1277 | 59 |
60 class XEP_0313(object): | |
61 def __init__(self, host): | |
62 log.info(_("Message Archive Management plugin initialization")) | |
63 self.host = host | |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
64 self.host.registerNamespace(u"mam", mam.NS_MAM) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
65 self._rsm = host.plugins[u"XEP-0059"] |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
66 self._sid = host.plugins[u"XEP-0359"] |
2930
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
67 # Deferred used to store last stanza id in order of reception |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
68 self._last_stanza_id_d = defer.Deferred() |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
69 self._last_stanza_id_d.callback(None) |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
70 host.bridge.addMethod( |
2718
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
71 "MAMGet", ".plugin", in_sign='sss', |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
72 out_sign='(a(sdssa{ss}a{ss}sa{ss})a{ss}s)', method=self._getArchives, |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
73 async=True) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
74 |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
75 @defer.inlineCallbacks |
3011
93da7c6f8e0c
plugin XEP-0198: retrieve missing messages + send buffered ones on hot reconnection:
Goffi <goffi@goffi.org>
parents:
2930
diff
changeset
|
76 def resume(self, client): |
93da7c6f8e0c
plugin XEP-0198: retrieve missing messages + send buffered ones on hot reconnection:
Goffi <goffi@goffi.org>
parents:
2930
diff
changeset
|
77 """Retrieve one2one messages received since the last we have in local storage""" |
2930
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
78 stanza_id_data = yield self.host.memory.storage.getPrivates( |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
79 mam.NS_MAM, [KEY_LAST_STANZA_ID], profile=client.profile) |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
80 stanza_id = stanza_id_data.get(KEY_LAST_STANZA_ID) |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
81 if stanza_id is None: |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
82 log.info(u"can't retrieve last stanza ID, checking history") |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
83 last_mess = yield self.host.memory.historyGet( |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
84 None, None, limit=1, filters={u'not_types': C.MESS_TYPE_GROUPCHAT, |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
85 u'last_stanza_id': True}, |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
86 profile=client.profile) |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
87 if not last_mess: |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
88 log.info(_(u"It seems that we have no MAM history yet")) |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
89 return |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
90 stanza_id = last_mess[0][-1][u'stanza_id'] |
2718
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
91 rsm_req = rsm.RSMRequest(max_=100, after=stanza_id) |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
92 mam_req = mam.MAMRequest(rsm_=rsm_req) |
2718
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
93 complete = False |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
94 count = 0 |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
95 while not complete: |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
96 mam_data = yield self.getArchives(client, mam_req, |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
97 service=client.jid.userhostJID()) |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
98 elt_list, rsm_response, mam_response = mam_data |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
99 complete = mam_response[u"complete"] |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
100 # we update MAM request for next iteration |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
101 mam_req.rsm.after = rsm_response.last |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
102 if not elt_list: |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
103 break |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
104 else: |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
105 count += len(elt_list) |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
106 |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
107 for mess_elt in elt_list: |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
108 try: |
2930
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
109 fwd_message_elt = self.getMessageFromResult( |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
110 client, mess_elt, mam_req) |
2718
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
111 except exceptions.DataError: |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
112 continue |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
113 |
2930
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
114 try: |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
115 destinee = jid.JID(fwd_message_elt['to']) |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
116 except KeyError: |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
117 log.warning(_(u'missing "to" attribute in forwarded message')) |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
118 destinee = client.jid |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
119 if destinee.userhostJID() == client.jid.userhostJID(): |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
120 # message to use, we insert the forwarded message in the normal |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
121 # workflow |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
122 client.xmlstream.dispatch(fwd_message_elt) |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
123 else: |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
124 # this message should be from us, we just add it to history |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
125 try: |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
126 from_jid = jid.JID(fwd_message_elt['from']) |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
127 except KeyError: |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
128 log.warning(_(u'missing "from" attribute in forwarded message')) |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
129 from_jid = client.jid |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
130 if from_jid.userhostJID() != client.jid.userhostJID(): |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
131 log.warning(_( |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
132 u'was expecting a message sent by our jid, but this one if ' |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
133 u'from {from_jid}, ignoring\n{xml}').format( |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
134 from_jid=from_jid.full(), xml=mess_elt.toXml())) |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
135 continue |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
136 # adding message to history |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
137 mess_data = client.messageProt.parseMessage(fwd_message_elt) |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
138 yield client.messageProt.addToHistory(mess_data) |
2718
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
139 |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
140 if not count: |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
141 log.info(_(u"We have received no message while offline")) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
142 else: |
2718
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
143 log.info(_(u"We have received {num_mess} message(s) while offline.") |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
144 .format(num_mess=count)) |
1277 | 145 |
3011
93da7c6f8e0c
plugin XEP-0198: retrieve missing messages + send buffered ones on hot reconnection:
Goffi <goffi@goffi.org>
parents:
2930
diff
changeset
|
146 def profileConnected(self, client): |
93da7c6f8e0c
plugin XEP-0198: retrieve missing messages + send buffered ones on hot reconnection:
Goffi <goffi@goffi.org>
parents:
2930
diff
changeset
|
147 return self.resume(client) |
93da7c6f8e0c
plugin XEP-0198: retrieve missing messages + send buffered ones on hot reconnection:
Goffi <goffi@goffi.org>
parents:
2930
diff
changeset
|
148 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
149 def getHandler(self, client): |
2930
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
150 mam_client = client._mam = SatMAMClient(self) |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
151 return mam_client |
1277 | 152 |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
153 def parseExtra(self, extra, with_rsm=True): |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
154 """Parse extra dictionnary to retrieve MAM arguments |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
155 |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
156 @param extra(dict): data for parse |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
157 @param with_rsm(bool): if True, RSM data will be parsed too |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
158 @return (data_form, None): request with parsed arguments |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
159 or None if no MAM arguments have been found |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
160 """ |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
161 mam_args = {} |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
162 form_args = {} |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
163 for arg in (u"start", u"end"): |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
164 try: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
165 value = extra.pop(MAM_PREFIX + arg) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
166 form_args[arg] = datetime.fromtimestamp(float(value), tz.tzutc()) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
167 except (TypeError, ValueError): |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
168 log.warning(u"Bad value for {arg} filter ({value}), ignoring".format( |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
169 arg=arg, value=value)) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
170 except KeyError: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
171 continue |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
172 |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
173 try: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
174 form_args[u"with_jid"] = jid.JID(extra.pop( |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
175 MAM_PREFIX + u"with")) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
176 except (jid.InvalidFormat): |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
177 log.warning(u"Bad value for jid filter") |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
178 except KeyError: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
179 pass |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
180 |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
181 for name, value in extra.iteritems(): |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
182 if name.startswith(FILTER_PREFIX): |
2763 | 183 var = name[len(FILTER_PREFIX):] |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
184 extra_fields = form_args.setdefault(u"extra_fields", []) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
185 extra_fields.append(data_form.Field(var=var, value=value)) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
186 |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
187 for arg in (u"node", u"query_id"): |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
188 try: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
189 value = extra.pop(MAM_PREFIX + arg) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
190 mam_args[arg] = value |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
191 except KeyError: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
192 continue |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
193 |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
194 if with_rsm: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
195 rsm_request = self._rsm.parseExtra(extra) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
196 if rsm_request is not None: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
197 mam_args["rsm_"] = rsm_request |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
198 |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
199 if form_args: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
200 mam_args["form"] = mam.buildForm(**form_args) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
201 |
2760
3480d4fdf83a
plugins XEP-0060, XEP-0313: implemented Order-By protoXEP:
Goffi <goffi@goffi.org>
parents:
2718
diff
changeset
|
202 # we only set orderBy if we have other MAM args |
3480d4fdf83a
plugins XEP-0060, XEP-0313: implemented Order-By protoXEP:
Goffi <goffi@goffi.org>
parents:
2718
diff
changeset
|
203 # else we would make a MAM query while it's not expected |
3480d4fdf83a
plugins XEP-0060, XEP-0313: implemented Order-By protoXEP:
Goffi <goffi@goffi.org>
parents:
2718
diff
changeset
|
204 if u"order_by" in extra and mam_args: |
3480d4fdf83a
plugins XEP-0060, XEP-0313: implemented Order-By protoXEP:
Goffi <goffi@goffi.org>
parents:
2718
diff
changeset
|
205 order_by = extra.pop(u"order_by") |
3480d4fdf83a
plugins XEP-0060, XEP-0313: implemented Order-By protoXEP:
Goffi <goffi@goffi.org>
parents:
2718
diff
changeset
|
206 assert isinstance(order_by, list) |
3480d4fdf83a
plugins XEP-0060, XEP-0313: implemented Order-By protoXEP:
Goffi <goffi@goffi.org>
parents:
2718
diff
changeset
|
207 mam_args["orderBy"] = order_by |
3480d4fdf83a
plugins XEP-0060, XEP-0313: implemented Order-By protoXEP:
Goffi <goffi@goffi.org>
parents:
2718
diff
changeset
|
208 |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
209 return mam.MAMRequest(**mam_args) if mam_args else None |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
210 |
2718
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
211 def serialise(self, mam_response, data=None): |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
212 """Serialise data for MAM |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
213 |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
214 Key set in data can be: |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
215 - mam_complete: a bool const indicating if all items have been received |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
216 - mam_stable: a bool const which is False if items order may be changed |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
217 All values are set as strings. |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
218 @param mam_response(dict): response data to serialise |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
219 @param data(dict, None): dict to update with mam_* data. |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
220 If None, a new dict is created |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
221 @return (dict): data dict |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
222 """ |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
223 if data is None: |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
224 data = {} |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
225 data[u"mam_complete"] = C.boolConst(mam_response[u'complete']) |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
226 data[u"mam_stable"] = C.boolConst(mam_response[u'stable']) |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
227 return data |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
228 |
2713
19000c506d0c
plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents:
2701
diff
changeset
|
229 def getMessageFromResult(self, client, mess_elt, mam_req, service=None): |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
230 """Extract usable <message/> from MAM query result |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
231 |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
232 The message will be validated, and stanza-id/delay will be added if necessary. |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
233 @param mess_elt(domish.Element): result <message/> element wrapping the message |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
234 to retrieve |
2718
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
235 @param mam_req(mam.MAMRequest): request used (needed to get query_id) |
2713
19000c506d0c
plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents:
2701
diff
changeset
|
236 @param service(jid.JID, None): MAM service where the request has been sent |
19000c506d0c
plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents:
2701
diff
changeset
|
237 None if it's user server |
2930
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
238 @return domish.Element): <message/> that can be used directly with onMessage |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
239 """ |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
240 if mess_elt.name != u"message": |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
241 log.warning(u"unexpected stanza in archive: {xml}".format( |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
242 xml=mess_elt.toXml())) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
243 raise exceptions.DataError(u"Invalid element") |
2713
19000c506d0c
plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents:
2701
diff
changeset
|
244 service_jid = client.jid.userhostJID() if service is None else service |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
245 mess_from = mess_elt[u"from"] |
2713
19000c506d0c
plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents:
2701
diff
changeset
|
246 # we check that the message has been sent by the right service |
19000c506d0c
plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents:
2701
diff
changeset
|
247 # if service is None (i.e. message expected from our own server) |
19000c506d0c
plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents:
2701
diff
changeset
|
248 # from can be server jid or user's bare jid |
19000c506d0c
plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents:
2701
diff
changeset
|
249 if (mess_from != service_jid.full() |
19000c506d0c
plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents:
2701
diff
changeset
|
250 and not (service is None and mess_from == client.jid.host)): |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
251 log.error(u"Message is not from our server, something went wrong: " |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
252 u"{xml}".format(xml=mess_elt.toXml())) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
253 raise exceptions.DataError(u"Invalid element") |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
254 try: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
255 result_elt = next(mess_elt.elements(mam.NS_MAM, u"result")) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
256 forwarded_elt = next(result_elt.elements(C.NS_FORWARD, u"forwarded")) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
257 try: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
258 delay_elt = next(forwarded_elt.elements(C.NS_DELAY, u"delay")) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
259 except StopIteration: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
260 # delay_elt is not mandatory |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
261 delay_elt = None |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
262 fwd_message_elt = next(forwarded_elt.elements(C.NS_CLIENT, u"message")) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
263 except StopIteration: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
264 log.warning(u"Invalid message received from MAM: {xml}".format( |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
265 xml=mess_elt.toXml())) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
266 raise exceptions.DataError(u"Invalid element") |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
267 else: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
268 if not result_elt[u"queryid"] == mam_req.query_id: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
269 log.error(u"Unexpected query id (was expecting {query_id}): {xml}" |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
270 .format(query_id=mam.query_id, xml=mess_elt.toXml())) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
271 raise exceptions.DataError(u"Invalid element") |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
272 stanza_id = self._sid.getStanzaId(fwd_message_elt, |
2713
19000c506d0c
plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents:
2701
diff
changeset
|
273 service_jid) |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
274 if stanza_id is None: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
275 # not stanza-id element is present, we add one so message |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
276 # will be archived with it, and we won't request several times |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
277 # the same MAM achive |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
278 try: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
279 stanza_id = result_elt[u"id"] |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
280 except AttributeError: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
281 log.warning(u'Invalid MAM result: missing "id" attribute: {xml}' |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
282 .format(xml=result_elt.toXml())) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
283 raise exceptions.DataError(u"Invalid element") |
2713
19000c506d0c
plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents:
2701
diff
changeset
|
284 self._sid.addStanzaId(client, fwd_message_elt, stanza_id, by=service_jid) |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
285 |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
286 if delay_elt is not None: |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
287 fwd_message_elt.addChild(delay_elt) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
288 |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
289 return fwd_message_elt |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
290 |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
291 def queryFields(self, client, service=None): |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
292 """Ask the server about supported fields. |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
293 |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
294 @param service: entity offering the MAM service (None for user archives) |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
295 @return (D(data_form.Form)): form with the implemented fields (cf XEP-0313 §4.1.5) |
1277 | 296 """ |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
297 return client._mam.queryFields(service) |
1277 | 298 |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
299 def queryArchive(self, client, mam_req, service=None): |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
300 """Query a user, MUC or pubsub archive. |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
301 |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
302 @param mam_req(mam.MAMRequest): MAM query instance |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
303 @param service(jid.JID, None): entity offering the MAM service |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
304 None for user server |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
305 @return (D(domish.Element)): <IQ/> result |
1277 | 306 """ |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
307 return client._mam.queryArchive(mam_req, service) |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
308 |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
309 def _appendMessage(self, elt_list, message_cb, message_elt): |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
310 if message_cb is not None: |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
311 elt_list.append(message_cb(message_elt)) |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
312 else: |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
313 elt_list.append(message_elt) |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
314 |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
315 def _queryFinished(self, iq_result, client, elt_list, event): |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
316 client.xmlstream.removeObserver(event, self._appendMessage) |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
317 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
318 fin_elt = iq_result.elements(mam.NS_MAM, "fin").next() |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
319 except StopIteration: |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
320 raise exceptions.DataError(u"Invalid MAM result") |
1277 | 321 |
2718
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
322 mam_response = {u"complete": C.bool(fin_elt.getAttribute(u"complete", C.BOOL_FALSE)), |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
323 u"stable": C.bool(fin_elt.getAttribute(u"stable", C.BOOL_TRUE))} |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
324 |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
325 try: |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
326 rsm_response = rsm.RSMResponse.fromElement(fin_elt) |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
327 except rsm.RSMNotFoundError: |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
328 rsm_response = None |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
329 |
2718
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
330 return (elt_list, rsm_response, mam_response) |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
331 |
2713
19000c506d0c
plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents:
2701
diff
changeset
|
332 def serializeArchiveResult(self, data, client, mam_req, service): |
2718
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
333 elt_list, rsm_response, mam_response = data |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
334 mess_list = [] |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
335 for elt in elt_list: |
2713
19000c506d0c
plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents:
2701
diff
changeset
|
336 fwd_message_elt = self.getMessageFromResult(client, elt, mam_req, |
19000c506d0c
plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents:
2701
diff
changeset
|
337 service=service) |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
338 mess_data = client.messageProt.parseMessage(fwd_message_elt) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
339 mess_list.append(client.messageGetBridgeArgs(mess_data)) |
2718
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
340 metadata = self._rsm.serialise(rsm_response) |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
341 self.serialise(mam_response, metadata) |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
342 return mess_list, metadata, client.profile |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
343 |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
344 def _getArchives(self, service, extra_ser, profile_key): |
2718
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
345 """ |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
346 @return: tuple with: |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
347 - list of message with same data as in bridge.messageNew |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
348 - response metadata with: |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
349 - rsm data (rsm_first, rsm_last, rsm_count, rsm_index) |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
350 - mam data (mam_complete, mam_stable) |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
351 - profile |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
352 """ |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
353 client = self.host.getClient(profile_key) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
354 service = jid.JID(service) if service else None |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
355 extra = data_format.deserialise(extra_ser, {}) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
356 mam_req = self.parseExtra(extra) |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
357 |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
358 d = self.getArchives(client, mam_req, service=service) |
2713
19000c506d0c
plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents:
2701
diff
changeset
|
359 d.addCallback(self.serializeArchiveResult, client, mam_req, service) |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
360 return d |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
361 |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
362 def getArchives(self, client, query, service=None, message_cb=None): |
2718
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
363 """Query archive and gather page result |
1277 | 364 |
2718
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
365 @param query(mam.MAMRequest): MAM request |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
366 @param service(jid.JID, None): MAM service to use |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
367 None to use our own server |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
368 @param message_cb(callable, None): callback to use on each message |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
369 this method can be used to unwrap messages |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
370 @return (tuple[list[domish.Element], rsm.RSMResponse, dict): result data with: |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
371 - list of found elements |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
372 - RSM response |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
373 - MAM response, which is a dict with following value: |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
374 - complete: a boolean which is True if all items have been received |
bb6adaa580ee
plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents:
2713
diff
changeset
|
375 - stable: a boolean which is False if items order may be changed |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
376 """ |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
377 if query.query_id is None: |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
378 query.query_id = unicode(uuid.uuid4()) |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
379 elt_list = [] |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
380 event = MESSAGE_RESULT.format(mam_ns=mam.NS_MAM, query_id=query.query_id) |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
381 client.xmlstream.addObserver(event, self._appendMessage, 0, elt_list, message_cb) |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
382 d = self.queryArchive(client, query, service) |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
383 d.addCallback(self._queryFinished, client, elt_list, event) |
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
384 return d |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
385 |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
386 def getPrefs(self, client, service=None): |
1277 | 387 """Retrieve the current user preferences. |
388 | |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
389 @param service: entity offering the MAM service (None for user archives) |
1277 | 390 @return: the server response as a Deferred domish.Element |
391 """ | |
392 # http://xmpp.org/extensions/xep-0313.html#prefs | |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
393 return client._mam.queryPrefs(service) |
1277 | 394 |
2701
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
395 def _setPrefs(self, service_s=None, default="roster", always=None, never=None, |
2ea2369ae7de
plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
396 profile_key=C.PROF_KEY_NONE): |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
397 service = jid.JID(service_s) if service_s else None |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
398 always_jid = [jid.JID(entity) for entity in always] |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
399 never_jid = [jid.JID(entity) for entity in never] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
400 # TODO: why not build here a MAMPrefs object instead of passing the args separately? |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
401 return self.setPrefs(service, default, always_jid, never_jid, profile_key) |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
402 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
403 def setPrefs(self, client, service=None, default="roster", always=None, never=None): |
1277 | 404 """Set news user preferences. |
405 | |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
406 @param service: entity offering the MAM service (None for user archives) |
1277 | 407 @param default (unicode): a value in ('always', 'never', 'roster') |
408 @param always (list): a list of JID instances | |
409 @param never (list): a list of JID instances | |
410 @param profile_key (unicode): %(doc_profile_key)s | |
411 @return: the server response as a Deferred domish.Element | |
412 """ | |
413 # http://xmpp.org/extensions/xep-0313.html#prefs | |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
414 return client._mam.setPrefs(service, default, always, never) |
1277 | 415 |
2930
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
416 def onMessageStanzaId(self, message_elt, client): |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
417 """Called when a message with a stanza-id is received |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
418 |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
419 the messages' stanza ids are stored when received, so the last one can be used |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
420 to retrieve missing history on next connection |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
421 @param message_elt(domish.Element): <message> with a stanza-id |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
422 """ |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
423 service_jid = client.jid.userhostJID() |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
424 stanza_id = self._sid.getStanzaId(message_elt, service_jid) |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
425 if stanza_id is None: |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
426 log.debug(u"Ignoring <message>, stanza id is not from our server") |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
427 else: |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
428 # we use self._last_stanza_id_d do be sure that last_stanza_id is stored in |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
429 # the order of reception |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
430 self._last_stanza_id_d.addCallback( |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
431 lambda __: self.host.memory.storage.setPrivateValue( |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
432 namespace=mam.NS_MAM, |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
433 key=KEY_LAST_STANZA_ID, |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
434 value=stanza_id, |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
435 profile=client.profile)) |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
436 |
1277 | 437 |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
438 class SatMAMClient(mam.MAMClient): |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
439 implements(disco.IDisco) |
1277 | 440 |
2930
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
441 def __init__(self, plugin_parent): |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
442 self.plugin_parent = plugin_parent |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
443 |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
444 @property |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
445 def host(self): |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
446 return self.parent.host_app |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
447 |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
448 def connectionInitialized(self): |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
449 observer_xpath = MESSAGE_STANZA_ID.format( |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
450 ns_stanza_id=self.host.ns_map[u'stanza_id']) |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
451 self.xmlstream.addObserver( |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
452 observer_xpath, self.plugin_parent.onMessageStanzaId, client=self.parent |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
453 ) |
32b6893240e0
plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
454 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
455 def getDiscoInfo(self, requestor, target, nodeIdentifier=""): |
1776
4fc1bf1af48f
plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
456 return [disco.DiscoFeature(mam.NS_MAM)] |
1277 | 457 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
458 def getDiscoItems(self, requestor, target, nodeIdentifier=""): |
1277 | 459 return [] |