From 5f4af52ef2d45a24cc99a6b64d55d1602aa938a7 Mon Sep 17 00:00:00 2001 From: xkeyC <3334969096@qq.com> Date: Sat, 2 Dec 2023 12:26:17 +0800 Subject: [PATCH] grpc import --- assets/cert.pem | 19 +++++ lib/api/grpc_api.dart | 20 +++++ lib/common/conf.dart | 13 +++- lib/common/grpc/grpc.dart | 17 +++++ lib/generated/grpc/app.pb.dart | 118 +++++++++++++++++++++++++++++ lib/generated/grpc/app.pbenum.dart | 11 +++ lib/generated/grpc/app.pbgrpc.dart | 59 +++++++++++++++ lib/generated/grpc/app.pbjson.dart | 39 ++++++++++ lib/ui/about/about_ui.dart | 2 +- lib/ui/home/home_ui.dart | 4 +- lib/ui/index_ui.dart | 18 ++++- lib/ui/tools/tools_ui.dart | 6 +- pubspec.yaml | 2 + update_grpc.bat | 1 + 14 files changed, 319 insertions(+), 10 deletions(-) create mode 100644 assets/cert.pem create mode 100644 lib/api/grpc_api.dart create mode 100644 lib/common/grpc/grpc.dart create mode 100644 lib/generated/grpc/app.pb.dart create mode 100644 lib/generated/grpc/app.pbenum.dart create mode 100644 lib/generated/grpc/app.pbgrpc.dart create mode 100644 lib/generated/grpc/app.pbjson.dart create mode 100644 update_grpc.bat diff --git a/assets/cert.pem b/assets/cert.pem new file mode 100644 index 0000000..4bd2775 --- /dev/null +++ b/assets/cert.pem @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDEDCCAfigAwIBAgIQd60aUiCLj0uhbJ9IdhfflzANBgkqhkiG9w0BAQsFADAS +MRAwDgYDVQQKEwdBY21lIENvMB4XDTIzMTIwMTE1MjkyN1oXDTMzMTEyODE1Mjky +N1owEjEQMA4GA1UEChMHQWNtZSBDbzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKBov8KcT7N4bhf1RE5D2vKV+NVDMnHVkvij9VvixLALA0K9QHPUOPM+ +ReDluJyeOk34lwXMd8S2HAWghKHB80lfFrUT0cj/BgSXQBRWL8oQNtCPMMOJmZ6A +TCKAQOXSJ86bwrEHWbuSjQtfDONPDg7qF8ysEjNfjIro/yxA9z+nxO07oHrtBLg+ +C//hd3miGIyL5iwgIXH86Y6Mvp6K1/Sfc6dZhwiZwjG+8XR338Y69KL+5SPemE88 +4fIa9p/QYKbkCRE2D5jjW4OCJOK/D105/DNSJu20HzdP1crZJsi4RXLLCE1OC/Mz +plzD9hdVovKtx6WfxgpFKZpNBlXs73ECAwEAAaNiMGAwDgYDVR0PAQH/BAQDAgWg +MBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwKwYDVR0RBCQwIoIg +Z3JwYy5zY3Rvb2xib3guZmFrZS5iaWxpYmlsaS5jb20wDQYJKoZIhvcNAQELBQAD +ggEBAHagncLc0hFp2bcCbp+V9nq5kYkc3iZ2eWgwwq7NeQVk5nAqMajFeoyJbN6C +Aksqbz+iNsJdzqpzfo2VC70Rd3n79i0krK2puDhSU+1CkHm5F4CcuJQXA44RWLt+ +iINU3Op1upl2+TAujLb2ezmh7CoxlHbMkd0+5qa6DHoRB1wZ6MF4iYzGupr63uVv +6wQzzRGZgEt5iC2nRF9moilwVIrs3w6swpWh/m/YCPUUWIZGj1J6PmOTiDyOReSQ +xG6chIPhdzAKPoBPEQzG9v/t94w3kdF010BP2JzQoKg3lecCM1QWgpGV8qvbhtoS +hFhz6sZZ/sh6NiH0Cp0t55jhKDI= +-----END CERTIFICATE----- diff --git a/lib/api/grpc_api.dart b/lib/api/grpc_api.dart new file mode 100644 index 0000000..13e0669 --- /dev/null +++ b/lib/api/grpc_api.dart @@ -0,0 +1,20 @@ +import 'package:starcitizen_doctor/common/grpc/grpc.dart'; +import 'package:starcitizen_doctor/generated/grpc/app.pbgrpc.dart'; + +import '../common/utils/base_utils.dart'; + +class GrpcApi { + static final _pingClient = PingServiceClient(GrpcClient.channel); + + static Future pingServer() async { + try { + final result = await _pingClient.pingServer(PingRequest(name: "ping")); + if (result.pong == "pong") { + dPrint("[GrpcApi] gRPC service Connected"); + return; + } + } catch (e) { + dPrint("[GrpcApi] pingServer Error: $e"); + } + } +} diff --git a/lib/common/conf.dart b/lib/common/conf.dart index 100e80c..7b37096 100644 --- a/lib/common/conf.dart +++ b/lib/common/conf.dart @@ -1,12 +1,14 @@ import 'dart:io'; import 'package:device_info_plus/device_info_plus.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_acrylic/flutter_acrylic.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:hive/hive.dart'; import 'package:path_provider/path_provider.dart'; import 'package:starcitizen_doctor/api/analytics.dart'; import 'package:starcitizen_doctor/api/api.dart'; +import 'package:starcitizen_doctor/api/grpc_api.dart'; import 'package:starcitizen_doctor/common/helper/system_helper.dart'; import 'package:starcitizen_doctor/common/rust/ffi.dart'; import 'package:starcitizen_doctor/data/app_version_data.dart'; @@ -54,6 +56,8 @@ class AppConf { static Color? colorMenu; static Color? colorMica; + static List? certData; + static const isMSE = String.fromEnvironment("MSE", defaultValue: "false") == "true"; @@ -95,10 +99,16 @@ class AppConf { colorMenu = HexColor("#132431").withOpacity(.95); colorMica = HexColor("#0A3142"); + /// init grpcKeys + certData = (await rootBundle.load("assets/cert.pem")) + .buffer + .asUint8List() + .toList(); + /// init windows await windowManager.ensureInitialized(); windowManager.waitUntilReadyToShow().then((_) async { - await windowManager.setSize(const Size(1280, 810)); + await windowManager.setSize(const Size(1080, 810)); await windowManager.setMinimumSize(const Size(1280, 810)); await windowManager.center(animate: true); await windowManager.setSkipTaskbar(false); @@ -124,6 +134,7 @@ class AppConf { } static Future checkUpdate() async { + GrpcApi.pingServer(); // clean path if (!isMSE) { final dir = Directory(getUpgradePath()); diff --git a/lib/common/grpc/grpc.dart b/lib/common/grpc/grpc.dart new file mode 100644 index 0000000..b53fa1a --- /dev/null +++ b/lib/common/grpc/grpc.dart @@ -0,0 +1,17 @@ +import 'package:grpc/grpc.dart'; +import 'package:starcitizen_doctor/common/conf.dart'; + +class GrpcClient { + static final channel = ClientChannel( + 'grpc.sctoolbox.xkeyc.com', + port: 8439, + options: ChannelOptions( + credentials: ChannelCredentials.secure( + certificates: AppConf.certData, + authority: 'grpc.sctoolbox.fake.bilibili.com', + ), + codecRegistry: + CodecRegistry(codecs: const [GzipCodec(), IdentityCodec()]), + ), + ); +} diff --git a/lib/generated/grpc/app.pb.dart b/lib/generated/grpc/app.pb.dart new file mode 100644 index 0000000..307d089 --- /dev/null +++ b/lib/generated/grpc/app.pb.dart @@ -0,0 +1,118 @@ +// +// Generated code. Do not modify. +// source: app.proto +// +// @dart = 2.12 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; + +class PingRequest extends $pb.GeneratedMessage { + factory PingRequest({ + $core.String? name, + }) { + final $result = create(); + if (name != null) { + $result.name = name; + } + return $result; + } + PingRequest._() : super(); + factory PingRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory PingRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PingRequest', createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'name') + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + PingRequest clone() => PingRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + PingRequest copyWith(void Function(PingRequest) updates) => super.copyWith((message) => updates(message as PingRequest)) as PingRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PingRequest create() => PingRequest._(); + PingRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PingRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static PingRequest? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get name => $_getSZ(0); + @$pb.TagNumber(1) + set name($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasName() => $_has(0); + @$pb.TagNumber(1) + void clearName() => clearField(1); +} + +class PingResult extends $pb.GeneratedMessage { + factory PingResult({ + $core.String? pong, + }) { + final $result = create(); + if (pong != null) { + $result.pong = pong; + } + return $result; + } + PingResult._() : super(); + factory PingResult.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory PingResult.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PingResult', createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'pong') + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + PingResult clone() => PingResult()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + PingResult copyWith(void Function(PingResult) updates) => super.copyWith((message) => updates(message as PingResult)) as PingResult; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PingResult create() => PingResult._(); + PingResult createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PingResult getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static PingResult? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get pong => $_getSZ(0); + @$pb.TagNumber(1) + set pong($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasPong() => $_has(0); + @$pb.TagNumber(1) + void clearPong() => clearField(1); +} + + +const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); +const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/lib/generated/grpc/app.pbenum.dart b/lib/generated/grpc/app.pbenum.dart new file mode 100644 index 0000000..44d506c --- /dev/null +++ b/lib/generated/grpc/app.pbenum.dart @@ -0,0 +1,11 @@ +// +// Generated code. Do not modify. +// source: app.proto +// +// @dart = 2.12 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + diff --git a/lib/generated/grpc/app.pbgrpc.dart b/lib/generated/grpc/app.pbgrpc.dart new file mode 100644 index 0000000..1e89ee8 --- /dev/null +++ b/lib/generated/grpc/app.pbgrpc.dart @@ -0,0 +1,59 @@ +// +// Generated code. Do not modify. +// source: app.proto +// +// @dart = 2.12 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:async' as $async; +import 'dart:core' as $core; + +import 'package:grpc/service_api.dart' as $grpc; +import 'package:protobuf/protobuf.dart' as $pb; + +import 'app.pb.dart' as $0; + +export 'app.pb.dart'; + +@$pb.GrpcServiceName('PingService') +class PingServiceClient extends $grpc.Client { + static final _$pingServer = $grpc.ClientMethod<$0.PingRequest, $0.PingResult>( + '/PingService/PingServer', + ($0.PingRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.PingResult.fromBuffer(value)); + + PingServiceClient($grpc.ClientChannel channel, + {$grpc.CallOptions? options, + $core.Iterable<$grpc.ClientInterceptor>? interceptors}) + : super(channel, options: options, + interceptors: interceptors); + + $grpc.ResponseFuture<$0.PingResult> pingServer($0.PingRequest request, {$grpc.CallOptions? options}) { + return $createUnaryCall(_$pingServer, request, options: options); + } +} + +@$pb.GrpcServiceName('PingService') +abstract class PingServiceBase extends $grpc.Service { + $core.String get $name => 'PingService'; + + PingServiceBase() { + $addMethod($grpc.ServiceMethod<$0.PingRequest, $0.PingResult>( + 'PingServer', + pingServer_Pre, + false, + false, + ($core.List<$core.int> value) => $0.PingRequest.fromBuffer(value), + ($0.PingResult value) => value.writeToBuffer())); + } + + $async.Future<$0.PingResult> pingServer_Pre($grpc.ServiceCall call, $async.Future<$0.PingRequest> request) async { + return pingServer(call, await request); + } + + $async.Future<$0.PingResult> pingServer($grpc.ServiceCall call, $0.PingRequest request); +} diff --git a/lib/generated/grpc/app.pbjson.dart b/lib/generated/grpc/app.pbjson.dart new file mode 100644 index 0000000..1ec09d8 --- /dev/null +++ b/lib/generated/grpc/app.pbjson.dart @@ -0,0 +1,39 @@ +// +// Generated code. Do not modify. +// source: app.proto +// +// @dart = 2.12 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:convert' as $convert; +import 'dart:core' as $core; +import 'dart:typed_data' as $typed_data; + +@$core.Deprecated('Use pingRequestDescriptor instead') +const PingRequest$json = { + '1': 'PingRequest', + '2': [ + {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'}, + ], +}; + +/// Descriptor for `PingRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List pingRequestDescriptor = $convert.base64Decode( + 'CgtQaW5nUmVxdWVzdBISCgRuYW1lGAEgASgJUgRuYW1l'); + +@$core.Deprecated('Use pingResultDescriptor instead') +const PingResult$json = { + '1': 'PingResult', + '2': [ + {'1': 'pong', '3': 1, '4': 1, '5': 9, '10': 'pong'}, + ], +}; + +/// Descriptor for `PingResult`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List pingResultDescriptor = $convert.base64Decode( + 'CgpQaW5nUmVzdWx0EhIKBHBvbmcYASABKAlSBHBvbmc='); + diff --git a/lib/ui/about/about_ui.dart b/lib/ui/about/about_ui.dart index d2d74d7..145b4f2 100644 --- a/lib/ui/about/about_ui.dart +++ b/lib/ui/about/about_ui.dart @@ -119,7 +119,7 @@ class AboutUI extends BaseUI { ), onPressed: () { launchUrlString( - "https://github.com/xkeyC/StarCitizenToolBox"); + "https://github.com/StarCitizenToolBox/app"); }, ), ], diff --git a/lib/ui/home/home_ui.dart b/lib/ui/home/home_ui.dart index 252e499..43570e9 100644 --- a/lib/ui/home/home_ui.dart +++ b/lib/ui/home/home_ui.dart @@ -147,7 +147,7 @@ class HomeUI extends BaseUI { ? null : () => model.launchRSI(), child: Padding( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.all(6), child: Icon( model.isCurGameRunning ? FluentIcons.stop_solid @@ -161,7 +161,7 @@ class HomeUI extends BaseUI { const SizedBox(width: 12), Button( child: const Padding( - padding: EdgeInsets.all(8.0), + padding: EdgeInsets.all(6), child: Icon(FluentIcons.folder_open), ), onPressed: () => model.openDir(model.scInstalledPath)), diff --git a/lib/ui/index_ui.dart b/lib/ui/index_ui.dart index 5ac36b0..cf5bbbd 100644 --- a/lib/ui/index_ui.dart +++ b/lib/ui/index_ui.dart @@ -48,7 +48,7 @@ class IndexUI extends BaseUI { pane: NavigationPane( selected: model.curIndex, items: getNavigationPaneItems(model), - size: const NavigationPaneSize(openWidth: 160), + size: const NavigationPaneSize(openWidth: 64), ), paneBodyBuilder: (item, child) { // final name = @@ -97,8 +97,20 @@ class IndexUI extends BaseUI { return [ for (final kv in menus.entries) PaneItem( - icon: Icon(kv.key), - title: Text(kv.value), + icon: Padding( + padding: const EdgeInsets.only(top: 6, bottom: 6, left: 4), + child: Column( + children: [ + Icon(kv.key, size: 18), + const SizedBox(height: 3), + Text( + kv.value, + style: const TextStyle(fontSize: 11), + ) + ], + ), + ), + // title: Text(kv.value), body: const SizedBox.shrink(), onTap: () { model.onIndexMenuTap(kv.value); diff --git a/lib/ui/tools/tools_ui.dart b/lib/ui/tools/tools_ui.dart index 75cd92a..c79eab3 100644 --- a/lib/ui/tools/tools_ui.dart +++ b/lib/ui/tools/tools_ui.dart @@ -29,7 +29,7 @@ class ToolsUI extends BaseUI { onPressed: model.working ? null : model.loadData, child: const Padding( padding: EdgeInsets.only( - top: 32, bottom: 32, left: 12, right: 12), + top: 30, bottom: 30, left: 12, right: 12), child: Icon(FluentIcons.refresh), ), ), @@ -197,7 +197,7 @@ class ToolsUI extends BaseUI { const SizedBox(width: 8), Button( child: const Padding( - padding: EdgeInsets.all(8.0), + padding: EdgeInsets.all(6), child: Icon(FluentIcons.folder_open), ), onPressed: () => model.openDir(model.scInstalledPath)) @@ -234,7 +234,7 @@ class ToolsUI extends BaseUI { const SizedBox(width: 8), Button( child: const Padding( - padding: EdgeInsets.all(8.0), + padding: EdgeInsets.all(6), child: Icon(FluentIcons.folder_open), ), onPressed: () => model.openDir(model.rsiLauncherInstalledPath)) diff --git a/pubspec.yaml b/pubspec.yaml index 7180367..5578415 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -64,6 +64,8 @@ dependencies: hexcolor: ^3.0.1 dart_rss: ^3.0.1 html: ^0.15.4 + protobuf: ^3.1.0 + grpc: ^3.2.4 dependency_overrides: http: ^1.1.2 diff --git a/update_grpc.bat b/update_grpc.bat new file mode 100644 index 0000000..f92c93b --- /dev/null +++ b/update_grpc.bat @@ -0,0 +1 @@ +protoc --dart_out=grpc:lib/generated/grpc -I../sctoolbox_grpc/protos/ ../sctoolbox_grpc/protos/*.proto