From 5ab77c745270d7d5c016c1dc7ef2a82533a4b16e Mon Sep 17 00:00:00 2001 From: Florent Le Coz Date: Thu, 17 Jul 2014 14:19:04 +0200 Subject: Rename to slixmpp --- slixmpp/plugins/xep_0060/stanza/pubsub.py | 272 ++++++++++++++++++++++++++++++ 1 file changed, 272 insertions(+) create mode 100644 slixmpp/plugins/xep_0060/stanza/pubsub.py (limited to 'slixmpp/plugins/xep_0060/stanza/pubsub.py') diff --git a/slixmpp/plugins/xep_0060/stanza/pubsub.py b/slixmpp/plugins/xep_0060/stanza/pubsub.py new file mode 100644 index 00000000..b4293918 --- /dev/null +++ b/slixmpp/plugins/xep_0060/stanza/pubsub.py @@ -0,0 +1,272 @@ +""" + Slixmpp: The Slick XMPP Library + Copyright (C) 2011 Nathanael C. Fritz + This file is part of Slixmpp. + + See the file LICENSE for copying permission. +""" + +from slixmpp import Iq, Message +from slixmpp.xmlstream import register_stanza_plugin, ElementBase, ET, JID +from slixmpp.plugins import xep_0004 +from slixmpp.plugins.xep_0060.stanza.base import OptionalSetting + + +class Pubsub(ElementBase): + namespace = 'http://jabber.org/protocol/pubsub' + name = 'pubsub' + plugin_attrib = name + interfaces = set(tuple()) + + +class Affiliations(ElementBase): + namespace = 'http://jabber.org/protocol/pubsub' + name = 'affiliations' + plugin_attrib = name + interfaces = set(('node',)) + + +class Affiliation(ElementBase): + namespace = 'http://jabber.org/protocol/pubsub' + name = 'affiliation' + plugin_attrib = name + interfaces = set(('node', 'affiliation', 'jid')) + + def set_jid(self, value): + self._set_attr('jid', str(value)) + + def get_jid(self): + return JID(self._get_attr('jid')) + + +class Subscription(ElementBase): + namespace = 'http://jabber.org/protocol/pubsub' + name = 'subscription' + plugin_attrib = name + interfaces = set(('jid', 'node', 'subscription', 'subid')) + + def set_jid(self, value): + self._set_attr('jid', str(value)) + + def get_jid(self): + return JID(self._get_attr('jid')) + + +class Subscriptions(ElementBase): + namespace = 'http://jabber.org/protocol/pubsub' + name = 'subscriptions' + plugin_attrib = name + interfaces = set(('node',)) + + +class SubscribeOptions(ElementBase, OptionalSetting): + namespace = 'http://jabber.org/protocol/pubsub' + name = 'subscribe-options' + plugin_attrib = 'suboptions' + interfaces = set(('required',)) + + +class Item(ElementBase): + namespace = 'http://jabber.org/protocol/pubsub' + name = 'item' + plugin_attrib = name + interfaces = set(('id', 'payload')) + + def set_payload(self, value): + del self['payload'] + if isinstance(value, ElementBase): + if value.tag_name() in self.plugin_tag_map: + self.init_plugin(value.plugin_attrib, existing_xml=value.xml) + self.xml.append(value.xml) + else: + self.xml.append(value) + + def get_payload(self): + childs = list(self.xml) + if len(childs) > 0: + return childs[0] + + def del_payload(self): + for child in self.xml: + self.xml.remove(child) + + +class Items(ElementBase): + namespace = 'http://jabber.org/protocol/pubsub' + name = 'items' + plugin_attrib = name + interfaces = set(('node', 'max_items')) + + def set_max_items(self, value): + self._set_attr('max_items', str(value)) + + +class Create(ElementBase): + namespace = 'http://jabber.org/protocol/pubsub' + name = 'create' + plugin_attrib = name + interfaces = set(('node',)) + + +class Default(ElementBase): + namespace = 'http://jabber.org/protocol/pubsub' + name = 'default' + plugin_attrib = name + interfaces = set(('node', 'type')) + + def get_type(self): + t = self._get_attr('type') + if not t: + return 'leaf' + return t + + +class Publish(ElementBase): + namespace = 'http://jabber.org/protocol/pubsub' + name = 'publish' + plugin_attrib = name + interfaces = set(('node',)) + + +class Retract(ElementBase): + namespace = 'http://jabber.org/protocol/pubsub' + name = 'retract' + plugin_attrib = name + interfaces = set(('node', 'notify')) + + def get_notify(self): + notify = self._get_attr('notify') + if notify in ('0', 'false'): + return False + elif notify in ('1', 'true'): + return True + return None + + def set_notify(self, value): + del self['notify'] + if value is None: + return + elif value in (True, '1', 'true', 'True'): + self._set_attr('notify', 'true') + else: + self._set_attr('notify', 'false') + + +class Unsubscribe(ElementBase): + namespace = 'http://jabber.org/protocol/pubsub' + name = 'unsubscribe' + plugin_attrib = name + interfaces = set(('node', 'jid', 'subid')) + + def set_jid(self, value): + self._set_attr('jid', str(value)) + + def get_jid(self): + return JID(self._get_attr('jid')) + + +class Subscribe(ElementBase): + namespace = 'http://jabber.org/protocol/pubsub' + name = 'subscribe' + plugin_attrib = name + interfaces = set(('node', 'jid')) + + def set_jid(self, value): + self._set_attr('jid', str(value)) + + def get_jid(self): + return JID(self._get_attr('jid')) + + +class Configure(ElementBase): + namespace = 'http://jabber.org/protocol/pubsub' + name = 'configure' + plugin_attrib = name + interfaces = set(('node', 'type')) + + def getType(self): + t = self._get_attr('type') + if not t: + t == 'leaf' + return t + + +class Options(ElementBase): + namespace = 'http://jabber.org/protocol/pubsub' + name = 'options' + plugin_attrib = name + interfaces = set(('jid', 'node', 'options')) + + def __init__(self, *args, **kwargs): + ElementBase.__init__(self, *args, **kwargs) + + def get_options(self): + config = self.xml.find('{jabber:x:data}x') + form = xep_0004.Form(xml=config) + return form + + def set_options(self, value): + self.xml.append(value.getXML()) + return self + + def del_options(self): + config = self.xml.find('{jabber:x:data}x') + self.xml.remove(config) + + def set_jid(self, value): + self._set_attr('jid', str(value)) + + def get_jid(self): + return JID(self._get_attr('jid')) + + +class PublishOptions(ElementBase): + namespace = 'http://jabber.org/protocol/pubsub' + name = 'publish-options' + plugin_attrib = 'publish_options' + interfaces = set(('publish_options',)) + is_extension = True + + def get_publish_options(self): + config = self.xml.find('{jabber:x:data}x') + if config is None: + return None + form = xep_0004.Form(xml=config) + return form + + def set_publish_options(self, value): + if value is None: + self.del_publish_options() + else: + self.xml.append(value.getXML()) + return self + + def del_publish_options(self): + config = self.xml.find('{jabber:x:data}x') + if config is not None: + self.xml.remove(config) + self.parent().xml.remove(self.xml) + + +register_stanza_plugin(Iq, Pubsub) +register_stanza_plugin(Pubsub, Affiliations) +register_stanza_plugin(Pubsub, Configure) +register_stanza_plugin(Pubsub, Create) +register_stanza_plugin(Pubsub, Default) +register_stanza_plugin(Pubsub, Items) +register_stanza_plugin(Pubsub, Options) +register_stanza_plugin(Pubsub, Publish) +register_stanza_plugin(Pubsub, PublishOptions) +register_stanza_plugin(Pubsub, Retract) +register_stanza_plugin(Pubsub, Subscribe) +register_stanza_plugin(Pubsub, Subscription) +register_stanza_plugin(Pubsub, Subscriptions) +register_stanza_plugin(Pubsub, Unsubscribe) +register_stanza_plugin(Affiliations, Affiliation, iterable=True) +register_stanza_plugin(Configure, xep_0004.Form) +register_stanza_plugin(Items, Item, iterable=True) +register_stanza_plugin(Publish, Item, iterable=True) +register_stanza_plugin(Retract, Item) +register_stanza_plugin(Subscribe, Options) +register_stanza_plugin(Subscription, SubscribeOptions) +register_stanza_plugin(Subscriptions, Subscription, iterable=True) -- cgit v1.2.3