Browse Source

qml: let qenetwork monitor gossip events, start/stop gossip service on config change

add simple gossip feedback on NetworkStats page
patch-4
Sander van Grieken 3 years ago
parent
commit
279b5a1b48
  1. 36
      electrum/gui/qml/components/NetworkStats.qml
  2. 2
      electrum/gui/qml/qeapp.py
  3. 52
      electrum/gui/qml/qenetwork.py

36
electrum/gui/qml/components/NetworkStats.qml

@ -9,7 +9,7 @@ Pane {
property string title: qsTr('Network')
GridLayout {
columns: 3
columns: 2
Label {
text: qsTr("Network: ");
@ -18,7 +18,6 @@ Pane {
}
Label {
text: Network.networkName
Layout.columnSpan: 2
}
Label {
@ -28,7 +27,6 @@ Pane {
}
Label {
text: Network.server
Layout.columnSpan: 2
}
Label {
@ -39,7 +37,6 @@ Pane {
}
Label {
text: Network.height
Layout.columnSpan: 2
}
Label {
@ -48,10 +45,12 @@ Pane {
font.bold: true
}
NetworkStatusIndicator {}
RowLayout {
NetworkStatusIndicator {}
Label {
text: Network.status
Label {
text: Network.status
}
}
Label {
@ -61,7 +60,28 @@ Pane {
}
Label {
id: feeHistogram
Layout.columnSpan: 2
}
Label {
text: qsTr("Gossip: ");
color: Material.primaryHighlightedTextColor;
font.bold: true
}
ColumnLayout {
visible: Config.useGossip
Label {
text: qsTr('%1 peers').arg(Network.gossipInfo.peers)
}
Label {
text: qsTr('%1 channels to fetch').arg(Network.gossipInfo.unknown_channels)
}
Label {
text: qsTr('%1 nodes, %2 channels').arg(Network.gossipInfo.db_nodes).arg(Network.gossipInfo.db_channels)
}
}
Label {
text: qsTr("disabled");
visible: !Config.useGossip
}
}

2
electrum/gui/qml/qeapp.py

@ -178,7 +178,7 @@ class ElectrumQmlApplication(QGuiApplication):
self.context = self.engine.rootContext()
self._qeconfig = QEConfig(config)
self._qenetwork = QENetwork(daemon.network)
self._qenetwork = QENetwork(daemon.network, self._qeconfig)
self._qedaemon = QEDaemon(daemon)
self._appController = QEAppController(self._qedaemon)
self._maxAmount = QEAmount(is_max=True)

52
electrum/gui/qml/qenetwork.py

@ -7,12 +7,16 @@ from electrum.interface import ServerAddr
from .util import QtEventListener, event_listener
class QENetwork(QObject, QtEventListener):
def __init__(self, network, parent=None):
def __init__(self, network, qeconfig, parent=None):
super().__init__(parent)
self.network = network
self._qeconfig = qeconfig
self._height = network.get_local_height() # init here, update event can take a while
self.register_callbacks()
self._qeconfig.useGossipChanged.connect(self.on_gossip_setting_changed)
_logger = get_logger(__name__)
networkUpdated = pyqtSignal()
@ -25,6 +29,7 @@ class QENetwork(QObject, QtEventListener):
feeHistogramUpdated = pyqtSignal()
chaintipsChanged = pyqtSignal()
isLaggingChanged = pyqtSignal()
gossipUpdated = pyqtSignal()
# shared signal for static properties
dataChanged = pyqtSignal()
@ -34,6 +39,11 @@ class QENetwork(QObject, QtEventListener):
_chaintips = 1
_islagging = False
_fee_histogram = []
_gossipPeers = 0
_gossipUnknownChannels = 0
_gossipDbNodes = 0
_gossipDbChannels = 0
_gossipDbPolicies = 0
@event_listener
def on_event_network_updated(self, *args):
@ -79,6 +89,37 @@ class QENetwork(QObject, QtEventListener):
self._fee_histogram = histogram if histogram else []
self.feeHistogramUpdated.emit()
@event_listener
def on_event_channel_db(self, num_nodes, num_channels, num_policies):
self._logger.debug(f'channel_db: {num_nodes} nodes, {num_channels} channels, {num_policies} policies')
self._gossipDbNodes = num_nodes
self._gossipDbChannels = num_channels
self._gossipDbPolicies = num_policies
self.gossipUpdated.emit()
@event_listener
def on_event_gossip_peers(self, num_peers):
self._logger.debug(f'gossip peers {num_peers}')
self._gossipPeers = num_peers
self.gossipUpdated.emit()
@event_listener
def on_event_unknown_channels(self, unknown):
if unknown == 0 and self._gossipUnknownChannels == 0: # TODO: backend sends a lot of unknown=0 events
return
self._logger.debug(f'unknown channels {unknown}')
self._gossipUnknownChannels = unknown
self.gossipUpdated.emit()
#self.lightning_gossip_num_queries = unknown
def on_gossip_setting_changed(self):
if not self.network:
return
if self._qeconfig.useGossip:
self.network.start_gossip()
else:
self.network.run_from_another_thread(self.network.stop_gossip())
@pyqtProperty(int, notify=heightChanged)
def height(self):
return self._height
@ -136,3 +177,12 @@ class QENetwork(QObject, QtEventListener):
def feeHistogram(self):
return self._fee_histogram
@pyqtProperty('QVariantMap', notify=gossipUpdated)
def gossipInfo(self):
return {
'peers': self._gossipPeers,
'unknown_channels': self._gossipUnknownChannels,
'db_nodes': self._gossipDbNodes,
'db_channels': self._gossipDbChannels ,
'db_policies': self._gossipDbPolicies
}

Loading…
Cancel
Save