From 435dd4f53474befad0bae0f56b75894b120480cc Mon Sep 17 00:00:00 2001
From: Inso <insomniak.fr@gmail.com>
Date: Sun, 1 Mar 2015 17:40:15 +0100
Subject: [PATCH] Fixed a bug in network traversal

---
 src/cutecoin/core/net/network.py | 18 ++++++++++++++----
 src/cutecoin/core/net/node.py    |  7 ++++---
 src/cutecoin/gui/network_tab.py  |  2 +-
 src/cutecoin/models/network.py   |  2 ++
 4 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/src/cutecoin/core/net/network.py b/src/cutecoin/core/net/network.py
index 44fc92ce..c4df2f9a 100644
--- a/src/cutecoin/core/net/network.py
+++ b/src/cutecoin/core/net/network.py
@@ -82,14 +82,24 @@ class Network(QObject):
     def start_perpetual_crawling(self):
         self.must_crawl = True
         while self.must_crawl:
-            self.nodes = self.crawling(interval=10)
-            for n in self._nodes:
-                n.changed.connect(self.nodes_changed)
+            nodes = self.crawling(interval=10)
+
+            new_inlines = [n.endpoint.inline() for n in nodes]
+            last_inlines = [n.endpoint.inline() for n in self._nodes]
+
+            hash_new_nodes = hash(tuple(frozenset(sorted(new_inlines))))
+            hash_last_nodes= hash(tuple(frozenset(sorted(last_inlines))))
+
+            if hash_new_nodes != hash_last_nodes:
+                self._nodes = nodes
+                self.nodes_changed.emit()
+                for n in self._nodes:
+                    n.changed.connect(self.nodes_changed)
 
     def crawling(self, interval=0):
         nodes = []
         traversed_pubkeys = []
-        for n in self.nodes:
+        for n in self._nodes.copy():
             logging.debug(traversed_pubkeys)
             logging.debug("Peering : next to read : {0} : {1}".format(n.pubkey,
                           (n.pubkey not in traversed_pubkeys)))
diff --git a/src/cutecoin/core/net/node.py b/src/cutecoin/core/net/node.py
index e484e97a..3223fe03 100644
--- a/src/cutecoin/core/net/node.py
+++ b/src/cutecoin/core/net/node.py
@@ -112,8 +112,9 @@ class Node(QObject):
             self._pubkey = node_pubkey
             emit_change = True
 
-        new_inlines = [e.inline() for e in [n for n in self._neighbours]]
-        last_inlines = [e.inline() for e in [n for n in self._neighbours]]
+        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]
 
         hash_new_neighbours = hash(tuple(frozenset(sorted(new_inlines))))
         hash_last_neighbours = hash(tuple(frozenset(sorted(last_inlines))))
@@ -138,7 +139,7 @@ class Node(QObject):
                 peering = bma.network.Peering(self.endpoint.conn_handler()).get()
                 peer = Peer.from_signed_raw("{0}{1}\n".format(peering['raw'],
                                                             peering['signature']))
-                node = Node.from_peer(peer)
+                node = Node.from_peer(currency, peer)
                 logging.debug(traversed_pubkeys)
                 logging.debug("Traversing : next to read : {0} : {1}".format(node.pubkey,
                               (node.pubkey not in traversed_pubkeys)))
diff --git a/src/cutecoin/gui/network_tab.py b/src/cutecoin/gui/network_tab.py
index aa46dbe1..4d13273c 100644
--- a/src/cutecoin/gui/network_tab.py
+++ b/src/cutecoin/gui/network_tab.py
@@ -36,6 +36,6 @@ class NetworkTabWidget(QWidget, Ui_NetworkTabWidget):
         community.network.nodes_changed.connect(self.refresh_nodes)
 
     def refresh_nodes(self):
-        self.table_network.sourceModel.dataChanged.emit(QModelIndex(), QModelIndex())
+        self.table_network.model().sourceModel().modelReset.emit()
 
 
diff --git a/src/cutecoin/models/network.py b/src/cutecoin/models/network.py
index d74a2199..946d1302 100644
--- a/src/cutecoin/models/network.py
+++ b/src/cutecoin/models/network.py
@@ -47,6 +47,8 @@ class NetworkFilterProxyModel(QSortFilterProxyModel):
 
     def data(self, index, role):
         source_index = self.mapToSource(index)
+        if not source_index.isValid():
+            return QVariant()
         source_data = self.sourceModel().data(source_index, role)
         if index.column() == self.sourceModel().column_types.index('is_member') \
          and role == Qt.DisplayRole:
-- 
GitLab