comparison src/plugins/plugin_xep_0334.py @ 1279:d84905c3e124

plugin XEP-0334: first draft
author souliane <souliane@mailoo.org>
date Thu, 25 Dec 2014 12:09:05 +0100
parents
children 069ad98b360d
comparison
equal deleted inserted replaced
1278:347aee3a3f5c 1279:d84905c3e124
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 # SAT plugin for Delayed Delivery (XEP-0334)
5 # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Jérôme Poisson (goffi@goffi.org)
6 # Copyright (C) 2013, 2014 Adrien Cossa (souliane@mailoo.org)
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.i18n import _
22 from sat.core.log import getLogger
23 log = getLogger(__name__)
24
25 from sat.core import exceptions
26
27 from wokkel import disco, iwokkel
28 try:
29 from twisted.words.protocols.xmlstream import XMPPHandler
30 except ImportError:
31 from wokkel.subprotocols import XMPPHandler
32 from twisted.python import failure
33 from zope.interface import implements
34
35
36 NS_MPH = 'urn:xmpp:hints'
37
38 PLUGIN_INFO = {
39 "name": "Message Processing Hints",
40 "import_name": "XEP-0334",
41 "type": "XEP",
42 "protocols": ["XEP-0334"],
43 "main": "XEP_0334",
44 "handler": "yes",
45 "description": _("""Implementation of Message Processing Hints""")
46 }
47
48
49 class XEP_0334(object):
50
51 def __init__(self, host):
52 log.info(_("Message Processing Hints plugin initialization"))
53 self.host = host
54 host.trigger.add("sendMessage", self.sendMessageTrigger)
55 host.trigger.add("MessageReceived", self.messageReceivedTrigger)
56
57 def getHandler(self, profile):
58 return XEP_0334_handler(self, profile)
59
60 def sendMessageTrigger(self, mess_data, pre_xml_treatments, post_xml_treatments, profile):
61 """Add the hints element to the message to be sent"""
62 hints = []
63 for key in ('no-permanent-storage', 'no-storage', 'no-copy'):
64 if mess_data['extra'].get(key, None):
65 hints.append(key)
66
67 def treatment(mess_data):
68 message = mess_data['xml']
69 for key in hints:
70 message.addElement((NS_MPH, key))
71 if key in ('no-permanent-storage', 'no-storage'):
72 mess_data['extra']['no_storage'] = True
73 # TODO: the core doesn't process this 'no_storage' info yet
74 # it will be added after the frontends refactorization
75 return mess_data
76
77 if hints:
78 post_xml_treatments.addCallback(treatment)
79 return True
80
81 def messageReceivedTrigger(self, message, post_treat, profile):
82 """Check for hints in the received message"""
83 hints = []
84 for key in ('no-permanent-storage', 'no-storage'):
85 try:
86 message.elements(uri=NS_MPH, name=key).next()
87 hints.append(key)
88 except StopIteration:
89 pass
90
91 def post_treat_hints(data):
92 raise failure.Failure(exceptions.SkipHistory())
93
94 if hints:
95 post_treat.addCallback(post_treat_hints)
96 return True
97
98
99 class XEP_0334_handler(XMPPHandler):
100 implements(iwokkel.IDisco)
101
102 def __init__(self, plugin_parent, profile):
103 self.plugin_parent = plugin_parent
104 self.host = plugin_parent.host
105 self.profile = profile
106
107 def getDiscoInfo(self, requestor, target, nodeIdentifier=''):
108 return [disco.DiscoFeature(NS_MPH)]
109
110 def getDiscoItems(self, requestor, target, nodeIdentifier=''):
111 return []