Philipp Hörist pushed to branch master at gajim / python-nbxmpp
Commits: a15b98ae by Philipp Hörist at 2019-10-12T13:17:20Z Add Receipts (XEP-0184) support
- - - - -
4 changed files:
- nbxmpp/dispatcher.py - + nbxmpp/modules/receipts.py - nbxmpp/protocol.py - nbxmpp/structs.py
Changes:
===================================== nbxmpp/dispatcher.py ===================================== @@ -72,6 +72,7 @@ from nbxmpp.modules.adhoc import AdHoc from nbxmpp.modules.ibb import IBB from nbxmpp.modules.discovery import Discovery from nbxmpp.modules.chat_markers import ChatMarkers +from nbxmpp.modules.receipts import Receipts from nbxmpp.modules.misc import unwrap_carbon from nbxmpp.modules.misc import unwrap_mam from nbxmpp.util import get_properties_struct @@ -211,6 +212,7 @@ class XMPPDispatcher(PlugIn): self._modules['IBB'] = IBB(self._owner) self._modules['Discovery'] = Discovery(self._owner) self._modules['ChatMarkers'] = ChatMarkers(self._owner) + self._modules['Receipts'] = Receipts(self._owner)
for instance in self._modules.values(): for handler in instance.handlers:
===================================== nbxmpp/modules/receipts.py ===================================== @@ -0,0 +1,51 @@ +# Copyright (C) 2018 Philipp Hörist <philipp AT hoerist.com> +# +# This file is part of nbxmpp. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 3 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; If not, see http://www.gnu.org/licenses/. + +import logging + +from nbxmpp.protocol import NS_RECEIPTS +from nbxmpp.structs import StanzaHandler +from nbxmpp.structs import ReceiptData + +log = logging.getLogger('nbxmpp.m.receipts') + + +class Receipts: + def __init__(self, client): + self._client = client + self.handlers = [ + StanzaHandler(name='message', + callback=self._process_message_receipt, + ns=NS_RECEIPTS, + priority=15), + ] + + def _process_message_receipt(self, _con, stanza, properties): + request = stanza.getTag('request', namespace=NS_RECEIPTS) + if request is not None: + properties.receipt = ReceiptData(request.getName()) + return + + received = stanza.getTag('received', namespace=NS_RECEIPTS) + if received is not None: + id_ = received.getAttr('id') + if id_ is None: + log.warning('Receipt without id attr') + log.warning(stanza) + return + + properties.receipt = ReceiptData(received.getName(), id_)
===================================== nbxmpp/protocol.py ===================================== @@ -1323,6 +1323,11 @@ class Message(Protocol): """ self.setTag('origin-id', namespace=NS_SID, attrs={'id': val})
+ def buildReceipt(self): + message = Message(to=self.getFrom().getBare(), typ=self.getType()) + message.setReceiptReceived(self.getID()) + return message + def buildReply(self, text=None): """ Builds and returns another message object with specified text. The to, @@ -1352,6 +1357,12 @@ class Message(Protocol): def setMarkable(self): self.setTag('markable', namespace=NS_CHATMARKERS)
+ def setReceiptRequest(self): + self.setTag('request', namespace=NS_RECEIPTS) + + def setReceiptReceived(self, id_): + self.setTag('received', namespace=NS_RECEIPTS, attrs={'id': id_}) +
class Presence(Protocol):
===================================== nbxmpp/structs.py ===================================== @@ -485,6 +485,22 @@ class CarbonData(namedtuple('MAMData', 'type')): return self.type == 'received'
+class ReceiptData(namedtuple('ReceiptData', 'type id')): + + __slots__ = [] + + def __new__(cls, type, id=None): + return super(ReceiptData, cls).__new__(cls, type, id) + + @property + def is_request(self): + return self.type == 'request' + + @property + def is_received(self): + return self.type == 'received' + + class Properties: pass
@@ -528,6 +544,7 @@ class MessageProperties: self.encrypted = None self.pgp_legacy = None self.marker = None + self.receipt = None
@property def has_user_delay(self): @@ -604,6 +621,10 @@ class MessageProperties: def is_marker(self): return self.marker is not None
+ @property + def is_receipt(self): + return self.receipt is not None +
class IqProperties: def __init__(self):
View it on GitLab: https://dev.gajim.org/gajim/python-nbxmpp/commit/a15b98aec870e0e6c8fac08f102...