Browse Source

replaced static logger as dep. injection, refactor java download link concat

Veloe 1 year ago
parent
commit
f1a3fb3a22

+ 92 - 126
VeloeMinecraftLauncher/Utils/Downloader.cs

@@ -1,4 +1,5 @@
-using System;
+using Microsoft.Extensions.Logging;
+using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.IO;
@@ -20,10 +21,12 @@ internal class Downloader
     static HttpClient _sHttpClient = new();
 
     public DownloaderParameters Parameters { get; private set; }
+    private readonly Serilog.ILogger _logger;
 
-    public Downloader(DownloaderParameters parameters)
+    public Downloader(DownloaderParameters parameters, Serilog.ILogger logger)
     {
         Parameters = parameters;
+        _logger = logger;
     }
 
     public async Task DownloadClient(
@@ -68,15 +71,21 @@ internal class Downloader
             ArgumentNullException.ThrowIfNull(versionJson);
 
             //SetMaxProgressBarValue(size);
-            Settings.logger.Debug("Downloading minecraft {0}", versionJson.Id);
+            _logger.Debug("Downloading minecraft {0}", versionJson.Id);
 
             //download java
             if (Parameters.Parameter.DownloadJava)
             {
-                await DownloadJava(httpClient, versionJson, cancellationToken);
-
-                tasksIterator++;
-                Parameters.Action.TasksStatus($"Task {tasksIterator} of {tasksCount} complete.");
+                try
+                {
+                    await DownloadJava(httpClient, versionJson, cancellationToken);
+                    tasksIterator++;
+                    Parameters.Action.TasksStatus($"Task {tasksIterator} of {tasksCount} complete.");
+                }
+                catch (Exception ex) when (ex is (ArgumentException or HttpRequestException) )
+                {
+                    _logger.Warning(ex.Message);
+                }
             }
 
             await DownloadMainJar(httpClient, versionJson, cancellationToken);
@@ -127,7 +136,7 @@ internal class Downloader
 
             //RemoveProgressBar(webClient);
             //Progress = 100;
-            Settings.logger.Debug("Downloading finished.");
+            _logger.Debug("Downloading finished.");
             Parameters.Action.DownloadingFileName("Finished!");
             Parameters.Action.IsControlsEnabled(true);
 
@@ -142,7 +151,7 @@ internal class Downloader
                 Parameters.Action.DownloadingFileName($"Downloading {Parameters.Data.SelectedVersion.Id} canceled.");
             else
                 Parameters.Action.DownloadingFileName("Downloading canceled: version config is null!");
-            Settings.logger.Warning(ex.Message);
+            _logger.Warning(ex.Message);
             return;// Task.FromCanceled(cancellationToken);
         }
         catch (Exception ex)
@@ -154,9 +163,9 @@ internal class Downloader
                 Parameters.Action.DownloadingFileName($"Error occured while downloading {Parameters.Data.SelectedVersion.Id}.");
             else
                 Parameters.Action.DownloadingFileName($"Error occured while downloading: version config is null!");
-            Settings.logger.Error(ex.Message);
+            _logger.Error(ex.Message);
             if (ex.StackTrace is not null)
-                Settings.logger.Error(ex.StackTrace);
+                _logger.Error(ex.StackTrace);
             return;// Task.FromException(ex);
         }
         return;
@@ -175,11 +184,11 @@ internal class Downloader
 
         if (!Directory.Exists($"{Settings.minecraftForlderPath}versions/{Parameters.Data.SelectedModpack.Name}"))
         {
-            Settings.logger.Debug("Creating path: {0}", $"{Settings.minecraftForlderPath}versions/{Parameters.Data.SelectedModpack.Name}");
+            _logger.Debug("Creating path: {0}", $"{Settings.minecraftForlderPath}versions/{Parameters.Data.SelectedModpack.Name}");
             Directory.CreateDirectory($"{Settings.minecraftForlderPath}versions/{Parameters.Data.SelectedModpack.Name}");
         }
 
-        Settings.logger.Debug("Downloading: {0}", $"{Parameters.Data.SelectedModpack.Name}.zip");
+        _logger.Debug("Downloading: {0}", $"{Parameters.Data.SelectedModpack.Name}.zip");
         Parameters.Action.DownloadingFileName($"{Parameters.Data.SelectedModpack.Name}.zip");
         await DownloadFileAsync(modpackUrl, Settings.minecraftForlderPath + $"versions/{Parameters.Data.SelectedModpack.Name}.zip", cancellationToken, httpClient);
 
@@ -207,7 +216,7 @@ internal class Downloader
         if (Directory.Exists($"{Settings.minecraftForlderPath}versions/{Parameters.Data.SelectedModpack.Name}/config"))
             Directory.Delete($"{Settings.minecraftForlderPath}versions/{Parameters.Data.SelectedModpack.Name}/config", true);
 
-        Settings.logger.Debug("Extracting: {0}", $"{Parameters.Data.SelectedModpack.Name}.zip");
+        _logger.Debug("Extracting: {0}", $"{Parameters.Data.SelectedModpack.Name}.zip");
         Parameters.Action.DownloadingFileName($"Unpacking {Parameters.Data.SelectedModpack.Name}.zip");
         ZipFile.ExtractToDirectory($"{Settings.minecraftForlderPath}versions/{Parameters.Data.SelectedModpack.Name}.zip", Settings.minecraftForlderPath + $"versions/{Parameters.Data.SelectedModpack.Name}", true);
         File.Delete($"{Settings.minecraftForlderPath}versions/{Parameters.Data.SelectedModpack.Name}.zip");
@@ -215,74 +224,74 @@ internal class Downloader
         File.WriteAllText($"{Settings.minecraftForlderPath}versions/{Parameters.Data.SelectedModpack.Name}/revision.json", JsonSerializer.Serialize(Parameters.Data.SelectedModpack.Revision));
     }
 
-    private async Task DownloadForgeOptifine(HttpClient httpClient, Entity.Version.Version? versionJson, CancellationToken cancellationToken)
+    private async Task DownloadForgeOptifine(HttpClient httpClient, Entity.Version.Version versionJson, CancellationToken cancellationToken)
     {
         if (!Directory.Exists($"{Settings.minecraftForlderPath}versions/Forge{versionJson.Id}/mods"))
         {
-            Settings.logger.Debug("Creating path: {0}", $"{Settings.minecraftForlderPath}versions/Forge" + versionJson.Id + "/mods");
+            _logger.Debug("Creating path: {0}", $"{Settings.minecraftForlderPath}versions/Forge" + versionJson.Id + "/mods");
             Directory.CreateDirectory($"{Settings.minecraftForlderPath}versions/Forge" + versionJson.Id + "/mods");
         }
 
-        Settings.logger.Debug("Downloading: {0}", $"Optifine{versionJson.Id}.jar");
+        _logger.Debug("Downloading: {0}", $"Optifine{versionJson.Id}.jar");
         Parameters.Action.DownloadingFileName($"Optifine{versionJson.Id}.jar");
         await DownloadFileAsync($@"https://files.veloe.link/launcher/forge/Forge{versionJson.Id}/Optifine{versionJson.Id}.jar", Settings.minecraftForlderPath + "versions/Forge" + versionJson.Id + "/mods/" + "Optifine" + versionJson.Id + ".jar", cancellationToken, httpClient);
     }
 
-    private async Task DownloadOptifine(HttpClient httpClient, Entity.Version.Version? versionJson, CancellationToken cancellationToken)
+    private async Task DownloadOptifine(HttpClient httpClient, Entity.Version.Version versionJson, CancellationToken cancellationToken)
     {
         var optifinePath = $"Optifine{versionJson.Id}";
         var optifineUrl = $"https://files.veloe.link/launcher/optifine/Optifine{versionJson.Id}/";
 
         if (!Directory.Exists($"{Settings.minecraftForlderPath}versions/{optifinePath}"))
         {
-            Settings.logger.Debug("Creating path: {0}", $"{Settings.minecraftForlderPath}versions/" + optifinePath);
+            _logger.Debug("Creating path: {0}", $"{Settings.minecraftForlderPath}versions/" + optifinePath);
             Directory.CreateDirectory($"{Settings.minecraftForlderPath}versions/" + optifinePath);
         }
 
-        Settings.logger.Debug("Downloading: {0}", $"Optifine{versionJson.Id}.json");
+        _logger.Debug("Downloading: {0}", $"Optifine{versionJson.Id}.json");
         Parameters.Action.DownloadingFileName($"Optifine{versionJson.Id}.json");
         await DownloadFileAsync($"{optifineUrl}Optifine{versionJson.Id}.json", Settings.minecraftForlderPath + "versions/" + optifinePath + "/" + optifinePath + ".json", cancellationToken, httpClient);
 
 
-        Settings.logger.Debug("Downloading: {0}", $"Optifine{versionJson.Id}.jar");
+        _logger.Debug("Downloading: {0}", $"Optifine{versionJson.Id}.jar");
         Parameters.Action.DownloadingFileName($"Optifine{versionJson.Id}.json");
         await DownloadFileAsync($"{optifineUrl}Optifine{versionJson.Id}.jar", Settings.minecraftForlderPath + "versions/" + optifinePath + "/" + optifinePath + ".jar", cancellationToken, httpClient);
 
 
-        Settings.logger.Debug("Downloading: {0}", "libraries.zip");
+        _logger.Debug("Downloading: {0}", "libraries.zip");
         Parameters.Action.DownloadingFileName("libraries.zip");
         await DownloadFileAsync(optifineUrl + "libraries.zip", Settings.minecraftForlderPath + "versions/" + optifinePath + "/libraries.zip", cancellationToken, httpClient);
 
 
-        Settings.logger.Debug("Extracting: {0}", "libraries.zip");
+        _logger.Debug("Extracting: {0}", "libraries.zip");
         Parameters.Action.DownloadingFileName("Unpacking libraries.zip");
         ZipFile.ExtractToDirectory($"{Settings.minecraftForlderPath}versions/Optifine{versionJson.Id}/libraries.zip", Settings.minecraftForlderPath, true);
         File.Delete($"{Settings.minecraftForlderPath}versions/Optifine{versionJson.Id}/libraries.zip");
     }
 
-    private async Task DownloadForge(HttpClient httpClient, Entity.Version.Version? versionJson, CancellationToken cancellationToken)
+    private async Task DownloadForge(HttpClient httpClient, Entity.Version.Version versionJson, CancellationToken cancellationToken)
     {
         var forgePath = $"Forge{versionJson.Id}";
         var forgeUrl = $"https://files.veloe.link/launcher/forge/Forge{versionJson.Id}/";
 
         if (!Directory.Exists($"{Settings.minecraftForlderPath}versions/Forge{versionJson.Id}"))
         {
-            Settings.logger.Debug("Creating path: {0}", $"{Settings.minecraftForlderPath}versions/" + forgePath);
+            _logger.Debug("Creating path: {0}", $"{Settings.minecraftForlderPath}versions/" + forgePath);
             Directory.CreateDirectory($"{Settings.minecraftForlderPath}versions/" + forgePath);
         }
 
 
-        Settings.logger.Debug("Downloading: {0}", $"Forge{versionJson.Id}.json");
+        _logger.Debug("Downloading: {0}", $"Forge{versionJson.Id}.json");
         Parameters.Action.DownloadingFileName($"Forge{versionJson.Id}.json");
         await DownloadFileAsync($"{forgeUrl}Forge{versionJson.Id}.json", Settings.minecraftForlderPath + "versions/" + forgePath + "/" + forgePath + ".json", cancellationToken, httpClient);
 
 
-        Settings.logger.Debug("Downloading: {0}", "libraries.zip");
+        _logger.Debug("Downloading: {0}", "libraries.zip");
         Parameters.Action.DownloadingFileName("libraries.zip");
         await DownloadFileAsync(forgeUrl + "libraries.zip", Settings.minecraftForlderPath + "versions/" + forgePath + "/libraries.zip", cancellationToken, httpClient);
 
 
-        Settings.logger.Debug("Extracting: {0}", "libraries.zip");
+        _logger.Debug("Extracting: {0}", "libraries.zip");
         Parameters.Action.DownloadingFileName("Unpacking libraries.zip");
         ZipFile.ExtractToDirectory($"{Settings.minecraftForlderPath}versions/Forge{versionJson.Id}/libraries.zip", Settings.minecraftForlderPath, true);
         File.Delete($"{Settings.minecraftForlderPath}versions/Forge{versionJson.Id}/libraries.zip");
@@ -295,13 +304,13 @@ internal class Downloader
         var assetsUrl = "https://resources.download.minecraft.net/";
 
         //download assets json
-        Settings.logger.Debug("Downloading: {0}", versionJson.Assets + ".json");
+        _logger.Debug("Downloading: {0}", versionJson.Assets + ".json");
 
         if (!Directory.Exists(Settings.minecraftForlderPath + "/assets/" + versionJson.Assets + "/indexes/"))
             Directory.CreateDirectory(Settings.minecraftForlderPath + "/assets/" + versionJson.Assets + "/indexes/");
         await DownloadFileAsync(versionJson.AssetIndex.Url, Settings.minecraftForlderPath + "/assets/" + versionJson.Assets + "/indexes/" + versionJson.Assets + ".json", cancellationToken);
 
-        Settings.logger.Debug("Downloading assets.");
+        _logger.Debug("Downloading assets.");
         Parameters.Action.SetProgress(0);
         var assetsCount = assetsJson?.Objects?.Count ?? 1;
         var assetsIterator = 1;
@@ -325,14 +334,14 @@ internal class Downloader
 
                 var assetRoot = folder.Contains("icons") ? $"{Settings.minecraftForlderPath}assets/{versionJson.Assets}" : assetsPath;
 
-                var chksum = String.Empty;
+                var chksum = string.Empty;
                 //here hash check
                 if (File.Exists(Path.Combine(assetRoot, folder, name)))
                 {
                     Parameters.Action.DownloadingFileName($"Checking hash {assetsIterator} of {assetsCount}");
                     using FileStream fop = File.OpenRead(Path.Combine(assetRoot, folder, name));
                     byte[] hash = System.Security.Cryptography.SHA1.Create().ComputeHash(fop);
-                    chksum = BitConverter.ToString(hash).Replace("-", String.Empty).ToLower();
+                    chksum = BitConverter.ToString(hash).Replace("-", string.Empty).ToLower();
                     fop.Close();
                 }
 
@@ -344,7 +353,7 @@ internal class Downloader
                         if (!Directory.Exists(assetRoot + "/" + folder))
                             Directory.CreateDirectory(assetRoot + "/" + folder);
 
-                        Settings.logger.Debug("Downloading asset: {0} ", name);
+                        _logger.Debug("Downloading asset: {0} ", name);
                         //DownloadingFileName($"Asset {assetsIterator} of {assetsCount}");
                         Parameters.Action.DownloadingFileName($"Asset {assetsIterator} of {assetsCount}");
                         await DownloadFileAsync(assetsUrl + asset.Value.Hash[..2] + "/" + asset.Value.Hash, Path.Combine(assetRoot, folder , name), cancellationToken, httpClient);
@@ -363,25 +372,24 @@ internal class Downloader
 
     }
 
-    private async Task DownloadLibraries(HttpClient httpClient, Entity.Version.Version? versionJson, CancellationToken cancellationToken)
+    private async Task DownloadLibraries(HttpClient httpClient, Entity.Version.Version versionJson, CancellationToken cancellationToken)
     {
-        Settings.logger.Debug("Downloading libraries.");
+        _logger.Debug("Downloading libraries.");
 
         foreach (var library in versionJson.Libraries)
         {
             var libPath = Settings.minecraftForlderPath + "libraries/";
-            string libUrl = "";
-            string sha1 = String.Empty;
+            string libUrl = string.Empty;
+            string sha1 = string.Empty;
             // getting path and url if universal lib
             if (library.Natives is null)
             {
-                libPath = Settings.minecraftForlderPath + "libraries/" + library.Downloads.Artifact.Path;
+                libPath +=  library.Downloads.Artifact.Path;
                 libUrl = library.Downloads.Artifact.Url;
                 sha1 = library.Downloads.Artifact.Sha1;
             }
             else
             {   // getting path if native
-                libPath = Settings.minecraftForlderPath + "libraries/";
                 libUrl = "";
                 if (library.Downloads.Classifiers is not null)
                 {
@@ -419,7 +427,7 @@ internal class Downloader
             }
 
             //if no lib url
-            if (libUrl == String.Empty)
+            if (libUrl == string.Empty)
                 continue;
 
             var libName = Path.GetFileName(libPath);
@@ -428,9 +436,9 @@ internal class Downloader
             if (libName is null || libDir is null)
             {
                 if (libPath == string.Empty)
-                    Settings.logger.Warning("Library dir, name are null, because libraryPath is empty! Skipping...");
+                    _logger.Warning("Library dir, name are null, because libraryPath is empty! Skipping...");
                 else
-                    Settings.logger.Warning("Library dir or name are null! Skipping...");
+                    _logger.Warning("Library dir or name are null! Skipping...");
                 continue;
             }
 
@@ -439,18 +447,18 @@ internal class Downloader
             {
                 if (!Directory.Exists(libDir))
                 {
-                    Settings.logger.Debug("Creating path: {0}", libDir);
+                    _logger.Debug("Creating path: {0}", libDir);
                     Directory.CreateDirectory(libDir);
                 }
 
-                var chksum = String.Empty;
+                var chksum = string.Empty;
 
                 if (File.Exists(libPath))
                 {
                     Parameters.Action.DownloadingFileName($"Checking hash: {libName}");
                     FileStream fop = File.OpenRead(libPath);
                     byte[] hash = System.Security.Cryptography.SHA1.Create().ComputeHash(fop);
-                    chksum = BitConverter.ToString(hash).Replace("-", String.Empty).ToLower();
+                    chksum = BitConverter.ToString(hash).Replace("-", string.Empty).ToLower();
 
                     fop.Close();
                     fop.Dispose();
@@ -458,7 +466,7 @@ internal class Downloader
 
                 if (chksum != sha1)
                 {
-                    Settings.logger.Debug("Downloading: {0}", libName);
+                    _logger.Debug("Downloading: {0}", libName);
                     Parameters.Action.DownloadingFileName(libName);
                     await DownloadFileAsync(libUrl, libDir + "/" + libName, cancellationToken, httpClient);
                 }
@@ -471,18 +479,18 @@ internal class Downloader
                     {
                         if (!Directory.Exists(libDir))
                         {
-                            Settings.logger.Debug("Creating path: {0}", libDir);
+                            _logger.Debug("Creating path: {0}", libDir);
                             Directory.CreateDirectory(libDir);
                         }
 
-                        var chksum = String.Empty;
+                        var chksum = string.Empty;
 
-                        if (File.Exists(libDir + "/" + libName) && sha1 != String.Empty)
+                        if (File.Exists(libDir + "/" + libName) && sha1 != string.Empty)
                         {
                             Parameters.Action.DownloadingFileName($"Checking hash: {libName}");
                             FileStream fop = File.OpenRead(libDir + "/" + libName);
                             byte[] hash = System.Security.Cryptography.SHA1.Create().ComputeHash(fop);
-                            chksum = BitConverter.ToString(hash).Replace("-", String.Empty).ToLower();
+                            chksum = BitConverter.ToString(hash).Replace("-", string.Empty).ToLower();
 
                             fop.Close();
                             fop.Dispose();
@@ -490,7 +498,7 @@ internal class Downloader
 
                         if (chksum != sha1)
                         {
-                            Settings.logger.Debug("Downloading: {0}", libName);
+                            _logger.Debug("Downloading: {0}", libName);
                             Parameters.Action.DownloadingFileName(libName);
                             await DownloadFileAsync(libUrl, libDir + "/" + libName, cancellationToken, httpClient);
                         }
@@ -502,10 +510,10 @@ internal class Downloader
                     {
                         if (!Directory.Exists(libPath))
                         {
-                            Settings.logger.Debug("Creating path: {0}", path);
+                            _logger.Debug("Creating path: {0}", path);
                             Directory.CreateDirectory(libPath);
                         }
-                        Settings.logger.Debug("Downloading: {0}", libName);
+                        _logger.Debug("Downloading: {0}", libName);
                         DownloadingFileName = libName;
                         webClient.DownloadFileAsync(new System.Uri(libUrl), libPath + "/" + libName);
 
@@ -527,22 +535,22 @@ internal class Downloader
 
                     if (!Directory.Exists(Settings.minecraftForlderPath + "versions/" + versionJson.Id + "/natives/"))
                     {
-                        Settings.logger.Debug("Creating path: {0}", Settings.minecraftForlderPath + "versions/" + versionJson.Id + "/natives/");
+                        _logger.Debug("Creating path: {0}", Settings.minecraftForlderPath + "versions/" + versionJson.Id + "/natives/");
                         Directory.CreateDirectory(Settings.minecraftForlderPath + "versions/" + versionJson.Id + "/natives/");
                     }
-                    Settings.logger.Debug("Extracting {0} to {1}", libName, Settings.minecraftForlderPath + "versions/" + versionJson.Id + "/natives/");
+                    _logger.Debug("Extracting {0} to {1}", libName, Settings.minecraftForlderPath + "versions/" + versionJson.Id + "/natives/");
                     ZipFile.ExtractToDirectory(libDir + "/" + libName, Settings.minecraftForlderPath + "versions/" + versionJson.Id + "/natives/", true);
                 }
                 catch (IOException)
                 {
-                    Settings.logger.Error("IOException on native lib extraction");
+                    _logger.Error("IOException on native lib extraction");
                 }
                 //TODO delete META-INF and sha1 files after
             }
         }
     }
 
-    private async Task DownloadMainJar(HttpClient httpClient, Entity.Version.Version? versionJson, CancellationToken cancellationToken)
+    private async Task DownloadMainJar(HttpClient httpClient, Entity.Version.Version versionJson, CancellationToken cancellationToken)
     {
         //download json
         var path = Settings.minecraftForlderPath + "/versions/" + versionJson.Id;
@@ -550,18 +558,18 @@ internal class Downloader
         //download jar
         if (!Directory.Exists(path))
         {
-            Settings.logger.Debug("Creating path: {0}", path);
+            _logger.Debug("Creating path: {0}", path);
             Directory.CreateDirectory(path);
         }
 
-        string chksum = String.Empty;
+        string chksum = string.Empty;
         //here hash check
         if (File.Exists(path + "/" + versionJson.Id + ".jar"))
         {
             Parameters.Action.DownloadingFileName($"Checking hash: {versionJson.Id}.jar");
             FileStream fop = File.OpenRead(path + "/" + versionJson.Id + ".jar");
             byte[] hash = System.Security.Cryptography.SHA1.Create().ComputeHash(fop);
-            chksum = BitConverter.ToString(hash).Replace("-", String.Empty).ToLower();
+            chksum = BitConverter.ToString(hash).Replace("-", string.Empty).ToLower();
 
             fop.Close();
             fop.Dispose();
@@ -569,80 +577,35 @@ internal class Downloader
 
         if (chksum != versionJson.Downloads.Client.Sha1)
         {
-            Settings.logger.Debug("Downloading {0}", $"{versionJson.Id}.jar");
+            _logger.Debug("Downloading {0}", $"{versionJson.Id}.jar");
             Parameters.Action.DownloadingFileName($"{versionJson.Id}.jar");
             await DownloadFileAsync(versionJson.Downloads.Client.Url, path + "/" + versionJson.Id + ".jar", cancellationToken, httpClient);
         }
     }
 
-    private async Task DownloadJava(HttpClient httpClient, Entity.Version.Version? versionJson, CancellationToken cancellationToken)
+    private async Task DownloadJava(HttpClient httpClient, Entity.Version.Version versionJson, CancellationToken cancellationToken)
     {
-        Settings.logger.Debug("Getting required Java version.");
-        string javaUrl = "";
-        if (versionJson.JavaVersion is not null && versionJson.JavaVersion.MajorVersion != null)
-        {
-            switch (versionJson.JavaVersion.MajorVersion)
-            {
-                case 8:
-                    if (Environment.Is64BitOperatingSystem && OperatingSystem.IsWindows())
-                        javaUrl = "https://files.veloe.link/launcher/java/8/windows64/java.zip";
-                    if (!Environment.Is64BitOperatingSystem && OperatingSystem.IsWindows())
-                        javaUrl = "https://files.veloe.link/launcher/java/8/windows32/java.zip";
-
-                    if (Environment.Is64BitOperatingSystem && OperatingSystem.IsLinux())
-                        javaUrl = "https://files.veloe.link/launcher/java/8/linux64/java.zip";
-                    if (!Environment.Is64BitOperatingSystem && OperatingSystem.IsLinux())
-                        javaUrl = "https://files.veloe.link/launcher/java/8/linux32/java.zip";
-                    break;
-                case 16:
-                    if (Environment.Is64BitOperatingSystem && OperatingSystem.IsWindows())
-                        javaUrl = "https://files.veloe.link/launcher/java/16/windows64/java.zip";
-                    if (Environment.Is64BitOperatingSystem && OperatingSystem.IsLinux())
-                        javaUrl = "https://files.veloe.link/launcher/java/16/linux64/java.zip";
-                    break;
-                case 17:
-                    if (Environment.Is64BitOperatingSystem && OperatingSystem.IsWindows())
-                        javaUrl = "https://files.veloe.link/launcher/java/17/windows64/java.zip";
-                    if (Environment.Is64BitOperatingSystem && OperatingSystem.IsLinux())
-                        javaUrl = "https://files.veloe.link/launcher/java/17/linux64/java.zip";
-
-                    break;
-                case 18:
-                    if (Environment.Is64BitOperatingSystem && OperatingSystem.IsWindows())
-                        javaUrl = "https://files.veloe.link/launcher/java/18/windows64/java.zip";
-                    if (Environment.Is64BitOperatingSystem && OperatingSystem.IsLinux())
-                        javaUrl = "https://files.veloe.link/launcher/java/18/linux64/java.zip";
-
-                    break;
-            }
-        }
+        _logger.Debug("Getting required Java version.");
 
-        if (versionJson.Assets == "legacy")
-        {
-            if (Environment.Is64BitOperatingSystem && OperatingSystem.IsWindows())
-                javaUrl = "https://files.veloe.link/launcher/java/8/windows64/java.zip";
-            if (!Environment.Is64BitOperatingSystem && OperatingSystem.IsWindows())
-                javaUrl = "https://files.veloe.link/launcher/java/8/windows32/java.zip";
-
-            if (Environment.Is64BitOperatingSystem && OperatingSystem.IsLinux())
-                javaUrl = "https://files.veloe.link/launcher/java/8/linux64/java.zip";
-            if (!Environment.Is64BitOperatingSystem && OperatingSystem.IsLinux())
-                javaUrl = "https://files.veloe.link/launcher/java/8/linux32/java.zip";
-        }
+        var javaVersion = (versionJson.JavaVersion?.MajorVersion ??
+            (versionJson.Assets == "legacy" ? 8 :
+            throw new ArgumentException("Required Java version was not found in json file.")));
+
+        var javaUrl = $"https://files.veloe.link/launcher/java/{javaVersion}/{(OperatingSystem.IsWindows() ? "windows" : "linux")}{(Environment.Is64BitOperatingSystem ? "64" : "32")}/java.zip";
 
-        if (javaUrl != "")
+        if (await IsFileAvaliable(javaUrl, cancellationToken))
         {
-            Settings.logger.Debug("Downloading Java");
+            _logger.Debug("Downloading Java");
             Parameters.Action.DownloadingFileName("java.zip");
             await DownloadFileAsync(javaUrl, Settings.minecraftForlderPath + "java.zip", cancellationToken, httpClient);
 
-            Settings.logger.Debug("Unpacking Java");
+            _logger.Debug("Unpacking Java");
             Parameters.Action.DownloadingFileName("Unpacking java.zip");
             ZipFile.ExtractToDirectory($"{Settings.minecraftForlderPath}java.zip", Settings.minecraftForlderPath, true);
             File.Delete($"{Settings.minecraftForlderPath}java.zip");
         }
         else
-            Settings.logger.Debug("Required Java version don't found in json file."); //log that java was not downloaded;
+            throw new HttpRequestException("Required Java version was not found on server.");
     }
 
     private async Task<Entity.Version.Version?> GetVersionJson()
@@ -660,24 +623,27 @@ internal class Downloader
             Parameters.Parameter.InstallOptifine = Parameters.Data.SelectedModpack.Optifine;
             Parameters.Parameter.InstallFabric = Parameters.Data.SelectedModpack.Fabric;
 
-            Settings.logger.Debug("Downloading {0}.json", Parameters.Data.SelectedVersion.Id);
+            _logger.Debug("Downloading {0}.json", Parameters.Data.SelectedVersion.Id);
             Parameters.Action.DownloadingFileName($"{Parameters.Data.SelectedVersion.Id}.json");
             return await Downloader.DownloadAndDeserializeJsonData<Entity.Version.Version>(Parameters.Data.SelectedVersion.Url, Settings.minecraftForlderPath + "versions/" + Parameters.Data.SelectedVersion.Id + "/", Parameters.Data.SelectedVersion.Id + ".json");
         }
         else
         {
             Parameters.Action.DownloadingFileName($"{Parameters.Data.SelectedVersion.Id}.json");
-            Settings.logger.Debug("Downloading {0}.json", Parameters.Data.SelectedVersion.Id);
+            _logger.Debug("Downloading {0}.json", Parameters.Data.SelectedVersion.Id);
             return await Downloader.DownloadAndDeserializeJsonData<Entity.Version.Version>(Parameters.Data.SelectedVersion.Url, Settings.minecraftForlderPath + "versions/" + Parameters.Data.SelectedVersion.Id + "/", Parameters.Data.SelectedVersion.Id + ".json");
         }
     }
 
-    public static async Task<T?> DownloadAndDeserializeJsonData<T>(string url, string path = "", string filename = "") where T : new()
+    public static async Task<T?> DownloadAndDeserializeJsonData<T>(string url, string path = "", string filename = "", Serilog.ILogger? logger = null) where T : new()
     {
         string jsonData;
+
+        if (logger is null) logger = Settings.logger;
+
         try
         {
-            Settings.logger.Debug($"Downloading: {url.Split('/').Last()}");
+            logger.Debug($"Downloading: {url.Split('/').Last()}");
             jsonData = await _sHttpClient.GetStringAsync(url);
         }
         catch (Exception ex)
@@ -687,7 +653,7 @@ internal class Downloader
             
         if (string.IsNullOrEmpty(jsonData))
         {
-            Settings.logger.Warning("Empty string!");
+            logger.Warning("Empty string!");
             return new T();
         }
         else
@@ -696,12 +662,12 @@ internal class Downloader
             {
                 if (!Directory.Exists(path))
                 {
-                    Settings.logger.Debug("Creating path: {0}", path);
+                    logger.Debug("Creating path: {0}", path);
                     Directory.CreateDirectory(path);
                 }
                 File.WriteAllText(path + filename, jsonData);
             }
-            //Settings.logger.Debug("Return serialized string.");
+            //_logger.Debug("Return serialized string.");
             return JsonSerializer.Deserialize<T>(jsonData, new JsonSerializerOptions{PropertyNameCaseInsensitive = true});
         }       
     }
@@ -741,7 +707,7 @@ internal class Downloader
         foreach (var library in Parameters.Data.VersionJson.Libraries)
         {
             if (string.IsNullOrEmpty(library.Name) || string.IsNullOrEmpty(library.Url))
-            { continue; }
+                continue; 
 
             var relativePath = StartCommandBuilder.GetLibRelativePathFromName(library.Name);
             var libPath = Settings.minecraftForlderPath + "libraries/" + relativePath;
@@ -756,7 +722,7 @@ internal class Downloader
             if (await IsFileAvaliable($"{library.Url}{relativePath}", ct))
                 await DownloadFileAsync($"{library.Url}{relativePath}", libPath, ct, httpClient);
             else
-                Settings.logger.Warning($"Library {library.Name} url is not accessible. Skipping...");
+                _logger.Warning($"Library {library.Name} url is not accessible. Skipping...");
 
         }
     }

+ 3 - 2
VeloeMinecraftLauncher/VeloeMinecraftLauncher.csproj

@@ -3,14 +3,15 @@
 		<OutputType>WinExe</OutputType>
 		<TargetFramework>net8.0</TargetFramework>
 		<TieredCompilationQuickJit>false</TieredCompilationQuickJit>
+		<JsonSerializerIsReflectionEnabledByDefault>true</JsonSerializerIsReflectionEnabledByDefault>
 		<Nullable>enable</Nullable>
 		<TrimMode>partial</TrimMode>
 		<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
 		<DebugType>embedded</DebugType>
 		<StartupObject>VeloeMinecraftLauncher.Program</StartupObject>
 		<PlatformTarget>x64</PlatformTarget>
-		<AssemblyVersion>1.5.0.19</AssemblyVersion>
-		<FileVersion>1.5.0.19</FileVersion>
+		<AssemblyVersion>1.5.0.29</AssemblyVersion>
+		<FileVersion>1.5.0.29</FileVersion>
 		<Configurations>Debug;Release</Configurations>
 	</PropertyGroup>
 	<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

+ 5 - 7
VeloeMinecraftLauncher/ViewModels/MainWindowViewModel.cs

@@ -59,8 +59,8 @@ public class MainWindowViewModel : ViewModelBase
         }
         catch (Exception ex)
         {
-            OpenErrorWindow(ex);
             _logger ??= new LoggerConfiguration().MinimumLevel.Debug().CreateLogger();
+            OpenErrorWindow(ex);
         }
         finally
         {
@@ -229,8 +229,6 @@ public class MainWindowViewModel : ViewModelBase
     private string _startButtonOutput = string.Empty;
     private CancellationTokenSource _tokenSource = new();
 
-    ILogger _logger;
-
     LatestLauncherVersion? _latestLauncherInfo;
     DownloadedVersion? _downloadedVersion;
     DownloadedVersion? _startedVersion;
@@ -354,7 +352,7 @@ public class MainWindowViewModel : ViewModelBase
 
     public async void OnClickCommand()
     {
-        using var versionsDownloaderViewModel = new VersionsDownloaderViewModel();
+        using var versionsDownloaderViewModel = new VersionsDownloaderViewModel(_logger);
         var versionsDownloader = new VersionsDownloader 
         { 
             DataContext = versionsDownloaderViewModel
@@ -410,12 +408,12 @@ public class MainWindowViewModel : ViewModelBase
                         if (string.IsNullOrEmpty(versionJson.InheritsFrom))
                         {
                             parameters.Data.VersionJson = versionJson;
-                            await new Downloader(parameters).DownloadClient(_tokenSource.Token);
+                            await new Downloader(parameters,_logger).DownloadClient(_tokenSource.Token);
                             result = TaskStatus.RanToCompletion;
                         }
                         else
                         {
-                            var downloader = new Downloader(parameters);
+                            var downloader = new Downloader(parameters,_logger);
                             if (versionJson.Libraries.Any(x => x.Name is not null && x.Name.Contains("fabric")))
                             {
                                 parameters.Data.VersionJson = versionJson;
@@ -725,7 +723,7 @@ public class MainWindowViewModel : ViewModelBase
 
     public void OpenSettings()
     {
-        var settingsWindow = new SettingsWindow { DataContext = new SettingsWindowViewModel() };
+        var settingsWindow = new SettingsWindow { DataContext = new SettingsWindowViewModel(_logger) };
 
         if (Avalonia.Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow is not null)
         {

+ 2 - 2
VeloeMinecraftLauncher/ViewModels/SettingsWindowViewModel.cs

@@ -16,11 +16,11 @@ namespace VeloeMinecraftLauncher.ViewModels;
 
 public class SettingsWindowViewModel : ViewModelBase
 {
-    public SettingsWindowViewModel()
+    public SettingsWindowViewModel(Serilog.ILogger logger)
     {
         LauncherVersion = Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? "unknown";
 
-        var _logger = Settings.logger;
+        _logger = logger;
 
         this.ValidationRule(
             viewModel => viewModel.MaxRam,

+ 4 - 9
VeloeMinecraftLauncher/ViewModels/VersionsDownloaderViewModel.cs

@@ -51,8 +51,6 @@ public class VersionsDownloaderViewModel : ViewModelBase, IDisposable
     /// </summary>
     private CancellationTokenSource _filteredVersionTokenSource = new();
 
-    Serilog.ILogger _logger;
-
     ObservableCollection<Entity.VersionManifest.Version> _filteredVersions;
     ObservableCollection<DownloadedVersion> _downloadedVersions;
     ObservableCollection<Modpack> _modpackVersions;
@@ -66,14 +64,14 @@ public class VersionsDownloaderViewModel : ViewModelBase, IDisposable
     Modpack? _selectedModpack;
     VersionManifest _versionManifest;
 
-    public VersionsDownloaderViewModel()
+    public VersionsDownloaderViewModel(Serilog.ILogger logger)
     {
         IsDownloaderTabControlsEnabled = false;
         IsManagerTabControlsEnabled = false;
 
         this.PropertyChanged += OnFilteredVersionPropertyChanged;
         this.PropertyChanged += OnDownloadedVersionPropertyChanged;
-        _logger = Settings.logger;
+        _logger = logger;
 
         ArgumentNullException.ThrowIfNull(_logger);
 
@@ -421,9 +419,7 @@ public class VersionsDownloaderViewModel : ViewModelBase, IDisposable
                     return TaskStatus.Faulted;
 
                 parameters.Data.SelectedVersion = selectedVersion;
-                parameters.Data.SelectedModpack = _selectedModpack;
-
-                await new Downloader(parameters).DownloadClient(_tokenSource.Token);
+                parameters.Data.SelectedModpack = _selectedModpack;          
             }
             else
             {
@@ -433,9 +429,8 @@ public class VersionsDownloaderViewModel : ViewModelBase, IDisposable
                 parameters.Parameter.InstallOptifine = InstallOptifine;
                 parameters.Parameter.InstallForgeOptifine = InstallForgeOptifine;
                 parameters.Parameter.InstallFabric = InstallFabric;
-
-                await new Downloader(parameters).DownloadClient(_tokenSource.Token);
             }
+            await new Downloader(parameters, _logger).DownloadClient(_tokenSource.Token);
 
             SearchGameFolderForVersions();
             return TaskStatus.RanToCompletion; 

+ 16 - 9
VeloeMinecraftLauncher/ViewModels/ViewModelBase.cs

@@ -17,6 +17,13 @@ namespace VeloeMinecraftLauncher.ViewModels;
 
 public class ViewModelBase : ReactiveValidationObject
 {
+    protected Serilog.ILogger _logger;
+
+    public ViewModelBase(Serilog.ILogger logger)
+    {
+        _logger = logger;
+    }
+
     public ViewModelBase()
     {
         this.RaisePropertyChanged(nameof(InterfaceColor));
@@ -35,7 +42,7 @@ public class ViewModelBase : ReactiveValidationObject
         set => this.RaisePropertyChanged(nameof(MaterialOpacity));
     }
 
-    public static void OpenErrorWindow(Exception ex)
+    public void OpenErrorWindow(Exception ex)
     {
         string message = string.Empty;
         string stackTrace = string.Empty;
@@ -45,36 +52,36 @@ public class ViewModelBase : ReactiveValidationObject
         {
             case WebException or Win32Exception or JavaProcessException or IOException:
                 message = ex.Message;
-                Settings.logger.Error(ex.Message);
+                _logger.Error(ex.Message);
 
                 if (ex is JavaProcessException javaEx && Path.Exists(javaEx.LogPath))
                         logfile = ((JavaProcessException)ex).LogPath;                   
 
                 if (ex.StackTrace is not null)
-                    Settings.logger.Error(ex.StackTrace);
+                    _logger.Error(ex.StackTrace);
                 innerException = ex.InnerException;
                 while (innerException is not null)
                 {
-                    Settings.logger.Error(innerException.Message);
+                    _logger.Error(innerException.Message);
                     if (innerException.StackTrace is not null)
-                        Settings.logger.Error(innerException.StackTrace);
+                        _logger.Error(innerException.StackTrace);
                     innerException = innerException.InnerException;
                 }
                 break;
             default:
                 message = ex.Message;
                 stackTrace = ex.StackTrace ?? string.Empty;
-                Settings.logger.Error(ex.Message);
+                _logger.Error(ex.Message);
                 if (ex.StackTrace is not null)
-                    Settings.logger.Error(ex.StackTrace);
+                    _logger.Error(ex.StackTrace);
                 innerException = ex.InnerException;
                 while (innerException is not null)
                 {
                     message += "\n" + innerException.Message;
                     stackTrace += "\n" + innerException.StackTrace;
-                    Settings.logger.Error(innerException.Message);
+                    _logger.Error(innerException.Message);
                     if (innerException.StackTrace is not null)
-                        Settings.logger.Error(innerException.StackTrace);
+                        _logger.Error(innerException.StackTrace);
                     innerException = innerException.InnerException;
                 }
                 break;