mirror of
https://github.com/correl/SleekXMPP.git
synced 2024-11-24 03:00:15 +00:00
And some more docs.
This commit is contained in:
parent
d8aae88526
commit
2c5b77ae2e
1 changed files with 200 additions and 41 deletions
|
@ -32,6 +32,21 @@ class xep_0030(base_plugin):
|
||||||
|
|
||||||
Also see <http://www.xmpp.org/extensions/xep-0030.html>.
|
Also see <http://www.xmpp.org/extensions/xep-0030.html>.
|
||||||
|
|
||||||
|
The XEP-0030 plugin works using a hierarchy of dynamic
|
||||||
|
node handlers, ranging from global handlers to specific
|
||||||
|
JID+node handlers. The default set of handlers operate
|
||||||
|
in a static manner, storing disco information in memory.
|
||||||
|
However, custom handlers may use any available backend
|
||||||
|
storage mechanism desired, such as SQLite or Redis.
|
||||||
|
|
||||||
|
Node handler hierarchy:
|
||||||
|
JID | Node | Level
|
||||||
|
---------------------
|
||||||
|
None | None | Global
|
||||||
|
Given | None | All nodes for the JID
|
||||||
|
None | Given | Node on self.xmpp.boundjid
|
||||||
|
Given | Given | A single node
|
||||||
|
|
||||||
Stream Handlers:
|
Stream Handlers:
|
||||||
Disco Info -- Any Iq stanze that includes a query with the
|
Disco Info -- Any Iq stanze that includes a query with the
|
||||||
namespace http://jabber.org/protocol/disco#info.
|
namespace http://jabber.org/protocol/disco#info.
|
||||||
|
@ -44,20 +59,33 @@ class xep_0030(base_plugin):
|
||||||
disco_info_query -- Received a disco#info Iq query request.
|
disco_info_query -- Received a disco#info Iq query request.
|
||||||
disco_items_query -- Received a disco#items Iq query request.
|
disco_items_query -- Received a disco#items Iq query request.
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
stanza -- A reference to the module containing the stanza classes
|
||||||
|
provided by this plugin.
|
||||||
|
static -- Object containing the default set of static node handlers.
|
||||||
|
xmpp -- The main SleekXMPP object.
|
||||||
|
|
||||||
Methods:
|
Methods:
|
||||||
set_node_handler --
|
set_node_handler -- Assign a handler to a JID/node combination.
|
||||||
del_node_handler --
|
del_node_handler -- Remove a handler from a JID/node combination.
|
||||||
add_identity --
|
get_info -- Retrieve disco#info data, locally or remote.
|
||||||
|
get_items -- Retrieve disco#items data, locally or remote.
|
||||||
|
set_identities --
|
||||||
|
set_features --
|
||||||
|
set_items --
|
||||||
|
del_items --
|
||||||
del_identity --
|
del_identity --
|
||||||
add_feature --
|
|
||||||
del_feature --
|
del_feature --
|
||||||
add_item --
|
|
||||||
del_item --
|
del_item --
|
||||||
get_info --
|
add_identity --
|
||||||
get_items --
|
add_feature --
|
||||||
|
add_item --
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def plugin_init(self):
|
def plugin_init(self):
|
||||||
|
"""
|
||||||
|
Start the XEP-0030 plugin.
|
||||||
|
"""
|
||||||
self.xep = '0030'
|
self.xep = '0030'
|
||||||
self.description = 'Service Discovery'
|
self.description = 'Service Discovery'
|
||||||
self.stanza = sleekxmpp.plugins.xep_0030.stanza
|
self.stanza = sleekxmpp.plugins.xep_0030.stanza
|
||||||
|
@ -78,12 +106,12 @@ class xep_0030(base_plugin):
|
||||||
self.static = StaticDisco(self.xmpp)
|
self.static = StaticDisco(self.xmpp)
|
||||||
|
|
||||||
self._disco_ops = ['get_info', 'set_identities', 'set_features',
|
self._disco_ops = ['get_info', 'set_identities', 'set_features',
|
||||||
'del_info', 'get_items', 'set_items', 'del_items',
|
'get_items', 'set_items', 'del_items',
|
||||||
'add_identity', 'del_identity', 'add_feature',
|
'add_identity', 'del_identity', 'add_feature',
|
||||||
'del_feature', 'add_item', 'del_item']
|
'del_feature', 'add_item', 'del_item']
|
||||||
self.handlers = {}
|
self._handlers = {}
|
||||||
for op in self._disco_ops:
|
for op in self._disco_ops:
|
||||||
self.handlers[op] = {'global': getattr(self.static, op),
|
self._handlers[op] = {'global': getattr(self.static, op),
|
||||||
'jid': {},
|
'jid': {},
|
||||||
'node': {}}
|
'node': {}}
|
||||||
|
|
||||||
|
@ -112,7 +140,6 @@ class xep_0030(base_plugin):
|
||||||
set_identities
|
set_identities
|
||||||
set_features
|
set_features
|
||||||
set_items
|
set_items
|
||||||
del_info
|
|
||||||
del_items
|
del_items
|
||||||
del_identity
|
del_identity
|
||||||
del_feature
|
del_feature
|
||||||
|
@ -133,14 +160,14 @@ class xep_0030(base_plugin):
|
||||||
if htype not in self._disco_ops:
|
if htype not in self._disco_ops:
|
||||||
return
|
return
|
||||||
if jid is None and node is None:
|
if jid is None and node is None:
|
||||||
self.handlers[htype]['global'] = handler
|
self._handlers[htype]['global'] = handler
|
||||||
elif node is None:
|
elif node is None:
|
||||||
self.handlers[htype]['jid'][jid] = handler
|
self._handlers[htype]['jid'][jid] = handler
|
||||||
elif jid is None:
|
elif jid is None:
|
||||||
jid = self.xmpp.boundjid.full
|
jid = self.xmpp.boundjid.full
|
||||||
self.handlers[htype]['node'][(jid, node)] = handler
|
self._handlers[htype]['node'][(jid, node)] = handler
|
||||||
else:
|
else:
|
||||||
self.handlers[htype]['node'][(jid, node)] = handler
|
self._handlers[htype]['node'][(jid, node)] = handler
|
||||||
|
|
||||||
def del_node_handler(self, htype, jid, node):
|
def del_node_handler(self, htype, jid, node):
|
||||||
"""
|
"""
|
||||||
|
@ -263,36 +290,168 @@ class xep_0030(base_plugin):
|
||||||
block=kwargs.get('block', None),
|
block=kwargs.get('block', None),
|
||||||
callback=kwargs.get('callback', None))
|
callback=kwargs.get('callback', None))
|
||||||
|
|
||||||
def set_info(self, jid=None, node=None, **kwargs):
|
|
||||||
self._run_node_handler('set_info', jid, node, kwargs)
|
|
||||||
|
|
||||||
def del_info(self, jid=None, node=None, **kwargs):
|
|
||||||
self._run_node_handler('del_info', jid, node, kwargs)
|
|
||||||
|
|
||||||
def set_items(self, jid=None, node=None, **kwargs):
|
def set_items(self, jid=None, node=None, **kwargs):
|
||||||
|
"""
|
||||||
|
Set or replace all items for the specified JID/node combination.
|
||||||
|
|
||||||
|
The given items must be in a list or set where each item is a
|
||||||
|
tuple of the form: (jid, node, name).
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
jid -- The JID to modify.
|
||||||
|
node -- Optional node to modify.
|
||||||
|
items -- A series of items in tuple format.
|
||||||
|
"""
|
||||||
self._run_node_handler('set_items', jid, node, kwargs)
|
self._run_node_handler('set_items', jid, node, kwargs)
|
||||||
|
|
||||||
def del_items(self, jid=None, node=None, **kwargs):
|
def del_items(self, jid=None, node=None, **kwargs):
|
||||||
|
"""
|
||||||
|
Remove all items from the given JID/node combination.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
jid -- The JID to modify.
|
||||||
|
node -- Optional node to modify.
|
||||||
|
"""
|
||||||
self._run_node_handler('del_items', jid, node, kwargs)
|
self._run_node_handler('del_items', jid, node, kwargs)
|
||||||
|
|
||||||
def add_identity(self, jid=None, node=None, **kwargs):
|
|
||||||
self._run_node_handler('add_identity', jid, node, kwargs)
|
|
||||||
|
|
||||||
def add_feature(self, jid=None, node=None, **kwargs):
|
|
||||||
self._run_node_handler('add_feature', jid, node, kwargs)
|
|
||||||
|
|
||||||
def del_identity(self, jid=None, node=None, **kwargs):
|
|
||||||
self._run_node_handler('del_identity', jid, node, kwargs)
|
|
||||||
|
|
||||||
def del_feature(self, jid=None, node=None, **kwargs):
|
|
||||||
self._run_node_handler('del_feature', jid, node, kwargs)
|
|
||||||
|
|
||||||
def add_item(self, jid=None, node=None, **kwargs):
|
def add_item(self, jid=None, node=None, **kwargs):
|
||||||
|
"""
|
||||||
|
Add a new item element to the given JID/node combination.
|
||||||
|
|
||||||
|
Each item is required to have a JID, but may also specify
|
||||||
|
a node value to reference non-addressable entities.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
jid -- The JID to modify.
|
||||||
|
node -- The node to modify.
|
||||||
|
ijid -- The JID for the item.
|
||||||
|
inode -- Optional node for the item.
|
||||||
|
name -- Optional name for the item.
|
||||||
|
"""
|
||||||
self._run_node_handler('add_item', jid, node, kwargs)
|
self._run_node_handler('add_item', jid, node, kwargs)
|
||||||
|
|
||||||
def del_item(self, jid=None, node=None, **kwargs):
|
def del_item(self, jid=None, node=None, **kwargs):
|
||||||
|
"""
|
||||||
|
Remove a single item from the given JID/node combination.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
jid -- The JID to modify.
|
||||||
|
node -- The node to modify.
|
||||||
|
ijid -- The item's JID.
|
||||||
|
inode -- The item's node.
|
||||||
|
"""
|
||||||
self._run_node_handler('del_item', jid, node, kwargs)
|
self._run_node_handler('del_item', jid, node, kwargs)
|
||||||
|
|
||||||
|
def add_identity(self, jid=None, node=None, **kwargs):
|
||||||
|
"""
|
||||||
|
Add a new identity to the given JID/node combination.
|
||||||
|
|
||||||
|
Each identity must be unique in terms of all four identity
|
||||||
|
components: category, type, name, and language.
|
||||||
|
|
||||||
|
Multiple, identical category/type pairs are allowed only
|
||||||
|
if the xml:lang values are different. Likewise, multiple
|
||||||
|
category/type/xml:lang pairs are allowed so long as the
|
||||||
|
names are different. A category and type is always required.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
jid -- The JID to modify.
|
||||||
|
node -- The node to modify.
|
||||||
|
category -- The identity's category.
|
||||||
|
itype -- The identity's type.
|
||||||
|
name -- Optional name for the identity.
|
||||||
|
lang -- Optional two-letter language code.
|
||||||
|
"""
|
||||||
|
self._run_node_handler('add_identity', jid, node, kwargs)
|
||||||
|
|
||||||
|
def add_feature(self, jid=None, node=None, **kwargs):
|
||||||
|
"""
|
||||||
|
Add a feature to a JID/node combination.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
jid -- The JID to modify.
|
||||||
|
node -- The node to modify.
|
||||||
|
feature -- The namespace of the supported feature.
|
||||||
|
"""
|
||||||
|
self._run_node_handler('add_feature', jid, node, kwargs)
|
||||||
|
|
||||||
|
def del_identity(self, jid=None, node=None, **kwargs):
|
||||||
|
"""
|
||||||
|
Remove an identity from the given JID/node combination.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
jid -- The JID to modify.
|
||||||
|
node -- The node to modify.
|
||||||
|
category -- The identity's category.
|
||||||
|
itype -- The identity's type value.
|
||||||
|
name -- Optional, human readable name for the identity.
|
||||||
|
lang -- Optional, the identity's xml:lang value.
|
||||||
|
"""
|
||||||
|
self._run_node_handler('del_identity', jid, node, kwargs)
|
||||||
|
|
||||||
|
def del_feature(self, jid=None, node=None, **kwargs):
|
||||||
|
"""
|
||||||
|
Remove a feature from a given JID/node combination.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
jid -- The JID to modify.
|
||||||
|
node -- The node to modify.
|
||||||
|
feature -- The feature's namespace.
|
||||||
|
"""
|
||||||
|
self._run_node_handler('del_feature', jid, node, kwargs)
|
||||||
|
|
||||||
|
def set_identities(self, jid=None, node=None, **kwargs):
|
||||||
|
"""
|
||||||
|
Add or replace all identities for the given JID/node combination.
|
||||||
|
|
||||||
|
The identities must be in a set where each identity is a tuple
|
||||||
|
of the form: (category, type, lang, name)
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
jid -- The JID to modify.
|
||||||
|
node -- The node to modify.
|
||||||
|
identities -- A set of identities in tuple form.
|
||||||
|
lang -- Optional, xml:lang value.
|
||||||
|
"""
|
||||||
|
self._run_node_handler('set_identities', jid, node, kwargs)
|
||||||
|
|
||||||
|
def del_identities(self, jid=None, node=None, **kwargs):
|
||||||
|
"""
|
||||||
|
Remove all identities for a JID/node combination.
|
||||||
|
|
||||||
|
If a language is specified, only identities using that
|
||||||
|
language will be removed.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
jid -- The JID to modify.
|
||||||
|
node -- The node to modify.
|
||||||
|
lang -- Optional. If given, only remove identities
|
||||||
|
using this xml:lang value.
|
||||||
|
"""
|
||||||
|
self._run_node_handler('del_identities', jid, node, kwargs)
|
||||||
|
|
||||||
|
def set_features(self, jid=None, node=None, **kwargs):
|
||||||
|
"""
|
||||||
|
Add or replace the set of supported features
|
||||||
|
for a JID/node combination.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
jid -- The JID to modify.
|
||||||
|
node -- The node to modify.
|
||||||
|
features -- The new set of supported features.
|
||||||
|
"""
|
||||||
|
self._run_node_handler('set_features', jid, node, kwargs)
|
||||||
|
|
||||||
|
def del_features(self, jid=None, node=None, **kwargs):
|
||||||
|
"""
|
||||||
|
Remove all features from a JID/node combination.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
jid -- The JID to modify.
|
||||||
|
node -- The node to modify.
|
||||||
|
"""
|
||||||
|
self._run_node_handler('del_features', jid, node, kwargs)
|
||||||
|
|
||||||
def _run_node_handler(self, htype, jid, node, data=None):
|
def _run_node_handler(self, htype, jid, node, data=None):
|
||||||
"""
|
"""
|
||||||
Execute the most specific node handler for the given
|
Execute the most specific node handler for the given
|
||||||
|
@ -309,12 +468,12 @@ class xep_0030(base_plugin):
|
||||||
if node is None:
|
if node is None:
|
||||||
node = ''
|
node = ''
|
||||||
|
|
||||||
if self.handlers[htype]['node'].get((jid, node), False):
|
if self._handlers[htype]['node'].get((jid, node), False):
|
||||||
return self.handlers[htype]['node'][(jid, node)](jid, node, data)
|
return self._handlers[htype]['node'][(jid, node)](jid, node, data)
|
||||||
elif self.handlers[htype]['jid'].get(jid, False):
|
elif self._handlers[htype]['jid'].get(jid, False):
|
||||||
return self.handlers[htype]['jid'][jid](jid, node, data)
|
return self._handlers[htype]['jid'][jid](jid, node, data)
|
||||||
elif self.handlers[htype]['global']:
|
elif self._handlers[htype]['global']:
|
||||||
return self.handlers[htype]['global'](jid, node, data)
|
return self._handlers[htype]['global'](jid, node, data)
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue