XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

HaloPixelToolBox

【WinUI3】基于USB HID通讯的花再音响工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using HaloPixelToolBox.Client.Profiles.CacheProfiles;
using HaloPixelToolBox.Client.Profiles.CrossVersionProfiles;
using HaloPixelToolBox.Core.Models.Bar;
using HaloPixelToolBox.Core.Utilities;
using System.Net;

namespace HaloPixelToolBox.Client.Utilities;

/// <summary>
/// 从服务器获取地址解析配置,并在网络不可用时回退到本地缓存。
/// </summary>
public static class AddressResolverProvider
{
    public static void LoadCachedResolvers()
    {
        foreach (var pair in CacheProfile.VersionAddress)
        {
            var model = Clone(pair.Value, pair.Key);
            CloudMusicLyricsReader.SetAddressResolver(model);
        }
    }

    public static async Task<AddressResolverModel?> GetAsync(string version)
    {
        if (string.IsNullOrWhiteSpace(version))
            return null;

        var cached = CacheProfile.VersionAddress.TryGetValue(version, out var cachedModel)
            ? Clone(cachedModel, version)
            : null;

        try
        {
            var connected = await DataManager.InitializeAsync([SystemProfile.ServerAddress]);
            if (!connected)
            {
                Console.WriteLine($"[WARN]解析地址服务器不可用,尝试使用版本 {version} 的本地缓存");
                return cached;
            }

            var response = await DataManager.ClientRequester.Request<AddressResolverModel>("getAddress", version);
            if (response.StatusCode != HttpStatusCode.OK || response.Result is null)
                return cached;

            var model = Clone(response.Result, version);
            if (!IsValid(model))
                return cached;

            CacheProfile.VersionAddress[version] = model;
            CloudMusicLyricsReader.SetAddressResolver(model);
            Console.WriteLine($"[INFO]已从服务器更新网易云音乐 {version} 的解析地址并写入缓存");
            return model;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"[WARN]获取版本 {version} 的解析地址失败,使用本地缓存:{ex.Message}");
            return cached;
        }
    }

    private static bool IsValid(AddressResolverModel model) =>
        !string.IsNullOrWhiteSpace(model.Version) &&
        !string.IsNullOrWhiteSpace(model.ModuleName) &&
        model.BaseAddress > 0 &&
        model.Offsets.Length > 0;

    private static AddressResolverModel Clone(AddressResolverModel model, string version) => new()
    {
        Version = version,
        ModuleName = model.ModuleName,
        BaseAddress = model.BaseAddress,
        Offsets = [.. model.Offsets]
    };
}