fixes.py 2.72 KB
Newer Older
mathieui's avatar
mathieui committed
1
"""
louiz’'s avatar
louiz’ committed
2
Module used to provide fixes for slixmpp functions not yet fixed
mathieui's avatar
mathieui committed
3
4
5
6
7
upstream.

TODO: Check that they are fixed and remove those hacks
"""

louiz’'s avatar
louiz’ committed
8
9
from slixmpp.stanza import Message
from slixmpp.xmlstream import ET
10

11
12
13
14
import logging

log = logging.getLogger(__name__)

15
16
def has_identity(xmpp, jid, identity, on_true=None, on_false=None):
    def _cb(iq):
17
        ident = lambda x: x[0]
18
19
20
21
22
23
        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)
24

mathieui's avatar
mathieui committed
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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)


41
42
43
def get_room_form(xmpp, room, callback):
    def _cb(result):
        if result["type"] == "error":
44
            return callback(None)
45
46
        xform = result.xml.find('{http://jabber.org/protocol/muc#owner}query/{jabber:x:data}x')
        if xform is None:
47
            return callback(None)
48
        form = xmpp.plugin['xep_0004'].build_form(xform)
49
        return callback(form)
50

mathieui's avatar
mathieui committed
51
52
53
    iq = xmpp.make_iq_get(ito=room)
    query = ET.Element('{http://jabber.org/protocol/muc#owner}query')
    iq.append(query)
54
    iq.send(callback=_cb)
mathieui's avatar
mathieui committed
55

56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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

91
92
93
    # hack
    if stanza['to'].resource and not hasattr(stanza, '_add_receipt'):
        return stanza
mathieui's avatar
mathieui committed
94

95
96
    stanza['request_receipt'] = True
    return stanza
97