RustyHearts-Launcher/RHLauncher/LauncherUpdater.cs
2023-05-12 17:19:21 -03:00

104 lines
4.3 KiB
C#

using Newtonsoft.Json;
using RHLauncher.RHLauncher;
using RHLauncher.RHLauncher.Helper;
using System.Diagnostics;
using System.IO.Compression;
using System.Text;
namespace RHLauncher
{
public class LauncherUpdater
{
private readonly string LauncherVersionUrl = Configuration.Default.GetLauncherVersion;
private readonly string LauncherUpdateUrl = Configuration.Default.UpdateLauncherVersion;
public async Task CheckForLauncherUpdateAsync()
{
try
{
using HttpClient client = new();
HttpResponseMessage response = await client.GetAsync(LauncherVersionUrl);
response.EnsureSuccessStatusCode();
string json = await response.Content.ReadAsStringAsync();
dynamic result = JsonConvert.DeserializeObject(json);
string version = result.version;
if (!string.IsNullOrEmpty(version))
{
string currentVersion = GetLauncherVersion();
if (!string.IsNullOrEmpty(currentVersion) && !currentVersion.Equals(version, StringComparison.OrdinalIgnoreCase))
{
MsgBoxForm.Show(LocalizedStrings.LauncherUpdateText, LocalizedStrings.Info);
await DownloadLauncherUpdateAsync(json);
}
await Task.Delay(1000);
}
}
catch (Exception ex)
{
string errorMessage = LocalizedStrings.LauncherUpdateCheckFailed + ex.Message;
string errorLog = LocalizedStrings.LauncherUpdateCheckFailed + ex.Message + ex.StackTrace;
Exception newEx = new(errorMessage, ex);
Exception newLogEx = new(errorLog, ex);
ExceptionHandler.HandleException(newEx, newLogEx);
}
}
private async Task DownloadLauncherUpdateAsync(string version)
{
try
{
using HttpClient client = new();
using StringContent content = new(version, Encoding.UTF8, "application/json");
dynamic result = JsonConvert.DeserializeObject(version);
string v = result.version;
using HttpResponseMessage response = await client.PostAsync(LauncherUpdateUrl, content);
response.EnsureSuccessStatusCode();
byte[] updateBytes = await response.Content.ReadAsByteArrayAsync();
string tempFilePath = Path.Combine(Path.GetTempPath(), $"launcher_update.zip");
File.WriteAllBytes(tempFilePath, updateBytes);
string executablePath = AppDomain.CurrentDomain.BaseDirectory;
string backupFilePath = Path.Combine(executablePath, $"Launcher_old.exe");
string launcherExePath = Path.Combine(executablePath, "Launcher.exe");
if (File.Exists(backupFilePath))
{
File.Delete(backupFilePath);
}
// Move existing launcher.exe to temporary location
File.Move(launcherExePath, backupFilePath);
// Extract new update files
ZipFile.ExtractToDirectory(tempFilePath, executablePath, true);
// Delete temporary zip file
File.Delete(tempFilePath);
MsgBoxForm.Show(LocalizedStrings.LauncherUpdateSuccess + v, LocalizedStrings.Info);
Application.Restart();
}
catch (Exception ex)
{
string errorMessage = LocalizedStrings.LauncherUpdateFailed + ex.Message;
string errorLog = LocalizedStrings.LauncherUpdateFailed + ex.Message + ex.StackTrace;
Exception newEx = new(errorMessage, ex);
Exception newLogEx = new(errorLog, ex);
ExceptionHandler.HandleException(newEx, newLogEx);
}
}
public static string GetLauncherVersion()
{
// Get the version information of the application
FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(Application.ExecutablePath);
// Extract the version number
string version = $"{versionInfo.FileMajorPart}.{versionInfo.FileMinorPart}.{versionInfo.FileBuildPart}";
return version;
}
}
}