Philipp Hörist pushed to branch mainwindow at gajim / gajim
Commits: 0a1e65bb by lovetox at 2021-02-07T23:31:21+01:00 Make Private Chat work
- - - - -
7 changed files:
- gajim/chat_control.py - gajim/common/modules/message.py - gajim/groupchat_control.py - gajim/gtk/chat_list.py - gajim/gtk/chat_stack.py - gajim/gtk/main.py - gajim/privatechat_control.py
Changes:
===================================== gajim/chat_control.py ===================================== @@ -188,19 +188,19 @@ def __init__(self, parent_win, contact, acct, session, resource=None):
self.subscribe_events()
- if not session: - # Don't use previous session if we want to a specific resource - # and it's not the same - if not resource: - resource = contact.resource - session = app.connections[self.account].find_controlless_session( - self.contact.jid, resource) + # if not session: + # # Don't use previous session if we want to a specific resource + # # and it's not the same + # if not resource: + # resource = contact.resource + # session = app.connections[self.account].find_controlless_session( + # self.contact.jid, resource) + + # if session: + # session.control = self + # self.session = session
self.setup_seclabel() - if session: - session.control = self - self.session = session - self.add_actions() self.update_ui() self.set_lock_image()
===================================== gajim/common/modules/message.py ===================================== @@ -176,7 +176,7 @@ def _message_received(self, _con, stanza, properties): 'account': self._account, 'additional_data': additional_data, 'fjid': fjid, - 'jid': jid, + 'jid': fjid if properties.is_muc_pm else jid, 'resource': resource, 'stanza_id': stanza_id, 'unique_id': stanza_id or message_id,
===================================== gajim/groupchat_control.py ===================================== @@ -679,7 +679,13 @@ def on_groupchat_maximize(self): self.last_msg_id = None
def _on_roster_row_activated(self, _roster, nick): - self._start_private_message(nick) + gc_c = app.contacts.get_gc_contact(self.account, self.room_jid, nick) + muc_prefer_direct_msg = app.settings.get('muc_prefer_direct_msg') + if not self.is_anonymous and muc_prefer_direct_msg: + jid = app.get_jid_without_resource(gc_c.jid) + app.window.add_chat(self.account, jid, 'contact', select=True) + else: + app.window.add_private_chat(self.account, gc_c.get_full_jid())
def on_msg_textview_populate_popup(self, textview, menu): """ @@ -823,38 +829,6 @@ def _on_gc_message_received(self, event): additional_data=event.additional_data) event.needs_highlight = self.needs_visual_notification(event.msgtxt)
- def on_private_message(self, nick, sent, msg, tim, session, additional_data, - message_id, msg_log_id=None, displaymarking=None): - # Do we have a queue? - fjid = self.room_jid + '/' + nick - - event = events.PmEvent(msg, - '', - 'incoming', - tim, - '', - msg_log_id, - session=session, - displaymarking=displaymarking, - sent_forwarded=sent, - additional_data=additional_data, - message_id=message_id) - - app.events.add_event(self.account, fjid, event) - - if allow_popup_window(self.account): - self._start_private_message(nick) - else: - self.roster.draw_contact(nick) - if self.parent_win: - self.parent_win.show_title() - self.parent_win.redraw_tab(self) - - contact = app.contacts.get_contact_with_highest_priority( - self.account, self.room_jid) - if contact: - app.interface.roster.draw_contact(self.room_jid, self.account) - def add_message(self, text, contact='', tim=None, displaymarking=None, correct_id=None, message_id=None, stanza_id=None, additional_data=None): @@ -1052,24 +1026,6 @@ def _on_muc_config_changed(self, event): for change in changes: self.add_info_message(change)
- def _on_message_received(self, event): - if not event.properties.jid.bare_match(self.room_jid): - return - - if event.properties.is_muc_pm and not event.session.control: - # We got a pm from this room - nick = event.resource - # otherwise pass it off to the control to be queued - self.on_private_message(nick, - event.properties.is_sent_carbon, - event.msgtxt, - event.properties.timestamp, - self.session, - event.additional_data, - event.properties.id, - msg_log_id=event.msg_log_id, - displaymarking=event.displaymarking) - def _on_our_show(self, event): client = app.get_client(event.account) if (event.show == 'offline' and @@ -1111,10 +1067,10 @@ def leave(self, reason=None): def rejoin(self): app.connections[self.account].get_module('MUC').join(self._muc_data)
- def send_pm(self, nick, message=None): - ctrl = self._start_private_message(nick) - if message is not None: - ctrl.send_message(message) + # def send_pm(self, nick, message=None): + # ctrl = self._start_private_message(nick) + # if message is not None: + # ctrl.send_message(message)
def _on_muc_self_presence(self, event): nick = event.properties.muc_nickname @@ -1758,22 +1714,6 @@ def focus(self): elif page_name == 'destroy': self.xml.destroy_reason_entry.grab_focus_without_selecting()
- def _start_private_message(self, nick): - gc_c = app.contacts.get_gc_contact(self.account, self.room_jid, nick) - nick_jid = gc_c.get_full_jid() - - muc_prefer_direct_msg = app.settings.get('muc_prefer_direct_msg') - pm_queue = len(app.events.get_events( - self.account, jid=nick_jid, types=['pm'])) - if not self.is_anonymous and muc_prefer_direct_msg and not pm_queue: - jid = app.get_jid_without_resource(gc_c.jid) - ctrl = app.interface.new_chat_from_jid(self.account, jid) - else: - ctrl = app.interface.new_private_chat(gc_c, self.account) - ctrl.parent_win.set_active_tab(ctrl) - - return ctrl - def append_nick_in_msg_textview(self, _widget, nick): self.msg_textview.remove_placeholder() message_buffer = self.msg_textview.get_buffer()
===================================== gajim/gtk/chat_list.py ===================================== @@ -63,7 +63,7 @@ def _update_timer(self):
def _query_tooltip(self, widget, _x_pos, y_pos, _keyboard_mode, tooltip): row = self.get_row_at_y(y_pos) - if row is None: + if row is None or row.type == 'pm': self._tab_tooltip.clear_tooltip() return False
===================================== gajim/gtk/chat_stack.py ===================================== @@ -6,6 +6,7 @@ from gajim.common import app from gajim.chat_control import ChatControl from gajim.groupchat_control import GroupchatControl +from gajim.privatechat_control import PrivateChatControl
from gajim.common.i18n import _
@@ -77,6 +78,17 @@ def add_group_chat(self, account, jid): self.add_named(control.widget, f'{account}:{jid}') control.widget.show_all()
+ def add_private_chat(self, account, jid): + mw = self.get_toplevel() + bare_jid = app.get_jid_without_resource(jid) + nick = app.get_resource_from_jid(jid) + gc_c = app.contacts.get_gc_contact(account, bare_jid, nick) + contact = gc_c.as_contact() + control = PrivateChatControl(mw, gc_c, contact, account, None) + self._controls[(account, str(jid))] = control + self.add_named(control.widget, f'{account}:{jid}') + control.widget.show_all() + def remove_chat(self, account, jid): control = self._controls.pop((account, jid)) self.remove(control.widget)
===================================== gajim/gtk/main.py ===================================== @@ -363,6 +363,14 @@ def add_chat(self, account, jid, type_, select=False): type_, select=select)
+ def add_private_chat(self, account, jid, select=False): + workspace_id = self._workspace_side_bar.get_active_workspace() + self.add_chat_for_workspace(workspace_id, + account, + jid, + 'pm', + select=select) + def add_chat_for_workspace(self, workspace_id, account, @@ -377,6 +385,12 @@ def add_chat_for_workspace(self,
if type_ == 'groupchat': self._chat_stack.add_group_chat(account, jid) + elif type_ == 'pm': + if not self._startup_finished: + # TODO: Currently we cant load private chats at start + # because the Contacts dont exist yet + return + self._chat_stack.add_private_chat(account, jid) else: self._chat_stack.add_chat(account, jid) self._chat_list_stack.add_chat(workspace_id, account, jid, type_) @@ -449,7 +463,10 @@ def _on_event(self, event):
if not self.chat_exists(event.account, event.jid): if event.name == 'message-received': - self.add_chat(event.account, event.jid, 'contact') + if event.properties.is_muc_pm: + self.add_private_chat(event.account, event.jid, 'pm') + else: + self.add_chat(event.account, event.jid, 'contact') else: # No chat is open, dont handle any gui events return
===================================== gajim/privatechat_control.py ===================================== @@ -48,26 +48,22 @@ class PrivateChatControl(ChatControl):
def __init__(self, parent_win, gc_contact, contact, account, session): room_jid = gc_contact.room_jid - self.room_ctrl = app.interface.msg_win_mgr.get_gc_control( - room_jid, account) - if room_jid in app.interface.minimized_controls[account]: - self.room_ctrl = app.interface.minimized_controls[account][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)
# 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), - ]) + # 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
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/0a1e65bba760ffb1d0d664f1603f77897...