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/a15b98aec870e0e6c8fac08f102b5da182aa0470

-- 
View it on GitLab: 
https://dev.gajim.org/gajim/python-nbxmpp/commit/a15b98aec870e0e6c8fac08f102b5da182aa0470
You're receiving this email because of your account on dev.gajim.org.


_______________________________________________
Commits mailing list
[email protected]
https://lists.gajim.org/cgi-bin/listinfo/commits

Reply via email to