diff --git a/src/ImeSense.Launchers.Belarus.Core/Manager/InitializerManager.cs b/src/ImeSense.Launchers.Belarus.Core/Manager/InitializerManager.cs index fa81581..11b97b8 100644 --- a/src/ImeSense.Launchers.Belarus.Core/Manager/InitializerManager.cs +++ b/src/ImeSense.Launchers.Belarus.Core/Manager/InitializerManager.cs @@ -106,9 +106,10 @@ private async Task HandleOnlineInitializationAsync(ISplashScreenManager splashSc var isLauncherReleaseCurrent = await IsLauncherReleaseCurrentAsync(splashScreenManager.CancellationToken); _logger?.LogInformation("Check launcher update time: {Time}", stopwatch.ElapsedMilliseconds); if (!isLauncherReleaseCurrent) { - var pathLauncherUpdater = Path.Combine(DirectoryStorage.Base, FileNameStorage.SBLauncherUpdater); - await _updaterService.UpdaterAsync(UriStorage.LauncherApiUri, pathLauncherUpdater, splashScreenManager.CancellationToken); + var pathLauncherUpdaterZip = Path.Combine(DirectoryStorage.Base, FileNameStorage.SBLauncherUpdaterZip); + await _updaterService.UpdaterAsync(UriStorage.LauncherApiUri, pathLauncherUpdaterZip, splashScreenManager.CancellationToken); + var pathLauncherUpdater = Path.Combine(DirectoryStorage.Base, FileNameStorage.SBLauncherUpdater); var updater = Launcher.Launch(pathLauncherUpdater); updater?.Start(); diff --git a/src/ImeSense.Launchers.Belarus.Core/Services/UpdaterService.cs b/src/ImeSense.Launchers.Belarus.Core/Services/UpdaterService.cs index e7a40f3..067ae4c 100644 --- a/src/ImeSense.Launchers.Belarus.Core/Services/UpdaterService.cs +++ b/src/ImeSense.Launchers.Belarus.Core/Services/UpdaterService.cs @@ -1,3 +1,5 @@ +using System.IO.Compression; + using ImeSense.Launchers.Belarus.Core.Manager; using ImeSense.Launchers.Belarus.Core.Storage; @@ -13,23 +15,23 @@ public class UpdaterService(ILogger logger, IGitStorageApiServic public async Task UpdaterAsync(Uri uri, string fileSavePath, CancellationToken cancellationToken = default) { - var appName = Path.GetFileNameWithoutExtension(fileSavePath); - var fullAppName = Path.GetFileName(fileSavePath); + var fileName = Path.GetFileNameWithoutExtension(fileSavePath); + var fullFileName = Path.GetFileName(fileSavePath); var lastRelease = await _gitStorageApiService.GetLastReleaseAsync(uri, cancellationToken) ?? throw new NullReferenceException("Latest release is null!"); - var sblauncher = lastRelease.Assets?.FirstOrDefault(x => x.Name.Equals(fullAppName)) - ?? throw new NullReferenceException($"{appName} asset is null!"); + var sblauncher = lastRelease.Assets?.FirstOrDefault(x => x.Name.Equals(fullFileName)) + ?? throw new NullReferenceException($"{fileName} asset is null!"); if (sblauncher.BrowserDownloadUrl == null) { throw new NullReferenceException("Browser download url is null!"); } var progress = new Progress(percentage => { - _logger.LogInformation("{appName} is {percentage}% downloaded", appName, percentage); + _logger.LogInformation("{fileName} is {percentage}% downloaded", fileName, percentage); }); var pathDownloadFolder = Path.Combine(DirectoryStorage.Base, "temp"); - var fileDownloadPath = Path.Combine(pathDownloadFolder, fullAppName); + var fileDownloadPath = Path.Combine(pathDownloadFolder, fullFileName); if (!Directory.Exists(pathDownloadFolder)) { Directory.CreateDirectory(pathDownloadFolder); @@ -37,13 +39,27 @@ public async Task UpdaterAsync(Uri uri, string fileSavePath, CancellationToken c await _fileDownloadManager.DownloadAsync(sblauncher.BrowserDownloadUrl, fileDownloadPath, progress, cancellationToken); - if (File.Exists(fileSavePath)) { - File.Delete(fileSavePath); + ExtractFile(fileDownloadPath, fileSavePath); + CleanUpTempFiles(); + } + + private static void ExtractFile(string sourcePath, string destinationPath) + { + if (Path.GetExtension(sourcePath).Equals(".zip", StringComparison.OrdinalIgnoreCase)) { + ZipFile.ExtractToDirectory(sourcePath, DirectoryStorage.Base, true); + } else { + if (File.Exists(destinationPath)) { + File.Delete(destinationPath); + } + File.Move(sourcePath, destinationPath); } - File.Move(fileDownloadPath, fileSavePath); + } + private static void CleanUpTempFiles() + { + var pathDownloadFolder = Path.Combine(DirectoryStorage.Base, "temp"); if (Directory.Exists(pathDownloadFolder)) { - Directory.Delete(pathDownloadFolder); + Directory.Delete(pathDownloadFolder, true); } } } diff --git a/src/ImeSense.Launchers.Belarus.Core/Storage/FileNameStorage.cs b/src/ImeSense.Launchers.Belarus.Core/Storage/FileNameStorage.cs index 2fb89c5..01caffb 100644 --- a/src/ImeSense.Launchers.Belarus.Core/Storage/FileNameStorage.cs +++ b/src/ImeSense.Launchers.Belarus.Core/Storage/FileNameStorage.cs @@ -8,7 +8,9 @@ public static class FileNameStorage public static string CryptoHasherLog => "CryptoHasherReport-"; public static string WebResources => "WebResources.json"; public static string SBLauncher => "SBLauncher.exe"; + public static string SBLauncherZip => "sblauncher-publish.zip"; public static string SBLauncherUpdater => "SBLauncherUpdater.exe"; + public static string SBLauncherUpdaterZip => "sblauncher-updater-publish.zip"; public static string GameSetting => "user.ltx"; public static string LauncherSetting => "sblauncher.json"; public static string CurrentRelease => "CurrentRelease.json"; diff --git a/src/ImeSense.Launchers.Belarus.Core/Storage/PathStorage.cs b/src/ImeSense.Launchers.Belarus.Core/Storage/PathStorage.cs index 12d9149..43f917a 100644 --- a/src/ImeSense.Launchers.Belarus.Core/Storage/PathStorage.cs +++ b/src/ImeSense.Launchers.Belarus.Core/Storage/PathStorage.cs @@ -9,6 +9,7 @@ public static class PathStorage // Актуально для версии 3.0 и новее public static string LauncherSetting => Path.Combine(DirectoryStorage.LaucherData, FileNameStorage.LauncherSetting); public static string CurrentRelease => Path.Combine(DirectoryStorage.LauncherCache, FileNameStorage.CurrentRelease); + public static string LegacyGameUser => Path.Combine(DirectoryStorage.LegacyUserData, FileNameStorage.GameSetting); public static string GameUser => Path.Combine(DirectoryStorage.AppData, FileNameStorage.GameSetting); public static string NewsCache => Path.Combine(DirectoryStorage.LauncherCache, FileNameStorage.NewsContent); public static string WebResourcesCache => Path.Combine(DirectoryStorage.LauncherCache, FileNameStorage.WebResources); diff --git a/src/ImeSense.Launchers.Belarus.Updater/Program.cs b/src/ImeSense.Launchers.Belarus.Updater/Program.cs index 89a6de5..bc5f72e 100644 --- a/src/ImeSense.Launchers.Belarus.Updater/Program.cs +++ b/src/ImeSense.Launchers.Belarus.Updater/Program.cs @@ -24,9 +24,12 @@ } logger.LogInformation($"Start update"); - var fileSavePath = Path.Combine(DirectoryStorage.Base, FileNameStorage.SBLauncher); + var fileSavePath = Path.Combine(DirectoryStorage.Base, FileNameStorage.SBLauncherZip); + + using var httpClient = new HttpClient(new HttpClientHandler { + SslProtocols = System.Security.Authentication.SslProtocols.Tls12 + }); - using var httpClient = new HttpClient(); httpClient.BaseAddress = UriStorage.LauncherApiUri; httpClient.DefaultRequestHeaders.Accept.Clear(); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/vnd.github.v3+json")); @@ -38,7 +41,7 @@ await updaterService.UpdaterAsync(UriStorage.LauncherApiUri, fileSavePath); logger.LogInformation($"Finish!"); - Launcher.Launch(fileSavePath)?.Start(); + Launcher.Launch(Path.Combine(DirectoryStorage.Base, FileNameStorage.SBLauncher))?.Start(); } catch (Exception ex) { logger.LogInformation("{Message}", ex.Message); logger.LogInformation("{StackTrace}", ex.StackTrace);