Philipp Hörist pushed to branch master at gajim / python-nbxmpp
Commits: b1f664db by Philipp Hörist at 2019-08-03T09:20:07Z Muclumbus: Add support for HTTP API - - - - - 1 changed file: - nbxmpp/modules/muclumbus.py Changes: ===================================== nbxmpp/modules/muclumbus.py ===================================== @@ -16,6 +16,7 @@ # along with this program; If not, see <http://www.gnu.org/licenses/>. import logging +import json from nbxmpp.protocol import NS_MUCLUMBUS from nbxmpp.protocol import NS_DATA @@ -31,6 +32,13 @@ from nbxmpp.util import call_on_response from nbxmpp.util import callback from nbxmpp.util import raise_error +try: + import gi + gi.require_version('Soup', '2.4') + from gi.repository import Soup + SOUP_AVAILABLE = True +except (ValueError, ImportError): + SOUP_AVAILABLE = False log = logging.getLogger('nbxmpp.m.muclumbus') @@ -42,6 +50,10 @@ class Muclumbus: self._client = client self.handlers = [] + self._soup_session = None + if SOUP_AVAILABLE: + self._soup_session = Soup.Session() + @call_on_response('_parameters_received') def request_parameters(self, jid): query = Iq(to=jid, typ='get') @@ -76,6 +88,25 @@ class Muclumbus: query.addChild(node=search) return query + def set_http_search(self, uri, keywords, after=None, + callback=None, user_data=None): + if not SOUP_AVAILABLE: + raise ImportError('Module Soup not found') + + search = {'keywords': keywords} + if after is not None: + search['after'] = after + + message = Soup.Message.new('POST', uri) + message.set_request('application/json', + Soup.MemoryUse.COPY, + json.dumps(search).encode()) + + self._soup_session.queue_message(message, + self._http_search_received, + callback, + user_data) + @callback def _search_received(self, stanza): if not isResultNode(stanza): @@ -118,10 +149,10 @@ class Muclumbus: except ValueError: anonymity_mode = AnonymityMode.UNKNOWN results.append(MuclumbusItem(jid=jid, - name=name, - nusers=nusers, - description=description, - language=language, + name=name or '', + nusers=nusers or '', + description=description or '', + language=language or '', is_open=is_open, anonymity_mode=anonymity_mode)) return MuclumbusResult(first=first, @@ -129,3 +160,53 @@ class Muclumbus: max=max_, end=len(items) < max_, items=results) + + def _http_search_received(self, _session, message, callback, user_data): + soup_body = message.get_property('response-body') + + if message.status_code != 200: + log.warning(soup_body.data) + return MuclumbusResult(first=None, + last=None, + max=None, + end=True, + items=[]) + + + response = json.loads(soup_body.data) + + result = response['result'] + items = result.get('items') + if items is None: + return MuclumbusResult(first=None, + last=None, + max=None, + end=True, + items=[]) + + results = [] + for item in items: + try: + anonymity_mode = AnonymityMode(item['anonymity_mode']) + except ValueError: + anonymity_mode = AnonymityMode.UNKNOWN + + results.append( + MuclumbusItem(jid=item['address'], + name=item['name'] or '', + nusers=str(item['nusers'] or ''), + description=item['description'] or '', + language=item['language'] or '', + is_open=item['is_open'], + anonymity_mode=anonymity_mode)) + + muclumbus_result = MuclumbusResult(first=None, + last=result['last'], + max=None, + end=not result['more'], + items=results) + + if user_data is None: + callback(muclumbus_result) + else: + callback(muclumbus_result, user_data) View it on GitLab: https://dev.gajim.org/gajim/python-nbxmpp/commit/b1f664db25f4729b36899bdafd38313f43665b1c -- View it on GitLab: https://dev.gajim.org/gajim/python-nbxmpp/commit/b1f664db25f4729b36899bdafd38313f43665b1c You're receiving this email because of your account on dev.gajim.org.
_______________________________________________ Commits mailing list [email protected] https://lists.gajim.org/cgi-bin/listinfo/commits
