diff --git a/Installer/Files/config.ini b/Installer/Files/config.ini index e66b0a9..05280d2 100644 --- a/Installer/Files/config.ini +++ b/Installer/Files/config.ini @@ -1,3 +1,7 @@ [plc] port = COM1 + +[update] +url = https://elwig.at/files/pamhagen-sysctrl/?format=json +auto = true diff --git a/PamhagenSysCtrl/App.xaml.cs b/PamhagenSysCtrl/App.xaml.cs index 48041b3..5e64ed2 100644 --- a/PamhagenSysCtrl/App.xaml.cs +++ b/PamhagenSysCtrl/App.xaml.cs @@ -1,3 +1,4 @@ +using PamhagenSysCtrl.Dialogs; using PamhagenSysCtrl.Helpers; using System.IO; using System.Reflection; @@ -10,6 +11,9 @@ namespace PamhagenSysCtrl { public static PamhagenPlant? Plant; public static Dispatcher? MainDispatcher; + private readonly DispatcherTimer AutoUpdateTimer = new() { Interval = TimeSpan.FromHours(1) }; + private bool IsCheckingForUpdates; + public static readonly string DataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Anlagensteuerung Pamhagen"); public static readonly string ConfigPath = Path.Combine(DataPath, "config.ini"); public static readonly string InstallPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "Anlagensteuerung Pamhagen"); @@ -45,6 +49,71 @@ namespace PamhagenSysCtrl { } base.OnStartup(evt); + + if (Config.UpdateAuto && Config.UpdateUrl != null) { + AutoUpdateTimer.Tick += async (_, _) => await CheckForUpdates(); + AutoUpdateTimer.Start(); + _ = Dispatcher.BeginInvoke(async () => { + await Task.Delay(1500); + await CheckForUpdates(); + }); + } + } + + public async Task CheckForUpdates(bool showResult = false) { + if (IsCheckingForUpdates) { + if (showResult) { + MessageBox.Show("Es wird bereits nach Updates gesucht.", "Nach Updates suchen", MessageBoxButton.OK, MessageBoxImage.Information); + } + return; + } + if (Config.UpdateUrl == null) { + if (showResult) { + MessageBox.Show("Die automatische Update-Suche ist deaktiviert.", "Nach Updates suchen", MessageBoxButton.OK, MessageBoxImage.Information); + } + return; + } + + IsCheckingForUpdates = true; + try { + using var timeout = new CancellationTokenSource(TimeSpan.FromSeconds(15)); + var latest = await UpdateService.GetLatestInstallerAsync(Config.UpdateUrl, timeout.Token); + if (latest.Version > Version) { + var dialog = new UpdateDialog(latest) { + Owner = MainWindow, + }; + if (dialog.ShowDialog() == true) { + Shutdown(); + } + } else if (showResult) { + MessageBox.Show( + $"Die Anlagensteuerung ist auf dem aktuellen Stand. (Version {Version})", + "Nach Updates suchen", + MessageBoxButton.OK, + MessageBoxImage.Information + ); + } + } catch (OperationCanceledException) { + if (showResult) { + MessageBox.Show( + "Zeitüberschreitung beim Abrufen der Update-Informationen.", + "Nach Updates suchen", + MessageBoxButton.OK, + MessageBoxImage.Error + ); + } + } catch (Exception exc) { + if (showResult) { + MessageBox.Show( + $"Die Update-Informationen konnten nicht abgerufen werden:\n\n{exc.Message}", + "Nach Updates suchen", + MessageBoxButton.OK, + MessageBoxImage.Error + ); + } + } finally { + IsCheckingForUpdates = false; + } } protected async void Application_Exit(object sender, ExitEventArgs evt) { diff --git a/PamhagenSysCtrl/Dialogs/UpdateDialog.xaml b/PamhagenSysCtrl/Dialogs/UpdateDialog.xaml new file mode 100644 index 0000000..da0ab88 --- /dev/null +++ b/PamhagenSysCtrl/Dialogs/UpdateDialog.xaml @@ -0,0 +1,37 @@ + + + + + + + + + + Version 0.0.0 ist verfügbar. + Soll das Update heruntergeladen und installiert werden? + (ca. 0 MB) + Hinweis: Die Anlagensteuerung wird zur Installation geschlossen. + + + + + + + + +