From 80f658e81fb786962f4317c50c4b31438e968c26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20H=C3=B6rist?= Date: Mon, 6 Nov 2017 20:10:26 +0100 Subject: [PATCH] ServerInfo: Add server uptime info --- gajim/server_info.py | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/gajim/server_info.py b/gajim/server_info.py index 0addfea5d..deff27b2d 100644 --- a/gajim/server_info.py +++ b/gajim/server_info.py @@ -18,14 +18,19 @@ # along with Gajim. If not, see . from collections import namedtuple - +from datetime import timedelta import nbxmpp +import logging + from gi.repository import Gtk from gajim.common import app from gajim.common import ged from gajim.gtkgui_helpers import get_icon_pixmap, Color +log = logging.getLogger('gajim.serverinfo') + + class ServerInfoDialog(Gtk.Dialog): def __init__(self, account): flags = Gtk.DialogFlags.DESTROY_WITH_PARENT @@ -67,8 +72,10 @@ class ServerInfoDialog(Gtk.Dialog): self._nec_agent_info_received) self.version = '' + self.uptime = '' self.hostname = app.get_hostname_from_account(account) app.connections[account].request_os_info(self.hostname, None) + self.request_last_activity() for feature in self.get_features(): self.add_feature(feature) @@ -94,6 +101,35 @@ class ServerInfoDialog(Gtk.Dialog): row.get_child().update(item) row.set_tooltip_text(item.tooltip) + def request_last_activity(self): + if not app.account_is_connected(self.account): + return + con = app.connections[self.account] + iq = nbxmpp.Iq(to=self.hostname, typ='get', queryNS=nbxmpp.NS_LAST) + con.connection.SendAndCallForResponse(iq, self._on_last_activity) + + def _on_last_activity(self, stanza): + if 'server_info' not in app.interface.instances[self.account]: + # Window got closed in the meantime + return + if not nbxmpp.isResultNode(stanza): + log.warning('Received malformed result: %s', stanza) + return + if stanza.getQueryNS() != nbxmpp.NS_LAST: + log.warning('Wrong namespace on result: %s', stanza) + return + try: + seconds = int(stanza.getQuery().getAttr('seconds')) + except (ValueError, TypeError, AttributeError): + log.exception('Received malformed last activity result') + else: + delta = timedelta(seconds=seconds) + hours = 0 + if seconds >= 3600: + hours = delta.seconds // 3600 + self.uptime = _('%s days, %s hours') % (delta.days, hours) + self.update(self.get_infos, self.info_listbox) + def _nec_version_result_received(self, obj): if obj.jid != self.hostname: return @@ -133,7 +169,8 @@ class ServerInfoDialog(Gtk.Dialog): Info = namedtuple('Info', ['name', 'value', 'tooltip']) return [ Info(_('Hostname'), self.hostname, None), - Info(_('Server Software'), self.version, None)] + Info(_('Server Software'), self.version, None), + Info(_('Server Uptime'), self.uptime, None)] def on_response(self, dialog, response): if response == Gtk.ResponseType.OK: