137 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'dart:convert';
 | |
| import 'package:flutter/foundation.dart';
 | |
| import 'platform_model.dart';
 | |
| 
 | |
| class Peer {
 | |
|   final String id;
 | |
|   final String username;
 | |
|   final String hostname;
 | |
|   final String platform;
 | |
|   String alias;
 | |
|   List<dynamic> tags;
 | |
|   bool online = false;
 | |
| 
 | |
|   Peer.fromJson(Map<String, dynamic> json)
 | |
|       : id = json['id'] ?? '',
 | |
|         username = json['username'] ?? '',
 | |
|         hostname = json['hostname'] ?? '',
 | |
|         platform = json['platform'] ?? '',
 | |
|         alias = json['alias'] ?? '',
 | |
|         tags = json['tags'] ?? [];
 | |
| 
 | |
|   Map<String, dynamic> toJson() {
 | |
|     return <String, dynamic>{
 | |
|       "id": id,
 | |
|       "username": username,
 | |
|       "hostname": hostname,
 | |
|       "platform": platform,
 | |
|       "alias": alias,
 | |
|       "tags": tags,
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   Peer({
 | |
|     required this.id,
 | |
|     required this.username,
 | |
|     required this.hostname,
 | |
|     required this.platform,
 | |
|     required this.alias,
 | |
|     required this.tags,
 | |
|   });
 | |
| 
 | |
|   Peer.loading()
 | |
|       : this(
 | |
|             id: '...',
 | |
|             username: '...',
 | |
|             hostname: '...',
 | |
|             platform: '...',
 | |
|             alias: '',
 | |
|             tags: []);
 | |
| }
 | |
| 
 | |
| class Peers extends ChangeNotifier {
 | |
|   final String name;
 | |
|   final String loadEvent;
 | |
|   List<Peer> peers;
 | |
|   static const _cbQueryOnlines = 'callback_query_onlines';
 | |
| 
 | |
|   Peers({required this.name, required this.peers, required this.loadEvent}) {
 | |
|     platformFFI.registerEventHandler(_cbQueryOnlines, name, (evt) async {
 | |
|       _updateOnlineState(evt);
 | |
|     });
 | |
|     platformFFI.registerEventHandler(loadEvent, name, (evt) async {
 | |
|       _updatePeers(evt);
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   void dispose() {
 | |
|     platformFFI.unregisterEventHandler(_cbQueryOnlines, name);
 | |
|     platformFFI.unregisterEventHandler(loadEvent, name);
 | |
|     super.dispose();
 | |
|   }
 | |
| 
 | |
|   Peer getByIndex(int index) {
 | |
|     if (index < peers.length) {
 | |
|       return peers[index];
 | |
|     } else {
 | |
|       return Peer.loading();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   int getPeersCount() {
 | |
|     return peers.length;
 | |
|   }
 | |
| 
 | |
|   void _updateOnlineState(Map<String, dynamic> evt) {
 | |
|     evt['onlines'].split(',').forEach((online) {
 | |
|       for (var i = 0; i < peers.length; i++) {
 | |
|         if (peers[i].id == online) {
 | |
|           peers[i].online = true;
 | |
|         }
 | |
|       }
 | |
|     });
 | |
| 
 | |
|     evt['offlines'].split(',').forEach((offline) {
 | |
|       for (var i = 0; i < peers.length; i++) {
 | |
|         if (peers[i].id == offline) {
 | |
|           peers[i].online = false;
 | |
|         }
 | |
|       }
 | |
|     });
 | |
| 
 | |
|     notifyListeners();
 | |
|   }
 | |
| 
 | |
|   void _updatePeers(Map<String, dynamic> evt) {
 | |
|     final onlineStates = _getOnlineStates();
 | |
|     peers = _decodePeers(evt['peers']);
 | |
|     for (var peer in peers) {
 | |
|       final state = onlineStates[peer.id];
 | |
|       peer.online = state != null && state != false;
 | |
|     }
 | |
|     notifyListeners();
 | |
|   }
 | |
| 
 | |
|   Map<String, bool> _getOnlineStates() {
 | |
|     var onlineStates = <String, bool>{};
 | |
|     for (var peer in peers) {
 | |
|       onlineStates[peer.id] = peer.online;
 | |
|     }
 | |
|     return onlineStates;
 | |
|   }
 | |
| 
 | |
|   List<Peer> _decodePeers(String peersStr) {
 | |
|     try {
 | |
|       if (peersStr == "") return [];
 | |
|       List<dynamic> peers = json.decode(peersStr);
 | |
|       return peers.map((peer) {
 | |
|         return Peer.fromJson(peer as Map<String, dynamic>);
 | |
|       }).toList();
 | |
|     } catch (e) {
 | |
|       debugPrint('peers(): $e');
 | |
|     }
 | |
|     return [];
 | |
|   }
 | |
| }
 |