| 
									
										
										
										
											2022-08-02 13:10:09 +08:00
										 |  |  | import 'dart:convert'; | 
					
						
							| 
									
										
										
										
											2022-07-27 22:56:28 +08:00
										 |  |  | import 'package:flutter/foundation.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-03 22:03:31 +08:00
										 |  |  | import 'platform_model.dart'; | 
					
						
							| 
									
										
										
										
											2022-07-27 22:56:28 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class Peer { | 
					
						
							|  |  |  |   final String id; | 
					
						
							|  |  |  |   final String username; | 
					
						
							|  |  |  |   final String hostname; | 
					
						
							|  |  |  |   final String platform; | 
					
						
							| 
									
										
										
										
											2022-10-08 16:53:03 +09:00
										 |  |  |   String alias; | 
					
						
							|  |  |  |   List<dynamic> tags; | 
					
						
							| 
									
										
										
										
											2022-07-27 22:56:28 +08:00
										 |  |  |   bool online = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-21 21:20:19 +08:00
										 |  |  |   Peer.fromJson(Map<String, dynamic> json) | 
					
						
							|  |  |  |       : id = json['id'] ?? '', | 
					
						
							|  |  |  |         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-07-27 22:56:28 +08:00
										 |  |  |         tags = json['tags'] ?? []; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-08 16:53:03 +09:00
										 |  |  |   Map<String, dynamic> toJson() { | 
					
						
							|  |  |  |     return <String, dynamic>{ | 
					
						
							|  |  |  |       "id": id, | 
					
						
							|  |  |  |       "username": username, | 
					
						
							|  |  |  |       "hostname": hostname, | 
					
						
							|  |  |  |       "platform": platform, | 
					
						
							|  |  |  |       "alias": alias, | 
					
						
							|  |  |  |       "tags": tags, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-27 22:56:28 +08:00
										 |  |  |   Peer({ | 
					
						
							|  |  |  |     required this.id, | 
					
						
							|  |  |  |     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, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Peer.loading() | 
					
						
							|  |  |  |       : this( | 
					
						
							|  |  |  |             id: '...', | 
					
						
							|  |  |  |             username: '...', | 
					
						
							|  |  |  |             hostname: '...', | 
					
						
							|  |  |  |             platform: '...', | 
					
						
							| 
									
										
										
										
											2022-09-21 21:20:19 +08:00
										 |  |  |             alias: '', | 
					
						
							| 
									
										
										
										
											2022-07-27 22:56:28 +08:00
										 |  |  |             tags: []); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Peers extends ChangeNotifier { | 
					
						
							| 
									
										
										
										
											2022-09-01 06:18:29 -07:00
										 |  |  |   final String name; | 
					
						
							|  |  |  |   final String loadEvent; | 
					
						
							|  |  |  |   List<Peer> peers; | 
					
						
							| 
									
										
										
										
											2022-08-02 13:10:09 +08:00
										 |  |  |   static const _cbQueryOnlines = 'callback_query_onlines'; | 
					
						
							| 
									
										
										
										
											2022-07-27 22:56:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-01 06:18:29 -07:00
										 |  |  |   Peers({required this.name, required this.peers, required this.loadEvent}) { | 
					
						
							| 
									
										
										
										
											2022-09-11 19:52:38 -07:00
										 |  |  |     platformFFI.registerEventHandler(_cbQueryOnlines, name, (evt) async { | 
					
						
							| 
									
										
										
										
											2022-07-27 22:56:28 +08:00
										 |  |  |       _updateOnlineState(evt); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2022-09-11 19:52:38 -07: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 06:18:29 -07: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 06:18:29 -07: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 06:18:29 -07: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 06:18:29 -07: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 06:18:29 -07: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
										 |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     notifyListeners(); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-08-02 13:10:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   void _updatePeers(Map<String, dynamic> evt) { | 
					
						
							|  |  |  |     final onlineStates = _getOnlineStates(); | 
					
						
							| 
									
										
										
										
											2022-09-01 06:18:29 -07:00
										 |  |  |     peers = _decodePeers(evt['peers']); | 
					
						
							|  |  |  |     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 06:18:29 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-08-02 13:10:09 +08:00
										 |  |  |     notifyListeners(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Map<String, bool> _getOnlineStates() { | 
					
						
							| 
									
										
										
										
											2022-09-01 06:18:29 -07: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 06:18:29 -07: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 06:18:29 -07:00
										 |  |  |       debugPrint('peers(): $e'); | 
					
						
							| 
									
										
										
										
											2022-08-02 13:10:09 +08:00
										 |  |  |     } | 
					
						
							|  |  |  |     return []; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-07-27 22:56:28 +08:00
										 |  |  | } |