summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsetup.py1
-rw-r--r--sleekxmpp/plugins/__init__.py1
-rw-r--r--sleekxmpp/plugins/xep_0107/__init__.py11
-rw-r--r--sleekxmpp/plugins/xep_0107/stanza.py55
-rw-r--r--sleekxmpp/plugins/xep_0107/user_mood.py94
5 files changed, 162 insertions, 0 deletions
diff --git a/setup.py b/setup.py
index f90639c1..da983add 100755
--- a/setup.py
+++ b/setup.py
@@ -71,6 +71,7 @@ packages = [ 'sleekxmpp',
'sleekxmpp/plugins/xep_0085',
'sleekxmpp/plugins/xep_0086',
'sleekxmpp/plugins/xep_0092',
+ 'sleekxmpp/plugins/xep_0107',
'sleekxmpp/plugins/xep_0115',
'sleekxmpp/plugins/xep_0118',
'sleekxmpp/plugins/xep_0128',
diff --git a/sleekxmpp/plugins/__init__.py b/sleekxmpp/plugins/__init__.py
index a970b7db..a8a3e2b6 100644
--- a/sleekxmpp/plugins/__init__.py
+++ b/sleekxmpp/plugins/__init__.py
@@ -27,6 +27,7 @@ __all__ = [
'xep_0085', # Chat State Notifications
'xep_0086', # Legacy Error Codes
'xep_0092', # Software Version
+ 'xep_0107', # User Mood
'xep_0115', # Entity Capabilities
'xep_0118', # User Tune
'xep_0128', # Extended Service Discovery
diff --git a/sleekxmpp/plugins/xep_0107/__init__.py b/sleekxmpp/plugins/xep_0107/__init__.py
new file mode 100644
index 00000000..e1c5eacf
--- /dev/null
+++ b/sleekxmpp/plugins/xep_0107/__init__.py
@@ -0,0 +1,11 @@
+"""
+ 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.xep_0107 import stanza
+from sleekxmpp.plugins.xep_0107.stanza import UserMood
+from sleekxmpp.plugins.xep_0107.user_mood import xep_0107
diff --git a/sleekxmpp/plugins/xep_0107/stanza.py b/sleekxmpp/plugins/xep_0107/stanza.py
new file mode 100644
index 00000000..2c5814ea
--- /dev/null
+++ b/sleekxmpp/plugins/xep_0107/stanza.py
@@ -0,0 +1,55 @@
+"""
+ 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 UserMood(ElementBase):
+
+ name = 'mood'
+ namespace = 'http://jabber.org/protocol/mood'
+ plugin_attrib = 'mood'
+ interfaces = set(['value', 'text'])
+ sub_interfaces = set(['text'])
+ moods = set(['afraid', 'amazed', 'amorous', 'angry', 'annoyed', 'anxious',
+ 'aroused', 'ashamed', 'bored', 'brave', 'calm', 'cautious',
+ 'cold', 'confident', 'confused', 'contemplative', 'contented',
+ 'cranky', 'crazy', 'creative', 'curious', 'dejected',
+ 'depressed', 'disappointed', 'disgusted', 'dismayed',
+ 'distracted', 'embarrassed', 'envious', 'excited',
+ 'flirtatious', 'frustrated', 'grateful', 'grieving', 'grumpy',
+ 'guilty', 'happy', 'hopeful', 'hot', 'humbled', 'humiliated',
+ 'hungry', 'hurt', 'impressed', 'in_awe', 'in_love',
+ 'indignant', 'interested', 'intoxicated', 'invincible',
+ 'jealous', 'lonely', 'lost', 'lucky', 'mean', 'moody',
+ 'nervous', 'neutral', 'offended', 'outraged', 'playful',
+ 'proud', 'relaxed', 'relieved', 'remorseful', 'restless',
+ 'sad', 'sarcastic', 'satisfied', 'serious', 'shocked',
+ 'shy', 'sick', 'sleepy', 'spontaneous', 'stressed', 'strong',
+ 'surprised', 'thankful', 'thirsty', 'tired', 'undefined',
+ 'weak', 'worried'])
+
+ def set_value(self, value):
+ self.del_value()
+ if value in self.moods:
+ self._set_sub_text(value, '', keep=True)
+ else:
+ raise ValueError('Unknown mood value')
+
+ def get_value(self):
+ for child in self.xml:
+ if child.tag.startswith('{%s}' % self.namespace):
+ elem_name = child.tag.split('}')[-1]
+ if elem_name in self.moods:
+ return elem_name
+ return ''
+
+ def del_value(self):
+ curr_value = self.get_value()
+ if curr_value:
+ self._set_sub_text(curr_value, '', keep=False)
diff --git a/sleekxmpp/plugins/xep_0107/user_mood.py b/sleekxmpp/plugins/xep_0107/user_mood.py
new file mode 100644
index 00000000..534b10a6
--- /dev/null
+++ b/sleekxmpp/plugins/xep_0107/user_mood.py
@@ -0,0 +1,94 @@
+"""
+ 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 import Message
+from sleekxmpp.xmlstream import register_stanza_plugin
+from sleekxmpp.xmlstream.handler import Callback
+from sleekxmpp.xmlstream.matcher import MatchXPath
+from sleekxmpp.plugins.base import base_plugin
+from sleekxmpp.plugins.xep_0107 import stanza, UserMood
+
+
+log = logging.getLogger(__name__)
+
+
+class xep_0107(base_plugin):
+
+ """
+ XEP-0107: User Mood
+ """
+
+ def plugin_init(self):
+ self.xep = '0107'
+ self.description = 'User Mood'
+ self.stanza = stanza
+
+ def post_init(self):
+ base_plugin.post_init(self)
+
+ pubsub_stanza = self.xmpp['xep_0060'].stanza
+ register_stanza_plugin(Message, UserMood)
+ register_stanza_plugin(pubsub_stanza.EventItem, UserMood)
+
+ self.xmpp['xep_0030'].add_feature(UserMood.namespace)
+ self.xmpp['xep_0163'].add_interest(UserMood.namespace)
+ self.xmpp['xep_0060'].map_node_event(UserMood.namespace, 'user_mood')
+
+ def publish_mood(self, value=None, text=None, options=None,
+ ifrom=None, block=True, callback=None, timeout=None):
+ """
+ Publish the user's current mood.
+
+ Arguments:
+ value -- The name of the mood to publish.
+ text -- Optional natural-language description or reason
+ for the mood.
+ 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.
+ """
+ mood = UserMood()
+ mood['value'] = value
+ mood['text'] = text
+ self.xmpp['xep_0163'].publish(mood,
+ node=UserMood.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 mood 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.
+ """
+ mood = UserMood()
+ self.xmpp['xep_0163'].publish(mood,
+ node=UserMood.namespace,
+ ifrom=ifrom,
+ block=block,
+ callback=callback,
+ timeout=timeout)