CI / Go Backend (push) Canceled after 0s
初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器 HTML5原型: Three.js 3D体素世界, Perlin噪声地形, 原版材质, 22种方块 Minecraft创造模式背包: 双栏布局, 拖拽移动物品, 方向性元件引脚 AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
90 lines
3.2 KiB
C#
90 lines
3.2 KiB
C#
using System.Net.Http;
|
|
using PCL.Core.App;
|
|
using PCL.Core.App.Localization;
|
|
using PCL.Core.Utils;
|
|
using PCL.Network;
|
|
using PCL.Network.Loaders;
|
|
using PCL.Core.IO.Net.Http;
|
|
|
|
namespace PCL;
|
|
|
|
public class UpdatesMirrorChyanModel : IUpdateSource // Mirror 酱的更新格式
|
|
{
|
|
private const string mirrorChyanBaseUrl =
|
|
"https://mirrorchyan.com/api/resources/{cid}/latest?cdk={cdk}&os=win&arch={arch}&channel={channel}";
|
|
|
|
private const string myCid = "PCL2-CE";
|
|
public string SourceName { get; set; } = "MirrorChyan";
|
|
|
|
public bool IsAvailable()
|
|
{
|
|
return !string.IsNullOrWhiteSpace(Config.Update.MirrorChyanKey);
|
|
}
|
|
|
|
public VersionDataModel GetLatestVersion(UpdateChannel channel, UpdateArch arch)
|
|
{
|
|
using (var response = HttpRequest.Create(GetUrl(channel, arch))
|
|
.SendAsync()
|
|
.GetAwaiter()
|
|
.GetResult())
|
|
{
|
|
var ret = (JsonObject)ModBase.GetJson(response.AsString());
|
|
if ((int)ret["code"] != 0)
|
|
throw new Exception("Mirror 酱获取数据不成功");
|
|
var data = ret["data"];
|
|
var upd_url = data["url"]?.ToString();
|
|
if (data is not null && string.IsNullOrWhiteSpace(upd_url))
|
|
throw new Exception("无效 CDK");
|
|
return new VersionDataModel
|
|
{
|
|
Source = SourceName,
|
|
VersionCode = (int)data["version_number"],
|
|
VersionName = (string)data["version_name"],
|
|
Sha256 = (string)data["sha256"],
|
|
Changelog = (string)data["release_note"]
|
|
};
|
|
}
|
|
}
|
|
|
|
public bool RefreshCache()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public bool IsLatest(UpdateChannel channel, UpdateArch arch, SemVer currentVersion, int currentVersionCode)
|
|
{
|
|
var latest = GetLatestVersion(channel, arch);
|
|
return currentVersion >= SemVer.Parse(latest.VersionName);
|
|
}
|
|
|
|
public VersionAnnouncementDataModel GetAnnouncementList()
|
|
{
|
|
throw new Exception("Mirror 酱无公告系统");
|
|
}
|
|
|
|
public List<ModLoader.LoaderBase> GetDownloadLoader(UpdateChannel channel, UpdateArch arch, string output)
|
|
{
|
|
var loaders = new List<ModLoader.LoaderBase>();
|
|
loaders.Add(new ModLoader.LoaderTask<int, List<DownloadFile>>(Lang.Text("Update.Task.GetDownloadInfo"), load =>
|
|
{
|
|
var ret = (JsonObject)Requester.FetchJson(GetUrl(channel, arch), RequestParam.WithRetry);
|
|
var dlUrl = ret["data"]["url"]?.ToString();
|
|
if (dlUrl is null)
|
|
throw new Exception("Mirror 酱下载源不可用");
|
|
load.output = new List<DownloadFile> { new(new[] { dlUrl }, output) };
|
|
}));
|
|
loaders.Add(new LoaderDownload(Lang.Text("Update.Task.DownloadUpdateFile"), new List<DownloadFile>()));
|
|
return loaders;
|
|
}
|
|
|
|
private string GetUrl(UpdateChannel channel, UpdateArch arch)
|
|
{
|
|
var reqUrl = mirrorChyanBaseUrl;
|
|
reqUrl = reqUrl.Replace("{cid}", myCid);
|
|
reqUrl = reqUrl.Replace("{cdk}", Config.Update.MirrorChyanKey);
|
|
reqUrl = reqUrl.Replace("{arch}", arch.ToString());
|
|
reqUrl = reqUrl.Replace("{channel}", channel.ToString());
|
|
return reqUrl;
|
|
}
|
|
}
|