✨ RPC now set remote status
This commit is contained in:
		| @@ -2,8 +2,9 @@ import 'dart:async'; | |||||||
| import 'dart:convert'; | import 'dart:convert'; | ||||||
| import 'dart:developer' as developer; | import 'dart:developer' as developer; | ||||||
| import 'dart:io'; | import 'dart:io'; | ||||||
| import 'dart:typed_data'; | import 'package:flutter/foundation.dart'; | ||||||
| import 'package:hooks_riverpod/hooks_riverpod.dart'; | import 'package:hooks_riverpod/hooks_riverpod.dart'; | ||||||
|  | import 'package:island/pods/network.dart'; | ||||||
| import 'package:shelf/shelf.dart'; | import 'package:shelf/shelf.dart'; | ||||||
| import 'package:shelf/shelf_io.dart' as shelf_io; | import 'package:shelf/shelf_io.dart' as shelf_io; | ||||||
| import 'package:shelf_web_socket/shelf_web_socket.dart'; | import 'package:shelf_web_socket/shelf_web_socket.dart'; | ||||||
| @@ -521,12 +522,17 @@ class ServerStateNotifier extends StateNotifier<ServerState> { | |||||||
|     : super(ServerState(status: 'Server not started')); |     : super(ServerState(status: 'Server not started')); | ||||||
|  |  | ||||||
|   Future<void> start() async { |   Future<void> start() async { | ||||||
|  |     // Only start server on desktop platforms | ||||||
|  |     if (!Platform.isAndroid && !Platform.isIOS && !kIsWeb) { | ||||||
|       try { |       try { | ||||||
|         await server.start(); |         await server.start(); | ||||||
|         state = state.copyWith(status: 'Server running'); |         state = state.copyWith(status: 'Server running'); | ||||||
|       } catch (e) { |       } catch (e) { | ||||||
|         state = state.copyWith(status: 'Server failed: $e'); |         state = state.copyWith(status: 'Server failed: $e'); | ||||||
|       } |       } | ||||||
|  |     } else { | ||||||
|  |       state = state.copyWith(status: 'Server disabled on mobile/web'); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   void updateStatus(String status) { |   void updateStatus(String status) { | ||||||
| @@ -572,11 +578,22 @@ final rpcServerStateProvider = | |||||||
|             'nonce': '12345', // Should be dynamic |             'nonce': '12345', // Should be dynamic | ||||||
|           }); |           }); | ||||||
|         }, |         }, | ||||||
|         'message': (socket, dynamic data) { |         'message': (socket, dynamic data) async { | ||||||
|           if (data['cmd'] == 'SET_ACTIVITY') { |           if (data['cmd'] == 'SET_ACTIVITY') { | ||||||
|             notifier.addActivity( |             notifier.addActivity( | ||||||
|               'Activity: ${data['args']['activity']['details'] ?? 'Unknown'}', |               'Activity: ${data['args']['activity']['details'] ?? 'Unknown'}', | ||||||
|             ); |             ); | ||||||
|  |             // Call setRemoteActivityStatus | ||||||
|  |             final label = data['args']['activity']['details'] ?? 'Unknown'; | ||||||
|  |             final appId = socket.clientId; | ||||||
|  |             try { | ||||||
|  |               await setRemoteActivityStatus(ref, label, appId); | ||||||
|  |             } catch (e) { | ||||||
|  |               developer.log( | ||||||
|  |                 'Failed to set remote activity status: $e', | ||||||
|  |                 name: kRpcLogPrefix, | ||||||
|  |               ); | ||||||
|  |             } | ||||||
|             // Echo back success |             // Echo back success | ||||||
|             socket.send({ |             socket.send({ | ||||||
|               'cmd': 'SET_ACTIVITY', |               'cmd': 'SET_ACTIVITY', | ||||||
| @@ -586,8 +603,17 @@ final rpcServerStateProvider = | |||||||
|             }); |             }); | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         'close': (socket) { |         'close': (socket) async { | ||||||
|           notifier.updateStatus('Client disconnected'); |           notifier.updateStatus('Client disconnected'); | ||||||
|  |           final appId = socket.clientId; | ||||||
|  |           try { | ||||||
|  |             await unsetRemoteActivityStatus(ref, appId); | ||||||
|  |           } catch (e) { | ||||||
|  |             developer.log( | ||||||
|  |               'Failed to unset remote activity status: $e', | ||||||
|  |               name: kRpcLogPrefix, | ||||||
|  |             ); | ||||||
|  |           } | ||||||
|         }, |         }, | ||||||
|       }); |       }); | ||||||
|       return notifier; |       return notifier; | ||||||
| @@ -597,3 +623,29 @@ final rpcServerProvider = Provider<ActivityRpcServer>((ref) { | |||||||
|   final notifier = ref.watch(rpcServerStateProvider.notifier); |   final notifier = ref.watch(rpcServerStateProvider.notifier); | ||||||
|   return notifier.server; |   return notifier.server; | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  | Future<void> setRemoteActivityStatus( | ||||||
|  |   Ref ref, | ||||||
|  |   String label, | ||||||
|  |   String appId, | ||||||
|  | ) async { | ||||||
|  |   final apiClient = ref.read(apiClientProvider); | ||||||
|  |   await apiClient.post( | ||||||
|  |     '/id/accounts/me/statuses', | ||||||
|  |     data: { | ||||||
|  |       'is_invisible': false, | ||||||
|  |       'is_not_disturb': false, | ||||||
|  |       'is_automated': true, | ||||||
|  |       'label': label, | ||||||
|  |       'app_identifier': appId, | ||||||
|  |     }, | ||||||
|  |   ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | Future<void> unsetRemoteActivityStatus(Ref ref, String appId) async { | ||||||
|  |   final apiClient = ref.read(apiClientProvider); | ||||||
|  |   await apiClient.delete( | ||||||
|  |     '/id/accounts/me/statuses', | ||||||
|  |     queryParameters: {'app': appId}, | ||||||
|  |   ); | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user