Files
MRCC/launcher/PCL-CE/Plain Craft Launcher 2/Modules/Updates/UpdatesMirrorChyanModel.cs
T
xyou f70b061d1a
CI / Go Backend (push) Canceled after 0s
feat: 项目初始化 + 3D方块世界原型 + AI助搭系统
初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器

HTML5原型: Three.js 3D体素世界, Perlin噪声地形, 原版材质, 22种方块

Minecraft创造模式背包: 双栏布局, 拖拽移动物品, 方向性元件引脚

AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
2026-08-08 14:07:56 +08:00

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;
}
}