diff --git a/src/common/connection.py b/src/common/connection.py index adfbacc92..64df14d5c 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -1547,7 +1547,7 @@ class Connection(CommonConnection, ConnectionHandlers): self.get_annotations() # Inform GUI we just signed in - self.dispatch('SIGNED_IN', ()) + gajim.nec.push_incoming_event(SignedInEvent(None, conn=self)) def get_signed_presence(self, msg, callback = None): if gajim.config.get_per('accounts', self.name, 'gpg_sign_presence'): diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 19a1a30dd..0b9f49a0d 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -2031,7 +2031,7 @@ ConnectionJingle, ConnectionIBBytestream): self.get_annotations() # Inform GUI we just signed in - self.dispatch('SIGNED_IN', ()) + gajim.nec.push_incoming_event(SignedInEvent(None, conn=self)) self.send_awaiting_pep() self.continue_connect_info = None diff --git a/src/common/connection_handlers_events.py b/src/common/connection_handlers_events.py index 2d640c96c..d9059fff9 100644 --- a/src/common/connection_handlers_events.py +++ b/src/common/connection_handlers_events.py @@ -1574,3 +1574,7 @@ class FailedDecryptEvent(nec.NetworkIncomingEvent): self.session = self.msg_obj.session self.printed_in_chat = False return True + +class SignedInEvent(nec.NetworkIncomingEvent): + name = 'signed-in' + base_network_events = [] diff --git a/src/common/zeroconf/connection_zeroconf.py b/src/common/zeroconf/connection_zeroconf.py index 79e7d5eac..cd1296c7b 100644 --- a/src/common/zeroconf/connection_zeroconf.py +++ b/src/common/zeroconf/connection_zeroconf.py @@ -279,7 +279,7 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf): check = self.connection.announce() else: self.connected = STATUS_LIST.index(show) - self.dispatch('SIGNED_IN', ()) + gajim.nec.push_incoming_event(SignedInEvent(None, conn=self)) # stay offline when zeroconf does something wrong if check: diff --git a/src/groupchat_control.py b/src/groupchat_control.py index c0fc88e76..6ff2f3186 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -464,6 +464,8 @@ class GroupchatControl(ChatControlBase): self._nec_gc_subject_received) gajim.ged.register_event_handler('gc-config-changed-received', ged.GUI1, self._nec_gc_config_changed_received) + gajim.ged.register_event_handler('signed-in', ged.GUI1, + self._nec_signed_in) gajim.gc_connected[self.account][self.room_jid] = False # disable win, we are not connected yet ChatControlBase.got_disconnected(self) @@ -1228,6 +1230,15 @@ class GroupchatControl(ChatControlBase): for change in changes: self.print_conversation(change) + def _nec_signed_in(self, obj): + if obj.conn.name != self.account: + return + if self.room_jid in gajim.gc_connected[obj.conn.name] and \ + gajim.gc_connected[obj.conn.name][self.room_jid]: + return + password = gajim.gc_passwords.get(self.room_jid, '') + obj.conn.join_gc(self.nick, self.room_jid, password) + def got_connected(self): # Make autorejoin stop. if self.autorejoin: @@ -1855,6 +1866,8 @@ class GroupchatControl(ChatControlBase): self._nec_gc_subject_received) gajim.ged.remove_event_handler('gc-config-changed-received', ged.GUI1, self._nec_gc_config_changed_received) + gajim.ged.remove_event_handler('signed-in', ged.GUI1, + self._nec_signed_in) if self.room_jid in gajim.gc_connected[self.account] and \ gajim.gc_connected[self.account][self.room_jid]: diff --git a/src/gui_interface.py b/src/gui_interface.py index d89200a54..e4e2c5040 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -1002,17 +1002,16 @@ class Interface: gajim.connections[account].request_last_status_time(contact.jid, contact.resource) - def handle_event_signed_in(self, account, empty): + def handle_event_signed_in(self, obj): """ SIGNED_IN event is emitted when we sign in, so handle it """ # ('SIGNED_IN', account, ()) # block signed in notifications for 30 seconds + account = obj.conn.name gajim.block_signed_in_notifications[account] = True - self.roster.set_actions_menu_needs_rebuild() - self.roster.draw_account(account) state = self.sleeper.getState() - connected = gajim.connections[account].connected + connected = obj.conn.connected if gajim.config.get('ask_offline_status_on_connection'): # Ask offline status in 1 minute so w'are sure we got all online # presences @@ -1021,42 +1020,33 @@ class Interface: # we go online or free for chat, so we activate auto status gajim.sleeper_state[account] = 'online' elif not ((state == common.sleepy.STATE_AWAY and connected == 4) or \ - (state == common.sleepy.STATE_XA and connected == 5)): + (state == common.sleepy.STATE_XA and connected == 5)): # If we are autoaway/xa and come back after a disconnection, do # nothing # Else disable autoaway gajim.sleeper_state[account] = 'off' - invisible_show = gajim.SHOW_LIST.index('invisible') - # We cannot join rooms if we are invisible - if gajim.connections[account].connected == invisible_show: - return - # join already open groupchats - for gc_control in self.msg_win_mgr.get_controls( - message_control.TYPE_GC) + self.minimized_controls[account].values(): - if account != gc_control.account: - continue - room_jid = gc_control.room_jid - if room_jid in gajim.gc_connected[account] and \ - gajim.gc_connected[account][room_jid]: - continue - nick = gc_control.nick - password = gajim.gc_passwords.get(room_jid, '') - gajim.connections[account].join_gc(nick, room_jid, password) - # send currently played music - if gajim.connections[account].pep_supported and dbus_support.supported \ - and gajim.config.get_per('accounts', account, 'publish_tune'): - self.enable_music_listener() - # enable location listener - if gajim.connections[account].pep_supported and dbus_support.supported \ - and gajim.config.get_per('accounts', account, 'publish_location'): - location_listener.enable() - if gajim.connections[account].archiving_supported: + + if obj.conn.archiving_supported: # Start merging logs from server - gajim.connections[account].request_modifications_page( - gajim.config.get_per('accounts', account, 'last_archiving_time')) + obj.conn.request_modifications_page(gajim.config.get_per('accounts', + account, 'last_archiving_time')) gajim.config.set_per('accounts', account, 'last_archiving_time', time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime())) + invisible_show = gajim.SHOW_LIST.index('invisible') + # We cannot join rooms if we are invisible + if connected == invisible_show: + return + # send currently played music + if obj.conn.pep_supported and dbus_support.supported and \ + gajim.config.get_per('accounts', account, 'publish_tune'): + self.enable_music_listener() + # enable location listener + if obj.conn.pep_supported and dbus_support.supported and \ + gajim.config.get_per('accounts', account, 'publish_location'): + location_listener.enable() + + def handle_event_metacontacts(self, obj): gajim.contacts.define_metacontacts(obj.conn.name, obj.meta_list) @@ -1403,7 +1393,6 @@ class Interface: 'FILE_REQUEST': [self.handle_event_file_request], 'FILE_REQUEST_ERROR': [self.handle_event_file_request_error], 'FILE_SEND_ERROR': [self.handle_event_file_send_error], - 'SIGNED_IN': [self.handle_event_signed_in], 'atom-entry-received': [self.handle_atom_entry], 'bad-gpg-passphrase': [self.handle_event_bad_gpg_passphrase], 'bookmarks-received': [self.handle_event_bookmarks], @@ -1438,6 +1427,7 @@ class Interface: 'roster-info': [self.handle_event_roster_info], 'roster-item-exchange-received': \ [self.handle_event_roster_item_exchange], + 'signed-in': [self.handle_event_signed_in], 'ssl-error': [self.handle_event_ssl_error], 'stream-conflict-received': [self.handle_event_resource_conflict], 'subscribe-presence-received': [ diff --git a/src/roster_window.py b/src/roster_window.py index 5e2860ec8..6484ad21b 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -2517,6 +2517,10 @@ class RosterWindow: def _nec_metacontacts_received(self, obj): self.redraw_metacontacts(obj.conn.name) + def _nec_signed_in(self, obj): + self.set_actions_menu_needs_rebuild() + self.draw_account(obj.conn.name) + ################################################################################ ### Menu and GUI callbacks ### FIXME: order callbacks in itself... @@ -6271,3 +6275,5 @@ class RosterWindow: self._nec_gc_subject_received) gajim.ged.register_event_handler('metacontacts-received', ged.GUI2, self._nec_metacontacts_received) + gajim.ged.register_event_handler('signed-in', ged.GUI1, + self._nec_signed_in)