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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Diagnostics;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using XFEEDToolBox.Core.Plugins;
namespace XFEEDToolBox.ViewModels;

public partial class ToolboxViewModel
{
    private readonly ChineseTranslationManager chinese=new();
    [ObservableProperty] public partial string TranslationGameExecutable { get; set; } = "";
    [ObservableProperty] public partial string TranslationSourceDirectory { get; set; } = "";
    [ObservableProperty] public partial string TranslationStatusText { get; set; } = "检测本机简体中文组件。";
    [ObservableProperty] public partial bool TranslationBusy { get; set; }
    private string TranslationResourceStore=>Path.Combine(runtime.DataDirectory,"translation-resources");
    private void InitializeTranslationSettings()
    {
        TranslationGameExecutable=runtime.Settings.TranslationGameExecutable.Length>0?runtime.Settings.TranslationGameExecutable:PluginGameExecutable;
        TranslationSourceDirectory=runtime.Settings.TranslationSourceDirectory;
        var imported=Path.Combine(TranslationResourceStore,TranslationBundle.Reference.GameSha256);
        if(Directory.Exists(imported))TranslationSourceDirectory=imported;
        if(TranslationSourceDirectory.Length==0 && TranslationGameExecutable.Length>0 && File.Exists(Path.Combine(Path.GetDirectoryName(TranslationGameExecutable)!,"edchs.pkg")))TranslationSourceDirectory=Path.GetDirectoryName(TranslationGameExecutable)!;
    }
    private bool TranslationGameRunning()
    {
        var games=Process.GetProcessesByName("EliteDangerous64");
        try{return games.Any(p=>string.Equals(p.MainModule?.FileName,TranslationGameExecutable,StringComparison.OrdinalIgnoreCase));}
        finally{foreach(var game in games)game.Dispose();}
    }
    [RelayCommand] private async Task ReadTranslationAsync(CancellationToken cancellationToken=default)
    {
        using var stop=CancellationTokenSource.CreateLinkedTokenSource(lifetime.Token,cancellationToken);var token=stop.Token;
        try{TranslationStatusText=TranslationGameExecutable.Length==0?"请选择游戏主程序。":(await chinese.InspectAsync(TranslationGameExecutable,token)).Message;}
        catch(OperationCanceledException){TranslationStatusText="状态检查已取消。";}
        catch(Exception e){TranslationStatusText=e.Message;}
    }
    [RelayCommand] private async Task InstallTranslationAsync(CancellationToken cancellationToken=default)
    {
        using var stop=CancellationTokenSource.CreateLinkedTokenSource(lifetime.Token,cancellationToken);var token=stop.Token;
        if(TranslationBusy)return;TranslationBusy=true;
        try
        {
            if(TranslationGameRunning())throw new InvalidOperationException("请在游戏退出后安装汉化。当前游戏不会被关闭。");
            TranslationSourceDirectory=await chinese.ImportBundleAsync(TranslationSourceDirectory,TranslationResourceStore,token);
            TranslationStatusText=(await chinese.InstallAsync(TranslationGameExecutable,TranslationSourceDirectory,token)).Message;
            await runtime.SaveSettingsAsync(runtime.Settings with{TranslationGameExecutable=TranslationGameExecutable,TranslationSourceDirectory=TranslationSourceDirectory});runtime.Log("汉化",TranslationStatusText);
        }
        catch(OperationCanceledException){TranslationStatusText="汉化安装已取消;已完成的步骤保留。";}
        catch(Exception e){TranslationStatusText=e.Message;}finally{TranslationBusy=false;}
    }
    [RelayCommand] private async Task UninstallTranslationAsync(CancellationToken cancellationToken=default)
    {
        using var stop=CancellationTokenSource.CreateLinkedTokenSource(lifetime.Token,cancellationToken);var token=stop.Token;
        if(TranslationBusy)return;TranslationBusy=true;
        try
        {
            if(TranslationGameRunning())throw new InvalidOperationException("请在游戏退出后还原汉化。当前游戏不会被关闭。");
            TranslationStatusText=(await chinese.UninstallAsync(TranslationGameExecutable,token)).Message;runtime.Log("汉化",TranslationStatusText);
        }
        catch(OperationCanceledException){TranslationStatusText="汉化还原已取消;已完成的步骤保留。";}
        catch(Exception e){TranslationStatusText=e.Message;}finally{TranslationBusy=false;}
    }
    [RelayCommand] private async Task ChooseTranslationGameAsync()
    {
        var picker=new Windows.Storage.Pickers.FileOpenPicker();picker.FileTypeFilter.Add(".exe");InitializePicker(picker);
        if(await picker.PickSingleFileAsync() is {} file){TranslationGameExecutable=file.Path;await ReadTranslationAsync();}
    }
    [RelayCommand] private async Task ChooseTranslationSourceAsync()
    {
        var picker=new Windows.Storage.Pickers.FolderPicker();picker.FileTypeFilter.Add("*");InitializePicker(picker);
        if(await picker.PickSingleFolderAsync() is {} folder)
        {
            TranslationBusy=true;
            try
            {
                TranslationSourceDirectory=await chinese.ImportBundleAsync(folder.Path,TranslationResourceStore,lifetime.Token);
                await runtime.SaveSettingsAsync(runtime.Settings with{TranslationSourceDirectory=TranslationSourceDirectory});
                TranslationStatusText="简体中文资源已导入本机资源库,可以独立安装。";
            }
            catch(Exception e){TranslationStatusText=e.Message;}
            finally{TranslationBusy=false;}
        }
    }
}