diff --git a/src/MeoAsstGui/ViewModels/VersionUpdateViewModel.cs b/src/MeoAsstGui/ViewModels/VersionUpdateViewModel.cs index b688af5cf1..d4d3321d62 100644 --- a/src/MeoAsstGui/ViewModels/VersionUpdateViewModel.cs +++ b/src/MeoAsstGui/ViewModels/VersionUpdateViewModel.cs @@ -166,6 +166,8 @@ namespace MeoAsstGui } private const string RequestUrl = "https://api.github.com/repos/MaaAssistantArknights/MaaRelease/releases"; + private const string StableRequestUrl = "https://api.github.com/repos/MaaAssistantArknights/MaaAssistantArknights/releases/latest"; + private const string MaaReleaseRequestUrlByTag = "https://api.github.com/repos/MaaAssistantArknights/MaaRelease/releases/tags/"; 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; @@ -420,42 +422,56 @@ namespace MeoAsstGui } // 开发版不检查更新 - if (!settings.UpdateNightly && !force && !isStableVersion()) + if (!(settings.UpdateNightly && isCVersion()) && !force && !isStableVersion()) { return false; } const int RequestRetryMaxTimes = 5; - var response = RequestApi(RequestUrl); - for (int i = 0; response.Length == 0 && i < RequestRetryMaxTimes; i++) - { - response = RequestApi(RequestUrl); - } - - if (response.Length == 0) - { - return false; - } - try { - var releaseArray = JsonConvert.DeserializeObject(response) as JArray; - - _latestJson = null; - foreach (var item in releaseArray) + if (!settings.UpdateBeta && !settings.UpdateNightly) { - if (!settings.UpdateNightly && isStableVersion(item["tag_name"].ToString())) + // 稳定版更新使用主仓库 /latest 接口 + // 直接使用 MaaRelease 的话,我怕默认的 30 个都找不到稳定版,因为有可能 Nightly 发了很多 + var stableResponse = RequestApi(StableRequestUrl, RequestRetryMaxTimes); + if (stableResponse.Length == 0) { - continue; + return false; } - if (!settings.UpdateNightly && !settings.UpdateBeta && (bool)item["prerelease"]) + _latestJson = JsonConvert.DeserializeObject(stableResponse) as JObject; + _latestVersion = _latestJson["tag_name"].ToString(); + stableResponse = RequestApi(MaaReleaseRequestUrlByTag + _latestVersion, RequestRetryMaxTimes); + if (stableResponse.Length == 0) { - continue; + return false; } - _latestJson = item as JObject; - break; + _latestJson = JsonConvert.DeserializeObject(stableResponse) as JObject; + } + else + { + // 非稳定版更新使用 MaaRelease/releases 接口 + var response = RequestApi(RequestUrl, RequestRetryMaxTimes); + if (response.Length == 0) + { + return false; + } + + var releaseArray = JsonConvert.DeserializeObject(response) as JArray; + + _latestJson = null; + foreach (var item in releaseArray) + { + if (!settings.UpdateNightly && isStableVersion(item["tag_name"].ToString())) + { + continue; + } + + _latestJson = item as JObject; + break; + } } if (_latestJson == null) @@ -464,6 +480,7 @@ namespace MeoAsstGui } _latestVersion = _latestJson["tag_name"].ToString(); + var releaseAssets = _latestJson["assets"] as JArray; if (ViewStatusStorage.Get("VersionUpdate.Ignore", string.Empty) == _latestVersion) { return false; @@ -493,28 +510,19 @@ namespace MeoAsstGui } } - if (!_latestJson.ContainsKey("assets") || (_latestJson["assets"] as JArray).Count == 0) + // 非稳定版本只能是Nightly下载的,这玩意主仓库没有,就不必再次请求主仓库的信息了 + if (isStableVersion(_latestVersion)) { - return false; + var infoResponse = RequestApi(InfoRequestUrl + _latestVersion, RequestRetryMaxTimes); + if (infoResponse.Length == 0) + { + return false; + } + + _latestJson = JsonConvert.DeserializeObject(infoResponse) as JObject; } - var releaseAssets = _latestJson["assets"] as JArray; _assetsObject = null; - - var infoRequestUrl = InfoRequestUrl + _latestVersion; - var infoResponse = RequestApi(infoRequestUrl); - for (int i = 0; infoResponse.Length == 0 && i < RequestRetryMaxTimes; i++) - { - infoResponse = RequestApi(infoRequestUrl); - } - - if (infoResponse.Length == 0) - { - return false; - } - - _latestJson = JsonConvert.DeserializeObject(infoResponse) as JObject; - foreach (var curAssets in releaseAssets) { string name = curAssets["name"].ToString().ToLower(); @@ -581,6 +589,17 @@ namespace MeoAsstGui } } + private string RequestApi(string url, int retryTimes) + { + string response; + do + { + response = RequestApi(url); + } + while (response.Length == 0 && retryTimes-- > 0); + return response; + } + /// /// 获取 GitHub Assets 对象对应的文件 /// @@ -714,6 +733,16 @@ namespace MeoAsstGui return true; } + private bool isCVersion(string version = null) + { + if (version == null) + { + version = _curVersion; + } + + return version.StartsWith("c"); + } + private bool isStableVersion(string version = null) { // 正式版:vX.X.X