Add support for XEP-0108: User Activity.
This commit is contained in:
		
							
								
								
									
										11
									
								
								sleekxmpp/plugins/xep_0108/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								sleekxmpp/plugins/xep_0108/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -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_0108 import stanza | ||||
| from sleekxmpp.plugins.xep_0108.stanza import UserActivity | ||||
| from sleekxmpp.plugins.xep_0108.user_activity import xep_0108 | ||||
							
								
								
									
										83
									
								
								sleekxmpp/plugins/xep_0108/stanza.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								sleekxmpp/plugins/xep_0108/stanza.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| """ | ||||
|     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 UserActivity(ElementBase): | ||||
|  | ||||
|     name = 'activity' | ||||
|     namespace = 'http://jabber.org/protocol/activity' | ||||
|     plugin_attrib = 'activity' | ||||
|     interfaces = set(['value', 'text']) | ||||
|     sub_interfaces = set(['text']) | ||||
|     general = set(['doing_chores', 'drinking', 'eating', 'exercising', | ||||
|                    'grooming', 'having_appointment', 'inactive', 'relaxing', | ||||
|                    'talking', 'traveling', 'undefined', 'working']) | ||||
|     specific = set(['at_the_spa', 'brushing_teeth', 'buying_groceries', | ||||
|                     'cleaning', 'coding', 'commuting', 'cooking', 'cycling', | ||||
|                     'dancing', 'day_off', 'doing_maintenance',  | ||||
|                     'doing_the_dishes', 'doing_the_laundry', 'driving', | ||||
|                     'fishing', 'gaming', 'gardening', 'getting_a_haircut', | ||||
|                     'going_out', 'hanging_out', 'having_a_beer', | ||||
|                     'having_a_snack', 'having_breakfast', 'having_coffee', | ||||
|                     'having_dinner', 'having_lunch', 'having_tea', 'hiding', | ||||
|                     'hiking', 'in_a_car', 'in_a_meeting', 'in_real_life', | ||||
|                     'jogging', 'on_a_bus', 'on_a_plane', 'on_a_train', | ||||
|                     'on_a_trip', 'on_the_phone', 'on_vacation', | ||||
|                     'on_video_phone', 'other', 'partying', 'playing_sports', | ||||
|                     'praying', 'reading', 'rehearsing', 'running',  | ||||
|                     'running_an_errand', 'scheduled_holiday', 'shaving', | ||||
|                     'shopping', 'skiing', 'sleeping', 'smoking', | ||||
|                     'socializing', 'studying', 'sunbathing', 'swimming', | ||||
|                     'taking_a_bath', 'taking_a_shower', 'thinking',  | ||||
|                     'walking', 'walking_the_dog', 'watching_a_movie', | ||||
|                     'watching_tv', 'working_out', 'writing']) | ||||
|  | ||||
|     def set_value(self, value): | ||||
|         self.del_value() | ||||
|         general = value | ||||
|         specific = None | ||||
|         if isinstance(value, tuple) or isinstance(value, list): | ||||
|             general = value[0] | ||||
|             specific = value[1] | ||||
|             | ||||
|         if general in self.general: | ||||
|             gen_xml = ET.Element('{%s}%s' % (self.namespace, general)) | ||||
|             if specific: | ||||
|                 spec_xml = ET.Element('{%s}%s' % (self.namespace, specific)) | ||||
|                 if specific in self.specific: | ||||
|                     gen_xml.append(spec_xml) | ||||
|                 else: | ||||
|                     raise ValueError('Unknown specific activity') | ||||
|             self.xml.append(gen_xml) | ||||
|         else: | ||||
|             raise ValueError('Unknown general activity') | ||||
|  | ||||
|     def get_value(self): | ||||
|         general = None | ||||
|         specific = None | ||||
|         gen_xml = None | ||||
|         for child in self.xml: | ||||
|             if child.tag.startswith('{%s}' % self.namespace): | ||||
|                 elem_name = child.tag.split('}')[-1] | ||||
|                 if elem_name in self.general: | ||||
|                     general = elem_name | ||||
|                     gen_xml = child | ||||
|         if gen_xml is not None: | ||||
|             for child in gen_xml: | ||||
|                 if child.tag.startswith('{%s}' % self.namespace): | ||||
|                     elem_name = child.tag.split('}')[-1] | ||||
|                     if elem_name in self.specific: | ||||
|                         specific = elem_name | ||||
|         return (general, specific) | ||||
|  | ||||
|     def del_value(self): | ||||
|         curr_value = self.get_value() | ||||
|         if curr_value[0]: | ||||
|             self._set_sub_text(curr_value[0], '', keep=False) | ||||
							
								
								
									
										94
									
								
								sleekxmpp/plugins/xep_0108/user_activity.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								sleekxmpp/plugins/xep_0108/user_activity.py
									
									
									
									
									
										Normal file
									
								
							| @@ -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.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_0108 import stanza, UserActivity | ||||
|  | ||||
|  | ||||
| log = logging.getLogger(__name__) | ||||
|  | ||||
|  | ||||
| class xep_0108(base_plugin): | ||||
|  | ||||
|     """ | ||||
|     XEP-0108: User Activity | ||||
|     """ | ||||
|  | ||||
|     def plugin_init(self): | ||||
|         self.xep = '0108' | ||||
|         self.description = 'User Activity' | ||||
|         self.stanza = stanza | ||||
|  | ||||
|     def post_init(self): | ||||
|         base_plugin.post_init(self) | ||||
|  | ||||
|         pubsub_stanza = self.xmpp['xep_0060'].stanza | ||||
|         register_stanza_plugin(pubsub_stanza.EventItem, UserActivity) | ||||
|  | ||||
|         self.xmpp['xep_0030'].add_feature(UserActivity.namespace) | ||||
|         self.xmpp['xep_0163'].add_interest(UserActivity.namespace) | ||||
|         self.xmpp['xep_0060'].map_node_event(UserActivity.namespace, 'user_activity') | ||||
|  | ||||
|     def publish_activity(self, general, specific=None, text=None, options=None,  | ||||
|                      ifrom=None, block=True, callback=None, timeout=None): | ||||
|         """ | ||||
|         Publish the user's current activity. | ||||
|  | ||||
|         Arguments: | ||||
|             general  -- The required general category of the activity. | ||||
|             specific -- Optional specific activity being done as part | ||||
|                         of the general category. | ||||
|             text     -- Optional natural-language description or reason | ||||
|                         for the activity. | ||||
|             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. | ||||
|         """ | ||||
|         activity = UserActivity() | ||||
|         activity['value'] = (general, specific) | ||||
|         activity['text'] = text | ||||
|         self.xmpp['xep_0163'].publish(activity, | ||||
|                 node=UserActivity.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. | ||||
|         """ | ||||
|         activity = UserActivity() | ||||
|         self.xmpp['xep_0163'].publish(activity,  | ||||
|                 node=UserActivity.namespace, | ||||
|                 ifrom=ifrom, | ||||
|                 block=block, | ||||
|                 callback=callback, | ||||
|                 timeout=timeout) | ||||
		Reference in New Issue
	
	Block a user
	 Lance Stout
					Lance Stout