[feat] add i18n localization: en/zh; add peers display; ui refresh
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
import 'dart:math'; // For min function
|
||||
|
||||
class PeerInfo implements Comparable<PeerInfo> {
|
||||
final String address;
|
||||
final int latency;
|
||||
final String? version;
|
||||
final String role;
|
||||
final String? preferredPath;
|
||||
final bool isPlanet;
|
||||
final bool tunneled; // 是否通过中继
|
||||
|
||||
PeerInfo({
|
||||
required this.address,
|
||||
required this.latency,
|
||||
this.version,
|
||||
required this.role,
|
||||
this.preferredPath,
|
||||
required this.tunneled,
|
||||
}) : isPlanet = (role == 'PLANET');
|
||||
|
||||
factory PeerInfo.fromJson(Map<String, dynamic> json) {
|
||||
String? bestPath;
|
||||
List<dynamic> paths = json['paths'] as List<dynamic>? ?? [];
|
||||
|
||||
// Find the preferred active path
|
||||
var preferred = paths.firstWhere(
|
||||
(p) =>
|
||||
p is Map<String, dynamic> &&
|
||||
p['active'] == true &&
|
||||
p['expired'] == false &&
|
||||
p['preferred'] == true,
|
||||
orElse: () => null);
|
||||
|
||||
if (preferred != null) {
|
||||
bestPath = preferred['address'] as String?;
|
||||
} else {
|
||||
// If no preferred, find the first active path
|
||||
var firstActive = paths.firstWhere(
|
||||
(p) =>
|
||||
p is Map<String, dynamic> &&
|
||||
p['active'] == true &&
|
||||
p['expired'] == false,
|
||||
orElse: () => null);
|
||||
if (firstActive != null) {
|
||||
bestPath = firstActive['address'] as String?;
|
||||
}
|
||||
}
|
||||
|
||||
return PeerInfo(
|
||||
address: json['address'] as String? ?? 'Unknown',
|
||||
latency: json['latency'] as int,
|
||||
version: json['version'] as String?,
|
||||
role: json['role'] as String? ?? 'UNKNOWN',
|
||||
preferredPath: bestPath,
|
||||
tunneled: json['tunneled'] as bool,
|
||||
);
|
||||
}
|
||||
|
||||
// Comparison logic for sorting: PLANETs first, then by tunneled (直连优先), then by latency
|
||||
@override
|
||||
int compareTo(PeerInfo other) {
|
||||
if (isPlanet != other.isPlanet) {
|
||||
return isPlanet ? 1 : -1;
|
||||
}
|
||||
|
||||
if (tunneled != other.tunneled) {
|
||||
return tunneled ? -1 : 1;
|
||||
}
|
||||
|
||||
// 最后按延迟排序(如果有的话)
|
||||
if (latency != null && other.latency != null) {
|
||||
return latency!.compareTo(other.latency!);
|
||||
} else if (latency != null) {
|
||||
return -1; // 有延迟信息的优先
|
||||
} else if (other.latency != null) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// 如果都没有延迟信息,按地址排序
|
||||
return address.compareTo(other.address);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user