using System; using System.Diagnostics; using System.Threading.Tasks; using Avalonia.Controls.ApplicationLifetimes; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Elfisa.Core; namespace Elfisa.Avalonia.ViewModels; /// Окно «Доступно обновление»: скачивает установщик и запускает его. public partial class UpdateViewModel : ViewModelBase { private readonly UpdateInfo _info; private readonly Action _close; public UpdateViewModel(UpdateInfo info, Action close) { _info = info; _close = close; } public string Message => $"Установлена версия {_info.CurrentVersion}.\nДоступна новая версия {_info.LatestVersion}."; [ObservableProperty] private bool _busy; [ObservableProperty] private double _progress; [ObservableProperty] private string _status = ""; [RelayCommand] private void Later() => _close(); [RelayCommand] private async Task UpdateAsync() { // Не-Windows: установщика нет — открываем страницу релиза в браузере. if (!OperatingSystem.IsWindows()) { OpenUrl(string.IsNullOrWhiteSpace(_info.ReleaseUrl) ? "https://cdn.24pharmdata.ru" : _info.ReleaseUrl); _close(); return; } try { Busy = true; Status = "Скачивание обновления…"; var progress = new Progress(p => { Progress = p; Status = $"Скачивание обновления… {p:0}%"; }); var setupPath = await UpdateService.DownloadSetupAsync(progress); Status = "Запуск установки…"; LaunchInstallerAndExit(setupPath); } catch (Exception ex) { Busy = false; Status = "Не удалось обновить: " + ex.Message; } } /// Тихая установка поверх + перезапуск приложения, затем закрываем себя. private void LaunchInstallerAndExit(string setupPath) { var exe = Process.GetCurrentProcess().MainModule?.FileName; var inner = $"\"{setupPath}\" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART"; if (!string.IsNullOrEmpty(exe)) inner += $" && start \"\" \"{exe}\""; Process.Start(new ProcessStartInfo("cmd.exe") { Arguments = "/c \"" + inner + "\"", UseShellExecute = false, CreateNoWindow = true, }); // Закрываем приложение, чтобы установщик заменил файлы (CloseApplications=yes). if (global::Avalonia.Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime d) d.Shutdown(); else Environment.Exit(0); } private static void OpenUrl(string url) { try { Process.Start(new ProcessStartInfo(url) { UseShellExecute = true }); } catch { /* игнорируем */ } } }