Philipp Hörist pushed to branch mainwindow at gajim / gajim
Commits: 5b75c68a by lovetox at 2021-03-01T22:30:11+01:00 Fix private chat
- - - - -
8 changed files:
- gajim/chat_control.py - gajim/chat_control_base.py - gajim/common/modules/contacts.py - gajim/common/modules/vcard_avatars.py - gajim/groupchat_control.py - gajim/gtk/chat_stack.py - gajim/gtk/main.py - gajim/privatechat_control.py
Changes:
===================================== gajim/chat_control.py ===================================== @@ -101,17 +101,10 @@ class ChatControl(ChatControlBase): COMMAND_HOST = ChatCommands # type: ClassVar[Type[CommandHost]]
def __init__(self, parent_win, jid, acct, session, resource=None): - - contact = app.get_client(acct).get_module('Contacts').get_contact(jid) - contact.connect('presence-update', self._on_presence_update) - contact.connect('chatstate-update', self._on_chatstate_update) - contact.connect('nickname-update', self._on_nickname_update) - contact.connect('avatar-update', self._on_avatar_update) - ChatControlBase.__init__(self, parent_win, 'chat_control', - contact, + jid, acct, resource)
@@ -225,6 +218,14 @@ def __init__(self, parent_win, jid, acct, session, resource=None): app.plugin_manager.gui_extension_point('chat_control', self) self.update_actions()
+ def _connect_contact_signals(self): + self.contact.multi_connect({ + 'presence-update': self._on_presence_update, + 'chatstate-update': self._on_chatstate_update, + 'nickname-update': self._on_nickname_update, + 'avatar-update': self._on_avatar_update, + }) + @property def jid(self): return self.contact.jid @@ -315,7 +316,7 @@ def update_actions(self):
# Send file (Jingle) jingle_support = self.contact.supports(Namespace.JINGLE_FILE_TRANSFER_5) - jingle_conditions = jingle_support and not self.contact.show.is_offline + jingle_conditions = jingle_support and self.contact.is_available jingle = win.lookup_action('send-file-jingle-' + self.control_id) jingle.set_enabled(online and jingle_conditions)
@@ -532,7 +533,7 @@ def _on_update_client_info(self, event): return self.xml.phone_image.set_visible(contact.uses_phone)
- def _on_chatstate_update(self, _contact, _signal_name): + def _on_chatstate_update(self, *args): self.draw_banner_text()
def _on_nickname_update(self, _contact, _signal_name):
===================================== gajim/chat_control_base.py ===================================== @@ -43,7 +43,6 @@ from gajim.common.i18n import _ from gajim.common.nec import EventHelper from gajim.common.helpers import AdditionalDataDict -from gajim.common.contacts import GC_Contact from gajim.common.structs import OutgoingMessage
from gajim import gtkgui_helpers @@ -99,7 +98,7 @@ class ChatControlBase(ChatCommandProcessor, CommandTools, EventHelper):
_type = None # type: ControlType
- def __init__(self, parent_win, widget_name, contact, acct, + def __init__(self, parent_win, widget_name, jid, acct, resource=None): EventHelper.__init__(self) # Undo needs this variable to know if space has been pressed. @@ -108,7 +107,13 @@ def __init__(self, parent_win, widget_name, contact, acct,
self.handlers = {} self.parent_win = parent_win + + groupchat = self._type != ControlType.CHAT + contact = app.get_client(acct).get_module('Contacts').get_contact( + jid, groupchat=groupchat) self.contact = contact + self._connect_contact_signals() + self.account = acct self.resource = resource
@@ -267,6 +272,9 @@ def __init__(self, parent_win, widget_name, contact, acct, # to properly use the super, because of the old code. CommandTools.__init__(self)
+ def _connect_contact_signals(self): + raise NotImplementedError + def process_event(self, event): method_name = event.name.replace('-', '_') method_name = f'_on_{method_name}' @@ -470,9 +478,7 @@ def setup_seclabel(self): # text to show is in in first column of liststore self.xml.label_selector.add_attribute(cell, 'text', 0) con = app.connections[self.account] - jid = self.contact.jid - if self._type.is_privatechat: - jid = self.gc_contact.room_jid + jid = self.contact.jid.bare if con.get_module('SecLabels').supported: con.get_module('SecLabels').request_catalog(jid)
@@ -480,9 +486,7 @@ def _sec_labels_received(self, event): if event.account != self.account: return
- jid = self.contact.jid - if self._type.is_privatechat: - jid = self.gc_contact.room_jid + jid = self.contact.jid.bare
if event.jid != jid: return @@ -971,9 +975,7 @@ def get_seclabel(self): return None
con = app.connections[self.account] - jid = self.contact.jid - if self._type.is_privatechat: - jid = self.gc_contact.room_jid + jid = self.contact.jid.bare catalog = con.get_module('SecLabels').get_catalog(jid) labels, label_list = catalog.labels, catalog.get_label_names() lname = label_list[idx]
===================================== gajim/common/modules/contacts.py ===================================== @@ -393,6 +393,10 @@ def affiliation(self): def role(self): return self._presence.role
+ @property + def chatstate(self): + return self._module('Chatstate').get_remote_chatstate(self._jid) + @property def avatar_sha(self): return self._client.get_module('VCardAvatars').get_avatar_sha(self._jid)
===================================== gajim/common/modules/vcard_avatars.py ===================================== @@ -163,7 +163,8 @@ def _process_update(self, jid, state, avatar_sha, groupchat): self._request_vcard(jid, avatar_sha, 'contact')
def _muc_update_received(self, properties): - contact = self._con.get_module('Contacts').get_contact(properties.jid) + contact = self._con.get_module('Contacts').get_contact(properties.jid, + groupchat=True) nick = properties.jid.resource
if properties.avatar_state == AvatarState.EMPTY:
===================================== gajim/groupchat_control.py ===================================== @@ -86,40 +86,12 @@ class GroupchatControl(ChatControlBase): COMMAND_HOST = GroupChatCommands
def __init__(self, parent_win, jid, muc_data, acct): - - contact = app.get_client(acct).get_module('Contacts').get_contact( - jid, groupchat=True) - contact.multi_connect({ - 'avatar-update': self._on_avatar_update, - 'user-joined': self._on_user_joined, - 'user-left': self._on_user_left, - 'user-affiliation-changed': self._on_user_affiliation_changed, - 'user-role-changed': self._on_user_role_changed, - '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, - 'room-config-finished': self._on_room_config_finished, - 'room-config-failed': self._on_room_config_failed, - 'room-config-changed': self._on_room_config_changed, - 'room-password-required': self._on_room_password_required, - 'room-creation-failed': self._on_room_creation_failed, - 'room-presence-error': self._on_room_presence_error, - 'room-voice-request': self._on_room_voice_request, - 'room-captcha-challenge': self._on_room_captcha_challenge, - 'room-captcha-error': self._on_room_captcha_error, - 'room-subject': self._on_room_subject, - 'room-joined': self._on_room_joined, - 'room-join-failed': self._on_room_join_failed, - }) - - # contact.connect('user-avatar-update', self._on_user_avatar_update) - ChatControlBase.__init__(self, parent_win, 'groupchat_control', - contact, + jid, acct) + self.force_non_minimizable = False self.is_anonymous = True
@@ -247,6 +219,31 @@ def __init__(self, parent_win, jid, muc_data, acct): app.plugin_manager.gui_extension_point('groupchat_control', self) self._restore_conversation()
+ def _connect_contact_signals(self): + self.contact.multi_connect({ + 'avatar-update': self._on_avatar_update, + 'user-joined': self._on_user_joined, + 'user-left': self._on_user_left, + 'user-affiliation-changed': self._on_user_affiliation_changed, + 'user-role-changed': self._on_user_role_changed, + '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, + 'room-config-finished': self._on_room_config_finished, + 'room-config-failed': self._on_room_config_failed, + 'room-config-changed': self._on_room_config_changed, + 'room-password-required': self._on_room_password_required, + 'room-creation-failed': self._on_room_creation_failed, + 'room-presence-error': self._on_room_presence_error, + 'room-voice-request': self._on_room_voice_request, + 'room-captcha-challenge': self._on_room_captcha_challenge, + 'room-captcha-error': self._on_room_captcha_error, + 'room-subject': self._on_room_subject, + 'room-joined': self._on_room_joined, + 'room-join-failed': self._on_room_join_failed, + }) + def _on_muc_state_changed(self, _muc_manager, _signal_name, state): if state == MUCJoinedState.JOINED: self.roster.initial_draw()
===================================== gajim/gtk/chat_stack.py ===================================== @@ -71,7 +71,7 @@ def add_group_chat(self, account, jid):
def add_private_chat(self, account, jid): mw = self.get_toplevel() - control = PrivateChatControl(mw, jid, None, account, None) + control = PrivateChatControl(mw, jid, account) self._controls[(account, str(jid))] = control self.add_named(control.widget, f'{account}:{jid}') control.widget.show_all()
===================================== gajim/gtk/main.py ===================================== @@ -487,6 +487,7 @@ def _load_chats(self): for account, jid, type_, pinned in open_chats: if account not in active_accounts: continue + self.add_chat_for_workspace(workspace_id, account, jid, type_, pinned=pinned)
@@ -511,9 +512,13 @@ def _on_event(self, event): if not self.chat_exists(event.account, event.jid): if event.name == 'message-received': if event.properties.is_muc_pm: - self.add_private_chat(event.account, event.jid, 'pm') + self.add_private_chat(event.account, + event.properties.jid, + 'pm') else: - self.add_chat(event.account, event.jid, 'contact') + self.add_chat(event.account, + event.properties.jid, + 'contact') else: # No chat is open, dont handle any gui events return
===================================== gajim/privatechat_control.py ===================================== @@ -46,56 +46,48 @@ class PrivateChatControl(ChatControl): # will be processed with this command host. COMMAND_HOST = PrivateChatCommands
- def __init__(self, parent_win, gc_contact, contact, account, session): - room_jid = gc_contact.room_jid - self.room_ctrl = app.window.get_control(account, room_jid) - self.gc_contact = gc_contact - ChatControl.__init__(self, parent_win, contact, account, session) + def __init__(self, parent_win, jid, account): + client = app.get_client(account) + self._room_contact = client.get_module('Contacts').get_contact(jid.bare) + self._manager = client.get_module('MUC').get_manager() + + ChatControl.__init__(self, parent_win, jid, account, None)
- # pylint: disable=line-too-long # self.register_events([ # ('update-gc-avatar', ged.GUI1, self._on_update_gc_avatar), # ('caps-update', ged.GUI1, self._on_caps_update), - # ('muc-user-joined', ged.GUI1, self._on_user_joined), - # ('muc-user-left', ged.GUI1, self._on_user_left), - # ('muc-nickname-changed', ged.GUI1, self._on_nickname_changed), - # ('muc-self-presence', ged.GUI1, self._on_self_presence), - # ('muc-self-kicked', ged.GUI1, self._on_disconnected), - # ('muc-user-status-show-changed', ged.GUI1, self._on_status_show_changed), - # ('muc-destroyed', ged.GUI1, self._on_disconnected), - # ]) - # pylint: enable=line-too-long - - @property - def contact(self): - return self.gc_contact.as_contact()
- @contact.setter - def contact(self, _value): - # TODO: remove all code that sets the contact here - return + def _connect_contact_signals(self): + self.contact.multi_connect({ + 'user-avatar-update': self._on_user_avatar_update, + 'user-joined': self._on_user_joined, + 'user-left': self._on_user_left, + '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, + 'room-joined': self._on_room_joined, + # 'room-left': self._on_room_left + 'chatstate-update': self._on_chatstate_update, + })
@property def room_name(self): - if self.room_ctrl is not None: - return self.room_ctrl.room_name - return self.gc_contact.room_jid + return self._room_contact.name
def get_our_nick(self): - return self.room_ctrl.nick - - def _on_caps_update(self, event): - if event.fjid != self.gc_contact.get_full_jid(): - return - self.update_contact() - - def _on_nickname_changed(self, event): - if event.properties.new_jid != self.gc_contact.get_full_jid(): - return - - nick = event.properties.muc_nickname - new_nick = event.properties.muc_user.nick - if event.properties.is_muc_self_presence: + muc_data = self._manager.get(self._room_contact.jid) + return muc_data.nick + + def _on_user_nickname_changed(self, + _contact, + _signal_name, + _user_contact, + properties): + + nick = properties.muc_nickname + 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 ' @@ -104,31 +96,23 @@ def _on_nickname_changed(self, event): self.add_info_message(message)
self.draw_banner() - app.interface.msg_win_mgr.change_key(str(event.properties.jid), - str(event.properties.new_jid), - self.account) - - self.parent_win.redraw_tab(self) self.update_ui()
- @event_filter(['account']) - def _on_status_show_changed(self, event): - if event.properties.jid != self.gc_contact.get_full_jid(): - return - - nick = event.properties.muc_nickname - status = event.properties.status + def _on_user_status_show_changed(self, + _contact, + _signal_name, + _user_contact, + properties): + nick = properties.muc_nickname + status = properties.status status = '' if status is None else ' - %s' % status - show = helpers.get_uf_show(event.properties.show.value) + show = helpers.get_uf_show(properties.show.value)
- if not app.settings.get_group_chat_setting(self.account, - self.gc_contact.room_jid, - 'print_status'): - self.parent_win.redraw_tab(self) + if not self._room_contact.settings.get('print_status'): self.update_ui() return
- if event.properties.is_muc_self_presence: + if properties.is_muc_self_presence: message = _('You are now {show}{status}').format(show=show, status=status)
@@ -137,46 +121,24 @@ def _on_status_show_changed(self, event): show=show, status=status) self.add_status_message(message) - self.parent_win.redraw_tab(self) self.update_ui()
- @event_filter(['account']) - def _on_disconnected(self, event): - if event.properties.jid != self.gc_contact.get_full_jid(): - return + # def _on_disconnected(self, event): + # if event.properties.jid != self.gc_contact.get_full_jid(): + # return + # self.got_disconnected()
+ def _on_user_left(self, *args): self.got_disconnected()
- @event_filter(['account']) - def _on_user_left(self, event): - if event.properties.jid != self.gc_contact.get_full_jid(): - return - - self.got_disconnected() - - @event_filter(['account']) - def _on_user_joined(self, event): - if event.properties.jid != self.gc_contact.get_full_jid(): - return - - self.gc_contact = app.contacts.get_gc_contact( - self.account, self.gc_contact.room_jid, self.gc_contact.name) - self.parent_win.redraw_tab(self) + def _on_user_joined(self, *args): self.got_connected()
- @event_filter(['account']) - def _on_self_presence(self, event): - if event.properties.jid != self.gc_contact.get_full_jid(): + def _on_room_joined(self, *args): + if not self.contact.is_available: return - - self.parent_win.redraw_tab(self) self.got_connected()
- def _on_update_gc_avatar(self, event): - if event.contact != self.gc_contact: - return - self._update_avatar() - def send_message(self, message, xhtml=None, process_commands=True, attention=False): """ @@ -188,14 +150,13 @@ def send_message(self, message, xhtml=None, process_commands=True,
# We need to make sure that we can still send through the room and that # the recipient did not go away - if self.gc_contact.presence.is_unavailable: + if not self.contact.is_available: ErrorDialog( _('Sending private message failed'), #in second %s code replaces with nickname _('You are no longer in group chat "%(room)s" or ' '"%(nick)s" has left.') % { - 'room': self.room_name, 'nick': self.gc_contact.name}, - transient_for=self.parent_win.window) + 'room': self.room_name, 'nick': self.contact.name}) return
ChatControl.send_message(self, message, @@ -204,35 +165,16 @@ def send_message(self, message, xhtml=None, process_commands=True, attention=attention)
def update_ui(self): - if self.gc_contact.presence.is_unavailable: + if not self.contact.is_available: self.got_disconnected() else: self.got_connected()
- def _update_avatar(self): - scale = self.parent_win.window.get_scale_factor() - surface = self.gc_contact.get_avatar(AvatarSize.CHAT, - scale, - self.gc_contact.show.value) - - self.xml.avatar_image.set_from_surface(surface) - - def get_tab_image(self): - if self.gc_contact.presence.is_unavailable: - show = 'offline' - else: - show = self.gc_contact.show.value - scale = self.parent_win.window.get_scale_factor() - return self.gc_contact.get_avatar(AvatarSize.ROSTER, - scale, - show) - - def update_contact(self): - self.contact = self.gc_contact.as_contact() + def _on_user_avatar_update(self, *args): + self._update_avatar()
def got_disconnected(self): ChatControl.got_disconnected(self) - self.parent_win.redraw_tab(self) ChatControl.update_ui(self)
def got_connected(self):
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/5b75c68ae0c582db97b5120b280e57c82...