Factor out fetching of identities in xep_0363 to xep_0030
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
This commit is contained in:
parent
b881c6729b
commit
037706552c
2 changed files with 30 additions and 11 deletions
|
@ -124,6 +124,8 @@ class XEP_0030(BasePlugin):
|
|||
for op in self._disco_ops:
|
||||
self.api.register(getattr(self.static, op), op, default=True)
|
||||
|
||||
self.domain_infos = {}
|
||||
|
||||
def session_bind(self, jid):
|
||||
self.add_feature('http://jabber.org/protocol/disco#info')
|
||||
|
||||
|
@ -296,6 +298,31 @@ class XEP_0030(BasePlugin):
|
|||
'cached': cached}
|
||||
return self.api['has_identity'](jid, node, ifrom, data)
|
||||
|
||||
async def find_identities(category, type_, domain=None, timeout=None):
|
||||
if domain is None:
|
||||
domain = self.xmpp.boundjid.domain
|
||||
|
||||
if domain not in self.domain_infos:
|
||||
infos = [self.xmpp['xep_0030'].get_info(
|
||||
domain, timeout=timeout)]
|
||||
iq_items = await self.xmpp['xep_0030'].get_items(
|
||||
domain, timeout=timeout)
|
||||
items = iq_items['disco_items']['items']
|
||||
infos += [
|
||||
self.xmpp['xep_0030'].get_info(item[0], timeout=timeout)
|
||||
for item in items]
|
||||
info_futures, _ = await asyncio.wait(infos, timeout=timeout)
|
||||
|
||||
self.domain_infos[domain] = [
|
||||
future.result() for future in info_futures]
|
||||
|
||||
results = []
|
||||
for info in self.domain_infos[domain]:
|
||||
for identity in info['disco_info']['identities']:
|
||||
if identity[0] == category and identity[1] == type_:
|
||||
results.append(info)
|
||||
return results
|
||||
|
||||
@future_wrapper
|
||||
def get_info(self, jid=None, node=None, local=None,
|
||||
cached=None, **kwargs):
|
||||
|
|
|
@ -69,17 +69,9 @@ class XEP_0363(BasePlugin):
|
|||
self.xmpp.event('http_upload_request', iq)
|
||||
|
||||
async def find_upload_service(self, timeout=None):
|
||||
infos = [self.xmpp['xep_0030'].get_info(self.xmpp.boundjid.domain)]
|
||||
iq_items = await self.xmpp['xep_0030'].get_items(
|
||||
self.xmpp.boundjid.domain, timeout=timeout)
|
||||
items = iq_items['disco_items']['items']
|
||||
infos += [self.xmpp['xep_0030'].get_info(item[0]) for item in items]
|
||||
info_futures, _ = await asyncio.wait(infos, timeout=timeout)
|
||||
for future in info_futures:
|
||||
info = future.result()
|
||||
for identity in info['disco_info']['identities']:
|
||||
if identity[0] == 'store' and identity[1] == 'file':
|
||||
return info
|
||||
results = await self.xmpp['xep_0030'].find_identities('store', 'file')
|
||||
if results:
|
||||
return results[0]
|
||||
|
||||
def request_slot(self, jid, filename, size, content_type=None, ifrom=None,
|
||||
timeout=None, callback=None, timeout_callback=None):
|
||||
|
|
Loading…
Reference in a new issue