56 lines
2.0 KiB
C#
56 lines
2.0 KiB
C#
using System.Security.Cryptography;
|
||
using DTLib.Extensions;
|
||
using Млаумчерб.Клиент.видимое;
|
||
using Млаумчерб.Клиент.классы;
|
||
using static Млаумчерб.Клиент.сеть.Сеть;
|
||
|
||
namespace Млаумчерб.Клиент.сеть.NetworkTaskFactories;
|
||
|
||
public class VersionFileDownloadTaskFactory : INetworkTaskFactory
|
||
{
|
||
private GameVersionDescriptor _descriptor;
|
||
private IOPath _filePath;
|
||
private SHA1 _hasher;
|
||
|
||
public VersionFileDownloadTaskFactory(GameVersionDescriptor descriptor)
|
||
{
|
||
_descriptor = descriptor;
|
||
_filePath = Пути.GetVersionJarFilePath(_descriptor.id);
|
||
_hasher = SHA1.Create();
|
||
}
|
||
|
||
public Task<NetworkTask?> 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 async Task Download(NetworkProgressReporter pr, CancellationToken ct)
|
||
{
|
||
Приложение.Логгер.LogInfo(nameof(Сеть), $"started downloading version file '{_descriptor.id}'");
|
||
await DownloadFileHTTP(_descriptor.downloads.client.url, _filePath, ct, pr.AddBytesCount);
|
||
Приложение.Логгер.LogInfo(nameof(Сеть), $"finished downloading version file '{_descriptor.id}'");
|
||
}
|
||
} |