comparison libervia/backend/plugins/plugin_xep_0428.py @ 4071:4b842c1fb686

refactoring: renamed `sat` package to `libervia.backend`
author Goffi <goffi@goffi.org>
date Fri, 02 Jun 2023 11:49:51 +0200
parents sat/plugins/plugin_xep_0428.py@524856bd7b19
children a1f7040b5a15
comparison
equal deleted inserted replaced
4070:d10748475025 4071:4b842c1fb686
1 #!/usr/bin/env python3
2
3 # Copyright (C) 2009-2022 Jérôme Poisson (goffi@goffi.org)
4
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU Affero General Public License for more details.
14
15 # You should have received a copy of the GNU Affero General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 from typing import Optional
19
20 from twisted.words.protocols.jabber import xmlstream
21 from twisted.words.xish import domish
22 from wokkel import disco
23 from zope.interface import implementer
24
25 from libervia.backend.core.constants import Const as C
26 from libervia.backend.core.i18n import _
27 from libervia.backend.core.log import getLogger
28
29 log = getLogger(__name__)
30
31
32 PLUGIN_INFO = {
33 C.PI_NAME: "Fallback Indication",
34 C.PI_IMPORT_NAME: "XEP-0428",
35 C.PI_TYPE: "XEP",
36 C.PI_PROTOCOLS: ["XEP-0428"],
37 C.PI_MAIN: "XEP_0428",
38 C.PI_HANDLER: "yes",
39 C.PI_DESCRIPTION: _("""Implementation of XEP-0428 (Fallback Indication)"""),
40 }
41
42 NS_FALLBACK = "urn:xmpp:fallback:0"
43
44
45 class XEP_0428(object):
46
47 def __init__(self, host):
48 log.info(_("XEP-0428 (Fallback Indication) plugin initialization"))
49 host.register_namespace("fallback", NS_FALLBACK)
50
51 def add_fallback_elt(
52 self,
53 message_elt: domish.Element,
54 msg: Optional[str] = None
55 ) -> None:
56 """Add the fallback indication element
57
58 @param message_elt: <message> element where the indication must be
59 set
60 @param msg: message to show as fallback
61 Will be added as <body>
62 """
63 message_elt.addElement((NS_FALLBACK, "fallback"))
64 if msg is not None:
65 message_elt.addElement("body", content=msg)
66
67 def has_fallback(self, message_elt: domish.Element) -> bool:
68 """Tell if a message has a fallback indication"""
69 try:
70 next(message_elt.elements(NS_FALLBACK, "fallback"))
71 except StopIteration:
72 return False
73 else:
74 return True
75
76 def get_handler(self, __):
77 return XEP_0428_handler()
78
79
80 @implementer(disco.IDisco)
81 class XEP_0428_handler(xmlstream.XMPPHandler):
82
83 def getDiscoInfo(self, __, target, nodeIdentifier=""):
84 return [disco.DiscoFeature(NS_FALLBACK)]
85
86 def getDiscoItems(self, requestor, target, nodeIdentifier=""):
87 return []