Esempio n. 1
0
            public static int Run(string[] args)
            {
                if (args.Length == 0)
                {
                    args = new[] { "-h" }
                }
                ;

                // https://docs.microsoft.com/zh-cn/archive/msdn-magazine/2019/march/net-parse-the-command-line-with-system-commandline
                var rootCommand = new RootCommand("命令行工具(Command Line Tools/CLT)");

                void MainHandler() => MainHandler_(null);

                void MainHandler_(Action?onInitStartuped)
                {
#if StartupTrace
                    StartupTrace.Restart("ProcessCheck");
#endif
                    Startup.Init(IsMainProcess ? DILevel.MainProcess : DILevel.Min);
#if StartupTrace
                    StartupTrace.Restart("Startup.Init");
#endif
                    onInitStartuped?.Invoke();
                    if (IsMainProcess)
                    {
                        var isInitAppInstanceReset = false;
                        initAppInstance : appInstance = new();
                        if (!appInstance.IsFirst)
                        {
                            //Console.WriteLine("ApplicationInstance.SendMessage(string.Empty);");
                            if (IApplication.SingletonInstance.SendMessage(string.Empty))
                            {
                                return;
                            }
                            else
                            {
                                if (!isInitAppInstanceReset &&
                                    IApplication.SingletonInstance.TryKillCurrentAllProcess())
                                {
                                    isInitAppInstanceReset = true;
                                    appInstance.Dispose();
                                    goto initAppInstance;
                                }
                                else
                                {
                                    return;
                                }
                            }
                        }
                        appInstance.MessageReceived += value =>
                        {
                            if (string.IsNullOrEmpty(value))
                            {
                                var app = App.Instance;
                                if (app != null)
                                {
                                    MainThread2.BeginInvokeOnMainThread(app.RestoreMainWindow);
                                }
                            }
                        };
                    }
                    //#if StartupTrace
                    //                    StartupTrace.Restart("ApplicationInstance");
                    //#endif
                    //                    initCef();
                    //#if StartupTrace
                    //                    StartupTrace.Restart("InitCefNetApp");
                    //#endif
                    if (IsMainProcess)
                    {
                        BuildAvaloniaAppAndStartWithClassicDesktopLifetime(args);
                    }
#if StartupTrace
                    StartupTrace.Restart("InitAvaloniaApp");
#endif
                }

                void MainHandlerByCLT() => MainHandlerByCLT_(null);

                void MainHandlerByCLT_(Action?onInitStartuped)
                {
                    IsMainProcess = true;
                    IsCLTProcess  = false;
                    MainHandler_(onInitStartuped);
                }

#if DEBUG
                // -clt debug -args 730
                var debug = new Command("debug", "调试");
                debug.AddOption(new Option <string>("-args", () => "", "测试参数"));
                debug.Handler = CommandHandler.Create((string args) => // 参数名与类型要与 Option 中一致!
                {
                    //Console.WriteLine("-clt debug -args " + args);
                    // OutputType WinExe 导致控制台输入不会显示,只能附加一个新的控制台窗口显示内容,不合适
                    // 如果能取消 管理员权限要求,改为运行时管理员权限,
                    // 则可尝试通过 Windows Terminal 或直接 Host 进行命令行模式
                    MainHandlerByCLT();
                });
                rootCommand.AddCommand(debug);
#endif

                var main = new Command(command_main)
                {
                    Handler = CommandHandler.Create(MainHandler)
                };
                rootCommand.AddCommand(main);

                // -clt devtools
                // -clt devtools -disable_gpu
                // -clt devtools -use_wgl
                var devtools = new Command("devtools");
                devtools.AddOption(new Option <bool>("-disable_gpu", () => false, "禁用 GPU 硬件加速"));
                devtools.AddOption(new Option <bool>("-use_wgl", () => false, "使用 Native OpenGL(仅 Windows)"));
                devtools.Handler = CommandHandler.Create((bool disable_gpu, bool use_wgl) =>
                {
                    IApplication.EnableDevtools = true;
                    IApplication.DisableGPU     = disable_gpu;
                    IApplication.UseWgl         = use_wgl;
                    MainHandlerByCLT_(onInitStartuped: () =>
                    {
                        IApplication.LoggerMinLevel = LogLevel.Debug;
                    });
                });
                rootCommand.AddCommand(devtools);

                // -clt c -silence
                var common = new Command("c", "common");
                common.AddOption(new Option <bool>("-silence", "静默启动(不弹窗口)"));
                common.Handler = CommandHandler.Create((bool silence) =>
                {
                    IsMinimize = silence;
                    MainHandlerByCLT();
                });
                rootCommand.AddCommand(common);

                // -clt steam -account
                var steamuser = new Command("steam", "Steam相关操作");
                steamuser.AddOption(new Option <string>("-account", "指定对应steam用户名"));
                steamuser.Handler = CommandHandler.Create((string account) =>
                {
                    if (!string.IsNullOrEmpty(account))
                    {
                        Startup.Init(DILevel.Steam);
                        ISteamService.Instance.TryKillSteamProcess();
                        ISteamService.Instance.SetCurrentUser(account);
                        ISteamService.Instance.StartSteam();
                    }
                });
                rootCommand.AddCommand(steamuser);

                // -clt app -id 632360
                var unlock_achievement = new Command("app", "打开成就解锁窗口");
                unlock_achievement.AddOption(new Option <int>("-id", "指定一个Steam游戏Id"));
                unlock_achievement.AddOption(new Option <bool>("-silence", "挂运行服务,不加载窗口,内存占用更小"));
                unlock_achievement.Handler = CommandHandler.Create(async(int id, bool silence) =>
                {
                    try
                    {
                        if (id <= 0)
                        {
                            return;
                        }
                        if (!silence)
                        {
                            Startup.Init(DILevel.GUI | DILevel.Steam | DILevel.HttpClientFactory);
                            IViewModelManager.Instance.InitUnlockAchievement(id);
                            BuildAvaloniaAppAndStartWithClassicDesktopLifetime(args);
                        }
                        else
                        {
                            Startup.Init(DILevel.Steam);
                            SteamConnectService.Current.Initialize(id);
                            TaskCompletionSource tcs = new();
                            await tcs.Task;
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.Error(nameof(unlock_achievement), ex, "Start");
                    }
                });
                rootCommand.AddCommand(unlock_achievement);

                var r = rootCommand.InvokeAsync(args).Result;
                return(r);
            }
        }
Esempio n. 2
0
        public override async void Initialize()
        {
            var list = steamService.GetRememberUserList();

            if (!list.Any_Nullable())
            {
                return;
            }
            _SteamUsersSourceList.AddOrUpdate(list);

            RefreshRememberUserList();

            #region 加载备注信息
            IReadOnlyDictionary <long, string?>?accountRemarks = SteamAccountSettings.AccountRemarks.Value;

            MenuItems = new ObservableCollection <MenuItemViewModel>();

            List <(string title, string applicationPath, string iconResourcePath, string arguments, string description, string customCategory)>?jumplistData = OperatingSystem2.IsWindows ? new() : null;
            foreach (var user in _SteamUsersSourceList.Items)
            {
                if (accountRemarks?.TryGetValue(user.SteamId64, out var remark) == true &&
                    !string.IsNullOrEmpty(remark))
                {
                    user.Remark = remark;
                }

                if (OperatingSystem2.IsWindows)
                {
                    var title = user.SteamNickName ?? user.SteamId64.ToString(CultureInfo.InvariantCulture);
                    if (!string.IsNullOrEmpty(user.Remark))
                    {
                        title = user.SteamNickName + "(" + user.Remark + ")";
                    }

                    MenuItems.Add(new MenuItemCustomName(title, AppResources.UserChange_BtnTootlip)
                    {
                        Command = ReactiveCommand.Create(() =>
                        {
                            SteamId_Click(user);

                            INotificationService.Instance.Notify(string.Format(AppResources.UserChange_ChangeUserTip, title), NotificationType.Message);
                        }),
                    });

                    if (!string.IsNullOrEmpty(user.AccountName))
                    {
                        jumplistData !.Add((
                                               title: title,
                                               applicationPath: IApplication.ProgramPath,
                                               iconResourcePath: IApplication.ProgramPath,
                                               arguments: $"-clt steam -account {user.AccountName}",
                                               description: AppResources.UserChange_BtnTootlip,
                                               customCategory: Name));
                    }
                }
            }

            if (jumplistData.Any_Nullable())
            {
                MainThread2.BeginInvokeOnMainThread(async() =>
                {
                    var s = IJumpListService.Instance;
                    await s.AddJumpItemsAsync(jumplistData);
                });
            }

            _SteamUsersSourceList.Refresh();
            #endregion

            #region 通过webapi加载头像图片用户信息
            foreach (var user in _SteamUsersSourceList.Items)
            {
                var temp = await webApiService.GetUserInfo(user.SteamId64);

                if (!string.IsNullOrEmpty(temp.SteamID))
                {
                    user.SteamID      = temp.SteamID;
                    user.OnlineState  = temp.OnlineState;
                    user.MemberSince  = temp.MemberSince;
                    user.VacBanned    = temp.VacBanned;
                    user.Summary      = temp.Summary;
                    user.PrivacyState = temp.PrivacyState;
                    user.AvatarIcon   = temp.AvatarIcon;
                    user.AvatarMedium = temp.AvatarMedium;
                    user.AvatarFull   = temp.AvatarFull;
                    user.MiniProfile  = temp.MiniProfile;

                    if (user.MiniProfile != null && !string.IsNullOrEmpty(user.MiniProfile.AnimatedAvatar))
                    {
                        user.AvatarStream = httpService.GetImageAsync(user.MiniProfile.AnimatedAvatar, ImageChannelType.SteamAvatars);
                    }
                    else
                    {
                        user.AvatarStream = httpService.GetImageAsync(temp.AvatarFull, ImageChannelType.SteamAvatars);
                    }
                }
            }

            _SteamUsersSourceList.Refresh();
            #endregion

            #region 加载动态头像头像框数据
            //foreach (var item in _SteamUsersSourceList.Items)
            //{
            //    item.MiniProfile = await webApiService.GetUserMiniProfile(item.SteamId3_Int);
            //    var miniProfile = item.MiniProfile;
            //    if (miniProfile != null)
            //    {
            //        if (!string.IsNullOrEmpty(miniProfile.AnimatedAvatar))
            //            item.AvatarStream = httpService.GetImageAsync(miniProfile.AnimatedAvatar, ImageChannelType.SteamAvatars);

            //        if (!string.IsNullOrEmpty(miniProfile.AvatarFrame))
            //            miniProfile.AvatarFrameStream = httpService.GetImageAsync(miniProfile.AvatarFrame, ImageChannelType.SteamAvatars);

            //        //item.Level = miniProfile.Level;
            //    }
            //}
            //_SteamUsersSourceList.Refresh();
            #endregion
        }
        /// <summary>
        /// 当接收到 WebSocket Client 发送的消息时
        /// </summary>
        /// <param name="host"></param>
        /// <param name="msg"></param>
        /// <param name="socket"></param>
        /// <returns></returns>
        static async Task OnMessage(string msg, IWebSocketConnection?socket)
        {
            if (tempAes == null)
            {
                return;
            }
            var byteArray = msg.Base64UrlDecodeToByteArray();

            try
            {
                byteArray = tempAes.Decrypt(byteArray);
            }
            catch
            {
                if (socket == null)
                {
                    Toast.Show(AppResources.Login_WebSocketOnMessage);
                }
                return;
            }
            var rsp    = ApiResponse.Deserialize <LoginOrRegisterResponse>(byteArray);
            var webRsp = new WebResponseDTO();

            if (rsp.IsSuccess && rsp.Content == null)
            {
                webRsp.Msg = ApiResponse.GetMessage(ApiResponseCode.NoResponseContent);
                if (socket != null)
                {
                    await socket.Send(JsonSerializer.Serialize(webRsp));
                }
                else
                {
                    Toast.Show(webRsp.Msg);
                }
                return;
            }
            var conn_helper = DI.Get <IApiConnectionPlatformHelper>();

            webRsp.State = rsp.IsSuccess;
            if (socket != null)
            {
                await socket.Send(JsonSerializer.Serialize(webRsp)); // 仅可在 close 之前传递消息
            }
            else
            {
                Toast.Show(webRsp.Msg);
            }
            if (rsp.IsSuccess)
            {
                if (isBind)
                {
                    var chan = rsp.Content?.FastLRBChannel;
                    if (!chan.HasValue)
                    {
                        return;
                    }
                    await MainThread2.InvokeOnMainThreadAsync(async() =>
                    {
                        string msg;
                        if (chan.HasValue)
                        {
                            msg = AppResources.Success_.Format(AppResources.User_AccountBind);
                            await UserService.Current.
                            BindAccountAfterUpdateAsync(chan.Value, rsp.Content !);
                            if (vm is IBindWindowViewModel vm2)
                            {
                                vm2.OnBindSuccessed();
                            }
                        }
                        else
                        {
                            msg = "Account bind fail, unknown channel.";
                        }
                        Toast.Show(msg);
                    });
                }
                else
                {
                    await conn_helper.OnLoginedAsync(rsp.Content !, rsp.Content !);

                    await MainThread2.InvokeOnMainThreadAsync(async() =>
                    {
                        await LoginOrRegisterWindowViewModel.
                        SuccessAsync(rsp.Content !, () => vm?.Close());
                    });
                }
            }
            else
            {
                await MainThread2.InvokeOnMainThreadAsync(() =>
                {
                    vm?.Close();
                    conn_helper.ShowResponseErrorMessage(rsp);
                });
            }
        }
Esempio n. 4
0
        public void SetLightOrDarkThemeFollowingSystem(bool enable)
        {
            var major = Environment.OSVersion.Version.Major;

            if (major < 10 || (major == 10 && Environment.OSVersion.Version.Build < 18282))
            {
                return;
            }

            var currentUser = WindowsIdentity.GetCurrent()?.User;

            if (currentUser == null)
            {
                return;
            }

            try
            {
                if (enable)
                {
                    if (isLightOrDarkThemeWatch == null)
                    {
                        var queryStr_ = @"SELECT * FROM RegistryValueChangeEvent WHERE Hive = 'HKEY_USERS' AND KeyPath = '{0}\\{1}' AND ValueName = '{2}'";

                        var queryStr = string.Format(
                            queryStr_,
                            currentUser.Value,
                            Themes_Personalize.Replace(@"\", @"\\"),
                            AppsUseLightTheme);

                        isLightOrDarkThemeWatch = new ManagementEventWatcher(queryStr);
                        isLightOrDarkThemeWatch.EventArrived += (_, _) =>
                        {
                            var value = IsLightOrDarkTheme;
                            if (value.HasValue)
                            {
                                var app         = IApplication.Instance;
                                var theme_value = value.Value ? AppTheme.Light : AppTheme.Dark;
                                MainThread2.BeginInvokeOnMainThread(() =>
                                {
                                    IApplication.Instance.SetThemeNotChangeValue(theme_value);
                                });
                            }
                        };
                    }
                    isLightOrDarkThemeWatch.Start();
                }
                else
                {
                    if (isLightOrDarkThemeWatch == null)
                    {
                        return;
                    }
                    else
                    {
                        isLightOrDarkThemeWatch.Stop();
                    }
                }
            }
            catch
            {
            }
        }
Esempio n. 5
0
 protected override void BeginInvokeOnMainThread(Action action) => MainThread2.BeginInvokeOnMainThread(action);