diff src/plugins/plugin_xep_0045.py @ 1358:bf3f669a6052 frontends_multi_profiles

plugins XEP-0045, XEP-0249, parrot: use JID instead of unicode in many methods + class attributes
author souliane <souliane@mailoo.org>
date Wed, 11 Mar 2015 12:35:21 +0100
parents c01cbd8fc8dd
children 876c9fbd0b3d
line wrap: on
line diff
--- a/src/plugins/plugin_xep_0045.py	Mon Mar 09 16:37:15 2015 +0100
+++ b/src/plugins/plugin_xep_0045.py	Wed Mar 11 12:35:21 2015 +0100
@@ -117,7 +117,7 @@
         profile = self.host.memory.getProfileName(profile_key)
         if not self.checkClient(profile):
             raise exceptions.ProfileUnknownError("Unknown or disconnected profile")
-        if room_jid.userhost() not in self.clients[profile].joined_rooms:
+        if room_jid not in self.clients[profile].joined_rooms:
             raise UnknownRoom("This room has not been joined")
         return profile
 
@@ -127,12 +127,11 @@
         def _sendBridgeSignal(ignore=None):
             self.host.bridge.roomJoined(room.roomJID.userhost(), [user.nick for user in room.roster.values()], room.nick, profile)
 
-        room_jid_s = room.roomJID.userhost()
-        self.clients[profile].joined_rooms[room_jid_s] = room
+        self.clients[profile].joined_rooms[room.roomJID] = room
         if room.locked:
-            #FIXME: the current behaviour is to create an instant room
-            #and send the signal only when the room is unlocked
-            #a proper configuration management should be done
+            # FIXME: the current behaviour is to create an instant room
+            # and send the signal only when the room is unlocked
+            # a proper configuration management should be done
             print "room locked !"
             self.clients[profile].configure(room.roomJID, {}).addCallbacks(_sendBridgeSignal, lambda x: log.error(_('Error while configuring the room')))
         else:
@@ -164,27 +163,25 @@
             result.append((room.roomJID.userhost(), [user.nick for user in room.roster.values()], room.nick))
         return result
 
-    def getRoomNick(self, room_jid_s, profile_key=C.PROF_KEY_NONE):
+    def getRoomNick(self, room_jid, profile_key=C.PROF_KEY_NONE):
         """return nick used in room by user
 
-        @param room_jid_s: unicode room id
+        @param room_jid (jid.JID): JID of the room
         @profile_key: profile
         @return: nick or empty string in case of error"""
         profile = self.host.memory.getProfileName(profile_key)
-        if not self.checkClient(profile) or room_jid_s not in self.clients[profile].joined_rooms:
+        if not self.checkClient(profile) or room_jid not in self.clients[profile].joined_rooms:
             return ''
-        return self.clients[profile].joined_rooms[room_jid_s].nick
+        return self.clients[profile].joined_rooms[room_jid].nick
 
     def getRoomNickOfUser(self, room, user_jid, secure=True):
         """Returns the nick of the given user in the room.
 
-        @room: instance of wokkel.muc.Room
-        @user: JID or unicode (JID userhost).
-        @param secure: set to True for a secure check
-        @return: the nick or None if the user didn't join the room.
+        @param room (wokkel.muc.Room): the room
+        @param user (jid.JID): bare JID of the user
+        @param secure (bool): set to True for a secure check
+        @return: unicode or None if the user didn't join the room.
         """
-        if not isinstance(user_jid, jid.JID):
-            user_jid = jid.JID(user_jid).userhostJID()
         for user in room.roster.values():
             if user.entity is not None:
                 if user.entity.userhostJID() == user_jid.userhostJID():
@@ -199,11 +196,12 @@
     def getRoomNicksOfUsers(self, room, users=[], secure=True):
         """Returns the nicks of the given users in the room.
 
-        @room: instance of wokkel.muc.Room
-        @users: list of JID or unicode (JID userhost).
-        @param secure: set to True for a secure check
-        @return: (x, y) with x a list containing the nicks of
-        the users who are in the room, and y the missing users.
+        @param room (wokkel.muc.Room): the room
+        @param users (list[jid.JID]): list of users
+        @param secure (True): set to True for a secure check
+        @return: a couple (x, y) with:
+            - x (list[unicode]): nicks of the users who are in the room
+            - y (list[jid.JID]): JID of the missing users.
         """
         nicks = []
         missing = []
@@ -231,6 +229,7 @@
         except KeyError:
             log.error(_("room_jid key is not present !"))
             return defer.fail(exceptions.DataError)
+
         def xmluiReceived(xmlui):
             return {"xmlui": xmlui.toXml()}
         return self.configureRoom(room_jid, profile).addCallback(xmluiReceived)
@@ -277,7 +276,7 @@
     def isNickInRoom(self, room_jid, nick, profile):
         """Tell if a nick is currently present in a room"""
         profile = self.getProfileAssertInRoom(room_jid, profile)
-        return self.clients[profile].joined_rooms[room_jid.userhost()].inRoster(muc.User(nick))
+        return self.clients[profile].joined_rooms[room_jid].inRoster(muc.User(nick))
 
     def getRoomsSubjects(self, profile_key=C.PROF_KEY_NONE):
         """Return received subjects of rooms"""
@@ -296,7 +295,7 @@
         muc_service = None
         services = yield self.host.findServiceEntities("conference", "text", jid_, profile_key=profile_key)
         for service in services:
-            if not ".irc." in service.userhost():
+            if ".irc." not in service.userhost():
                 # FIXME:
                 # This ugly hack is here to avoid an issue with openfire: the IRC gateway
                 # use "conference/text" identity (instead of "conference/irc")
@@ -313,7 +312,7 @@
         @param muc_service (jid.JID) : leave empty string to use the default service
         @return: jid.JID (unique room bare JID)
         """
-        #TODO: we should use #RFC-0045 10.1.4 when available here
+        # TODO: we should use #RFC-0045 10.1.4 when available here
         client = self.host.getClient(profile_key)
         room_name = uuid.uuid1()
         if muc_service is None:
@@ -337,7 +336,7 @@
         profile = self.host.memory.getProfileName(profile_key)
         if not self.checkClient(profile):
             return _errDeferred()
-        if room_jid.userhost() in self.clients[profile].joined_rooms:
+        if room_jid in self.clients[profile].joined_rooms:
             log.warning(_('%(profile)s is already in room %(room_jid)s') % {'profile': profile, 'room_jid': room_jid.userhost()})
             return _errDeferred()
         log.info(_("[%(profile)s] is joining room %(room)s with nick %(nick)s") % {'profile': profile, 'room': room_jid.userhost(), 'nick': nick})
@@ -472,10 +471,10 @@
             return False
 
         if mess_data["unparsed"].strip():
-            room = self.host.plugins[C.TEXT_CMDS].getRoomJID(mess_data["unparsed"].strip(), mess_data["to"].host)
-            nick = (self.getRoomNick(mess_data["to"].userhost(), profile) or
+            room_jid = self.host.plugins[C.TEXT_CMDS].getRoomJID(mess_data["unparsed"].strip(), mess_data["to"].host)
+            nick = (self.getRoomNick(room_jid, profile) or
                     self.host.getClient(profile).jid.user)
-            self.join(room, nick, {}, profile)
+            self.join(room_jid, nick, {}, profile)
 
         return False
 
@@ -631,10 +630,10 @@
         """ Add MUC user information to whois """
         if mess_data['type'] != "groupchat":
             return
-        if target_jid.userhost() not in self.clients[profile].joined_rooms:
+        if target_jid.userhostJID() not in self.clients[profile].joined_rooms:
             log.warning(_("This room has not been joined"))
             return
-        user = self.clients[profile].joined_rooms[target_jid.userhost()].getUser(target_jid.resource)
+        user = self.clients[profile].joined_rooms[target_jid.userhostJID()].getUser(target_jid.resource)
         whois_msg.append(_("Nickname: %s") % user.nick)
         if user.entity:
             whois_msg.append(_("Entity: %s") % user.entity)
@@ -650,32 +649,35 @@
     def presenceTrigger(self, presence_elt, client):
         # XXX: shouldn't it be done by the server ?!!
         muc_client = self.clients[client.profile]
-        for room_jid_s, room in muc_client.joined_rooms.items():
+        for room_jid, room in muc_client.joined_rooms.iteritems():
             elt = copy.deepcopy(presence_elt)
-            elt['to'] = room_jid_s + '/' + room.nick
+            elt['to'] = room_jid.userhost() + '/' + room.nick
             client.presence.send(elt)
         return True
 
 
 class SatMUCClient (muc.MUCClient):
-    #implements(iwokkel.IDisco)
+    # implements(iwokkel.IDisco)
 
     def __init__(self, plugin_parent):
         self.plugin_parent = plugin_parent
         self.host = plugin_parent.host
         muc.MUCClient.__init__(self)
-        self.joined_rooms = {}  # FIXME: seem to do the same thing as MUCClient's _rooms attribute, must be removed
         self.rec_subjects = {}
         self.__changing_nicks = set()  # used to keep trace of who is changing nick,
                                        # and to discard userJoinedRoom signal in this case
         print "init SatMUCClient OK"
 
+    @property
+    def joined_rooms(self):
+        return self._rooms
+
     def subject(self, room, subject):
         return muc.MUCClientProtocol.subject(self, room, subject)
 
     def unavailableReceived(self, presence):
-        #XXX: we override this method to manage nickname change
-        #TODO: feed this back to Wokkel
+        # XXX: we override this method to manage nickname change
+        # TODO: feed this back to Wokkel
         """
         Unavailable presence was received.
 
@@ -714,9 +716,8 @@
             # we left the room
             room_jid_s = room.roomJID.userhost()
             log.info(_("Room [%(room)s] left (%(profile)s))") % {"room": room_jid_s,
-                                                             "profile": self.parent.profile})
+                                                                 "profile": self.parent.profile})
             self.host.memory.delEntityCache(room.roomJID, profile_key=self.parent.profile)
-            del self.plugin_parent.clients[self.parent.profile].joined_rooms[room_jid_s]
             self.host.bridge.roomLeft(room.roomJID.userhost(), self.parent.profile)
         else:
             log.debug(_("user %(nick)s left room (%(room_id)s)") % {'nick': user.nick, 'room_id': room.occupantJID.userhost()})
@@ -734,7 +735,7 @@
 
     def receivedHistory(self, room, user, message):
         # http://xmpp.org/extensions/xep-0045.html#enter-history
-        #log.debug('receivedHistory: room=%s user=%s body=%s' % (room.roomJID.full(), user, message))
+        # log.debug('receivedHistory: room=%s user=%s body=%s' % (room.roomJID.full(), user, message))
         pass
 
     def receivedSubject(self, room, user, subject):