From 332a5c2553db41de777473a1e1be9cd1522c9496 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Thu, 31 Mar 2016 18:54:41 +0100 Subject: Move the src directory to poezio, for better cython compatibility. --- poezio/fixes.py | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 poezio/fixes.py (limited to 'poezio/fixes.py') diff --git a/poezio/fixes.py b/poezio/fixes.py new file mode 100644 index 00000000..3840a093 --- /dev/null +++ b/poezio/fixes.py @@ -0,0 +1,97 @@ +""" +Module used to provide fixes for slixmpp functions not yet fixed +upstream. + +TODO: Check that they are fixed and remove those hacks +""" + +from slixmpp.stanza import Message +from slixmpp.xmlstream import ET + +import logging + +log = logging.getLogger(__name__) + +def has_identity(xmpp, jid, identity, on_true=None, on_false=None): + def _cb(iq): + ident = lambda x: x[0] + res = identity in map(ident, iq['disco_info']['identities']) + if res and on_true is not None: + on_true() + if not res and on_false is not None: + on_false() + xmpp.plugin['xep_0030'].get_info(jid=jid, callback=_cb) + +def get_version(xmpp, jid, callback=None, **kwargs): + def handle_result(res): + if res and res['type'] != 'error': + ret = res['software_version'].values + else: + ret = False + if callback: + callback(ret) + return ret + iq = xmpp.make_iq_get(ito=jid) + iq['query'] = 'jabber:iq:version' + result = iq.send(callback=handle_result if callback else None) + if not callback: + return handle_result(result) + + +def get_room_form(xmpp, room, callback): + def _cb(result): + if result["type"] == "error": + return callback(None) + xform = result.xml.find('{http://jabber.org/protocol/muc#owner}query/{jabber:x:data}x') + if xform is None: + return callback(None) + form = xmpp.plugin['xep_0004'].buildForm(xform) + return callback(form) + + iq = xmpp.make_iq_get(ito=room) + query = ET.Element('{http://jabber.org/protocol/muc#owner}query') + iq.append(query) + iq.send(callback=_cb) + +def _filter_add_receipt_request(self, stanza): + """ + Auto add receipt requests to outgoing messages, if: + + - ``self.auto_request`` is set to ``True`` + - The message is not for groupchat + - The message does not contain a receipt acknowledgment + - The recipient is a bare JID or, if a full JID, one + that has the ``urn:xmpp:receipts`` feature enabled + - The message has a body + + The disco cache is checked if a full JID is specified in + the outgoing message, which may mean a round-trip disco#info + delay for the first message sent to the JID if entity caps + are not used. + """ + + if not self.auto_request: + return stanza + + if not isinstance(stanza, Message): + return stanza + + if stanza['request_receipt']: + return stanza + + if not stanza['type'] in self.ack_types: + return stanza + + if stanza['receipt']: + return stanza + + if not stanza['body']: + return stanza + + # hack + if stanza['to'].resource and not hasattr(stanza, '_add_receipt'): + return stanza + + stanza['request_receipt'] = True + return stanza + -- cgit v1.2.3