|
1 | 1 | import 'package:flutter_riverpod/flutter_riverpod.dart'; |
| 2 | +import 'package:threebotlogin/helpers/globals.dart'; |
2 | 3 | import 'package:threebotlogin/helpers/logger.dart'; |
3 | 4 | import 'package:threebotlogin/models/farm.dart'; |
4 | 5 | import 'package:threebotlogin/models/wallet.dart'; |
5 | 6 | import 'package:threebotlogin/providers/wallets_provider.dart'; |
| 7 | +import 'package:threebotlogin/services/crypto_service.dart'; |
6 | 8 | import 'package:threebotlogin/services/gridproxy_service.dart'; |
7 | 9 | import 'package:threebotlogin/services/tfchain_service.dart'; |
| 10 | +import 'package:registrar_client/models/farm.dart' as registrarFarm; |
| 11 | +import 'package:registrar_client/models/node.dart' as registrarNode; |
| 12 | +import 'package:registrar_client/registrar_client.dart' as registrar; |
8 | 13 |
|
9 | 14 | class NodeCheckService { |
10 | | - static Future<List<Node>> pingNodesInBackground() async { |
| 15 | + static Future<List<Node>> pingV3NodesInBackground() async { |
11 | 16 | final container = ProviderContainer(); |
12 | 17 | try { |
13 | 18 | final walletsNotifierInstance = container.read(walletsNotifier.notifier); |
@@ -41,16 +46,81 @@ class NodeCheckService { |
41 | 46 | .toList(); |
42 | 47 | allNodes.addAll(nodes); |
43 | 48 | } |
44 | | - final offlineNodes = |
| 49 | + final offlineNodes = |
45 | 50 | allNodes.where((n) => n.status != NodeStatus.Up).toList(); |
46 | 51 |
|
47 | 52 | return offlineNodes; |
48 | | - |
49 | 53 | } catch (e) { |
50 | 54 | logger.e('[NodeCheckService] Error: $e'); |
51 | 55 | return []; |
52 | 56 | } finally { |
53 | 57 | container.dispose(); |
54 | 58 | } |
55 | 59 | } |
| 60 | + |
| 61 | + static Future<List<Node>> pingV4NodesInBackground() async { |
| 62 | + final container = ProviderContainer(); |
| 63 | + final List<Node> allOfflineNodes = []; |
| 64 | + |
| 65 | + try { |
| 66 | + final walletsNotifierInstance = container.read(walletsNotifier.notifier); |
| 67 | + |
| 68 | + await walletsNotifierInstance.waitUntilListed(); |
| 69 | + |
| 70 | + final List<Wallet> wallets = container.read(walletsNotifier); |
| 71 | + |
| 72 | + if (wallets.isEmpty) { |
| 73 | + logger.i('[NodeCheckService] No wallets found'); |
| 74 | + return []; |
| 75 | + } |
| 76 | + |
| 77 | + registrar.RegistrarClient? registrarClient = registrar.RegistrarClient( |
| 78 | + baseUrl: Globals().registrarURL, |
| 79 | + mnemonicOrSeed: wallets.first.tfchainSecret); |
| 80 | + for (var w in wallets) { |
| 81 | + try { |
| 82 | + final publicKey = await derivePublicKey(w.tfchainSecret); |
| 83 | + final account = |
| 84 | + await registrarClient.accounts.getByPublicKey(publicKey); |
| 85 | + final farms = await registrarClient.farms |
| 86 | + .list(registrarFarm.FarmFilter(twinID: account.twinID)); |
| 87 | + |
| 88 | + for (var f in farms) { |
| 89 | + final farmNodes = await registrarClient.nodes |
| 90 | + .list(registrarNode.NodeFilter(farmID: f.farmID)); |
| 91 | + |
| 92 | + final nodes = farmNodes.map((n) { |
| 93 | + // Convert ISO timestamp to Unix timestamp |
| 94 | + final lastSeenDate = DateTime.parse(n.lastSeen); |
| 95 | + final unixTimestamp = lastSeenDate.millisecondsSinceEpoch ~/ 1000; |
| 96 | + |
| 97 | + return Node( |
| 98 | + nodeId: n.nodeID, |
| 99 | + status: n.online ? NodeStatus.Up : NodeStatus.Down, |
| 100 | + country: n.location.country, |
| 101 | + uptime: (n.uptime.isNotEmpty) ? n.uptime.last.duration : 0, |
| 102 | + updatedAt: unixTimestamp, |
| 103 | + ); |
| 104 | + }).toList(); |
| 105 | + |
| 106 | + final offlineNodes = |
| 107 | + nodes.where((n) => n.status != NodeStatus.Up).toList(); |
| 108 | + allOfflineNodes.addAll(offlineNodes); |
| 109 | + } |
| 110 | + } catch (e) { |
| 111 | + logger.e('[NodeCheckService] Error: $e'); |
| 112 | + continue; |
| 113 | + } |
| 114 | + } |
| 115 | + |
| 116 | + logger.i( |
| 117 | + '[NodeCheckService] Found ${allOfflineNodes.length} offline nodes'); |
| 118 | + return allOfflineNodes; |
| 119 | + } catch (e) { |
| 120 | + logger.e('[NodeCheckService] Error in pingV4NodesInBackground: $e'); |
| 121 | + return []; |
| 122 | + } finally { |
| 123 | + container.dispose(); |
| 124 | + } |
| 125 | + } |
56 | 126 | } |
0 commit comments