Mercurial > libervia-web
diff src/browser/libervia_main.py @ 584:0a06cf833f5a
browser_side: various improvements, especially for MUC
author | souliane <souliane@mailoo.org> |
---|---|
date | Wed, 22 Oct 2014 19:03:55 +0200 |
parents | 1c1dbe03d3c6 |
children | 3eb3a2c0c011 a5019e62c3e9 |
line wrap: on
line diff
--- a/src/browser/libervia_main.py Wed Oct 22 14:19:25 2014 +0200 +++ b/src/browser/libervia_main.py Wed Oct 22 19:03:55 2014 +0200 @@ -722,6 +722,44 @@ lib_wid.refresh() return lib_wid + def getRoomWidget(self, target): + """Get the MUC widget for the given target. + + @param target (jid.JID): BARE jid of the MUC + @return: panels.ChatPanel instance or None + """ + entity = {'item': target, 'type_': 'group'} + if target.full() in self.room_list or target in self.room_list: # as JID is a string-based class, we don't know what will please Pyjamas... + return self.getLiberviaWidget(panels.ChatPanel, entity, ignoreOtherTabs=False) + return None + + def getOrCreateRoomWidget(self, target): + """Get the MUC widget for the given target, create it if necessary. + + @param target (jid.JID): BARE jid of the MUC + @return: panels.ChatPanel instance + """ + lib_wid = self.getRoomWidget(target) + if lib_wid: + return lib_wid + + # XXX: target.node.startwith(...) raises an error "startswith is not a function" + # This happens when node a is property defined in the JID class + # FIXME: pyjamas doesn't handle the properties well + node = target.node + + # XXX: it's not really beautiful, but it works :) + if node.startswith('sat_tarot_'): + tab_name = "Tarot" + elif node.startswith('sat_radiocol_'): + tab_name = "Radio collective" + else: + tab_name = target.node + + self.room_list.append(target) + entity = {'item': target, 'type_': 'group'} + return self.getOrCreateLiberviaWidget(panels.ChatPanel, entity, new_tab=tab_name) + def _newMessageCb(self, from_jid_s, msg, msg_type, to_jid_s, extra): from_jid = jid.JID(from_jid_s) to_jid = jid.JID(to_jid_s) @@ -766,8 +804,9 @@ if statuses: self.status_panel.setStatus(statuses.values()[0]) # pylint: disable=E1103 else: - if entity_jid.bare in self.room_list: - wid = self.getLiberviaWidget(panels.ChatPanel, {'item': entity_jid, 'type_': 'group'}, ignoreOtherTabs=False) + bare_jid = entity_jid.bareJID() + if bare_jid.full() in self.room_list or bare_jid in self.room_list: # as JID is a string-based class, we don't know what will please Pyjamas... + wid = self.getRoomWidget(bare_jid) else: wid = self.contact_panel if show == 'unavailable': # XXX: save some resources as for now we only need 'unavailable' @@ -777,75 +816,56 @@ if wid: wid.setConnected(entity_jid.bare, entity_jid.resource, show, priority, statuses) - def _roomJoinedCb(self, room_jid, room_nicks, user_nick): - _target = jid.JID(room_jid) - - # XXX: _target.node.startwith(...) raises an error "startswith is not a function" - # This happens when node a is property defined in the JID class - # FIXME: pyjamas doesn't handle the properties well - node = _target.node - - if _target not in self.room_list: - self.room_list.append(_target) - - # XXX: it's not really beautiful, but it works :) - if node.startswith('sat_tarot_'): - tab_name = "Tarot" - elif node.startswith('sat_radiocol_'): - tab_name = "Radio collective" - else: - tab_name = _target.node - - chat_panel = self.getOrCreateLiberviaWidget(panels.ChatPanel, {'item': _target, 'type_': 'group'}, new_tab=tab_name) + def _roomJoinedCb(self, room_jid_s, room_nicks, user_nick): + chat_panel = self.getOrCreateRoomWidget(jid.JID(room_jid_s)) chat_panel.setUserNick(user_nick) chat_panel.setPresents(room_nicks) - chat_panel.historyPrint() chat_panel.refresh() - def _roomLeftCb(self, room_jid, room_nicks, user_nick): - # FIXME: room_list contains jid.JID instances so why MUST we do - # 'remove(room_jid)' and not 'remove(jid.JID(room_jid))' ????!! - # This looks like a pyjamas bug --> check/report + def _roomLeftCb(self, room_jid_s, room_nicks, user_nick): try: - self.room_list.remove(room_jid) + del self.room_list[room_jid_s] except KeyError: - pass + try: # as JID is a string-based class, we don't know what will please Pyjamas... + del self.room_list[jid.JID(room_jid_s)] + except KeyError: + pass def _roomUserJoinedCb(self, room_jid_s, user_nick, user_data): - for lib_wid in self.libervia_widgets: - if isinstance(lib_wid, panels.ChatPanel) and lib_wid.type == 'group' and lib_wid.target.bare == room_jid_s: - lib_wid.userJoined(user_nick, user_data) + lib_wid = self.getOrCreateRoomWidget(jid.JID(room_jid_s)) + if lib_wid: + lib_wid.userJoined(user_nick, user_data) def _roomUserLeftCb(self, room_jid_s, user_nick, user_data): - for lib_wid in self.libervia_widgets: - if isinstance(lib_wid, panels.ChatPanel) and lib_wid.type == 'group' and lib_wid.target.bare == room_jid_s: - lib_wid.userLeft(user_nick, user_data) + lib_wid = self.getRoomWidget(jid.JID(room_jid_s)) + if lib_wid: + lib_wid.userLeft(user_nick, user_data) def _roomUserChangedNickCb(self, room_jid_s, old_nick, new_nick): """Called when an user joined a MUC room""" - for lib_wid in self.libervia_widgets: - if isinstance(lib_wid, panels.ChatPanel) and lib_wid.type == 'group' and lib_wid.target.bare == room_jid_s: - lib_wid.changeUserNick(old_nick, new_nick) + lib_wid = self.getRoomWidget(jid.JID(room_jid_s)) + if lib_wid: + lib_wid.changeUserNick(old_nick, new_nick) def _tarotGameStartedCb(self, waiting, room_jid_s, referee, players): - for lib_wid in self.libervia_widgets: - if isinstance(lib_wid, panels.ChatPanel) and lib_wid.type == 'group' and lib_wid.target.bare == room_jid_s: - lib_wid.startGame("Tarot", waiting, referee, players) + lib_wid = self.getRoomWidget(jid.JID(room_jid_s)) + if lib_wid: + lib_wid.startGame("Tarot", waiting, referee, players) def _tarotGameGenericCb(self, event_name, room_jid_s, args): - for lib_wid in self.libervia_widgets: - if isinstance(lib_wid, panels.ChatPanel) and lib_wid.type == 'group' and lib_wid.target.bare == room_jid_s: - getattr(lib_wid.getGame("Tarot"), event_name)(*args) + lib_wid = self.getRoomWidget(jid.JID(room_jid_s)) + if lib_wid: + getattr(lib_wid.getGame("Tarot"), event_name)(*args) def _radioColStartedCb(self, waiting, room_jid_s, referee, players, queue_data): - for lib_wid in self.libervia_widgets: - if isinstance(lib_wid, panels.ChatPanel) and lib_wid.type == 'group' and lib_wid.target.bare == room_jid_s: - lib_wid.startGame("RadioCol", waiting, referee, players, queue_data) + lib_wid = self.getRoomWidget(jid.JID(room_jid_s)) + if lib_wid: + lib_wid.startGame("RadioCol", waiting, referee, players, queue_data) def _radioColGenericCb(self, event_name, room_jid_s, args): - for lib_wid in self.libervia_widgets: - if isinstance(lib_wid, panels.ChatPanel) and lib_wid.type == 'group' and lib_wid.target.bare == room_jid_s: - getattr(lib_wid.getGame("RadioCol"), event_name)(*args) + lib_wid = self.getRoomWidget(jid.JID(room_jid_s)) + if lib_wid: + getattr(lib_wid.getGame("RadioCol"), event_name)(*args) def _getPresenceStatusesCb(self, presence_data): for entity in presence_data: @@ -909,17 +929,13 @@ @param state: new state (string) """ if from_jid_s == '@ALL@': - target = '@ALL@' - nick = C.ALL_OCCUPANTS - else: - from_jid = jid.JID(from_jid_s) - target = from_jid.bare - nick = from_jid.resource - - for lib_wid in self.libervia_widgets: - if isinstance(lib_wid, panels.ChatPanel): - if target == '@ALL@' or lib_wid.matchEntity(target): - lib_wid.setState(state, nick=nick) + for lib_wid in self.libervia_widgets: + if isinstance(lib_wid, panels.ChatPanel): + lib_wid.setState(state, nick=C.ALL_OCCUPANTS) + return + from_jid = jid.JID(from_jid_s) + lib_wid = self.getLiberviaWidget(panels.ChatPanel, {'item': from_jid}, ignoreOtherTabs=False) + lib_wid.setState(state, nick=from_jid.resource) def _askConfirmation(self, confirmation_id, confirmation_type, data): answer_data = {}