2022-08-02 13:10:09 +08:00
|
|
|
import 'dart:convert';
|
2022-07-27 22:56:28 +08:00
|
|
|
import 'package:flutter/foundation.dart';
|
2023-09-14 10:17:03 +08:00
|
|
|
import 'package:get/get.dart';
|
2022-08-03 22:03:31 +08:00
|
|
|
import 'platform_model.dart';
|
2023-08-16 08:59:50 +08:00
|
|
|
// ignore: depend_on_referenced_packages
|
|
|
|
import 'package:collection/collection.dart';
|
2022-07-27 22:56:28 +08:00
|
|
|
|
|
|
|
class Peer {
|
|
|
|
final String id;
|
2023-08-02 22:25:54 +08:00
|
|
|
String hash;
|
2023-09-14 10:17:03 +08:00
|
|
|
String username; // pc username
|
2023-08-17 21:17:31 +08:00
|
|
|
String hostname;
|
|
|
|
String platform;
|
2022-10-08 15:53:03 +08:00
|
|
|
String alias;
|
|
|
|
List<dynamic> tags;
|
2022-11-28 18:16:29 +08:00
|
|
|
bool forceAlwaysRelay = false;
|
|
|
|
String rdpPort;
|
|
|
|
String rdpUsername;
|
2022-07-27 22:56:28 +08:00
|
|
|
bool online = false;
|
2023-09-14 10:17:03 +08:00
|
|
|
String loginName; //login username
|
2022-07-27 22:56:28 +08:00
|
|
|
|
2023-03-10 15:25:19 +08:00
|
|
|
String getId() {
|
|
|
|
if (alias != '') {
|
|
|
|
return alias;
|
|
|
|
}
|
|
|
|
return id;
|
|
|
|
}
|
|
|
|
|
2022-09-21 21:20:19 +08:00
|
|
|
Peer.fromJson(Map<String, dynamic> json)
|
|
|
|
: id = json['id'] ?? '',
|
2023-08-02 22:25:54 +08:00
|
|
|
hash = json['hash'] ?? '',
|
2022-09-21 21:20:19 +08:00
|
|
|
username = json['username'] ?? '',
|
2022-07-27 22:56:28 +08:00
|
|
|
hostname = json['hostname'] ?? '',
|
|
|
|
platform = json['platform'] ?? '',
|
2022-09-21 21:20:19 +08:00
|
|
|
alias = json['alias'] ?? '',
|
2022-11-28 18:16:29 +08:00
|
|
|
tags = json['tags'] ?? [],
|
|
|
|
forceAlwaysRelay = json['forceAlwaysRelay'] == 'true',
|
|
|
|
rdpPort = json['rdpPort'] ?? '',
|
2023-09-14 10:17:03 +08:00
|
|
|
rdpUsername = json['rdpUsername'] ?? '',
|
|
|
|
loginName = json['loginName'] ?? '';
|
2022-07-27 22:56:28 +08:00
|
|
|
|
2022-10-08 15:53:03 +08:00
|
|
|
Map<String, dynamic> toJson() {
|
|
|
|
return <String, dynamic>{
|
|
|
|
"id": id,
|
2023-08-02 22:25:54 +08:00
|
|
|
"hash": hash,
|
2022-10-08 15:53:03 +08:00
|
|
|
"username": username,
|
|
|
|
"hostname": hostname,
|
|
|
|
"platform": platform,
|
|
|
|
"alias": alias,
|
|
|
|
"tags": tags,
|
2022-11-28 18:16:29 +08:00
|
|
|
"forceAlwaysRelay": forceAlwaysRelay.toString(),
|
|
|
|
"rdpPort": rdpPort,
|
|
|
|
"rdpUsername": rdpUsername,
|
2023-09-14 10:17:03 +08:00
|
|
|
'loginName': loginName,
|
2022-10-08 15:53:03 +08:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2023-08-02 22:25:54 +08:00
|
|
|
Map<String, dynamic> toAbUploadJson() {
|
|
|
|
return <String, dynamic>{
|
|
|
|
"id": id,
|
|
|
|
"hash": hash,
|
|
|
|
"username": username,
|
|
|
|
"hostname": hostname,
|
|
|
|
"platform": platform,
|
2023-08-15 09:23:55 +08:00
|
|
|
"alias": alias,
|
2023-08-02 22:25:54 +08:00
|
|
|
"tags": tags,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2023-09-14 10:17:03 +08:00
|
|
|
Map<String, dynamic> toGroupCacheJson() {
|
|
|
|
return <String, dynamic>{
|
|
|
|
"id": id,
|
|
|
|
"username": username,
|
|
|
|
"hostname": hostname,
|
|
|
|
"platform": platform,
|
|
|
|
"login_name": loginName,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2022-07-27 22:56:28 +08:00
|
|
|
Peer({
|
|
|
|
required this.id,
|
2023-08-02 22:25:54 +08:00
|
|
|
required this.hash,
|
2022-07-27 22:56:28 +08:00
|
|
|
required this.username,
|
|
|
|
required this.hostname,
|
|
|
|
required this.platform,
|
2022-09-21 21:20:19 +08:00
|
|
|
required this.alias,
|
2022-07-27 22:56:28 +08:00
|
|
|
required this.tags,
|
2022-11-28 18:16:29 +08:00
|
|
|
required this.forceAlwaysRelay,
|
|
|
|
required this.rdpPort,
|
|
|
|
required this.rdpUsername,
|
2023-09-14 10:17:03 +08:00
|
|
|
required this.loginName,
|
2022-07-27 22:56:28 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
Peer.loading()
|
|
|
|
: this(
|
2022-11-28 18:16:29 +08:00
|
|
|
id: '...',
|
2023-08-02 22:25:54 +08:00
|
|
|
hash: '',
|
2022-11-28 18:16:29 +08:00
|
|
|
username: '...',
|
|
|
|
hostname: '...',
|
|
|
|
platform: '...',
|
|
|
|
alias: '',
|
|
|
|
tags: [],
|
|
|
|
forceAlwaysRelay: false,
|
|
|
|
rdpPort: '',
|
|
|
|
rdpUsername: '',
|
2023-09-14 10:17:03 +08:00
|
|
|
loginName: '',
|
2022-11-28 18:16:29 +08:00
|
|
|
);
|
2023-08-16 08:59:50 +08:00
|
|
|
bool equal(Peer other) {
|
|
|
|
return id == other.id &&
|
|
|
|
hash == other.hash &&
|
|
|
|
username == other.username &&
|
|
|
|
hostname == other.hostname &&
|
|
|
|
platform == other.platform &&
|
|
|
|
alias == other.alias &&
|
|
|
|
tags.equals(other.tags) &&
|
|
|
|
forceAlwaysRelay == other.forceAlwaysRelay &&
|
|
|
|
rdpPort == other.rdpPort &&
|
2023-09-14 10:17:03 +08:00
|
|
|
rdpUsername == other.rdpUsername &&
|
|
|
|
loginName == other.loginName;
|
2023-08-16 08:59:50 +08:00
|
|
|
}
|
2023-08-16 22:43:17 +08:00
|
|
|
|
|
|
|
Peer.copy(Peer other)
|
|
|
|
: this(
|
2023-09-14 10:17:03 +08:00
|
|
|
id: other.id,
|
|
|
|
hash: other.hash,
|
|
|
|
username: other.username,
|
|
|
|
hostname: other.hostname,
|
|
|
|
platform: other.platform,
|
|
|
|
alias: other.alias,
|
|
|
|
tags: other.tags.toList(),
|
|
|
|
forceAlwaysRelay: other.forceAlwaysRelay,
|
|
|
|
rdpPort: other.rdpPort,
|
|
|
|
rdpUsername: other.rdpUsername,
|
|
|
|
loginName: other.loginName,
|
|
|
|
);
|
2022-07-27 22:56:28 +08:00
|
|
|
}
|
|
|
|
|
2023-06-20 23:34:05 +08:00
|
|
|
enum UpdateEvent { online, load }
|
|
|
|
|
2022-07-27 22:56:28 +08:00
|
|
|
class Peers extends ChangeNotifier {
|
2022-09-01 21:18:29 +08:00
|
|
|
final String name;
|
|
|
|
final String loadEvent;
|
2023-09-14 10:17:03 +08:00
|
|
|
List<Peer> peers = List.empty(growable: true);
|
|
|
|
final RxList<Peer>? initPeers;
|
2023-06-20 23:34:05 +08:00
|
|
|
UpdateEvent event = UpdateEvent.load;
|
2022-08-02 13:10:09 +08:00
|
|
|
static const _cbQueryOnlines = 'callback_query_onlines';
|
2022-07-27 22:56:28 +08:00
|
|
|
|
2023-09-14 10:17:03 +08:00
|
|
|
Peers(
|
|
|
|
{required this.name, required this.initPeers, required this.loadEvent}) {
|
|
|
|
peers = initPeers ?? [];
|
2022-09-12 10:52:38 +08:00
|
|
|
platformFFI.registerEventHandler(_cbQueryOnlines, name, (evt) async {
|
2022-07-27 22:56:28 +08:00
|
|
|
_updateOnlineState(evt);
|
|
|
|
});
|
2022-09-12 10:52:38 +08:00
|
|
|
platformFFI.registerEventHandler(loadEvent, name, (evt) async {
|
2022-08-02 13:10:09 +08:00
|
|
|
_updatePeers(evt);
|
|
|
|
});
|
2022-07-27 22:56:28 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void dispose() {
|
2022-09-01 21:18:29 +08:00
|
|
|
platformFFI.unregisterEventHandler(_cbQueryOnlines, name);
|
|
|
|
platformFFI.unregisterEventHandler(loadEvent, name);
|
2022-07-27 22:56:28 +08:00
|
|
|
super.dispose();
|
|
|
|
}
|
|
|
|
|
|
|
|
Peer getByIndex(int index) {
|
2022-09-01 21:18:29 +08:00
|
|
|
if (index < peers.length) {
|
|
|
|
return peers[index];
|
2022-07-27 22:56:28 +08:00
|
|
|
} else {
|
|
|
|
return Peer.loading();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int getPeersCount() {
|
2022-09-01 21:18:29 +08:00
|
|
|
return peers.length;
|
2022-07-27 22:56:28 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void _updateOnlineState(Map<String, dynamic> evt) {
|
|
|
|
evt['onlines'].split(',').forEach((online) {
|
2022-09-01 21:18:29 +08:00
|
|
|
for (var i = 0; i < peers.length; i++) {
|
|
|
|
if (peers[i].id == online) {
|
|
|
|
peers[i].online = true;
|
2022-07-27 22:56:28 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
evt['offlines'].split(',').forEach((offline) {
|
2022-09-01 21:18:29 +08:00
|
|
|
for (var i = 0; i < peers.length; i++) {
|
|
|
|
if (peers[i].id == offline) {
|
|
|
|
peers[i].online = false;
|
2022-07-27 22:56:28 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2023-06-20 23:34:05 +08:00
|
|
|
event = UpdateEvent.online;
|
2022-07-27 22:56:28 +08:00
|
|
|
notifyListeners();
|
|
|
|
}
|
2022-08-02 13:10:09 +08:00
|
|
|
|
|
|
|
void _updatePeers(Map<String, dynamic> evt) {
|
|
|
|
final onlineStates = _getOnlineStates();
|
2023-09-14 10:17:03 +08:00
|
|
|
if (initPeers != null) {
|
|
|
|
peers = initPeers!;
|
|
|
|
} else {
|
|
|
|
peers = _decodePeers(evt['peers']);
|
|
|
|
}
|
2022-09-01 21:18:29 +08:00
|
|
|
for (var peer in peers) {
|
2022-08-02 13:10:09 +08:00
|
|
|
final state = onlineStates[peer.id];
|
|
|
|
peer.online = state != null && state != false;
|
2022-09-01 21:18:29 +08:00
|
|
|
}
|
2023-06-20 23:34:05 +08:00
|
|
|
event = UpdateEvent.load;
|
2022-08-02 13:10:09 +08:00
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
|
|
|
|
Map<String, bool> _getOnlineStates() {
|
2022-09-01 21:18:29 +08:00
|
|
|
var onlineStates = <String, bool>{};
|
|
|
|
for (var peer in peers) {
|
2022-08-02 13:10:09 +08:00
|
|
|
onlineStates[peer.id] = peer.online;
|
2022-09-01 21:18:29 +08:00
|
|
|
}
|
2022-08-02 13:10:09 +08:00
|
|
|
return onlineStates;
|
|
|
|
}
|
|
|
|
|
|
|
|
List<Peer> _decodePeers(String peersStr) {
|
|
|
|
try {
|
|
|
|
if (peersStr == "") return [];
|
|
|
|
List<dynamic> peers = json.decode(peersStr);
|
2022-09-21 21:20:19 +08:00
|
|
|
return peers.map((peer) {
|
|
|
|
return Peer.fromJson(peer as Map<String, dynamic>);
|
|
|
|
}).toList();
|
2022-08-02 13:10:09 +08:00
|
|
|
} catch (e) {
|
2022-09-01 21:18:29 +08:00
|
|
|
debugPrint('peers(): $e');
|
2022-08-02 13:10:09 +08:00
|
|
|
}
|
|
|
|
return [];
|
|
|
|
}
|
2022-07-27 22:56:28 +08:00
|
|
|
}
|