From 10ec92f7c61caf80a94a2ab483934ba6798e2797 Mon Sep 17 00:00:00 2001 From: Lance Stout Date: Sat, 10 Mar 2012 23:32:20 -0800 Subject: [PATCH] Add support for XEP-0107, User Mood. --- setup.py | 1 + sleekxmpp/plugins/__init__.py | 1 + sleekxmpp/plugins/xep_0107/__init__.py | 11 +++ sleekxmpp/plugins/xep_0107/stanza.py | 55 +++++++++++++++ sleekxmpp/plugins/xep_0107/user_mood.py | 94 +++++++++++++++++++++++++ 5 files changed, 162 insertions(+) create mode 100644 sleekxmpp/plugins/xep_0107/__init__.py create mode 100644 sleekxmpp/plugins/xep_0107/stanza.py create mode 100644 sleekxmpp/plugins/xep_0107/user_mood.py 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)