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