summaryrefslogtreecommitdiff
path: root/slixmpp/plugins/xep_0352/csi.py
blob: d9f38348ef7a262b89c2963dfada4e559f30d218 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

# Slixmpp: The Slick XMPP Library
# Copyright (C) 2012 Nathanael C. Fritz, Lance J.T. Stout
# This file is part of Slixmpp.
# See the file LICENSE for copying permission.
import logging

from slixmpp import ClientXMPP
from slixmpp.stanza import StreamFeatures
from slixmpp.xmlstream import register_stanza_plugin
from slixmpp.plugins.base import BasePlugin
from slixmpp.plugins.xep_0352 import stanza, Active, Inactive, ClientStateIndication


log = logging.getLogger(__name__)


class XEP_0352(BasePlugin):

    """
    XEP-0352: Client State Indication
    """

    name = 'xep_0352'
    description = 'XEP-0352: Client State Indication'
    dependencies = set()
    stanza = stanza
    default_config = {
        "order": 12000,
    }

    def plugin_init(self):
        """Start the XEP-0352 plugin."""

        self.enabled = False

        register_stanza_plugin(StreamFeatures, ClientStateIndication)
        self.xmpp.register_stanza(stanza.Active)
        self.xmpp.register_stanza(stanza.Inactive)

        if isinstance(self.xmpp, ClientXMPP):
            self.xmpp.register_feature('csi',
                    self._handle_csi_feature,
                    restart=False,
                    order=self.order)


    def plugin_end(self):
        if self.xmpp.is_component:
            return

        if isinstance(self.xmpp, ClientXMPP):
            self.xmpp.unregister_feature('csi', self.order)
        self.xmpp.remove_stanza(stanza.Active)
        self.xmpp.remove_stanza(stanza.Inactive)

    def send_active(self):
        """Send an 'active' state"""
        if self.enabled:
            self.xmpp.send_raw(str(stanza.Active(self.xmpp)))

    def send_inactive(self):
        """Send an 'active' state"""
        if self.enabled:
            self.xmpp.send_raw(str(stanza.Inactive(self.xmpp)))

    def _handle_csi_feature(self, features):
        """
        Enable CSI
        """
        if 'csi' in self.xmpp.features:
            log.debug('CSI already enabled')
            return False
        self.enabled = True
        self.xmpp.event('csi_enabled', features)
        return False