From e0fa6196d300e5c176c2249c6977e4275955e356 Mon Sep 17 00:00:00 2001 From: Inso <insomniak.fr@gmail.com> Date: Sun, 15 Mar 2015 20:10:37 +0100 Subject: [PATCH] Added uid to Node class --- src/cutecoin/core/net/network.py | 3 +- src/cutecoin/core/net/node.py | 50 ++++++++++++++++++++++++++++---- src/cutecoin/core/person.py | 2 +- src/cutecoin/core/wallet.py | 3 +- src/cutecoin/gui/network_tab.py | 10 +++++-- src/cutecoin/models/network.py | 8 +---- 6 files changed, 56 insertions(+), 20 deletions(-) diff --git a/src/cutecoin/core/net/network.py b/src/cutecoin/core/net/network.py index 26b1948d..37990432 100644 --- a/src/cutecoin/core/net/network.py +++ b/src/cutecoin/core/net/network.py @@ -8,7 +8,7 @@ from .node import Node import logging import time -from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot +from PyQt5.QtCore import QObject, pyqtSignal class Network(QObject): @@ -162,7 +162,6 @@ class Network(QObject): node.check_sync(block_max) #TODO: Offline nodes for too long have to be removed - #TODO: Corrupted nodes should maybe be removed faster ? logging.debug("Nodes found : {0}".format(nodes)) diff --git a/src/cutecoin/core/net/node.py b/src/cutecoin/core/net/node.py index 6ed23a0e..974dce8c 100644 --- a/src/cutecoin/core/net/node.py +++ b/src/cutecoin/core/net/node.py @@ -8,7 +8,8 @@ from ucoinpy.documents.peer import Peer, BMAEndpoint, Endpoint from ucoinpy.api import bma from ucoinpy.api.bma import ConnectionHandler from requests.exceptions import RequestException -from ...tools.exceptions import InvalidNodeCurrency +from ...tools.exceptions import InvalidNodeCurrency, PersonNotFoundError +from ..person import Person import logging import time @@ -32,12 +33,13 @@ class Node(QObject): changed = pyqtSignal() - def __init__(self, currency, endpoints, pubkey, block, state): + def __init__(self, currency, endpoints, uid, pubkey, block, state): ''' Constructor ''' super().__init__() self._endpoints = endpoints + self._uid = uid self._pubkey = pubkey self._block = block self._state = state @@ -63,7 +65,7 @@ class Node(QObject): if peer.currency != currency: raise InvalidNodeCurrency(peer.currency, currency) - node = cls(peer.currency, peer.endpoints, peer.pubkey, 0, Node.ONLINE) + node = cls(peer.currency, peer.endpoints, "", peer.pubkey, 0, Node.ONLINE) node.refresh_state() return node @@ -80,25 +82,35 @@ class Node(QObject): if peer.currency != currency: raise InvalidNodeCurrency(peer.currency, currency) - node = cls(peer.currency, peer.endpoints, "", 0, Node.ONLINE) + node = cls(peer.currency, peer.endpoints, "", "", 0, Node.ONLINE) node.refresh_state() return node @classmethod def from_json(cls, currency, data): endpoints = [] + uid = "" + pubkey = "" + for endpoint_data in data['endpoints']: endpoints.append(Endpoint.from_inline(endpoint_data)) if currency in data: currency = data['currency'] - node = cls(currency, endpoints, "", 0, Node.ONLINE) + if uid in data: + uid = data['uid'] + + if pubkey in data: + pubkey = data['pubkey'] + + node = cls(currency, endpoints, uid, pubkey, 0, Node.ONLINE) node.refresh_state() return node def jsonify(self): data = {'pubkey': self._pubkey, + 'uid': self._uid, 'currency': self._currency} endpoints = [] for e in self._endpoints: @@ -130,12 +142,34 @@ class Node(QObject): def neighbours(self): return self._neighbours + @property + def uid(self): + return self._uid + def check_sync(self, block): if self._block < block: self._state = Node.DESYNCED else: self._state = Node.ONLINE + def _request_uid(self): + uid = "" + try: + data = bma.wot.Lookup(self.endpoint.conn_handler(), self.pubkey).get() + timestamp = 0 + for result in data['results']: + if result["pubkey"] == self.pubkey: + uids = result['uids'] + for uid in uids: + if uid["meta"]["timestamp"] > timestamp: + timestamp = uid["meta"]["timestamp"] + uid = uid["uid"] + except ValueError as e: + if '404' in str(e): + logging.debug("Error : node uid not found : {0}".format(self.pubkey)) + uid = "" + return uid + def refresh_state(self): emit_change = False try: @@ -165,6 +199,8 @@ class Node(QObject): self.state = Node.CORRUPTED emit_change = True else: + node_uid = self._request_uid() + if block_number != self._block: self._block = block_number emit_change = True @@ -173,6 +209,10 @@ class Node(QObject): self._pubkey = node_pubkey emit_change = True + if node_uid != self._uid: + self._uid = node_uid + emit_change = True + logging.debug(neighbours) new_inlines = [e.inline() for n in neighbours for e in n] last_inlines = [e.inline() for n in self._neighbours for e in n] diff --git a/src/cutecoin/core/person.py b/src/cutecoin/core/person.py index d508a10a..3dc466f0 100644 --- a/src/cutecoin/core/person.py +++ b/src/cutecoin/core/person.py @@ -217,7 +217,7 @@ class Person(object): if '400' in str(e): raise MembershipNotFoundError(self.pubkey, community.name) -#TODO: Manage 'OUT' memberships +#TODO: Manage 'OUT' memberships ? Maybe ? @cached def membership(self, community): ''' diff --git a/src/cutecoin/core/wallet.py b/src/cutecoin/core/wallet.py index 48ccfa6a..3589bc2a 100644 --- a/src/cutecoin/core/wallet.py +++ b/src/cutecoin/core/wallet.py @@ -60,7 +60,7 @@ class Cache(): def transfers(self): return [t for t in self._transfers if t.state != Transfer.DROPPED] - def _parse_transaction(self, community, block_number, mediantime, tx): + def _parse_transaction(self, community, tx, block_number, mediantime): receivers = [o.pubkey for o in tx.outputs if o.pubkey != tx.issuers[0]] @@ -127,7 +127,6 @@ class Cache(): transfer.check_registered(tx, block_number, block_doc.mediantime) -#TODO: Refactor to reduce this method size and split it to more methods def refresh(self, community): current_block = 0 try: diff --git a/src/cutecoin/gui/network_tab.py b/src/cutecoin/gui/network_tab.py index aad3e04a..ca32208b 100644 --- a/src/cutecoin/gui/network_tab.py +++ b/src/cutecoin/gui/network_tab.py @@ -4,8 +4,9 @@ Created on 20 févr. 2015 @author: inso ''' +import logging from PyQt5.QtWidgets import QWidget -from PyQt5.QtCore import QModelIndex, QThread +from PyQt5.QtCore import Qt, QThread from ..core.watchers.network import NetworkWatcher from ..models.network import NetworkTableModel, NetworkFilterProxyModel from ..gen_resources.network_tab_uic import Ui_NetworkTabWidget @@ -31,16 +32,19 @@ class NetworkTabWidget(QWidget, Ui_NetworkTabWidget): self.watcher_thread = QThread() self.network_watcher.moveToThread(self.watcher_thread) self.watcher_thread.started.connect(self.network_watcher.watch) + self.watcher_thread.finished.connect(self.network_watcher.stop) + self.watcher_thread.finished.connect(self.network_watcher.deleteLater) + self.watcher_thread.finished.connect(self.watcher_thread.deleteLater) community.network.nodes_changed.connect(self.refresh_nodes) def refresh_nodes(self): self.table_network.model().sourceModel().modelReset.emit() + self.table_network.sortByColumn(0, Qt.AscendingOrder) def closeEvent(self, event): super().closeEvent(event) - self.network_watcher.deleteLater() - self.watcher_thread.deleteLater() + self.watcher_thread.terminate() def showEvent(self, event): super().showEvent(event) diff --git a/src/cutecoin/models/network.py b/src/cutecoin/models/network.py index f44a7735..2be03e42 100644 --- a/src/cutecoin/models/network.py +++ b/src/cutecoin/models/network.py @@ -100,12 +100,6 @@ class NetworkTableModel(QAbstractTableModel): :param ..core.net.node.Node node: Network node :return: """ - try: - person = Person.lookup(node.pubkey, self.community) - uid = person.name - except PersonNotFoundError: - uid = "" - is_member = node.pubkey in self.community.members_pubkeys() address = "" @@ -117,7 +111,7 @@ class NetworkTableModel(QAbstractTableModel): address = node.endpoint.ipv6 port = node.endpoint.port - return node.pubkey, is_member, uid, address, port, node.block + return node.pubkey, is_member, node.uid, address, port, node.block def data(self, index, role): row = index.row() -- GitLab