From 7b49c82210d6b27b18dffe36e6533024b8bee913 Mon Sep 17 00:00:00 2001
From: Lance Stout <lancestout@gmail.com>
Date: Sat, 11 May 2013 12:22:56 -0700
Subject: Add support for XEP-0152: Reachability Addresses

---
 sleekxmpp/plugins/__init__.py              |  1 +
 sleekxmpp/plugins/xep_0152/__init__.py     | 16 +++++
 sleekxmpp/plugins/xep_0152/reachability.py | 93 ++++++++++++++++++++++++++++++
 sleekxmpp/plugins/xep_0152/stanza.py       | 29 ++++++++++
 4 files changed, 139 insertions(+)
 create mode 100644 sleekxmpp/plugins/xep_0152/__init__.py
 create mode 100644 sleekxmpp/plugins/xep_0152/reachability.py
 create mode 100644 sleekxmpp/plugins/xep_0152/stanza.py

(limited to 'sleekxmpp/plugins')

diff --git a/sleekxmpp/plugins/__init__.py b/sleekxmpp/plugins/__init__.py
index 36fb6dad..016334dc 100644
--- a/sleekxmpp/plugins/__init__.py
+++ b/sleekxmpp/plugins/__init__.py
@@ -50,6 +50,7 @@ __all__ = [
     'xep_0128',  # Extended Service Discovery
     'xep_0131',  # Standard Headers and Internet Metadata
     'xep_0133',  # Service Administration
+    'xep_0152',  # Reachability Addresses
     'xep_0153',  # vCard-Based Avatars
     'xep_0163',  # Personal Eventing Protocol
     'xep_0172',  # User Nickname
diff --git a/sleekxmpp/plugins/xep_0152/__init__.py b/sleekxmpp/plugins/xep_0152/__init__.py
new file mode 100644
index 00000000..7de031b7
--- /dev/null
+++ b/sleekxmpp/plugins/xep_0152/__init__.py
@@ -0,0 +1,16 @@
+"""
+    SleekXMPP: The Sleek XMPP Library
+    Copyright (C) 2013 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_0152 import stanza
+from sleekxmpp.plugins.xep_0152.stanza import Reachability
+from sleekxmpp.plugins.xep_0152.reachability import XEP_0152
+
+
+register_plugin(XEP_0152)
diff --git a/sleekxmpp/plugins/xep_0152/reachability.py b/sleekxmpp/plugins/xep_0152/reachability.py
new file mode 100644
index 00000000..4cf81739
--- /dev/null
+++ b/sleekxmpp/plugins/xep_0152/reachability.py
@@ -0,0 +1,93 @@
+"""
+    SleekXMPP: The Sleek XMPP Library
+    Copyright (C) 2013 Nathanael C. Fritz, Lance J.T. Stout
+    This file is part of SleekXMPP.
+
+    See the file LICENSE for copying permission.
+"""
+
+import logging
+
+from sleekxmpp.plugins.base import BasePlugin
+from sleekxmpp.plugins.xep_0152 import stanza, Reachability
+
+
+log = logging.getLogger(__name__)
+
+
+class XEP_0152(BasePlugin):
+
+    """
+    XEP-0152: Reachability Addresses
+    """
+
+    name = 'xep_0152'
+    description = 'XEP-0152: Reachability Addresses'
+    dependencies = set(['xep_0163'])
+    stanza = stanza
+
+    def plugin_end(self):
+        self.xmpp['xep_0030'].del_feature(feature=Reachability.namespace)
+        self.xmpp['xep_0163'].remove_interest(Reachability.namespace)
+
+    def session_bind(self, jid):
+        self.xmpp['xep_0163'].register_pep('reachability', Reachability)
+
+    def publish_reachability(self, addresses, options=None,
+                        ifrom=None, block=True, callback=None, timeout=None):
+        """
+        Publish alternative addresses where the user can be reached.
+
+        Arguments:
+            addresses -- A list of dictionaries containing the URI and
+                         optional description for each address.
+            options   -- Optional form of publish options.
+            ifrom     -- Specify the sender's JID.
+            block     -- Specify if the send call will block until a response
+                         is received, or a timeout occurs. Defaults to True.
+            timeout   -- The length of time (in seconds) to wait for a response
+                         before exiting the send call if blocking is used.
+                         Defaults to sleekxmpp.xmlstream.RESPONSE_TIMEOUT
+            callback  -- Optional reference to a stream handler function. Will
+                         be executed when a reply stanza is received.
+        """
+        if not isinstance(addresses, (list, tuple)):
+            addresses = [addresses]
+        reach = Reachability()
+        for address in addresses:
+            if not hasattr(address, 'items'):
+                address = {'uri': address}
+
+            addr = stanza.Address()
+            for key, val in address.items():
+                addr[key] = val
+            reach.append(addr)
+        return self.xmpp['xep_0163'].publish(reach,
+                node=Reachability.namespace,
+                options=options,
+                ifrom=ifrom,
+                block=block,
+                callback=callback,
+                timeout=timeout)
+
+    def stop(self, ifrom=None, block=True, callback=None, timeout=None):
+        """
+        Clear existing user activity information to stop notifications.
+
+        Arguments:
+            ifrom    -- Specify the sender's JID.
+            block    -- Specify if the send call will block until a response
+                        is received, or a timeout occurs. Defaults to True.
+            timeout  -- The length of time (in seconds) to wait for a response
+                        before exiting the send call if blocking is used.
+                        Defaults to sleekxmpp.xmlstream.RESPONSE_TIMEOUT
+            callback -- Optional reference to a stream handler function. Will
+                        be executed when a reply stanza is received.
+        """
+        reach = Reachability()
+        return self.xmpp['xep_0163'].publish(reach,
+                node=Reachability.namespace,
+                ifrom=ifrom,
+                block=block,
+                callback=callback,
+                timeout=timeout)
diff --git a/sleekxmpp/plugins/xep_0152/stanza.py b/sleekxmpp/plugins/xep_0152/stanza.py
new file mode 100644
index 00000000..bd173ce1
--- /dev/null
+++ b/sleekxmpp/plugins/xep_0152/stanza.py
@@ -0,0 +1,29 @@
+"""
+    SleekXMPP: The Sleek XMPP Library
+    Copyright (C) 2013 Nathanael C. Fritz, Lance J.T. Stout
+    This file is part of SleekXMPP.
+
+    See the file LICENSE for copying permission.
+"""
+
+from sleekxmpp.xmlstream import ElementBase, register_stanza_plugin
+
+
+class Reachability(ElementBase):
+    name = 'reach'
+    namespace = 'urn:xmpp:reach:0'
+    plugin_attrib = 'reach'
+    interfaces = set()
+
+
+class Address(ElementBase):
+    name = 'addr'
+    namespace = 'urn:xmpp:reach:0'
+    plugin_attrib = 'address'
+    plugin_multi_attrib = 'addresses'
+    interfaces = set(['uri', 'desc'])
+    lang_interfaces = set(['desc'])
+    sub_interfaces = set(['desc'])
+
+
+register_stanza_plugin(Reachability, Address, iterable=True)
-- 
cgit v1.2.3