[docs]classXEP_0055(BasePlugin):""" XEP-0055: Jabber Search The config options are only useful for a "server-side" search feature, and if the ``provide_search`` option is set to True. API === ``search_get_form``: customize the search form content (ie fields) ``search_query``: return search results """name="xep_0055"description="XEP-0055: Jabber search"dependencies={"xep_0004","xep_0030"}stanza=stanzadefault_config={"form_fields":{"first","last"},"form_instructions":"","form_title":"","provide_search":True}defplugin_init(self):register_stanza_plugin(Iq,stanza.Search)register_stanza_plugin(stanza.Search,self.xmpp["xep_0004"].stanza.Form)ifself.provide_search:self.xmpp["xep_0030"].add_feature(stanza.Search.namespace)self.xmpp.register_handler(CoroutineCallback("search",StanzaPath("/iq/search"),self._handle_search,))self.api.register(self._get_form,"search_get_form")self.api.register(self._get_results,"search_query")asyncdef_handle_search(self,iq:StanzaBase):ifiq["search"]["form"].get_values():reply=awaitself.api["search_query"](None,None,iq.get_from(),iq)reply["search"]["form"]["type"]="result"else:reply=awaitself.api["search_get_form"](None,None,iq.get_from(),iq)reply["search"]["form"].add_field("FORM_TYPE",value=stanza.Search.namespace,ftype="hidden")reply.send()asyncdef_get_form(self,jid,node,ifrom,iq):reply=iq.reply()form=reply["search"]["form"]form["title"]=self.form_titleform["instructions"]=self.form_instructionsforfieldinself.form_fields:form.add_field(field)returnreplyasyncdef_get_results(self,jid,node,ifrom,iq):reply=iq.reply()form=reply["search"]["form"]form["type"]="result"forfieldinself.form_fields:form.add_reported(field)returnreplydefmake_search_iq(self,**kwargs):iq=self.xmpp.make_iq(itype="set",**kwargs)iq["search"]["form"].set_type("submit")iq["search"]["form"].add_field("FORM_TYPE",value=stanza.Search.namespace,ftype="hidden")returniq