using System.Diagnostics; using System.Reflection; using Avalonia.Controls; using MsBox.Avalonia; using MsBox.Avalonia.Enums; using Pilz; using Pilz.Extensions; using Pilz.Runtime; using Pilz.Updating.Client; namespace ModpackUpdater.Apps; public class AppUpdates(string appShortName, Window mainWindow) { public const string UpdateUrl = "https://git.pilzinsel64.de/LITW-Refined/minecraft-modpack-updater/raw/branch/updates/updates.json"; public event EventHandler? OnDownloadProgramUpdate; public bool UsePopups { get; set; } public async Task UpdateApp() { #if DISABLE_UPDATE await Task.CompletedTask; #else try { await UpdateAppCore(); } catch (Exception ex) { await MessageBoxManager.GetMessageBoxStandard(GeneralMsgBoxLangRes.UpdateAvailable_Title, string.Format(GeneralMsgBoxLangRes.UpdateAvailable, ex.Message), ButtonEnum.YesNo, MsBox.Avalonia.Enums.Icon.Info).ShowWindowAsync(); mainWindow.IsEnabled = true; } #endif } private async Task UpdateAppCore() { if (Debugger.IsAttached) return; var myAppPath = EnvironmentEx.ProcessPath!; var updater = new UpdateClient(UpdateUrl, Assembly.GetEntryAssembly()!.GetAppVersion(), AppChannel.Stable) { Distro = $"{appShortName}-{RuntimeInformationsEx.GetRuntimeIdentifier()}", }; if (await updater.CheckForUpdate() is not { } packageToInstall || await AskForUpdate() != ButtonResult.Yes) return; OnDownloadProgramUpdate?.Invoke(this, EventArgs.Empty); mainWindow.IsEnabled = false; if (await updater.DownloadPackageAsync(packageToInstall) && await updater.InstallPackageAsync(packageToInstall, myAppPath)) { mainWindow.IsVisible = false; await Process.Start(myAppPath).WaitForExitAsync(); Environment.Exit(0); return; } mainWindow.IsEnabled = true; } private Task AskForUpdate() { var msgBox = MessageBoxManager.GetMessageBoxStandard(GeneralMsgBoxLangRes.UpdateAvailable_Title, GeneralMsgBoxLangRes.UpdateAvailable, ButtonEnum.YesNo, Icon.Info); if (UsePopups) return msgBox.ShowAsPopupAsync(mainWindow); return msgBox.ShowWindowDialogAsync(mainWindow); } }