Philipp Hörist pushed to branch master at gajim / gajim
Commits: 843b6f1d by lovetox at 2022-08-13T17:19:01+02:00 fix: GroupChat: Handle nickname changes correctly
- - - - - c90c3353 by lovetox at 2022-08-13T17:48:22+02:00 refactor: GED: Prevent registering events multiple times
- - - - - de8cb97b by lovetox at 2022-08-13T17:48:22+02:00 refactor: ChatBanner: Simplify phone image logic
- - - - - ba7e88c2 by lovetox at 2022-08-13T18:06:43+02:00 refactor: ChatBanner: Register events only once
- - - - -
6 changed files:
- gajim/common/ged.py - gajim/common/modules/muc.py - gajim/gtk/chat_banner.py - gajim/gtk/control.py - gajim/gtk/groupchat_nick_completion.py - gajim/gtk/groupchat_roster.py
Changes:
===================================== gajim/common/ged.py ===================================== @@ -57,6 +57,10 @@ def register_event_handler(self,
if event_name in self.handlers: handlers_list = self.handlers[event_name] + if (priority, handler) in handlers_list: + # Don’t register same handler/prio multiple times + return + i = 0 for i, handler_tuple in enumerate(handlers_list): if priority < handler_tuple[0]: @@ -122,11 +126,16 @@ def register_event(self, priority: int, handler: HandlerFuncT) -> None:
+ if (event_name, priority, handler) in self.__event_handlers: + return + self.__event_handlers.append((event_name, priority, handler)) app.ged.register_event_handler(event_name, priority, handler)
def register_events(self, events: list[EventHandlerT]) -> None: for handler in events: + if handler in self.__event_handlers: + continue self.__event_handlers.append(handler) app.ged.register_event_handler(*handler)
===================================== gajim/common/modules/muc.py ===================================== @@ -575,21 +575,21 @@ def _on_muc_user_presence(self, properties.jid, properties.muc_user.nick)
- # Create a copy of the contact object - new_occupant = room.add_resource(properties.muc_user.nick) + # We receive only the unavailable presence here, so we take + # the current presence and create a new contact with it, before we + # update the precence. + nickname = properties.muc_user.nick + new_occupant = room.add_resource(nickname) new_occupant.set_presence(occupant.presence) + self._joined_users[room.jid][nickname] = occupant.presence
presence = self._process_user_presence(properties) occupant.update_presence(presence, properties)
- # new_nick = properties.muc_user.nick - # nick = properties.muc_nickname - # presence_dict = self._joined_users[properties.jid.bare] - # presence_dict[new_nick] = presence_dict.pop(nick) - # self._manager.change_nickname - # TODO remove presence from manager - - room.notify('user-nickname-changed', occupant, properties) + room.notify('user-nickname-changed', + occupant, + new_occupant, + properties) return
is_joined = self._is_user_joined(properties.jid)
===================================== gajim/gtk/chat_banner.py ===================================== @@ -117,16 +117,18 @@ def switch_contact(self, contact: types.ChatContactT) -> None: 'user-joined': self._on_user_state_changed, 'user-left': self._on_user_state_changed, 'user-avatar-update': self._on_user_avatar_update, - 'user-nickname-changed': self._on_user_nickname_changed })
- self.register_events([ - ('message-received', ged.GUI1, self._on_message_received), - ('bookmarks-received', ged.GUI1, self._on_bookmarks_received), - ('muc-disco-update', ged.GUI1, self._on_muc_disco_update), - ('account-enabled', ged.GUI2, self._on_account_changed), - ('account-disabled', ged.GUI2, self._on_account_changed) - ]) + if not self.has_events_registered(): + self.register_events([ + ('message-received', ged.GUI2, self._on_message_received), + ('muc-disco-update', ged.GUI2, self._on_muc_disco_update), + ('bookmarks-received', ged.GUI2, self._on_bookmarks_received), + ('account-enabled', ged.GUI2, self._on_account_changed), + ('account-disabled', ged.GUI2, self._on_account_changed) + ]) + + self._ui.phone_image.set_visible(False)
if hide_banner: self.set_no_show_all(True) @@ -188,15 +190,6 @@ def _on_user_role_changed(self, user_contact: GroupchatParticipant, properties: PresenceProperties ) -> None: - self._update_content() - - def _on_user_nickname_changed(self, - user_contact: GroupchatParticipant, - _signal_name: str, - properties: PresenceProperties, - ) -> None: - if user_contact.name != properties.muc_nickname: - return
self._update_content()
@@ -207,45 +200,32 @@ def _on_user_avatar_update(self, *args: Any) -> None: self._update_avatar()
def _on_bookmarks_received(self, _event: BookmarksReceived) -> None: + if not isinstance(self._contact, GroupchatContact): + return + self._update_content()
def _on_muc_disco_update(self, event: MucDiscoUpdate) -> None: - if self._contact is None or event.jid != self._contact.jid: + assert self._contact is not None + if event.jid != self._contact.jid: return
self._update_content()
def _on_account_changed(self, event: AccountEnabled) -> None: - if self._contact is None: - return - + assert self._contact is not None self._update_account_badge(self._contact.account)
def _on_message_received(self, event: MessageReceived) -> None: - if not event.msgtxt: - return - - if event.properties.is_sent_carbon: - return - - assert self._contact is not None - - if event.jid != self._contact.jid: - return - - self._ui.phone_image.set_visible(False) - - if isinstance(self._contact, ( - GroupchatContact, GroupchatParticipant)): - return - - kind = 'outgoing' if event.properties.is_sent_carbon else 'incoming' - if kind == 'outgoing': + if (not isinstance(self._contact, BareContact) or + event.jid != self._contact.jid or + not event.msgtxt or + event.properties.is_sent_carbon or + event.resource is None): return
- if event.resource is not None and not self._contact.is_groupchat: - resource_contact = self._contact.get_resource(event.resource) - self._ui.phone_image.set_visible(resource_contact.is_phone) + resource_contact = self._contact.get_resource(event.resource) + self._ui.phone_image.set_visible(resource_contact.is_phone)
def _update_avatar(self) -> None: scale = app.window.get_scale_factor()
===================================== gajim/gtk/control.py ===================================== @@ -174,9 +174,6 @@ def switch_contact(self, contact: Union[BareContact, if isinstance(contact, GroupchatParticipant): contact.multi_connect({ 'user-status-show-changed': self._on_user_status_show_changed, - # 'user-nickname-changed': self._on_user_nickname_changed, - # 'room-kicked': self._on_room_kicked, - # 'room-destroyed': self._on_room_destroyed, })
elif isinstance(contact, GroupchatContact): @@ -187,7 +184,7 @@ def switch_contact(self, contact: Union[BareContact, 'user-role-changed': self._on_user_role_changed, 'user-status-show-changed': self._on_muc_user_status_show_changed, - # 'user-nickname-changed': self._on_user_nickname_changed, + 'user-nickname-changed': self._on_user_nickname_changed, 'room-kicked': self._on_room_kicked, 'room-destroyed': self._on_room_destroyed, 'room-config-finished': self._on_room_config_finished, @@ -693,27 +690,21 @@ def add_message(self, additional_data=additional_data)
def _on_user_nickname_changed(self, - _user_contact: GroupchatParticipant, + contact: types.GroupchatContact, _signal_name: str, - properties: PresenceProperties, + old_contact: types.GroupchatParticipant, + new_contact: types.GroupchatParticipant, + properties: PresenceProperties ) -> None:
- # TODO: check if the nick logic makes sense - return - # if isinstance(self.contact, GroupchatContact): - # nick = user_contact.name - # else: - # nick = properties.muc_nickname - - # assert properties.muc_user is not None - # new_nick = properties.muc_user.nick - # if properties.is_muc_self_presence: - # message = _('You are now known as %s') % new_nick - # else: - # message = _('{nick} is now known ' - # 'as {new_nick}').format(nick=nick, new_nick=new_nick) - - # self.add_info_message(message) + if properties.is_muc_self_presence: + message = _('You are now known as %s') % new_contact.name + else: + message = _('{nick} is now known ' + 'as {new_nick}').format(nick=old_contact.name, + new_nick=new_contact.name) + + self.add_info_message(message)
def _on_muc_user_status_show_changed(self, contact: GroupchatContact,
===================================== gajim/gtk/groupchat_nick_completion.py ===================================== @@ -78,16 +78,17 @@ def switch_contact(self, contact: types.GroupchatContactT) -> None: def _on_user_nickname_changed(self, _contact: types.GroupchatContact, _signal_name: str, - user_contact: types.GroupchatParticipant, + old_contact: types.GroupchatParticipant, + new_contact: types.GroupchatParticipant, properties: PresenceProperties ) -> None: + if properties.is_muc_self_presence: return
- old_name = user_contact.name - assert properties.muc_user - new_name = properties.muc_user.nick - assert new_name is not None + old_name = old_contact.name + new_name = new_contact.name + log.debug('Contact %s renamed to %s', old_name, new_name) for lst in (self._highlight_list, self._sender_list): for idx, contact in enumerate(lst):
===================================== gajim/gtk/groupchat_roster.py ===================================== @@ -283,16 +283,13 @@ def _update_contact(self, def _on_user_nickname_changed(self, contact: types.GroupchatContact, _signal_name: str, - user_contact: types.GroupchatParticipant, + old_contact: types.GroupchatParticipant, + new_contact: types.GroupchatParticipant, properties: PresenceProperties ) -> None:
- self._remove_contact(user_contact) - - assert properties.muc_user is not None - assert properties.muc_user.nick is not None - user_contact = contact.get_resource(properties.muc_user.nick) - self._add_contact(user_contact) + self._remove_contact(old_contact) + self._add_contact(new_contact)
def _on_user_status_show_changed(self, _contact: types.GroupchatContact,
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/0835a88652ee14c9e9b6889acdc15b50...