using System.Security.Cryptography; using DTLib.Extensions; using Млаумчерб.Клиент.классы; using static Млаумчерб.Клиент.сеть.Сеть; namespace Млаумчерб.Клиент.сеть.NetworkTaskFactories; public class VersionFileDownloadTaskFactory : INetworkTaskFactory { private VersionDescriptor _descriptor; private IOPath _filePath; private SHA1 _hasher; public VersionFileDownloadTaskFactory(VersionDescriptor descriptor) { _descriptor = descriptor; _filePath = Пути.GetVersionJarFilePath(_descriptor.id); _hasher = SHA1.Create(); } public Task CreateAsync(bool checkHashes) { NetworkTask? networkTask = null; if (!CheckFiles(checkHashes)) networkTask = new NetworkTask( $"version file '{_descriptor.id}'", GetTotalSize(), Download ); return Task.FromResult(networkTask); } private bool CheckFiles(bool checkHashes) { if (!File.Exists(_filePath)) return false; if (!checkHashes) return true; using var fs = File.OpenRead(_filePath); string hash = _hasher.ComputeHash(fs).HashToString(); return hash == _descriptor.downloads.client.sha1; } private long GetTotalSize() { return _descriptor.downloads.client.size; } private Task Download(NetworkProgressReporter pr, CancellationToken ct) { return DownloadFileHTTP(_descriptor.downloads.client.url, _filePath, ct, pr.AddBytesCount); } }