TeamsNetphoneLink/TeamsNetphoneLinkWPF/WPF/UpdateWindow.xaml.cs
krjan02 55ca9934df
All checks were successful
Build and Relase / build-release (push) Successful in 1m22s
Build and Relase / create-release (push) Successful in 38s
changed release archive name / fixed log scrollbar
2025-03-26 17:25:10 +01:00

230 lines
8.4 KiB
C#

using System.IO;
using System.IO.Compression;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using System.Windows;
namespace TeamsNetphoneLink.WPF
{
/// <summary>
/// Interaktionslogik für ExceptionWindow.xaml
/// </summary>
public partial class UpdateWindow : Window
{
private bool _updateRunning = false;
private string _currentVersion;
private string _latestVersion;
public UpdateWindow(string currentVersion, string latestVersion)
{
InitializeComponent();
// Step 1: Check for updates
_currentVersion = currentVersion;
_latestVersion = latestVersion;
TitleText.Text = $"Es ist ein Update von {currentVersion} auf {latestVersion} verfügbar";
LoadReleaseNotesAsync();
}
private async void LoadReleaseNotesAsync()
{
try
{
var notes = await GetReleaseNotes();
Dispatcher.Invoke(() =>
{
ReleaseNotesTextBox.Text = notes;
});
}
catch (Exception ex)
{
Dispatcher.Invoke(() =>
{
ReleaseNotesTextBox.Text = $"Failed to load release notes: {ex.Message}";
});
}
}
// Button zum Schließen
private void CloseButton_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
// Button zum Updaten
private void UpdateButton_Click(object sender, RoutedEventArgs e)
{
this._updateRunning = true;
this.UpdateButton.IsEnabled = false;
this.CloseButton.IsEnabled = false;
_ = UpdateApplicationAsync();
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (this._updateRunning)
{
e.Cancel = true;
}
}
private void StartUpdater(string tempExtractPath)
{
string appPath = AppDomain.CurrentDomain.BaseDirectory;
string updaterPathEXE = Path.Combine(appPath, "TeamsNetphoneLinkUpdater.exe");
string updaterPathDLL = Path.Combine(appPath, "TeamsNetphoneLinkUpdater.dll");
string newUpdaterPathEXE = Path.Combine(tempExtractPath, "TeamsNetphoneLinkUpdater.exe");
string newUpdaterPathDLL = Path.Combine(tempExtractPath, "TeamsNetphoneLinkUpdater.dll");
//Replace the updater if it exists in the new release
if (File.Exists(newUpdaterPathEXE))
{
File.Copy(newUpdaterPathEXE, updaterPathEXE, true);
}
if (File.Exists(newUpdaterPathDLL))
{
File.Copy(newUpdaterPathDLL, updaterPathDLL, true);
}
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = updaterPathEXE;
p.StartInfo.ArgumentList.Add(appPath);
p.StartInfo.ArgumentList.Add(tempExtractPath);
p.StartInfo.UseShellExecute = true; // This will start the process in a new shell
p.Start();
// Exit the application
Application.Current.Shutdown();
}
private static void UnzipRelease(string zipPath, string extractPath)
{
ZipFile.ExtractToDirectory(zipPath, extractPath);
}
private async Task UpdateApplicationAsync()
{
try
{
if (_latestVersion != _currentVersion)
{
UpdateProgress.Value = 0;
// Step 2: Download the new release
string downloadUrl = $"https://git.jan.sx/krjan02/TeamsNetphoneLink/releases/download/latest/TeamsNetphoneLink{_latestVersion}.zip";
var tempZipPath = Path.GetTempFileName();
tempZipPath = tempZipPath + ".TEAMSNETPHONEUPDATE";
Console.WriteLine(tempZipPath);
await DownloadReleaseAsync(downloadUrl, tempZipPath);
// Step 3: Unzip the release
var tempExtractPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + "TEAMSNETPHONEUPDATE");
Directory.CreateDirectory(tempExtractPath);
UnzipRelease(tempZipPath, tempExtractPath);
File.Delete(tempZipPath);
// Step 4: Replace Updater.exe and run the updater
StartUpdater(tempExtractPath);
}
}
catch (Exception ex)
{
Dispatcher.Invoke(() => ProgressStatusText.Text = $"Error: {ex.Message}");
}
}
private async Task<string> GetReleaseNotes()
{
string apiUrl = $"https://git.jan.sx/api/v1/repos/krjan02/TeamsNetphoneLink/releases/tags/{_latestVersion}";
using (HttpClient client = new HttpClient())
{
// Send a GET request to the Gitea API
HttpResponseMessage response = await client.GetAsync(apiUrl);
response.EnsureSuccessStatusCode();
// Parse the JSON response
string jsonResponse = await response.Content.ReadAsStringAsync();
using (JsonDocument doc = JsonDocument.Parse(jsonResponse))
{
JsonElement root = doc.RootElement;
JsonElement body = root.GetProperty("body");
return body.GetString();
}
}
}
private async Task<long> GetFileSize()
{
string apiUrl = $"https://git.jan.sx/api/v1/repos/krjan02/TeamsNetphoneLink/releases/tags/{_latestVersion}";
using (HttpClient client = new HttpClient())
{
// Send a GET request to the Gitea API
HttpResponseMessage response = await client.GetAsync(apiUrl);
response.EnsureSuccessStatusCode();
// Parse the JSON response
string jsonResponse = await response.Content.ReadAsStringAsync();
using (JsonDocument doc = JsonDocument.Parse(jsonResponse))
{
JsonElement root = doc.RootElement;
JsonElement assets = root.GetProperty("assets");
// Iterate through the assets to find the file
foreach (JsonElement asset in assets.EnumerateArray())
{
string name = asset.GetProperty("name").GetString();
if (name == $"TeamsNetphoneLink{_latestVersion}.zip")
{
long size = asset.GetProperty("size").GetInt64();
return size;
}
}
}
}
return -1;
}
private async Task DownloadReleaseAsync(string downloadUrl, string destinationPath)
{
using (var client = new HttpClient())
{
var response = await client.GetAsync(downloadUrl, HttpCompletionOption.ResponseHeadersRead);
response.EnsureSuccessStatusCode();
var totalBytes = await GetFileSize();
var downloadedBytes = 0L;
var buffer = new byte[8192];
using (var fileStream = new FileStream(destinationPath, FileMode.Create, FileAccess.Write, FileShare.None))
using (var stream = await response.Content.ReadAsStreamAsync())
{
int bytesRead;
while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
fileStream.Write(buffer, 0, bytesRead);
downloadedBytes += bytesRead;
// Update progress in the UI
Dispatcher.Invoke(() =>
{
ProgressStatusText.Text = $"Update wird heruntergeladen... ({downloadedBytes/1000}kB/{totalBytes/1000}kB)";
UpdateProgress.Value = (double)downloadedBytes / totalBytes * 100;
//StatusText.Text = $"Downloading... {DownloadProgress.Value:F2}%";
});
}
}
}
}
}
}