From 8449658b47981b5d10afdf9462b8f6c37daee5b1 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Tue, 9 Sep 2025 00:27:26 +0800 Subject: [PATCH] :sparkles: RPC now set remote status --- lib/pods/activity_rpc.dart | 68 +++++++++++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 8 deletions(-) diff --git a/lib/pods/activity_rpc.dart b/lib/pods/activity_rpc.dart index c6fa7ac5..1e4e3bfa 100644 --- a/lib/pods/activity_rpc.dart +++ b/lib/pods/activity_rpc.dart @@ -2,8 +2,9 @@ import 'dart:async'; import 'dart:convert'; import 'dart:developer' as developer; import 'dart:io'; -import 'dart:typed_data'; +import 'package:flutter/foundation.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:island/pods/network.dart'; import 'package:shelf/shelf.dart'; import 'package:shelf/shelf_io.dart' as shelf_io; import 'package:shelf_web_socket/shelf_web_socket.dart'; @@ -521,11 +522,16 @@ class ServerStateNotifier extends StateNotifier { : super(ServerState(status: 'Server not started')); Future start() async { - try { - await server.start(); - state = state.copyWith(status: 'Server running'); - } catch (e) { - state = state.copyWith(status: 'Server failed: $e'); + // Only start server on desktop platforms + if (!Platform.isAndroid && !Platform.isIOS && !kIsWeb) { + try { + await server.start(); + state = state.copyWith(status: 'Server running'); + } catch (e) { + state = state.copyWith(status: 'Server failed: $e'); + } + } else { + state = state.copyWith(status: 'Server disabled on mobile/web'); } } @@ -572,11 +578,22 @@ final rpcServerStateProvider = 'nonce': '12345', // Should be dynamic }); }, - 'message': (socket, dynamic data) { + 'message': (socket, dynamic data) async { if (data['cmd'] == 'SET_ACTIVITY') { notifier.addActivity( '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 socket.send({ 'cmd': 'SET_ACTIVITY', @@ -586,8 +603,17 @@ final rpcServerStateProvider = }); } }, - 'close': (socket) { + 'close': (socket) async { 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; @@ -597,3 +623,29 @@ final rpcServerProvider = Provider((ref) { final notifier = ref.watch(rpcServerStateProvider.notifier); return notifier.server; }); + +Future 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 unsetRemoteActivityStatus(Ref ref, String appId) async { + final apiClient = ref.read(apiClientProvider); + await apiClient.delete( + '/id/accounts/me/statuses', + queryParameters: {'app': appId}, + ); +}