diff --git a/sleekxmpp/plugins/xep_0352/__init__.py b/sleekxmpp/plugins/xep_0352/__init__.py new file mode 100644 index 000000000..9b66a1eed --- /dev/null +++ b/sleekxmpp/plugins/xep_0352/__init__.py @@ -0,0 +1,15 @@ +""" + SleekXMPP: The Sleek XMPP Library + Copyright (C) 2016 Nathanael C. Fritz, Lance J.T. Stout + This file is part of SleekXMPP. + + See the file LICENSE for copying permission. +""" + +from sleekxmpp.plugins.base import register_plugin + +from sleekxmpp.plugins.xep_0352.stanza import Active, Inactive, ClientStateIndication +from sleekxmpp.plugins.xep_0352.csi import XEP_0352 + + +register_plugin(XEP_0352) diff --git a/sleekxmpp/plugins/xep_0352/csi.py b/sleekxmpp/plugins/xep_0352/csi.py new file mode 100644 index 000000000..01390e711 --- /dev/null +++ b/sleekxmpp/plugins/xep_0352/csi.py @@ -0,0 +1,76 @@ +""" + SleekXMPP: The Sleek XMPP Library + Copyright (C) 2016 Nathanael C. Fritz, Lance J.T. Stout + This file is part of SleekXMPP. + + See the file LICENSE for copying permission. +""" + +import logging + +from sleekxmpp.stanza import StreamFeatures +from sleekxmpp.xmlstream import register_stanza_plugin +from sleekxmpp.plugins.base import BasePlugin +from sleekxmpp.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) + + self.xmpp.register_feature('csi', + self._handle_csi_feature, + restart=False, + order=self.order) + + + def plugin_end(self): + if self.xmpp.is_component: + return + + 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 diff --git a/sleekxmpp/plugins/xep_0352/stanza.py b/sleekxmpp/plugins/xep_0352/stanza.py new file mode 100644 index 000000000..4f6179624 --- /dev/null +++ b/sleekxmpp/plugins/xep_0352/stanza.py @@ -0,0 +1,33 @@ +""" + SleekXMPP: The Sleek XMPP Library + Copyright (C) 2016 Nathanael C. Fritz, Lance J.T. Stout + This file is part of SleekXMPP. + + See the file LICENSE for copying permission. +""" + +from sleekxmpp.stanza import Error +from sleekxmpp.xmlstream import ElementBase, StanzaBase + +class ClientStateIndication(ElementBase): + name = 'csi' + namespace = 'urn:xmpp:csi:0' + plugin_attrib = name + +class Active(StanzaBase): + name = 'active' + plugin_attrib = 'active' + namespace = 'urn:xmpp:csi:0' + + def setup(self, xml): + StanzaBase.setup(self, xml) + self.xml.tag = self.tag_name() + +class Inactive (StanzaBase): + name = 'inactive' + plugin_attrib = 'inactive' + namespace = 'urn:xmpp:csi:0' + + def setup(self, xml): + StanzaBase.setup(self, xml) + self.xml.tag = self.tag_name()