diff --git a/Source/LibationAvalonia/LibationAvalonia.csproj b/Source/LibationAvalonia/LibationAvalonia.csproj
index 572e61f6..06e66b4d 100644
--- a/Source/LibationAvalonia/LibationAvalonia.csproj
+++ b/Source/LibationAvalonia/LibationAvalonia.csproj
@@ -129,6 +129,9 @@
Always
+
+ Always
+
\ No newline at end of file
diff --git a/Source/LibationAvalonia/Views/MainWindow/MainWindow.axaml.cs b/Source/LibationAvalonia/Views/MainWindow/MainWindow.axaml.cs
index f8f0d155..0bf8611f 100644
--- a/Source/LibationAvalonia/Views/MainWindow/MainWindow.axaml.cs
+++ b/Source/LibationAvalonia/Views/MainWindow/MainWindow.axaml.cs
@@ -8,8 +8,7 @@ using LibationAvalonia.ViewModels;
using LibationFileManager;
using DataLayer;
using System.Collections.Generic;
-using System.Linq;
-using LibationAvalonia.Dialogs;
+using System.Threading.Tasks;
namespace LibationAvalonia.Views
{
@@ -67,11 +66,88 @@ namespace LibationAvalonia.Views
private async void MainWindow_Opened(object sender, EventArgs e)
{
- /*
- var charReplace = new EditReplacementChars();
+#if !DEBUG
+ if (App.IsWindows)
+ {
+ try
+ {
+ await Task.Run(checkForAndDownloadUpdate);
+ }
+ catch(Exception ex)
+ {
+ Serilog.Log.Logger.Error(ex, "An error occured while checking for app updates.");
+ return;
+ }
+ }
+#endif
+ }
- await charReplace.ShowDialog(this);
- */
+ private async Task checkForAndDownloadUpdate()
+ {
+ AppScaffolding.UpgradeProperties upgradeProperties;
+ try
+ {
+ upgradeProperties = AppScaffolding.LibationScaffolding.GetLatestRelease(@"Libation\.\d+\.\d+\.\d+-win-avalonia.zip");
+
+ if (upgradeProperties is null)
+ return;
+ }
+ catch (Exception ex)
+ {
+ Serilog.Log.Logger.Error(ex, "Failed to check for update");
+ return;
+ }
+
+ if (upgradeProperties.ZipUrl is null)
+ {
+ Serilog.Log.Logger.Information("Download link for new version not found");
+ return;
+ }
+
+ //Silently download the update in the background, ave it to a temp file.
+
+ var zipPath = System.IO.Path.GetTempFileName();
+ try
+ {
+ System.Net.Http.HttpClient cli = new();
+ using (var fs = System.IO.File.OpenWrite(zipPath))
+ {
+ using (var dlStream = await cli.GetStreamAsync(new Uri(upgradeProperties.ZipUrl)))
+ await dlStream.CopyToAsync(fs);
+ }
+ }
+ catch (Exception ex)
+ {
+ Serilog.Log.Logger.Error(ex, "Failed to download the update: {pdate}", upgradeProperties.ZipUrl);
+ return;
+ }
+
+ var result = MessageBox.Show($"{upgradeProperties.HtmlUrl}\r\n\r\nWould you like to upgrade now?", "New version available", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
+
+ if (result != DialogResult.Yes)
+ return;
+
+ var thisExe = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
+ var thisDir = System.IO.Path.GetDirectoryName(thisExe);
+
+ var args = $"--input {zipPath} --output {thisDir} --executable {thisExe}";
+
+ var zipExtractor = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "ZipExtractor.exe");
+
+ System.IO.File.Copy("ZipExtractor.exe", zipExtractor, overwrite: true);
+
+ var psi = new System.Diagnostics.ProcessStartInfo()
+ {
+ FileName = zipExtractor,
+ UseShellExecute = true,
+ Verb = "runas",
+ WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal,
+ Arguments = args,
+ CreateNoWindow = true
+ };
+
+ System.Diagnostics.Process.Start(psi);
+ Environment.Exit(0);
}
public void ProductsDisplay_Initialized1(object sender, EventArgs e)
diff --git a/Source/LibationAvalonia/ZipExtractor.exe b/Source/LibationAvalonia/ZipExtractor.exe
new file mode 100644
index 00000000..29e0a3b3
Binary files /dev/null and b/Source/LibationAvalonia/ZipExtractor.exe differ