From 0f60226522a28ff580ef72b8f684794de95c660e Mon Sep 17 00:00:00 2001 From: zzyyyl Date: Sun, 30 Oct 2022 00:31:19 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=20OTA=20?= =?UTF-8?q?=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MeoAsstGui/Helper/ViewStatusStorage.cs | 26 +-- .../ViewModels/VersionUpdateViewModel.cs | 155 ++++++++---------- 2 files changed, 78 insertions(+), 103 deletions(-) diff --git a/src/MeoAsstGui/Helper/ViewStatusStorage.cs b/src/MeoAsstGui/Helper/ViewStatusStorage.cs index a08205554d..0e29e16f97 100644 --- a/src/MeoAsstGui/Helper/ViewStatusStorage.cs +++ b/src/MeoAsstGui/Helper/ViewStatusStorage.cs @@ -71,25 +71,25 @@ namespace MeoAsstGui if (jsonStr.Length <= 2 && File.Exists(_configBakFilename)) { - File.Copy(_configBakFilename, _configFilename, true); - jsonStr = File.ReadAllText(_configFilename); + jsonStr = File.ReadAllText(_configBakFilename); + try + { + File.Copy(_configBakFilename, _configFilename, true); + } + catch (Exception e) + { + File.AppendAllText("gui.err.log", DateTime.Now.ToString() + ' ' + e.ToString() + '\n'); + } } // 文件存在但为空,会读出来一个null,感觉c#这库有bug,如果是null 就赋值一个空JObject _viewStatus = (JObject)JsonConvert.DeserializeObject(jsonStr) ?? new JObject(); } - catch (Exception) + catch (Exception e) { - if (withRestore && File.Exists(_configBakFilename)) - { - File.Copy(_configBakFilename, _configFilename, true); - return Load(false); - } - else - { - _viewStatus = new JObject(); - return false; - } + File.AppendAllText("gui.err.log", DateTime.Now.ToString() + ' ' + e.ToString() + '\n'); + _viewStatus = new JObject(); + return false; } } else diff --git a/src/MeoAsstGui/ViewModels/VersionUpdateViewModel.cs b/src/MeoAsstGui/ViewModels/VersionUpdateViewModel.cs index 2a9f925ab1..8d66ddb2eb 100644 --- a/src/MeoAsstGui/ViewModels/VersionUpdateViewModel.cs +++ b/src/MeoAsstGui/ViewModels/VersionUpdateViewModel.cs @@ -21,6 +21,7 @@ using System.Runtime.InteropServices; using System.Text; using System.Text.RegularExpressions; using System.Windows; +using MeoAsstGui.Views; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Stylet; @@ -164,7 +165,8 @@ namespace MeoAsstGui } } - private const string RequestUrl = "https://api.github.com/repos/MaaAssistantArknights/MaaAssistantArknights/releases"; + private const string RequestUrl = "https://api.github.com/repos/MaaAssistantArknights/MaaRelease/releases"; + private const string InfoRequestUrl = "https://api.github.com/repos/MaaAssistantArknights/MaaAssistantArknights/releases/tags/"; private const string RequestUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 Edg/97.0.1072.76"; private JObject _latestJson; private JObject _assetsObject; @@ -192,7 +194,9 @@ namespace MeoAsstGui } }); - string extractDir = Directory.GetCurrentDirectory() + "\\NewVersionExtract"; + string curDir = Directory.GetCurrentDirectory(); + string extractDir = Path.Combine(curDir, "NewVersionExtract"); + string oldFileDir = Path.Combine(curDir, ".old"); // 解压 try @@ -219,76 +223,65 @@ namespace MeoAsstGui return false; } - // TODO: 等 CI 加了文件列表,到时候按照文件列表来,不在列表里的都删了 + string removeListFile = Path.Combine(extractDir, "removelist.txt"); + if (File.Exists(removeListFile)) { - string resourceDir = Directory.GetCurrentDirectory() + "\\resource"; - string oldResourceDir = Directory.GetCurrentDirectory() + "\\resource.old"; - if (Directory.Exists(resourceDir)) + string[] removeList = File.ReadAllLines(removeListFile); + foreach (string file in removeList) { - CopyFilesRecursively(resourceDir, oldResourceDir); - Directory.Delete(resourceDir, true); - } - - var paddleResourcePaths = new[] - { - "\\PaddleOCR", - "\\PaddleCharOCR", - "\\global\\txwy\\resource\\PaddleOCR", - "\\global\\YoStarEN\\resource\\PaddleOCR", - "\\global\\YoStarJP\\resource\\PaddleOCR", - "\\global\\YoStarKR\\resource\\PaddleOCR", - }; - - foreach (var path in paddleResourcePaths) - { - string paddleDir = resourceDir + path; - string oldPaddleDir = oldResourceDir + path; - if (Directory.Exists(oldPaddleDir)) + string path = Path.Combine(curDir, file); + if (File.Exists(path)) { - CopyFilesRecursively(oldPaddleDir, paddleDir); + string moveTo = Path.Combine(oldFileDir, file); + if (File.Exists(moveTo)) + { + File.Delete(moveTo); + } + else + { + Directory.CreateDirectory(Path.GetDirectoryName(moveTo)); + } + + File.Move(path, moveTo); } } } - var uncopiedList = new List(); + foreach (var dir in Directory.GetDirectories(extractDir, "*", SearchOption.AllDirectories)) + { + Directory.CreateDirectory(dir.Replace(extractDir, curDir)); + Directory.CreateDirectory(dir.Replace(extractDir, oldFileDir)); + } // 复制新版本的所有文件到当前路径下 - foreach (var file in Directory.GetFiles(extractDir)) + foreach (var file in Directory.GetFiles(extractDir, "*", SearchOption.AllDirectories)) { - if (file.Contains("paddle_inference.dll") || file.Contains("ppocr.dll")) + var fileName = Path.GetFileName(file); + if (fileName == "removelist.txt" || fileName == "md5sum.txt") { continue; } - try + string curFileName = file.Replace(extractDir, curDir); + if (File.Exists(curFileName)) { - File.Copy(file, Path.Combine(Directory.GetCurrentDirectory(), Path.GetFileName(file)), true); - } - catch (Exception) - { - uncopiedList.Add(file); + string moveTo = file.Replace(extractDir, oldFileDir); + if (File.Exists(moveTo)) + { + File.Delete(moveTo); + } + + File.Move(curFileName, moveTo); } + + File.Move(file, curFileName); } - foreach (var directory in Directory.GetDirectories(extractDir)) - { - CopyFilesRecursively(directory, Path.Combine(Directory.GetCurrentDirectory(), Path.GetFileName(directory))); - } - - // 程序正在运行中,部分文件是无法覆写的,这里曲线操作下 - // 先将当前这些文件重命名,然后再把新的复制过来 - foreach (var oldFile in Directory.GetFiles(Directory.GetCurrentDirectory(), "*.old")) + foreach (var oldFile in Directory.GetFiles(curDir, "*.old")) { File.Delete(oldFile); } - foreach (var file in uncopiedList) - { - string curFileName = Path.Combine(Directory.GetCurrentDirectory(), Path.GetFileName(file)); - File.Move(curFileName, curFileName + ".old"); - File.Copy(file, curFileName); - } - // 操作完了,把解压的文件删了 Directory.Delete(extractDir, true); File.Delete(UpdatePackageName); @@ -491,57 +484,39 @@ namespace MeoAsstGui var releaseAssets = _latestJson["assets"] as JArray; _assetsObject = null; - try - { - TimeSpan timeSpan = TimeSpan.FromDays(114); - foreach (var item in releaseArray) - { - if (item["tag_name"].ToString() == _curVersion) - { - timeSpan = DateTime.Parse(_latestJson["published_at"].ToString()) - - DateTime.Parse(item["published_at"].ToString()); - break; - } - } - // 14天内的版本更新先尝试下OTA - if (timeSpan < TimeSpan.FromDays(14)) - { - foreach (var curAssets in releaseAssets) - { - string name = curAssets["name"].ToString().ToLower(); - if (name.Contains("ota") && name.Contains("win")) - { - _assetsObject = curAssets as JObject; - break; - } - } - - if (_assetsObject != null) - { - return true; - } - } - } - catch (Exception e) + var infoRequestUrl = InfoRequestUrl + _latestVersion; + var infoResponse = RequestApi(infoRequestUrl); + for (int i = 0; infoResponse.Length == 0 && i < RequestRetryMaxTimes; i++) { - File.AppendAllText("gui.err.log", DateTime.Now.ToString() + " CheckUpdate | " + e.ToString() + Environment.NewLine); + infoResponse = RequestApi(infoRequestUrl); } - // 其它情况直接下载完整包 - long maxSize = 0; + if (infoResponse.Length == 0) + { + return false; + } + + _latestJson = JsonConvert.DeserializeObject(infoResponse) as JObject; + foreach (var curAssets in releaseAssets) { - var name = curAssets["name"].ToString().ToLower(); - long curSize = (long)curAssets["size"]; - if (curSize > maxSize && !name.Contains("debug") && name.Contains("win")) + string name = curAssets["name"].ToString().ToLower(); + if (name.Contains("ota") && name.Contains("win") && name.Contains($"{_curVersion}_{_latestVersion}")) { - maxSize = curSize; _assetsObject = curAssets as JObject; + break; } } - return _assetsObject != null; + if (_assetsObject != null) + { + return true; + } + + var errorView = new ErrorView("Download Failed", "It was not possible to find a suitable OTA file to download.", false); + errorView.ShowDialog(); + return false; } catch (Exception e) { From b64933750c38897016375af3dc14aff388a4e8ee Mon Sep 17 00:00:00 2001 From: MistEO Date: Sun, 30 Oct 2022 00:33:30 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=90=8E=E4=BF=9D=E5=AD=98gui.json=E6=97=B6=E5=86=B2=E7=AA=81?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MeoAsstGui/Bootstrapper.cs | 2 +- src/MeoAsstGui/Helper/ViewStatusStorage.cs | 13 +++++++++++++ src/MeoAsstGui/ViewModels/VersionUpdateViewModel.cs | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/MeoAsstGui/Bootstrapper.cs b/src/MeoAsstGui/Bootstrapper.cs index cd932796c8..8b9f93dd1a 100644 --- a/src/MeoAsstGui/Bootstrapper.cs +++ b/src/MeoAsstGui/Bootstrapper.cs @@ -142,7 +142,7 @@ namespace MeoAsstGui // 注销任务栏图标 _trayIconInSettingsViewModel.Close(); - ViewStatusStorage.Save(); + ViewStatusStorage.Release(); } /// diff --git a/src/MeoAsstGui/Helper/ViewStatusStorage.cs b/src/MeoAsstGui/Helper/ViewStatusStorage.cs index 0e29e16f97..bc36b2e2a5 100644 --- a/src/MeoAsstGui/Helper/ViewStatusStorage.cs +++ b/src/MeoAsstGui/Helper/ViewStatusStorage.cs @@ -128,6 +128,11 @@ namespace MeoAsstGui /// Whether the operation is successful. public static bool Save() { + if (_released) + { + return false; + } + try { var jsonStr = _viewStatus.ToString(); @@ -152,6 +157,14 @@ namespace MeoAsstGui return true; } + private static bool _released = false; + + public static void Release() + { + Save(); + _released = true; + } + /// /// Backs up configuration daily. (#2145) /// diff --git a/src/MeoAsstGui/ViewModels/VersionUpdateViewModel.cs b/src/MeoAsstGui/ViewModels/VersionUpdateViewModel.cs index 8d66ddb2eb..fe965a7727 100644 --- a/src/MeoAsstGui/ViewModels/VersionUpdateViewModel.cs +++ b/src/MeoAsstGui/ViewModels/VersionUpdateViewModel.cs @@ -288,7 +288,7 @@ namespace MeoAsstGui // 保存更新信息,下次启动后会弹出已更新完成的提示 UpdatePackageName = string.Empty; - ViewStatusStorage.Save(); + ViewStatusStorage.Release(); // 重启进程(启动的是更新后的程序了) var newProcess = new Process();