From f0bb217ad716e807f67537bc557af5dc8beeafbe Mon Sep 17 00:00:00 2001 From: liamcottle Date: Tue, 13 Aug 2024 12:12:46 +1200 Subject: [PATCH] show a yellow icon if announce is 1 hop via interface --- .../network-visualiser/NetworkVisualiser.vue | 29 +++++------------- .../images/network-visualiser/server_1hop.png | Bin 0 -> 8338 bytes .../images/network-visualiser/user_1hop.png | Bin 0 -> 8291 bytes 3 files changed, 7 insertions(+), 22 deletions(-) create mode 100644 src/frontend/public/assets/images/network-visualiser/server_1hop.png create mode 100644 src/frontend/public/assets/images/network-visualiser/user_1hop.png diff --git a/src/frontend/components/network-visualiser/NetworkVisualiser.vue b/src/frontend/components/network-visualiser/NetworkVisualiser.vue index 91eea5d..de136b6 100644 --- a/src/frontend/components/network-visualiser/NetworkVisualiser.vue +++ b/src/frontend/components/network-visualiser/NetworkVisualiser.vue @@ -206,7 +206,7 @@ export default { const name = announce.app_data ? atob(announce.app_data) : "Anonymous Peer"; node.shape = "circularImage"; - node.image = "/assets/images/network-visualiser/user.png"; + node.image = entry.hops === 1 ? "/assets/images/network-visualiser/user_1hop.png" : "/assets/images/network-visualiser/user.png"; node.label = name; node.title = [ @@ -225,7 +225,7 @@ export default { const name = announce.app_data ? atob(announce.app_data) : "Anonymous Node"; node.shape = "circularImage"; - node.image = "/assets/images/network-visualiser/server.png"; + node.image = entry.hops === 1 ? "/assets/images/network-visualiser/server_1hop.png" : "/assets/images/network-visualiser/server.png"; node.label = name; node.title = [ @@ -239,30 +239,15 @@ export default { } - const edge = { - from: entry.interface, - to: entry.hash, - color: "gray", - }; - - // if announce is 1 hop away, they are directly running on the interface they announced from - // for example, they might be a nomadnetwork node, that is hosting a TCPServerInterface - // in this case, its lxmf.delivery and nomadnetwork.node addresses would be 1 hop away - if(entry.hops === 1){ - - // make the line between the interface and the announce thicker - edge.background = { - enabled: true, - color: "gray", - }; - - } - // add node nodes.push(node); // add edge from interface to announced aspect - edges.push(edge); + edges.push({ + from: entry.interface, + to: entry.hash, + color: "gray", + }); } diff --git a/src/frontend/public/assets/images/network-visualiser/server_1hop.png b/src/frontend/public/assets/images/network-visualiser/server_1hop.png new file mode 100644 index 0000000000000000000000000000000000000000..79990cab01e4ba82716940861942c3c9ab23f41b GIT binary patch literal 8338 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 literal 0 HcmV?d00001 diff --git a/src/frontend/public/assets/images/network-visualiser/user_1hop.png b/src/frontend/public/assets/images/network-visualiser/user_1hop.png new file mode 100644 index 0000000000000000000000000000000000000000..8ef9f2e2defcd19c63ef5a1a5b89a7a90365002e GIT binary patch literal 8291 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 X->3NOQUBxr2HaM;tNcpQI^@3qply8l literal 0 HcmV?d00001