# HG changeset patch # User souliane # Date 1441198768 -7200 # Node ID 72e6ee3fdf536061d26819c7fcb7b117275c02ff # Parent ec60682a9d175f89febdc178cd7b1c7bbe12ea49 plugin XEP-0055: add "Directory subscription" menu + use the category "Service" for this plugin's menus instead of "Communication" diff -r ec60682a9d17 -r 72e6ee3fdf53 src/plugins/plugin_xep_0055.py --- a/src/plugins/plugin_xep_0055.py Wed Sep 02 13:57:46 2015 +0200 +++ b/src/plugins/plugin_xep_0055.py Wed Sep 02 14:59:28 2015 +0200 @@ -46,7 +46,7 @@ "type": "XEP", "protocols": ["XEP-0055"], "dependencies": [], - "recommendations": ["XEP-0059"], + "recommendations": ["XEP-0050", "XEP-0059"], "main": "XEP_0055", "handler": "no", "description": _("""Implementation of Jabber Search""") @@ -78,7 +78,18 @@ async=True) self.__search_menu_id = host.registerCallback(self._getMainUI, with_data=True) - host.importMenu((D_("Communication"), D_("Search directory")), self._getMainUI, security_limit=1, help_string=D_("Search use directory")) + host.importMenu((D_("Service"), D_("Search directory")), self._getMainUI, security_limit=1, help_string=D_("Search user directory")) + if "XEP-0050" in host.plugins: + host.importMenu((D_("Service"), D_("Directory subscription")), self.subscribe, security_limit=1, help_string=D_("User directory subscription")) + + def _getHostServices(self, profile): + """Return the jabber search services associated to the user host. + + @param profile (unicode): %(doc_profile)s + @return: list[jid.JID] + """ + d = self.host.findFeaturesSet([NS_SEARCH], profile_key=profile) + return d.addCallback(lambda set_: list(set_)) ## Main search UI (menu item callback) ## @@ -92,8 +103,8 @@ @return: a deferred XMLUI string representation """ # check if the user's server offers some search services - d = self.host.findFeaturesSet([NS_SEARCH], profile_key=profile) - return d.addCallback(lambda services: self.getMainUI(list(services), raw_data, profile)) + d = self._getHostServices(profile) + return d.addCallback(lambda services: self.getMainUI(services, raw_data, profile)) def getMainUI(self, services, raw_data, profile): """Get the XMLUI for selecting a service and searching the directory. @@ -436,6 +447,32 @@ raise failure + ## Subscription ## + + + def subscribe(self, raw_data, profile): + """Request available commands on the jabber search service associated to profile's host. + + @param raw_data (dict): data received from the frontend + @param profile (unicode): %(doc_profile)s + @return: a deferred dict{unicode: unicode} + """ + d = self._getHostServices(profile) + + def got_services(services): + service_jid = services[0] + d = self.host.plugins["XEP-0050"].requestCommandsList(service_jid, profile) + return d.addCallback(got_commands, service_jid) + + def got_commands(form_ui, service_jid): + session_id, session_data = self.host.plugins["XEP-0050"].requesting.newSession(profile=profile) + session_data["jid"] = service_jid + form_ui.session_id = session_id + return {'xmlui': form_ui.toXml()} + + return d.addCallback(got_services) + + class XEP_0059_handler(XMPPHandler): implements(iwokkel.IDisco)