# HG changeset patch # User Goffi # Date 1515153592 -3600 # Node ID 8f14c1865e9e6659c2e1e68a56309a7dac36acc5 # Parent 908be289eb49b37aba0a75bd9a07590cbe6385b7 plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server. diff -r 908be289eb49 -r 8f14c1865e9e src/plugins/plugin_xep_0045.py --- a/src/plugins/plugin_xep_0045.py Fri Jan 05 12:58:54 2018 +0100 +++ b/src/plugins/plugin_xep_0045.py Fri Jan 05 12:59:52 2018 +0100 @@ -88,6 +88,7 @@ host.bridge.addMethod("mucGetUniqueRoomName", ".plugin", in_sign='ss', out_sign='s', method=self._getUniqueName) host.bridge.addMethod("mucConfigureRoom", ".plugin", in_sign='ss', out_sign='s', method=self._configureRoom, async=True) host.bridge.addMethod("mucGetDefaultService", ".plugin", in_sign='', out_sign='s', method=self.getDefaultMUC) + host.bridge.addMethod("mucGetService", ".plugin", in_sign='ss', out_sign='s', method=self._getMUCService, async=True) host.bridge.addSignal("mucRoomJoined", ".plugin", signature='sa{sa{ss}}sss') # args: room_jid, occupants, user_nick, subject, profile host.bridge.addSignal("mucRoomLeft", ".plugin", signature='ss') # args: room_jid, profile host.bridge.addSignal("mucRoomUserChangedNick", ".plugin", signature='ssss') # args: room_jid, old_nick, new_nick, profile @@ -109,7 +110,7 @@ def profileConnected(self, client): def assign_service(service): client.muc_service = service - return self.getMUCService(profile=client.profile).addCallback(assign_service) + return self.getMUCService(client).addCallback(assign_service) def MessageReceivedTrigger(self, client, message_elt, post_treat): if message_elt.getAttribute("type") == C.MESS_TYPE_GROUPCHAT: @@ -359,15 +360,27 @@ self.checkRoomJoined(client, room_jid) return client._muc_client.joined_rooms[room_jid].inRoster(muc.User(nick)) + def _getMUCService(self, jid_=None, profile=C.PROF_KEY_NONE): + client = self.host.getClient(profile) + d = self.getMUCService(client, jid_ or None) + d.addCallback(lambda service_jid: service_jid.full() if service_jid is not None else u'') + return d + @defer.inlineCallbacks - def getMUCService(self, jid_=None, profile=C.PROF_KEY_NONE): + def getMUCService(self, client, jid_=None): """Return first found MUC service of an entity @param jid_: entity which may have a MUC service, or None for our own server - @param profile: %(doc_profile)s + @return (jid.JID, None): found service jid or None """ - client = self.host.getClient(profile) - muc_service = None + if jid_ is None: + try: + muc_service = client.muc_service + except AttributeError: + pass + else: + # we have a cached value, we return it + defer.returnValue(muc_service) services = yield self.host.findServiceEntities(client, "conference", "text", jid_) for service in services: if ".irc." not in service.userhost():