|
@@ -1,7 +1,5 @@
|
|
|
-using Microsoft.Extensions.Logging;
|
|
|
-using System;
|
|
|
+using System;
|
|
|
using System.Collections.Generic;
|
|
|
-using System.Collections.ObjectModel;
|
|
|
using System.IO;
|
|
|
using System.IO.Compression;
|
|
|
using System.Linq;
|
|
@@ -12,9 +10,9 @@ using System.Text.Json;
|
|
|
using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
|
using VeloeMinecraftLauncher.Entity.Assets;
|
|
|
-using VeloeMinecraftLauncher.Models.Entity;
|
|
|
+using VeloeMinecraftLauncher.Utils.Starter;
|
|
|
|
|
|
-namespace VeloeMinecraftLauncher.Utils;
|
|
|
+namespace VeloeMinecraftLauncher.Utils.Downloader;
|
|
|
|
|
|
internal class Downloader
|
|
|
{
|
|
@@ -52,7 +50,7 @@ internal class Downloader
|
|
|
Parameters.Action.TasksStatus($"Task {tasksIterator} of {tasksCount} complete.");
|
|
|
|
|
|
var handler = new HttpClientHandler() { AllowAutoRedirect = true };
|
|
|
-
|
|
|
+
|
|
|
var ph = new ProgressMessageHandler(handler);
|
|
|
ph.HttpSendProgress += (_, args) =>
|
|
|
{
|
|
@@ -83,7 +81,7 @@ internal class Downloader
|
|
|
tasksIterator++;
|
|
|
Parameters.Action.TasksStatus($"Task {tasksIterator} of {tasksCount} complete.");
|
|
|
}
|
|
|
- catch (Exception ex) when (ex is (ArgumentException or HttpRequestException) )
|
|
|
+ catch (Exception ex) when (ex is ArgumentException or HttpRequestException)
|
|
|
{
|
|
|
_logger.Warning(ex.Message);
|
|
|
}
|
|
@@ -102,7 +100,7 @@ internal class Downloader
|
|
|
Parameters.Action.TasksStatus($"Task {tasksIterator} of {tasksCount} complete.");
|
|
|
|
|
|
await DownloadAssets(versionJson, cancellationToken);
|
|
|
-
|
|
|
+
|
|
|
Parameters.Action.SetProgress(100);
|
|
|
tasksIterator++;
|
|
|
Parameters.Action.TasksStatus($"Task {tasksIterator} of {tasksCount} complete.");
|
|
@@ -301,8 +299,8 @@ internal class Downloader
|
|
|
private async Task DownloadAssets(Entity.Version.Version versionJson, CancellationToken cancellationToken)
|
|
|
{
|
|
|
using var httpClient = new HttpClient();
|
|
|
- var assetsJson = await Downloader.DownloadAndDeserializeJsonData<AssetsManifest>(versionJson.AssetIndex.Url);
|
|
|
- var assetsPath = $"{Settings.minecraftForlderPath}{(versionJson.Assets == "pre-1.6" ? "resources" : $"assets/{versionJson.Assets}/objects")}";
|
|
|
+ var assetsJson = await DownloadAndDeserializeJsonData<AssetsManifest>(versionJson.AssetIndex.Url);
|
|
|
+ var assetsPath = $"{Settings.minecraftForlderPath}{(versionJson.Assets == "pre-1.6" ? "resources" : $"assets/{versionJson.Assets}/objects")}";
|
|
|
var assetsUrl = "https://resources.download.minecraft.net/";
|
|
|
|
|
|
//download assets json
|
|
@@ -358,7 +356,7 @@ internal class Downloader
|
|
|
_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);
|
|
|
+ await DownloadFileAsync(assetsUrl + asset.Value.Hash[..2] + "/" + asset.Value.Hash, Path.Combine(assetRoot, folder, name), cancellationToken, httpClient);
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
@@ -386,7 +384,7 @@ internal class Downloader
|
|
|
// getting path and url if universal lib
|
|
|
if (library.Natives is null)
|
|
|
{
|
|
|
- libPath += library.Downloads.Artifact.Path;
|
|
|
+ libPath += library.Downloads.Artifact.Path;
|
|
|
libUrl = library.Downloads.Artifact.Url;
|
|
|
sha1 = library.Downloads.Artifact.Sha1;
|
|
|
}
|
|
@@ -531,8 +529,8 @@ internal class Downloader
|
|
|
if (!(library.Downloads.Classifiers is not null && (
|
|
|
library.Downloads.Classifiers.NativesWindows is not null ||
|
|
|
library.Downloads.Classifiers.NativesWindows64 is not null ||
|
|
|
- (library.Downloads.Classifiers.NativesWindows32 is not null && OperatingSystem.IsWindows()) ||
|
|
|
- (library.Downloads.Classifiers.NativesLinux is not null && OperatingSystem.IsLinux()))))
|
|
|
+ library.Downloads.Classifiers.NativesWindows32 is not null && OperatingSystem.IsWindows() ||
|
|
|
+ library.Downloads.Classifiers.NativesLinux is not null && OperatingSystem.IsLinux())))
|
|
|
continue;
|
|
|
|
|
|
if (!Directory.Exists(Settings.minecraftForlderPath + "versions/" + versionJson.Id + "/natives/"))
|
|
@@ -589,9 +587,9 @@ internal class Downloader
|
|
|
{
|
|
|
_logger.Debug("Getting required Java version.");
|
|
|
|
|
|
- var javaVersion = (versionJson.JavaVersion?.MajorVersion ??
|
|
|
+ var javaVersion = versionJson.JavaVersion?.MajorVersion ??
|
|
|
(versionJson.Assets == "legacy" ? 8 :
|
|
|
- throw new ArgumentException("Required Java version was not found in json file.")));
|
|
|
+ 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";
|
|
|
|
|
@@ -627,13 +625,13 @@ internal class Downloader
|
|
|
|
|
|
_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");
|
|
|
+ return await 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");
|
|
|
_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");
|
|
|
+ return await DownloadAndDeserializeJsonData<Entity.Version.Version>(Parameters.Data.SelectedVersion.Url, Settings.minecraftForlderPath + "versions/" + Parameters.Data.SelectedVersion.Id + "/", Parameters.Data.SelectedVersion.Id + ".json");
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -650,9 +648,9 @@ internal class Downloader
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
- throw new WebException($"An error occured while downloading {url}. Check your internet connection.",ex);
|
|
|
+ throw new WebException($"An error occured while downloading {url}. Check your internet connection.", ex);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if (string.IsNullOrEmpty(jsonData))
|
|
|
{
|
|
|
logger.Warning("Empty string!");
|
|
@@ -670,23 +668,23 @@ internal class Downloader
|
|
|
File.WriteAllText(path + filename, jsonData);
|
|
|
}
|
|
|
//_logger.Debug("Return serialized string.");
|
|
|
- return JsonSerializer.Deserialize<T>(jsonData, new JsonSerializerOptions{PropertyNameCaseInsensitive = true});
|
|
|
- }
|
|
|
+ return JsonSerializer.Deserialize<T>(jsonData, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public static async Task DownloadFileAsync(string url, string path, CancellationToken ct, HttpClient? client = null)
|
|
|
{
|
|
|
client ??= _sHttpClient;
|
|
|
- using HttpResponseMessage response = await client.GetAsync(new System.Uri(url),HttpCompletionOption.ResponseHeadersRead, ct);
|
|
|
+ using HttpResponseMessage response = await client.GetAsync(new Uri(url), HttpCompletionOption.ResponseHeadersRead, ct);
|
|
|
response.EnsureSuccessStatusCode();
|
|
|
using Stream contentStream = await response.Content.ReadAsStreamAsync(ct);
|
|
|
using FileStream fileStream = File.OpenWrite(path);
|
|
|
- await contentStream.CopyToAsync(fileStream,ct);
|
|
|
+ await contentStream.CopyToAsync(fileStream, ct);
|
|
|
}
|
|
|
|
|
|
public static async Task<bool> IsFileAvaliable(string url, CancellationToken ct)
|
|
|
{
|
|
|
- using HttpResponseMessage response = await _sHttpClient.GetAsync(new System.Uri(url), HttpCompletionOption.ResponseHeadersRead, ct);
|
|
|
+ using HttpResponseMessage response = await _sHttpClient.GetAsync(new Uri(url), HttpCompletionOption.ResponseHeadersRead, ct);
|
|
|
return response.IsSuccessStatusCode;
|
|
|
}
|
|
|
|
|
@@ -709,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;
|