From 9ba5b644cf814e8515d5b2449ce01595d2689cf4 Mon Sep 17 00:00:00 2001
From: Lance Stout <lancestout@gmail.com>
Date: Mon, 11 Mar 2013 16:26:26 -0700
Subject: Add XEP-0196 for User Gaming, from mathieui

---
 setup.py                                  |  1 +
 sleekxmpp/plugins/__init__.py             |  1 +
 sleekxmpp/plugins/xep_0196/__init__.py    | 16 +++++
 sleekxmpp/plugins/xep_0196/stanza.py      | 20 +++++++
 sleekxmpp/plugins/xep_0196/user_gaming.py | 97 +++++++++++++++++++++++++++++++
 5 files changed, 135 insertions(+)
 create mode 100644 sleekxmpp/plugins/xep_0196/__init__.py
 create mode 100644 sleekxmpp/plugins/xep_0196/stanza.py
 create mode 100644 sleekxmpp/plugins/xep_0196/user_gaming.py

diff --git a/setup.py b/setup.py
index f48de173..d30b6e8e 100755
--- a/setup.py
+++ b/setup.py
@@ -97,6 +97,7 @@ packages     = [ 'sleekxmpp',
                  'sleekxmpp/plugins/xep_0184',
                  'sleekxmpp/plugins/xep_0186',
                  'sleekxmpp/plugins/xep_0191',
+                 'sleekxmpp/plugins/xep_0196',
                  'sleekxmpp/plugins/xep_0198',
                  'sleekxmpp/plugins/xep_0199',
                  'sleekxmpp/plugins/xep_0202',
diff --git a/sleekxmpp/plugins/__init__.py b/sleekxmpp/plugins/__init__.py
index e3e01a5e..36fb6dad 100644
--- a/sleekxmpp/plugins/__init__.py
+++ b/sleekxmpp/plugins/__init__.py
@@ -56,6 +56,7 @@ __all__ = [
     'xep_0184',  # Message Receipts
     'xep_0186',  # Invisible Command
     'xep_0191',  # Blocking Command
+    'xep_0196',  # User Gaming
     'xep_0198',  # Stream Management
     'xep_0199',  # Ping
     'xep_0202',  # Entity Time
diff --git a/sleekxmpp/plugins/xep_0196/__init__.py b/sleekxmpp/plugins/xep_0196/__init__.py
new file mode 100644
index 00000000..7aeaf6c9
--- /dev/null
+++ b/sleekxmpp/plugins/xep_0196/__init__.py
@@ -0,0 +1,16 @@
+"""
+    SleekXMPP: The Sleek XMPP Library
+    Copyright (C) 2012 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_0196 import stanza
+from sleekxmpp.plugins.xep_0196.stanza import UserGaming
+from sleekxmpp.plugins.xep_0196.user_gaming import XEP_0196
+
+
+register_plugin(XEP_0196)
diff --git a/sleekxmpp/plugins/xep_0196/stanza.py b/sleekxmpp/plugins/xep_0196/stanza.py
new file mode 100644
index 00000000..571c89d7
--- /dev/null
+++ b/sleekxmpp/plugins/xep_0196/stanza.py
@@ -0,0 +1,20 @@
+"""
+    SleekXMPP: The Sleek XMPP Library
+    Copyright (C) 2012 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, ET
+
+
+class UserGaming(ElementBase):
+
+    name = 'gaming'
+    namespace = 'urn:xmpp:gaming:0'
+    plugin_attrib = 'gaming'
+    interfaces = set(['character_name', 'character_profile', 'name',
+                        'level', 'server_address', 'server_name', 'uri'])
+    sub_interfaces = interfaces
+
diff --git a/sleekxmpp/plugins/xep_0196/user_gaming.py b/sleekxmpp/plugins/xep_0196/user_gaming.py
new file mode 100644
index 00000000..e78f1acc
--- /dev/null
+++ b/sleekxmpp/plugins/xep_0196/user_gaming.py
@@ -0,0 +1,97 @@
+"""
+    SleekXMPP: The Sleek XMPP Library
+    Copyright (C) 2011 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_0196 import stanza, UserGaming
+
+
+log = logging.getLogger(__name__)
+
+
+class XEP_0196(BasePlugin):
+
+    """
+    XEP-0196: User Gaming
+    """
+
+    name = 'xep_0196'
+    description = 'XEP-0196: User Gaming'
+    dependencies = set(['xep_0163'])
+    stanza = stanza
+
+    def plugin_end(self):
+        self.xmpp['xep_0030'].del_feature(feature=UserGaming.namespace)
+        self.xmpp['xep_0163'].remove_interest(UserGaming.namespace)
+
+    def session_bind(self, jid):
+        self.xmpp['xep_0163'].register_pep('user_gaming', UserGaming)
+
+    def publish_gaming(self, name=None, level=None, server_name=None, uri=None,
+                    character_name=None, character_profile=None, server_address=None,
+                    options=None, ifrom=None, block=True, callback=None, timeout=None):
+        """
+        Publish the user's current gaming status.
+
+        Arguments:
+            name              -- The name of the game.
+            level             -- The user's level in the game.
+            uri               -- A URI for the game or relevant gaming service
+            server_name       -- The name of the server where the user is playing.
+            server_address    -- The hostname or IP address of the server where the
+                                 user is playing.
+            character_name    -- The name of the user's character in the game.
+            character_profile -- A URI for a profile of the user's character.
+            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.
+        """
+        gaming = UserGaming()
+        gaming['name'] = name
+        gaming['level'] = level
+        gaming['uri'] = uri
+        gaming['character_name'] = character_name
+        gaming['character_profile'] = character_profile
+        gaming['server_name'] = server_name
+        gaming['server_address'] = server_address
+        return self.xmpp['xep_0163'].publish(gaming,
+                node=UserGaming.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 gaming 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.
+        """
+        gaming = UserGaming()
+        return self.xmpp['xep_0163'].publish(gaming,
+                node=UserGaming.namespace,
+                ifrom=ifrom,
+                block=block,
+                callback=callback,
+                timeout=timeout)
-- 
cgit v1.2.3