Update XEP-0030 and XEP-0059 to new system.
This commit is contained in:
parent
1a153487c3
commit
8b06d10415
@ -11,17 +11,18 @@ import logging
|
|||||||
import sleekxmpp
|
import sleekxmpp
|
||||||
from sleekxmpp import Iq
|
from sleekxmpp import Iq
|
||||||
from sleekxmpp.exceptions import XMPPError, IqError, IqTimeout
|
from sleekxmpp.exceptions import XMPPError, IqError, IqTimeout
|
||||||
from sleekxmpp.plugins.base import base_plugin
|
from sleekxmpp.plugins import BasePlugin, register_plugin
|
||||||
from sleekxmpp.xmlstream.handler import Callback
|
from sleekxmpp.xmlstream.handler import Callback
|
||||||
from sleekxmpp.xmlstream.matcher import StanzaPath
|
from sleekxmpp.xmlstream.matcher import StanzaPath
|
||||||
from sleekxmpp.xmlstream import register_stanza_plugin, ElementBase, ET, JID
|
from sleekxmpp.xmlstream import register_stanza_plugin, ElementBase, ET, JID
|
||||||
from sleekxmpp.plugins.xep_0030 import DiscoInfo, DiscoItems, StaticDisco
|
from sleekxmpp.plugins.xep_0030 import stanza, DiscoInfo, DiscoItems
|
||||||
|
from sleekxmpp.plugins.xep_0030 import StaticDisco
|
||||||
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class xep_0030(base_plugin):
|
class XEP_0030(BasePlugin):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
XEP-0030: Service Discovery
|
XEP-0030: Service Discovery
|
||||||
@ -85,14 +86,15 @@ class xep_0030(base_plugin):
|
|||||||
add_item --
|
add_item --
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
name = 'xep_0030'
|
||||||
|
description = 'XEP-0030: Service Discovery'
|
||||||
|
dependencies = set()
|
||||||
|
stanza = stanza
|
||||||
|
|
||||||
def plugin_init(self):
|
def plugin_init(self):
|
||||||
"""
|
"""
|
||||||
Start the XEP-0030 plugin.
|
Start the XEP-0030 plugin.
|
||||||
"""
|
"""
|
||||||
self.xep = '0030'
|
|
||||||
self.description = 'Service Discovery'
|
|
||||||
self.stanza = sleekxmpp.plugins.xep_0030.stanza
|
|
||||||
|
|
||||||
self.xmpp.register_handler(
|
self.xmpp.register_handler(
|
||||||
Callback('Disco Info',
|
Callback('Disco Info',
|
||||||
StanzaPath('iq/disco_info'),
|
StanzaPath('iq/disco_info'),
|
||||||
@ -117,19 +119,12 @@ class xep_0030(base_plugin):
|
|||||||
'del_identity', 'add_feature', 'del_feature', 'add_item',
|
'del_identity', 'add_feature', 'del_feature', 'add_item',
|
||||||
'del_item', 'del_identities', 'del_features', 'cache_info',
|
'del_item', 'del_identities', 'del_features', 'cache_info',
|
||||||
'get_cached_info', 'supports', 'has_identity']
|
'get_cached_info', 'supports', 'has_identity']
|
||||||
|
|
||||||
self.default_handlers = {}
|
self.default_handlers = {}
|
||||||
self._handlers = {}
|
self._handlers = {}
|
||||||
for op in self._disco_ops:
|
for op in self._disco_ops:
|
||||||
self._add_disco_op(op, getattr(self.static, op))
|
self._add_disco_op(op, getattr(self.static, op))
|
||||||
|
|
||||||
def post_init(self):
|
|
||||||
"""Handle cross-plugin dependencies."""
|
|
||||||
base_plugin.post_init(self)
|
|
||||||
if 'xep_0059' in self.xmpp.plugin:
|
|
||||||
register_stanza_plugin(DiscoItems,
|
|
||||||
self.xmpp['xep_0059'].stanza.Set)
|
|
||||||
|
|
||||||
def _add_disco_op(self, op, default_handler):
|
def _add_disco_op(self, op, default_handler):
|
||||||
self.default_handlers[op] = default_handler
|
self.default_handlers[op] = default_handler
|
||||||
self._handlers[op] = {'global': default_handler,
|
self._handlers[op] = {'global': default_handler,
|
||||||
@ -242,7 +237,7 @@ class xep_0030(base_plugin):
|
|||||||
self.del_node_handler(op, jid, node)
|
self.del_node_handler(op, jid, node)
|
||||||
self.set_node_handler(op, jid, node, self.default_handlers[op])
|
self.set_node_handler(op, jid, node, self.default_handlers[op])
|
||||||
|
|
||||||
def supports(self, jid=None, node=None, feature=None, local=False,
|
def supports(self, jid=None, node=None, feature=None, local=False,
|
||||||
cached=True, ifrom=None):
|
cached=True, ifrom=None):
|
||||||
"""
|
"""
|
||||||
Check if a JID supports a given feature.
|
Check if a JID supports a given feature.
|
||||||
@ -274,14 +269,14 @@ class xep_0030(base_plugin):
|
|||||||
'local': local,
|
'local': local,
|
||||||
'cached': cached}
|
'cached': cached}
|
||||||
return self._run_node_handler('supports', jid, node, ifrom, data)
|
return self._run_node_handler('supports', jid, node, ifrom, data)
|
||||||
|
|
||||||
def has_identity(self, jid=None, node=None, category=None, itype=None,
|
def has_identity(self, jid=None, node=None, category=None, itype=None,
|
||||||
lang=None, local=False, cached=True, ifrom=None):
|
lang=None, local=False, cached=True, ifrom=None):
|
||||||
"""
|
"""
|
||||||
Check if a JID provides a given identity.
|
Check if a JID provides a given identity.
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
True -- The identity is provided
|
True -- The identity is provided
|
||||||
False -- The identity is not listed
|
False -- The identity is not listed
|
||||||
None -- Nothing could be found due to a timeout
|
None -- Nothing could be found due to a timeout
|
||||||
|
|
||||||
@ -311,8 +306,8 @@ class xep_0030(base_plugin):
|
|||||||
'local': local,
|
'local': local,
|
||||||
'cached': cached}
|
'cached': cached}
|
||||||
return self._run_node_handler('has_identity', jid, node, ifrom, data)
|
return self._run_node_handler('has_identity', jid, node, ifrom, data)
|
||||||
|
|
||||||
def get_info(self, jid=None, node=None, local=False,
|
def get_info(self, jid=None, node=None, local=False,
|
||||||
cached=None, **kwargs):
|
cached=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Retrieve the disco#info results from a given JID/node combination.
|
Retrieve the disco#info results from a given JID/node combination.
|
||||||
@ -362,7 +357,7 @@ class xep_0030(base_plugin):
|
|||||||
if local or jid in (None, ''):
|
if local or jid in (None, ''):
|
||||||
log.debug("Looking up local disco#info data " + \
|
log.debug("Looking up local disco#info data " + \
|
||||||
"for %s, node %s.", jid, node)
|
"for %s, node %s.", jid, node)
|
||||||
info = self._run_node_handler('get_info',
|
info = self._run_node_handler('get_info',
|
||||||
jid, node, kwargs.get('ifrom', None), kwargs)
|
jid, node, kwargs.get('ifrom', None), kwargs)
|
||||||
info = self._fix_default_info(info)
|
info = self._fix_default_info(info)
|
||||||
return self._wrap(kwargs.get('ifrom', None), jid, info)
|
return self._wrap(kwargs.get('ifrom', None), jid, info)
|
||||||
@ -370,11 +365,11 @@ class xep_0030(base_plugin):
|
|||||||
if cached:
|
if cached:
|
||||||
log.debug("Looking up cached disco#info data " + \
|
log.debug("Looking up cached disco#info data " + \
|
||||||
"for %s, node %s.", jid, node)
|
"for %s, node %s.", jid, node)
|
||||||
info = self._run_node_handler('get_cached_info',
|
info = self._run_node_handler('get_cached_info',
|
||||||
jid, node, kwargs.get('ifrom', None), kwargs)
|
jid, node, kwargs.get('ifrom', None), kwargs)
|
||||||
if info is not None:
|
if info is not None:
|
||||||
return self._wrap(kwargs.get('ifrom', None), jid, info)
|
return self._wrap(kwargs.get('ifrom', None), jid, info)
|
||||||
|
|
||||||
iq = self.xmpp.Iq()
|
iq = self.xmpp.Iq()
|
||||||
# Check dfrom parameter for backwards compatibility
|
# Check dfrom parameter for backwards compatibility
|
||||||
iq['from'] = kwargs.get('ifrom', kwargs.get('dfrom', ''))
|
iq['from'] = kwargs.get('ifrom', kwargs.get('dfrom', ''))
|
||||||
@ -426,7 +421,7 @@ class xep_0030(base_plugin):
|
|||||||
Otherwise the parameter is ignored.
|
Otherwise the parameter is ignored.
|
||||||
"""
|
"""
|
||||||
if local or jid is None:
|
if local or jid is None:
|
||||||
items = self._run_node_handler('get_items',
|
items = self._run_node_handler('get_items',
|
||||||
jid, node, kwargs.get('ifrom', None), kwargs)
|
jid, node, kwargs.get('ifrom', None), kwargs)
|
||||||
return self._wrap(kwargs.get('ifrom', None), jid, items)
|
return self._wrap(kwargs.get('ifrom', None), jid, items)
|
||||||
|
|
||||||
@ -794,7 +789,10 @@ class xep_0030(base_plugin):
|
|||||||
return payload
|
return payload
|
||||||
|
|
||||||
|
|
||||||
|
register_plugin(XEP_0030)
|
||||||
|
|
||||||
# Retain some backwards compatibility
|
# Retain some backwards compatibility
|
||||||
xep_0030.getInfo = xep_0030.get_info
|
xep_0030 = XEP_0030
|
||||||
xep_0030.getItems = xep_0030.get_items
|
XEP_0030.getInfo = XEP_0030.get_info
|
||||||
xep_0030.make_static = xep_0030.restore_defaults
|
XEP_0030.getItems = XEP_0030.get_items
|
||||||
|
XEP_0030.make_static = XEP_0030.restore_defaults
|
||||||
|
@ -147,4 +147,3 @@ class DiscoItem(ElementBase):
|
|||||||
|
|
||||||
|
|
||||||
register_stanza_plugin(DiscoItems, DiscoItem, iterable=True)
|
register_stanza_plugin(DiscoItems, DiscoItem, iterable=True)
|
||||||
|
|
||||||
|
@ -12,7 +12,6 @@ import threading
|
|||||||
import sleekxmpp
|
import sleekxmpp
|
||||||
from sleekxmpp import Iq
|
from sleekxmpp import Iq
|
||||||
from sleekxmpp.exceptions import XMPPError, IqError, IqTimeout
|
from sleekxmpp.exceptions import XMPPError, IqError, IqTimeout
|
||||||
from sleekxmpp.plugins.base import base_plugin
|
|
||||||
from sleekxmpp.xmlstream.handler import Callback
|
from sleekxmpp.xmlstream.handler import Callback
|
||||||
from sleekxmpp.xmlstream.matcher import StanzaPath
|
from sleekxmpp.xmlstream.matcher import StanzaPath
|
||||||
from sleekxmpp.xmlstream import register_stanza_plugin, ElementBase, ET, JID
|
from sleekxmpp.xmlstream import register_stanza_plugin, ElementBase, ET, JID
|
||||||
@ -104,7 +103,7 @@ class StaticDisco(object):
|
|||||||
ifrom = ifrom.full
|
ifrom = ifrom.full
|
||||||
if (jid, node, ifrom) not in self.nodes:
|
if (jid, node, ifrom) not in self.nodes:
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
# =================================================================
|
# =================================================================
|
||||||
# Node Handlers
|
# Node Handlers
|
||||||
@ -117,7 +116,7 @@ class StaticDisco(object):
|
|||||||
# additional parameters that will be passed to other calls.
|
# additional parameters that will be passed to other calls.
|
||||||
#
|
#
|
||||||
# This implementation does not allow different responses based on
|
# This implementation does not allow different responses based on
|
||||||
# the requester's JID, except for cached results. To do that,
|
# the requester's JID, except for cached results. To do that,
|
||||||
# register a custom node handler.
|
# register a custom node handler.
|
||||||
|
|
||||||
def supports(self, jid, node, ifrom, data):
|
def supports(self, jid, node, ifrom, data):
|
||||||
@ -148,7 +147,7 @@ class StaticDisco(object):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
info = self.disco.get_info(jid=jid, node=node,
|
info = self.disco.get_info(jid=jid, node=node,
|
||||||
ifrom=ifrom, **data)
|
ifrom=ifrom, **data)
|
||||||
info = self.disco._wrap(ifrom, jid, info, True)
|
info = self.disco._wrap(ifrom, jid, info, True)
|
||||||
features = info['disco_info']['features']
|
features = info['disco_info']['features']
|
||||||
@ -179,7 +178,7 @@ class StaticDisco(object):
|
|||||||
be skipped, even if a result has already been
|
be skipped, even if a result has already been
|
||||||
cached. Defaults to false.
|
cached. Defaults to false.
|
||||||
"""
|
"""
|
||||||
identity = (data.get('category', None),
|
identity = (data.get('category', None),
|
||||||
data.get('itype', None),
|
data.get('itype', None),
|
||||||
data.get('lang', None))
|
data.get('lang', None))
|
||||||
|
|
||||||
@ -192,7 +191,7 @@ class StaticDisco(object):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
try:
|
try:
|
||||||
info = self.disco.get_info(jid=jid, node=node,
|
info = self.disco.get_info(jid=jid, node=node,
|
||||||
ifrom=ifrom, **data)
|
ifrom=ifrom, **data)
|
||||||
info = self.disco._wrap(ifrom, jid, info, True)
|
info = self.disco._wrap(ifrom, jid, info, True)
|
||||||
trunc = lambda i: (i[0], i[1], i[2])
|
trunc = lambda i: (i[0], i[1], i[2])
|
||||||
@ -202,7 +201,6 @@ class StaticDisco(object):
|
|||||||
except IqTimeout:
|
except IqTimeout:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def get_info(self, jid, node, ifrom, data):
|
def get_info(self, jid, node, ifrom, data):
|
||||||
"""
|
"""
|
||||||
Return the stored info data for the requested JID/node combination.
|
Return the stored info data for the requested JID/node combination.
|
||||||
@ -343,7 +341,8 @@ class StaticDisco(object):
|
|||||||
"""
|
"""
|
||||||
with self.lock:
|
with self.lock:
|
||||||
self.add_node(jid, node)
|
self.add_node(jid, node)
|
||||||
self.get_node(jid, node)['info'].add_feature(data.get('feature', ''))
|
self.get_node(jid, node)['info'].add_feature(
|
||||||
|
data.get('feature', ''))
|
||||||
|
|
||||||
def set_features(self, jid, node, ifrom, data):
|
def set_features(self, jid, node, ifrom, data):
|
||||||
"""
|
"""
|
||||||
@ -366,7 +365,8 @@ class StaticDisco(object):
|
|||||||
"""
|
"""
|
||||||
with self.lock:
|
with self.lock:
|
||||||
if self.node_exists(jid, node):
|
if self.node_exists(jid, node):
|
||||||
self.get_node(jid, node)['info'].del_feature(data.get('feature', ''))
|
self.get_node(jid, node)['info'].del_feature(
|
||||||
|
data.get('feature', ''))
|
||||||
|
|
||||||
def del_features(self, jid, node, ifrom, data):
|
def del_features(self, jid, node, ifrom, data):
|
||||||
"""
|
"""
|
||||||
|
@ -10,9 +10,9 @@ import logging
|
|||||||
|
|
||||||
import sleekxmpp
|
import sleekxmpp
|
||||||
from sleekxmpp import Iq
|
from sleekxmpp import Iq
|
||||||
from sleekxmpp.plugins.base import base_plugin
|
from sleekxmpp.plugins import BasePlugin, register_plugin
|
||||||
from sleekxmpp.xmlstream import register_stanza_plugin
|
from sleekxmpp.xmlstream import register_stanza_plugin
|
||||||
from sleekxmpp.plugins.xep_0059 import Set
|
from sleekxmpp.plugins.xep_0059 import stanza, Set
|
||||||
from sleekxmpp.exceptions import XMPPError
|
from sleekxmpp.exceptions import XMPPError
|
||||||
|
|
||||||
|
|
||||||
@ -85,7 +85,7 @@ class ResultIterator():
|
|||||||
num_items = len(r[self.interface]['substanzas'])
|
num_items = len(r[self.interface]['substanzas'])
|
||||||
if first + num_items == count:
|
if first + num_items == count:
|
||||||
raise StopIteration
|
raise StopIteration
|
||||||
|
|
||||||
if self.reverse:
|
if self.reverse:
|
||||||
self.start = r[self.interface]['rsm']['first']
|
self.start = r[self.interface]['rsm']['first']
|
||||||
else:
|
else:
|
||||||
@ -96,24 +96,24 @@ class ResultIterator():
|
|||||||
raise StopIteration
|
raise StopIteration
|
||||||
|
|
||||||
|
|
||||||
class xep_0059(base_plugin):
|
class XEP_0059(BasePlugin):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
XEP-0050: Result Set Management
|
XEP-0050: Result Set Management
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
name = 'xep_0059'
|
||||||
|
description = 'XEP-0059: Result Set Management'
|
||||||
|
dependencies = set(['xep_0030'])
|
||||||
|
stanza = stanza
|
||||||
|
|
||||||
def plugin_init(self):
|
def plugin_init(self):
|
||||||
"""
|
"""
|
||||||
Start the XEP-0059 plugin.
|
Start the XEP-0059 plugin.
|
||||||
"""
|
"""
|
||||||
self.xep = '0059'
|
|
||||||
self.description = 'Result Set Management'
|
|
||||||
self.stanza = sleekxmpp.plugins.xep_0059.stanza
|
|
||||||
|
|
||||||
def post_init(self):
|
|
||||||
"""Handle inter-plugin dependencies."""
|
|
||||||
base_plugin.post_init(self)
|
|
||||||
self.xmpp['xep_0030'].add_feature(Set.namespace)
|
self.xmpp['xep_0030'].add_feature(Set.namespace)
|
||||||
|
register_stanza_plugin(self.xmpp['xep_0030'].stanza.DiscoItems,
|
||||||
|
self.stanza.Set)
|
||||||
|
|
||||||
def iterate(self, stanza, interface):
|
def iterate(self, stanza, interface):
|
||||||
"""
|
"""
|
||||||
@ -129,3 +129,8 @@ class xep_0059(base_plugin):
|
|||||||
the interface 'disco_items' should be used.
|
the interface 'disco_items' should be used.
|
||||||
"""
|
"""
|
||||||
return ResultIterator(stanza, interface)
|
return ResultIterator(stanza, interface)
|
||||||
|
|
||||||
|
|
||||||
|
register_plugin(XEP_0059)
|
||||||
|
|
||||||
|
xep_0059 = XEP_0059
|
||||||
|
Loading…
Reference in New Issue
Block a user