import 'dart:async'; import 'dart:io'; import 'package:dart_json_mapper/dart_json_mapper.dart'; import 'package:get/get.dart'; import 'package:naiyouwl/app/controller/GlobalController.dart'; import 'package:naiyouwl/app/controller/controllers.dart'; import 'package:naiyouwl/app/controller/service.dart'; import 'package:naiyouwl/app/utils/system_proxy.dart'; import 'package:naiyouwl/app/utils/utils.dart'; import 'package:tray_manager/tray_manager.dart'; import 'package:window_manager/window_manager.dart'; import '../../../common/LogHelper.dart'; import '../../../common/SharedPreferencesUtil.dart'; import '../../../component/connection_status.dart'; import '../../../data/model/LocalUser.dart'; import '../../../data/model/NodeMode.dart'; import '../../../data/model/SysConfig.dart'; import '../../../data/model/UserMode.dart'; import '../../../network/api_service.dart'; import '../../../routes/app_pages.dart'; enum ImageType { CUSTOMER, PROMOTION, TUTORIAL, RENEWAL, } class HomeController extends GetxController { //TODO: Implement HomeController var isLoading = false.obs; var sysConfig = SysConfig().obs; var localUsers = LocalUser().obs; var userMode = User().obs; var errorMsg = ''.obs; var connectStatus = Rx(ConnectionStatus.disconnected); var nodeModes = []; late final GlobalController globalController = controllers.global; StreamSubscription? _statusSubscription; final Map imageMap = { ImageType.CUSTOMER: "assets/images/main/customer.png", ImageType.PROMOTION: "assets/images/main/promotion.png", ImageType.TUTORIAL: "assets/images/main/tutorial.png", ImageType.RENEWAL: "assets/images/main/renewal.png", }; void onImageTap(ImageType type) { if(type == ImageType.CUSTOMER){ } else if (type == ImageType.PROMOTION){ } else if (type == ImageType.TUTORIAL){ } else if (type == ImageType.RENEWAL){ } LogHelper().d("${imageMap[type]} tapped as ${type.toString().split('.').last}"); } void updateStatus(ConnectionStatus newStatus) { connectStatus.value = newStatus; } void _handleStateChange([dynamic _]) async { final coreStatus = controllers.service.coreStatus.value; final isVisible = controllers.window.isVisible.value; if (coreStatus == RunningState.running && isVisible && controllers.global.allowStatusUpdate) { updateStatus(ConnectionStatus.connecting); await Future.delayed(const Duration(seconds: 5)); updateStatus(ConnectionStatus.stopped); await controllers.global.updateDate(); } else { updateStatus(ConnectionStatus.disconnected); } } Future handleButtonClick() async { // 如果当前状态是已连接或正在连接,则停止服务 if (connectStatus.value == ConnectionStatus.connecting || connectStatus.value == ConnectionStatus.stopped) { connectStatus.value = ConnectionStatus.disconnected; controllers.global.allowStatusUpdate = false; // 停止服务 await controllers.service.stopClashCore(); return; } else { controllers.global.allowStatusUpdate = true; //生成配置 await controllers.global.makeProxy(); // 开始重启服务 await controllers.service.reloadClashCore(); } } void SetSysProxy() async{ } Future fetchSysConfig() async { try { String? data = await SharedPreferencesUtil().getString("sysconfig"); if(data != null){ sysConfig.value =JsonMapper.deserialize(data)!; } } catch (e) { errorMsg.value = e.toString(); } finally { } } Future fetchUserinfo() async { try { isLoading.value = true; userMode.value = await ApiService().userinfo("/api/client/v4/userinfo"); await globalController.fetchNodes(); } catch (e) { errorMsg.value = e.toString(); } finally { isLoading.value = false; } } Future fetchNode() async { try { isLoading.value = true; await globalController.fetchNodes(); } catch (e) { errorMsg.value = e.toString(); } finally { isLoading.value = false; } } //await SharedPreferencesUtil().setObject("localUser", userModes.toJson()); Future fetchLocalUser() async { try { String? userdata = await SharedPreferencesUtil().getString("localUser"); if(userdata != null){ localUsers.value = JsonMapper.deserialize(userdata)!; } } catch (e) { errorMsg.value = e.toString(); } finally { } } final count = 0.obs; @override void onInit() { super.onInit(); _statusSubscription = controllers.service.coreStatus.stream.listen(_handleStateChange); fetchSysConfig(); fetchLocalUser(); fetchUserinfo(); } @override void onReady() { super.onReady(); } @override void onClose() { _statusSubscription?.cancel(); super.onClose(); } bool GetEnable() => userMode.value.enable == 1; String GetUserName() => localUsers.value.email.toString(); String GetExpiredAt() => "到期时间:${userMode.value.expiredAt}"; String GetTraffic() => "用户流量:${userMode.value.unusedTraffic}"; String GetNode() => controllers.global.selectedNode.value?.name ?? "未选择节点"; String getHttp() => "https://127.0.0.1:${controllers.core.config.value.mixedPort}"; String getSocket() => "socks5://127.0.0.1:${controllers.core.config.value.mixedPort}"; void RouteNode() => Get.toNamed(Routes.NODE); }