Philipp Hörist pushed to branch master at gajim / gajim
Commits: 80f658e8 by Philipp Hörist at 2017-11-06T23:03:16+01:00 ServerInfo: Add server uptime info
- - - - - 6fc2cd30 by Philipp Hörist at 2017-11-06T23:04:33+01:00 ServerInfo: fix pylint/pep8
- - - - - 8c8b4918 by Philipp Hörist at 2017-11-06T23:04:49+01:00 ServerInfo: Show if features are disabled by user
- Show new Symbol if a feature is available but not enabled - Add this info to the tooltip
- - - - - e4ad111c by Philipp Hörist at 2017-11-06T23:05:32+01:00 ServerInfo: Make InfoItems selectable
- - - - -
3 changed files:
- gajim/common/connection.py - gajim/gtkgui_helpers.py - gajim/server_info.py
Changes:
===================================== gajim/common/connection.py ===================================== --- a/gajim/common/connection.py +++ b/gajim/common/connection.py @@ -170,7 +170,7 @@ class CommonConnection: self.roster_supported = True self.blocking_supported = False self.addressing_supported = False - self.carbons_enabled = False + self.carbons_available = False
self.muc_jid = {} # jid of muc server for each transport type self._stun_servers = [] # STUN servers of our jabber server @@ -1942,13 +1942,14 @@ class Connection(CommonConnection, ConnectionHandlers): self.blocking_supported = True if nbxmpp.NS_ADDRESS in obj.features: self.addressing_supported = True - if nbxmpp.NS_CARBONS in obj.features and app.config.get_per( - 'accounts', self.name, 'enable_message_carbons'): - self.carbons_enabled = True - # Server supports carbons, activate it - iq = nbxmpp.Iq('set') - iq.setTag('enable', namespace=nbxmpp.NS_CARBONS) - self.connection.send(iq) + if nbxmpp.NS_CARBONS in obj.features: + self.carbons_available = True + if app.config.get_per('accounts', self.name, + 'enable_message_carbons'): + # Server supports carbons, activate it + iq = nbxmpp.Iq('set') + iq.setTag('enable', namespace=nbxmpp.NS_CARBONS) + self.connection.send(iq) if nbxmpp.NS_PRIVACY in obj.features: self.privacy_rules_supported = True get_action(self.name + '-privacylists').set_enabled(True)
===================================== gajim/gtkgui_helpers.py ===================================== --- a/gajim/gtkgui_helpers.py +++ b/gajim/gtkgui_helpers.py @@ -58,6 +58,7 @@ class Color: GREEN = Gdk.RGBA(red=115/255, green=210/255, blue=22/255, alpha=1) RED = Gdk.RGBA(red=204/255, green=0, blue=0, alpha=1) GREY = Gdk.RGBA(red=195/255, green=195/255, blue=192/255, alpha=1) + ORANGE = Gdk.RGBA(red=245/255, green=121/255, blue=0/255, alpha=1)
def get_icon_pixmap(icon_name, size=16, color=None, quiet=False): try:
===================================== gajim/server_info.py ===================================== --- a/gajim/server_info.py +++ b/gajim/server_info.py @@ -18,14 +18,19 @@ # along with Gajim. If not, see http://www.gnu.org/licenses/.
from collections import namedtuple +from datetime import timedelta +import logging
-import nbxmpp from gi.repository import Gtk +import nbxmpp
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 @@ -59,16 +64,18 @@ class ServerInfoDialog(Gtk.Dialog): self.connect('destroy', self.on_destroy)
app.ged.register_event_handler('version-result-received', - ged.CORE, - self._nec_version_result_received) + ged.CORE, + self._nec_version_result_received)
app.ged.register_event_handler('agent-info-received', - ged.GUI1, - self._nec_agent_info_received) + ged.GUI1, + 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) @@ -92,7 +99,36 @@ class ServerInfoDialog(Gtk.Dialog): for index, item in enumerate(func()): row = listbox.get_row_at_index(index) row.get_child().update(item) - row.set_tooltip_text(item.tooltip) + row.set_tooltip_text(row.get_child().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: @@ -101,30 +137,45 @@ class ServerInfoDialog(Gtk.Dialog): self.update(self.get_infos, self.info_listbox)
def _nec_agent_info_received(self, obj): - if not 'Gajim_' in obj.id_: + if 'Gajim_' not in obj.id_: return self.update(self.get_features, self.feature_listbox)
def add_feature(self, feature): item = FeatureItem(feature) self.feature_listbox.add(item) - item.get_parent().set_tooltip_text(feature.tooltip) + item.get_parent().set_tooltip_text(item.tooltip)
def get_features(self): con = app.connections[self.account] - Feature = namedtuple('Feature', ['name', 'enabled', 'tooltip']) + Feature = namedtuple('Feature', + ['name', 'available', 'tooltip', 'enabled']) + + carbons_enabled = app.config.get_per('accounts', self.account, + 'enable_message_carbons') + mam_enabled = app.config.get_per('accounts', self.account, + 'sync_logs_with_server')
return [ - Feature('XEP-0016: Privacy Lists', con.privacy_rules_supported, None), - Feature('XEP-0045: Multi-User Chat', con.muc_jid, None), - Feature('XEP-0054: vcard-temp', con.vcard_supported, None), - Feature('XEP-0163: Personal Eventing Protocol', con.pep_supported, None), - Feature('XEP-0163: #publish-options', con.pubsub_publish_options_supported, None), - Feature('XEP-0191: Blocking Command', con.blocking_supported, nbxmpp.NS_BLOCKING), - Feature('XEP-0198: Stream Management', con.sm.enabled, nbxmpp.NS_STREAM_MGMT), - Feature('XEP-0280: Message Carbons', con.carbons_enabled, nbxmpp.NS_CARBONS), - Feature('XEP-0313: Message Archive Management', con.archiving_namespace, con.archiving_namespace), - Feature('XEP-0363: HTTP File Upload', con.httpupload, nbxmpp.NS_HTTPUPLOAD)] + Feature('XEP-0016: Privacy Lists', + con.privacy_rules_supported, '', None), + Feature('XEP-0045: Multi-User Chat', con.muc_jid, '', None), + Feature('XEP-0054: vcard-temp', con.vcard_supported, '', None), + Feature('XEP-0163: Personal Eventing Protocol', + con.pep_supported, '', None), + Feature('XEP-0163: #publish-options', + con.pubsub_publish_options_supported, '', None), + Feature('XEP-0191: Blocking Command', + con.blocking_supported, nbxmpp.NS_BLOCKING, None), + Feature('XEP-0198: Stream Management', + con.sm.enabled, nbxmpp.NS_STREAM_MGMT, None), + Feature('XEP-0280: Message Carbons', + con.carbons_available, nbxmpp.NS_CARBONS, carbons_enabled), + Feature('XEP-0313: Message Archive Management', + con.archiving_namespace, con.archiving_namespace, + mam_enabled), + Feature('XEP-0363: HTTP File Upload', + con.httpupload, nbxmpp.NS_HTTPUPLOAD, None)]
def add_info(self, info): self.info_listbox.add(ServerInfoItem(info)) @@ -133,7 +184,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: @@ -142,41 +194,49 @@ class ServerInfoDialog(Gtk.Dialog): def on_destroy(self, *args): del app.interface.instances[self.account]['server_info'] app.ged.remove_event_handler('version-result-received', - ged.CORE, - self._nec_version_result_received) + ged.CORE, + self._nec_version_result_received)
app.ged.remove_event_handler('agent-info-received', - ged.GUI1, - self._nec_agent_info_received) + ged.GUI1, + self._nec_agent_info_received) +
class FeatureItem(Gtk.Grid): def __init__(self, feature): super().__init__() - + self.tooltip = feature.tooltip self.set_column_spacing(6)
self.icon = Gtk.Image() self.feature_label = Gtk.Label(label=feature.name) - self.set_feature_enabled(bool(feature.enabled)) + self.set_feature(feature.available, feature.enabled)
self.add(self.icon) self.add(self.feature_label)
- def set_feature_enabled(self, enabled): - if enabled: + def set_feature(self, available, enabled): + if not available: self.icon.set_from_pixbuf( - get_icon_pixmap('emblem-ok-symbolic', color=[Color.GREEN])) + get_icon_pixmap('window-close-symbolic', color=[Color.RED])) + elif enabled is False: + self.icon.set_from_pixbuf( + get_icon_pixmap('dialog-warning-symbolic', + color=[Color.ORANGE])) + self.tooltip += _('\nDisabled in config') else: self.icon.set_from_pixbuf( - get_icon_pixmap('window-close-symbolic', color=[Color.RED])) + get_icon_pixmap('emblem-ok-symbolic', color=[Color.GREEN]))
def update(self, feature): - self.set_feature_enabled(bool(feature.enabled)) + self.tooltip = feature.tooltip + self.set_feature(feature.available, feature.enabled) +
class ServerInfoItem(Gtk.Grid): def __init__(self, info): super().__init__() - + self.tooltip = info.tooltip self.set_hexpand(True) self.insert_column(0) self.set_column_homogeneous(True) @@ -187,6 +247,7 @@ class ServerInfoItem(Gtk.Grid): self.value = Gtk.Label(label=info.value) self.value.set_halign(Gtk.Align.START) self.value.set_hexpand(True) + self.value.set_selectable(True)
self.add(self.info) self.add(self.value)
View it on GitLab: https://dev.gajim.org/gajim/gajim/compare/3c823d307d81e87f210daaffd52f6540e2...
--- View it on GitLab: https://dev.gajim.org/gajim/gajim/compare/3c823d307d81e87f210daaffd52f6540e2... You're receiving this email because of your account on dev.gajim.org.