SleekXMPP/sleekxmpp/plugins/stanza_pubsub.py
Nathan Fritz 093644ffbd * major stanza improvements
* raise XMPPError in handler to reply with error stanza
* started work on pubsub stanzas
2010-01-05 21:56:48 +00:00

177 lines
4.1 KiB
Python

from .. xmlstream.stanzabase import ElementBase, ET
from .. stanza.iq import Iq
from .. basexmpp import basexmpp
from .. xmlstream.xmlstream import XMLStream
from . import xep_0004
def stanzaPlugin(stanza, plugin):
stanza.plugin_attrib_map[plugin.plugin_attrib] = plugin
stanza.plugin_tag_map["{%s}%s" % (plugin.namespace, plugin.name)] = plugin
class Pubsub(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'pubsub'
plugin_attrib = 'pubsub'
interfaces = set((
'create',
'configure',
'subscribe',
'options',
'default',
'items',
'publish',
'retract',
'subscription',
'subscriptions',
'unsubscribe',
))
stanzaPlugin(Iq, Pubsub)
class Affiliations(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'affiliations'
plugin_attrib = 'affiliations'
interfaces = set(tuple())
def __init__(self, *args, **kwargs):
ElementBase.__init__(self, *args, **kwargs)
self.affiliations = []
self.idx = 0
def __iter__(self):
self.idx = 0
return self
def __next__(self):
self.idx += 1
if self.idx + 1 > len(self.affilations):
self.idx = 0
raise StopIteration
return self.affiliations[self.idx]
def __len__(self):
return len(self.affiliations)
def append(self, affiliation):
if not isinstance(affiliation, Affiliation):
raise TypeError
self.xml.append(affiliation.xml)
return self.affiliations.append(affiliation)
def pop(self, idx=0):
aff = self.affiliations.pop(idx)
self.xml.remove(aff.xml)
return aff
def find(self, affilation):
return self.affilations.find(affiliation)
stanzaPlugin(Pubsub, Affiliations)
class Affiliation(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'affiliation'
plugin_attrib = name
interfaces = set(('node', 'affiliation'))
class Items(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'items'
plugin_attrib = 'items'
interfaces = set(tuple())
def __init__(self, *args, **kwargs):
ElementBase.__init__(self, *args, **kwargs)
self.items = []
self.idx = 0
def __iter__(self):
self.idx = 0
return self
def __next__(self):
self.idx += 1
if self.idx + 1 > len(self.items):
self.idx = 0
raise StopIteration
return self.items[self.idx]
def __len__(self):
return len(self.items)
def append(self, item):
if not isinstance(item, Item):
raise TypeError
self.xml.append(item.xml)
return self.items.append(item)
def pop(self, idx=0):
aff = self.items.pop(idx)
self.xml.remove(aff.xml)
return aff
def find(self, item):
return self.items.find(item)
stanzaPlugin(Pubsub, Items)
class Item(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'affiliation'
plugin_attrib = name
interfaces = set(('node', 'affiliation'))
class DefaultConfig(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'default'
plugin_attrib = 'defaultconfig'
interfaces = set(('node', 'type', 'config'))
def __init__(self, *args, **kwargs):
ElementBase.__init__(self, *args, **kwargs)
def getConfig(self):
config = self.xml.find('{jabber:x:data}x')
form = xep_0004.Form()
if config is not None:
form.fromXML(config)
return form
def setConfig(self, value):
self.xml.append(value.getXML())
return self
def delConfig(self):
config = self.xml.find('{jabber:x:data}x')
self.xml.remove(config)
stanzaPlugin(Pubsub, DefaultConfig)
iq = Iq()
aff1 = Affiliation()
aff1['node'] = 'testnode'
aff1['affiliation'] = 'owner'
aff2 = Affiliation()
aff2['node'] = 'testnode2'
aff2['affiliation'] = 'publisher'
iq['pubsub']['affiliations'].append(aff1)
iq['pubsub']['affiliations'].append(aff2)
print(iq)
iq['pubsub']['affiliations'].pop(0)
print(iq)
iq = Iq()
iq['pubsub']['defaultconfig']
print(iq)
class OwnerAffiliations(Affiliations):
pass
class OwnerAffiation(Affiliation):
namespace = 'http://jabber.org/protocol/pubsub#owner'
interfaces = set(('node', 'affiliation', 'jid'))
class PubSubOwner(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub#owner'
nick = 'pubsubowner'