✨ 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