RPC now set remote status

This commit is contained in:
2025-09-09 00:27:26 +08:00
parent c7f417234e
commit 8449658b47

View File

@@ -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,11 +522,16 @@ 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 {
try { // Only start server on desktop platforms
await server.start(); if (!Platform.isAndroid && !Platform.isIOS && !kIsWeb) {
state = state.copyWith(status: 'Server running'); try {
} catch (e) { await server.start();
state = state.copyWith(status: 'Server failed: $e'); 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 '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},
);
}