plugin XEP-0045: small refactorization + clean on profile's disconnection
This commit is contained in:
parent
56ec86b8e5
commit
7d849b11ca
1 changed files with 40 additions and 52 deletions
|
|
@ -90,12 +90,12 @@ class XEP_0045(object):
|
|||
client.muc_service = service
|
||||
return self.getMUCService(profile_key=profile).addCallback(assign_service)
|
||||
|
||||
def __check_profile(self, profile):
|
||||
"""check if profile is used and connected
|
||||
def checkClient(self, profile):
|
||||
"""Check if the profile is connected and has used the MUC feature.
|
||||
|
||||
if profile known but disconnected, remove it from known profiles
|
||||
If profile was using MUC feature but is now disconnected, remove it from the client list.
|
||||
@param profile: profile to check
|
||||
@return: True if the profile is known and connected, else False"""
|
||||
@return: True if the profile is connected and has used the MUC feature, else False"""
|
||||
if not profile or profile not in self.clients or not self.host.isConnected(profile):
|
||||
log.error(_('Unknown or disconnected profile (%s)') % profile)
|
||||
if profile in self.clients:
|
||||
|
|
@ -103,6 +103,20 @@ class XEP_0045(object):
|
|||
return False
|
||||
return True
|
||||
|
||||
def getProfileAssertInRoom(self, room_jid, profile_key):
|
||||
"""Retrieve the profile name, assert that it's connected and participating in the given room.
|
||||
|
||||
@param room_jid (JID): room JID
|
||||
@param profile_key (str): %(doc_profile_key)
|
||||
@return: the profile name
|
||||
"""
|
||||
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:
|
||||
raise UnknownRoom("This room has not been joined")
|
||||
return profile
|
||||
|
||||
def __room_joined(self, room, profile):
|
||||
"""Called when the user is in the requested room"""
|
||||
|
||||
|
|
@ -141,7 +155,7 @@ class XEP_0045(object):
|
|||
"""Return room where user is"""
|
||||
profile = self.host.memory.getProfileName(profile_key)
|
||||
result = []
|
||||
if not self.__check_profile(profile):
|
||||
if not self.checkClient(profile):
|
||||
return result
|
||||
for room in self.clients[profile].joined_rooms.values():
|
||||
result.append((room.roomJID.userhost(), [user.nick for user in room.roster.values()], room.nick))
|
||||
|
|
@ -154,7 +168,7 @@ class XEP_0045(object):
|
|||
@profile_key: profile
|
||||
@return: nick or empty string in case of error"""
|
||||
profile = self.host.memory.getProfileName(profile_key)
|
||||
if not self.__check_profile(profile) or room_jid_s not in self.clients[profile].joined_rooms:
|
||||
if not self.checkClient(profile) or room_jid_s not in self.clients[profile].joined_rooms:
|
||||
return ''
|
||||
return self.clients[profile].joined_rooms[room_jid_s].nick
|
||||
|
||||
|
|
@ -210,11 +224,7 @@ class XEP_0045(object):
|
|||
@param profile_key: %(doc_profile_key)s
|
||||
@return: configuration form as XMLUI
|
||||
"""
|
||||
profile = self.host.memory.getProfileName(profile_key)
|
||||
if not self.__check_profile(profile):
|
||||
raise exceptions.ProfileUnknownError("Unknown or disconnected profile")
|
||||
if room_jid.userhost() not in self.clients[profile].joined_rooms:
|
||||
raise UnknownRoom(D_("This room has not been joined"))
|
||||
profile = self.getProfileAssertInRoom(room_jid, profile_key)
|
||||
|
||||
def config2XMLUI(result):
|
||||
if not result:
|
||||
|
|
@ -248,17 +258,13 @@ class XEP_0045(object):
|
|||
|
||||
def isNickInRoom(self, room_jid, nick, profile):
|
||||
"""Tell if a nick is currently present in a room"""
|
||||
profile = self.host.memory.getProfileName(profile)
|
||||
if not self.__check_profile(profile):
|
||||
raise exceptions.ProfileUnknownError("Unknown or disconnected profile")
|
||||
if room_jid.userhost() not in self.clients[profile].joined_rooms:
|
||||
raise UnknownRoom("This room has not been joined")
|
||||
profile = self.getProfileAssertInRoom(room_jid, profile)
|
||||
return self.clients[profile].joined_rooms[room_jid.userhost()].inRoster(muc.User(nick))
|
||||
|
||||
def getRoomsSubjects(self, profile_key=C.PROF_KEY_NONE):
|
||||
"""Return received subjects of rooms"""
|
||||
profile = self.host.memory.getProfileName(profile_key)
|
||||
if not self.__check_profile(profile):
|
||||
if not self.checkClient(profile):
|
||||
return []
|
||||
return self.clients[profile].rec_subjects.values()
|
||||
|
||||
|
|
@ -311,7 +317,7 @@ class XEP_0045(object):
|
|||
return d
|
||||
|
||||
profile = self.host.memory.getProfileName(profile_key)
|
||||
if not self.__check_profile(profile):
|
||||
if not self.checkClient(profile):
|
||||
return _errDeferred()
|
||||
if room_jid.userhost() in self.clients[profile].joined_rooms:
|
||||
log.warning(_('%(profile)s is already in room %(room_jid)s') % {'profile': profile, 'room_jid': room_jid.userhost()})
|
||||
|
|
@ -332,7 +338,7 @@ class XEP_0045(object):
|
|||
@return the room userhost (given value or unique generated name)
|
||||
"""
|
||||
profile = self.host.memory.getProfileName(profile_key)
|
||||
if not self.__check_profile(profile):
|
||||
if not self.checkClient(profile):
|
||||
return
|
||||
if room_jid_s == "":
|
||||
room_jid_s = self.getUniqueName(profile_key=profile_key)
|
||||
|
|
@ -348,27 +354,15 @@ class XEP_0045(object):
|
|||
return room_jid_s
|
||||
|
||||
def nick(self, room_jid, nick, profile_key):
|
||||
profile = self.host.memory.getProfileName(profile_key)
|
||||
if not self.__check_profile(profile):
|
||||
raise exceptions.ProfileUnknownError("Unknown or disconnected profile")
|
||||
if room_jid.userhost() not in self.clients[profile].joined_rooms:
|
||||
raise UnknownRoom("This room has not been joined")
|
||||
profile = self.getProfileAssertInRoom(room_jid, profile_key)
|
||||
return self.clients[profile].nick(room_jid, nick)
|
||||
|
||||
def leave(self, room_jid, profile_key):
|
||||
profile = self.host.memory.getProfileName(profile_key)
|
||||
if not self.__check_profile(profile):
|
||||
raise exceptions.ProfileUnknownError("Unknown or disconnected profile")
|
||||
if room_jid.userhost() not in self.clients[profile].joined_rooms:
|
||||
raise UnknownRoom("This room has not been joined")
|
||||
profile = self.getProfileAssertInRoom(room_jid, profile_key)
|
||||
return self.clients[profile].leave(room_jid)
|
||||
|
||||
def subject(self, room_jid, subject, profile_key):
|
||||
profile = self.host.memory.getProfileName(profile_key)
|
||||
if not self.__check_profile(profile):
|
||||
raise exceptions.ProfileUnknownError("Unknown or disconnected profile")
|
||||
if room_jid.userhost() not in self.clients[profile].joined_rooms:
|
||||
raise UnknownRoom("This room has not been joined")
|
||||
profile = self.getProfileAssertInRoom(room_jid, profile_key)
|
||||
return self.clients[profile].subject(room_jid, subject)
|
||||
|
||||
def mucNick(self, room_jid_s, nick, profile_key=C.PROF_KEY_NONE):
|
||||
|
|
@ -383,6 +377,12 @@ class XEP_0045(object):
|
|||
self.clients[profile] = SatMUCClient(self)
|
||||
return self.clients[profile]
|
||||
|
||||
def profileDisconnected(self, profile):
|
||||
try:
|
||||
del self.clients[profile]
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
def kick(self, nick, room_jid, options={}, profile_key=C.PROF_KEY_NONE):
|
||||
"""
|
||||
Kick a participant from the room
|
||||
|
|
@ -391,11 +391,7 @@ class XEP_0045(object):
|
|||
@param options (dict): attribute with extra info (reason, password) as in #XEP-0045
|
||||
@param profile_key (str): %(doc_profile_key)s
|
||||
"""
|
||||
profile = self.host.memory.getProfileName(profile_key)
|
||||
if not self.__check_profile(profile):
|
||||
raise exceptions.ProfileUnknownError("Unknown or disconnected profile")
|
||||
if room_jid.userhost() not in self.clients[profile].joined_rooms:
|
||||
raise UnknownRoom("This room has not been joined")
|
||||
profile = self.getProfileAssertInRoom(room_jid, profile_key)
|
||||
return self.clients[profile].kick(room_jid, nick, reason=options.get('reason', None))
|
||||
|
||||
def ban(self, entity_jid, room_jid, options={}, profile_key=C.PROF_KEY_NONE):
|
||||
|
|
@ -408,11 +404,7 @@ class XEP_0045(object):
|
|||
"""
|
||||
assert(not entity_jid.resource)
|
||||
assert(not room_jid.resource)
|
||||
profile = self.host.memory.getProfileName(profile_key)
|
||||
if not self.__check_profile(profile):
|
||||
raise exceptions.ProfileUnknownError("Unknown or disconnected profile")
|
||||
if room_jid.userhost() not in self.clients[profile].joined_rooms:
|
||||
raise UnknownRoom("This room has not been joined")
|
||||
profile = self.getProfileAssertInRoom(room_jid, profile_key)
|
||||
return self.clients[profile].ban(room_jid, entity_jid, reason=options.get('reason', None))
|
||||
|
||||
def affiliate(self, entity_jid, room_jid, options=None, profile_key=C.PROF_KEY_NONE):
|
||||
|
|
@ -426,11 +418,7 @@ class XEP_0045(object):
|
|||
assert(not entity_jid.resource)
|
||||
assert(not room_jid.resource)
|
||||
assert('affiliation' in options)
|
||||
profile = self.host.memory.getProfileName(profile_key)
|
||||
if not self.__check_profile(profile):
|
||||
raise exceptions.ProfileUnknownError("Unknown or disconnected profile")
|
||||
if room_jid.userhost() not in self.clients[profile].joined_rooms:
|
||||
raise UnknownRoom("This room has not been joined")
|
||||
profile = self.getProfileAssertInRoom(room_jid, profile_key)
|
||||
# TODO: handles reason and nick
|
||||
return self.clients[profile].modifyAffiliationList(room_jid, [entity_jid], options['affiliation'])
|
||||
|
||||
|
|
@ -626,9 +614,9 @@ class XEP_0045(object):
|
|||
whois_msg.append(_("Nickname: %s") % user.nick)
|
||||
if user.entity:
|
||||
whois_msg.append(_("Entity: %s") % user.entity)
|
||||
if user.affiliation!='none':
|
||||
if user.affiliation != 'none':
|
||||
whois_msg.append(_("Affiliation: %s") % user.affiliation)
|
||||
if user.role!='none':
|
||||
if user.role != 'none':
|
||||
whois_msg.append(_("Role: %s") % user.role)
|
||||
if user.status:
|
||||
whois_msg.append(_("Status: %s") % user.status)
|
||||
|
|
@ -646,7 +634,7 @@ class SatMUCClient (muc.MUCClient):
|
|||
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
|
||||
# and to discard userJoinedRoom signal in this case
|
||||
print "init SatMUCClient OK"
|
||||
|
||||
def subject(self, room, subject):
|
||||
|
|
|
|||
Loading…
Reference in a new issue