public async Task RunInstaller(string branch) { restore(); setStatus("Checking for updates"); echo("Checking build installation..."); string currentBranch = Program.GetString("BuildBranch", "roblox"); string currentVersion = versionRegistry.GetString("VersionGuid"); bool shouldInstall = (forceInstall || currentBranch != branch); string fastVersion = await GetFastVersionGuid(currentBranch); if (branch == "roblox") { buildVersion = fastVersion; } ClientVersionInfo versionInfo = null; if (shouldInstall || fastVersion != currentVersion) { if (currentBranch != "roblox") { echo("Possible update detected, verifying..."); } versionInfo = await GetCurrentVersionInfo(branch, fastVersion); buildVersion = versionInfo.Guid; } else { buildVersion = fastVersion; } if (currentVersion != buildVersion || shouldInstall) { echo("This build needs to be installed!"); bool studioClosed = await shutdownStudioProcesses(); if (studioClosed) { string binaryType = GetStudioBinaryType(); string studioDir = GetStudioDirectory(); string versionId = versionInfo.Version; restore(); setStatus($"Installing Version {versionId} of Roblox Studio..."); var taskQueue = new List <Task>(); echo("Grabbing package manifest..."); List <PackageManifest> pkgManifest = await PackageManifest.Get(branch, buildVersion); echo("Grabbing file manifest..."); fileManifest = await FileManifest.Get(branch, buildVersion); progressBar.Maximum = 1; progressBar.Value = 0; progressBar.Style = ProgressBarStyle.Continuous; progressBar.Refresh(); foreach (PackageManifest package in pkgManifest) { Task installer = Task.Run(() => installPackage(package)); taskQueue.Add(installer); } await Task.WhenAll(taskQueue.ToArray()); echo("Writing AppSettings.xml..."); string appSettings = Path.Combine(studioDir, "AppSettings.xml"); File.WriteAllText(appSettings, appSettingsXml); setStatus("Deleting unused files..."); await deleteUnusedFiles(); progressBar.Style = ProgressBarStyle.Marquee; progressBar.Refresh(); Program.SetValue("BuildBranch", branch); versionRegistry.SetValue("Version", versionId); versionRegistry.SetValue("VersionGuid", buildVersion); } else { progressBar.Style = ProgressBarStyle.Marquee; progressBar.Refresh(); echo("Update cancelled. Launching on current branch and version."); } } else { echo("This version of Roblox Studio has been installed!"); } setStatus("Configuring Roblox Studio..."); echo("Updating registry protocols..."); Program.UpdateStudioRegistryProtocols(); if (exitWhenClosed) { echo("Applying flag configuration..."); FlagEditor.ApplyFlags(); echo("Patching explorer icons..."); await ExplorerIconEditor.PatchExplorerIcons(); } setStatus("Starting Roblox Studio..."); echo("Roblox Studio is up to date!"); await Task.Delay(1000); }
public async Task RunInstaller(string branch, bool setStartEvent = false) { restore(); setStatus("检查更新中"); echo("检查该构建版本是否可安装..."); string currentBranch = Program.GetString("BuildBranch", "roblox"); string currentVersion = versionRegistry.GetString("VersionGuid"); bool shouldInstall = (forceInstall || currentBranch != branch); string fastVersion = await GetFastVersionGuid(currentBranch); ClientVersionInfo versionInfo = null; if (shouldInstall || fastVersion != currentVersion) { if (currentBranch != "roblox") { echo("发现已有更新,验证中..."); } versionInfo = await GetCurrentVersionInfo(branch, fastVersion); buildVersion = versionInfo.Guid; } else { buildVersion = fastVersion; } if (currentVersion != buildVersion || shouldInstall) { echo("此构建版本需要安装!"); bool studioClosed = await shutdownStudioProcesses(); if (studioClosed) { string binaryType = GetStudioBinaryType(); string studioDir = GetStudioDirectory(); string versionId = versionInfo.Version; restore(); setStatus($"正在安装版本为 {versionId} 的 Roblox Studio..."); var taskQueue = new List <Task>(); writtenFiles = new HashSet <string>(); echo("正在获取版本元信息..."); var pkgManifest = await PackageManifest.Get(branch, buildVersion); echo("正在获取文件元信息..."); fileManifest = await FileManifest.Get(branch, buildVersion); progressBar.Maximum = 5000; progressBar.Value = 0; progressBar.Style = ProgressBarStyle.Continuous; progressBar.Refresh(); foreach (var package in pkgManifest) { Task installer = Task.Run(() => installPackage(branch, package)); taskQueue.Add(installer); } await Task.WhenAll(taskQueue); echo("正在写入 AppSettings.xml..."); string appSettings = Path.Combine(studioDir, "AppSettings.xml"); File.WriteAllText(appSettings, appSettingsXml); setStatus("正在搜索未使用的文件..."); await deleteUnusedFiles(); progressBar.Style = ProgressBarStyle.Marquee; progressBar.Refresh(); Program.SetValue("BuildBranch", branch); versionRegistry.SetValue("Version", versionId); versionRegistry.SetValue("VersionGuid", buildVersion); } else { progressBar.Style = ProgressBarStyle.Marquee; progressBar.Refresh(); echo("更新已取消,正在启动当前已有分支版本..."); } } else { echo("该版本安装成功!"); } setStatus("正在配置 Roblox Studio..."); echo("正在更新注册表..."); Program.UpdateStudioRegistryProtocols(); if (exitWhenClosed) { echo("应用参数配置中..."); FlagEditor.ApplyFlags(); echo("修改浏览窗口图标中..."); await ClassIconEditor.PatchExplorerIcons(); } setStatus("正在启动 Roblox Studio..."); echo("Roblox Studio 已为最新版!"); if (setStartEvent) { SystemEvent start = new SystemEvent("RobloxStudioModManagerStart"); autoExitTask = Task.Run(async() => { bool started = await start.WaitForEvent(); start.Close(); if (started) { await Task.Delay(500); Application.Exit(); } }); StartEvent = start; } }