diff --git a/plugins/embed.py b/plugins/embed.py index 726b1eb2..0cdc41d2 100644 --- a/plugins/embed.py +++ b/plugins/embed.py @@ -20,7 +20,7 @@ from poezio.theming import get_theme class Plugin(BasePlugin): def init(self): - for tab_t in [tabs.MucTab, tabs.ConversationTab, tabs.PrivateTab]: + for tab_t in [tabs.MucTab, tabs.StaticConversationTab, tabs.DynamicConversationTab, tabs.PrivateTab]: self.api.add_tab_command( tab_t, 'embed', diff --git a/plugins/upload.py b/plugins/upload.py index db8615c2..7e25070e 100644 --- a/plugins/upload.py +++ b/plugins/upload.py @@ -33,7 +33,7 @@ class Plugin(BasePlugin): def init(self): if not self.core.xmpp['xep_0363']: raise Exception('slixmpp XEP-0363 plugin failed to load') - for _class in (tabs.PrivateTab, tabs.ConversationTab, tabs.MucTab): + for _class in (tabs.PrivateTab, tabs.StaticConversationTab, tabs.DynamicConversationTab, tabs.MucTab): self.api.add_tab_command( _class, 'upload', diff --git a/poezio/core/handlers.py b/poezio/core/handlers.py index b87e7307..0a6e7e50 100644 --- a/poezio/core/handlers.py +++ b/poezio/core/handlers.py @@ -1068,7 +1068,8 @@ class HandlerCore: '{http://jabber.org/protocol/muc#user}x') is not None: return jid = presence['from'] - if not logger.log_roster_change(jid.bare, 'got offline'): + status = presence['status'] + if not logger.log_roster_change(jid.bare, 'got offline{}'.format(' ({})'.format(status) if status else '')): self.core.information('Unable to write in the log file', 'Error') # If a resource got offline, display the message in the conversation with this # precise resource. @@ -1078,12 +1079,15 @@ class HandlerCore: roster.connected -= 1 if contact.name: name = contact.name + offline_msg = '%s is \x191}offline' % name + if status: + offline_msg += ' (\x19o%s\x191})' % status if jid.resource: self.core.add_information_message_to_conversation_tab( - jid.full, '\x195}%s is \x191}offline' % name) + jid.full, '\x195}' + offline_msg) self.core.add_information_message_to_conversation_tab( - jid.bare, '\x195}%s is \x191}offline' % name) - self.core.information('\x193}%s \x195}is \x191}offline' % name, + jid.bare, '\x195}' + offline_msg) + self.core.information('\x193}' + offline_msg, 'Roster') roster.modified() if isinstance(self.core.tabs.current_tab, tabs.RosterInfoTab): diff --git a/poezio/tabs/muctab.py b/poezio/tabs/muctab.py index 54795bc3..d533f817 100644 --- a/poezio/tabs/muctab.py +++ b/poezio/tabs/muctab.py @@ -53,6 +53,7 @@ class MucTab(ChatTab): plugin_commands = {} # type: Dict[str, Command] plugin_keys = {} # type: Dict[str, Callable] additional_information = {} # type: Dict[str, Callable[[str], str]] + lagged = False def __init__(self, core, jid, nick, password=None): ChatTab.__init__(self, core, jid) @@ -411,6 +412,8 @@ class MucTab(ChatTab): if self.joined: if self.input.text: self.state = 'nonempty' + elif self.lagged: + self.state = 'disconnected' else: self.state = 'normal' else: @@ -436,6 +439,7 @@ class MucTab(ChatTab): """ Handle MUC presence """ + self.reset_lag() status_codes = set() for status_code in presence.xml.findall(STATUS_XPATH): status_codes.add(status_code.attrib['code']) @@ -1143,6 +1147,7 @@ class MucTab(ChatTab): self.command_cycle(iq["error"]["text"] or "not in this room") self.core.refresh_window() else: # Re-send a self-ping in a few seconds + self.reset_lag() self.enable_self_ping_event() def search_for_color(self, nick): @@ -1162,8 +1167,26 @@ class MucTab(ChatTab): return color def on_self_ping_failed(self, iq): - self.command_cycle("the MUC server is not responding") - self.core.refresh_window() + if not self.lagged: + self.lagged = True + info_text = dump_tuple(get_theme().COLOR_INFORMATION_TEXT) + self._text_buffer.add_message( + "\x19%s}MUC service not responding." % info_text) + self._state = 'disconnected' + self.core.refresh_window() + self.enable_self_ping_event() + + def reset_lag(self): + if self.lagged: + self.lagged = False + info_text = dump_tuple(get_theme().COLOR_INFORMATION_TEXT) + self._text_buffer.add_message( + "\x19%s}MUC service is responding again." % info_text) + if self != self.core.tabs.current_tab: + self._state = 'joined' + else: + self._state = 'normal' + self.core.refresh_window() ########################## UI ONLY #####################################