rework a lot of stuff: downloads, how to watch a player

This commit is contained in:
Stanley Dimant
2022-06-30 13:24:35 +02:00
parent eb39429777
commit 3618540402
18 changed files with 319 additions and 233 deletions

View File

@@ -6,6 +6,7 @@ using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Dalamud.Logging;
using LZ4;
using MareSynchronos.API;
using MareSynchronos.FileCacheDB;
@@ -49,31 +50,60 @@ namespace MareSynchronos.WebAPI
public async Task DownloadFiles(List<FileReplacementDto> fileReplacementDto, CancellationToken ct)
{
IsDownloading = true;
Logger.Debug("Downloading files");
List<FileTransfer> fileTransferList = new List<FileTransfer>();
List<DownloadFileDto> downloadFiles = new List<DownloadFileDto>();
foreach (var file in fileReplacementDto)
{
var downloadFileDto = await _fileHub!.InvokeAsync<DownloadFileDto>("GetFileSize", file.Hash, ct);
CurrentDownloads.Add(new FileTransfer
downloadFiles.Add(await _fileHub!.InvokeAsync<DownloadFileDto>("GetFileSize", file.Hash, ct));
/*var downloadFileDto = ;
var downloadFileTransfer = new DownloadFileTransfer(downloadFileDto);
if (CurrentDownloads.Any(f => f.Hash == downloadFileTransfer.Hash))
{
Total = downloadFileDto.Size,
Hash = downloadFileDto.Hash
});
}
if (fileTransferList.All(f => f.Hash != downloadFileTransfer.Hash))
{
fileTransferList.Add(downloadFileTransfer);
}
List<string> downloadedHashes = new();
foreach (var file in fileReplacementDto.Where(f => CurrentDownloads.Single(t => f.Hash == t.Hash).Transferred > 0))
{
if (downloadedHashes.Contains(file.Hash))
{
continue;
}
if (fileTransferList.All(f => f.Hash != downloadFileTransfer.Hash))
{
fileTransferList.Add(downloadFileTransfer);
}
CurrentDownloads.Add(new DownloadFileTransfer(downloadFileDto));*/
}
downloadFiles = downloadFiles.Distinct().ToList();
foreach (var dto in downloadFiles)
{
var downloadFileTransfer = new DownloadFileTransfer(dto);
if (CurrentDownloads.All(f => f.Hash != downloadFileTransfer.Hash))
{
CurrentDownloads.Add(downloadFileTransfer);
}
fileTransferList.Add(downloadFileTransfer);
}
foreach (var file in CurrentDownloads.Where(c => c.IsForbidden))
{
if (ForbiddenTransfers.All(f => f.Hash != file.Hash))
{
ForbiddenTransfers.Add(file);
}
}
foreach (var file in fileTransferList.Where(f => f.CanBeTransferred))
{
var hash = file.Hash;
var tempFile = await DownloadFile(hash, ct);
if (ct.IsCancellationRequested)
{
File.Delete(tempFile);
CurrentDownloads.RemoveAll(d => fileReplacementDto.Any(f => f.Hash == d.Hash));
break;
}
@@ -94,7 +124,6 @@ namespace MareSynchronos.WebAPI
fi.CreationTime = RandomDayFunc().Invoke();
fi.LastAccessTime = RandomDayFunc().Invoke();
fi.LastWriteTime = RandomDayFunc().Invoke();
downloadedHashes.Add(hash);
}
var allFilesInDb = false;
@@ -102,14 +131,81 @@ namespace MareSynchronos.WebAPI
{
await using (var db = new FileCacheContext())
{
allFilesInDb = downloadedHashes.All(h => db.FileCaches.Any(f => f.Hash == h));
allFilesInDb = fileTransferList.Where(c => c.CanBeTransferred).All(h => db.FileCaches.Any(f => f.Hash == h.Hash));
}
await Task.Delay(250, ct);
}
CurrentDownloads.Clear();
IsDownloading = false;
CurrentDownloads.RemoveAll(d => d.Transferred == d.Total);
}
public async Task SendCharacterData(CharacterCacheDto character, List<string> visibleCharacterIds)
{
if (!IsConnected || SecretKey == "-") return;
Logger.Debug("Sending Character data to service " + ApiUri);
CancelUpload();
_uploadCancellationTokenSource = new CancellationTokenSource();
var uploadToken = _uploadCancellationTokenSource.Token;
Logger.Verbose("New Token Created");
var filesToUpload = await _fileHub!.InvokeAsync<List<UploadFileDto>>("SendFiles", character.FileReplacements.Select(c => c.Hash).Distinct(), uploadToken);
foreach (var file in filesToUpload.Where(f => !f.IsForbidden))
{
await using var db = new FileCacheContext();
CurrentUploads.Add(new UploadFileTransfer(file)
{
Total = new FileInfo(db.FileCaches.First(f => f.Hash == file.Hash).Filepath).Length
});
}
foreach (var file in CurrentUploads.Where(c => c.IsForbidden))
{
if (ForbiddenTransfers.All(f => f.Hash != file.Hash))
{
ForbiddenTransfers.Add(file);
}
}
Logger.Verbose("Compressing and uploading files");
foreach (var file in CurrentUploads.Where(f => f.CanBeTransferred && !f.IsTransferred))
{
Logger.Verbose("Compressing and uploading " + file);
var data = await GetCompressedFileData(file.Hash, uploadToken);
CurrentUploads.Single(e => e.Hash == data.Item1).Total = data.Item2.Length;
_ = UploadFile(data.Item2, file.Hash, uploadToken);
if (!uploadToken.IsCancellationRequested) continue;
Logger.Warn("Cancel in filesToUpload loop detected");
CurrentUploads.Clear();
break;
}
Logger.Verbose("Upload tasks complete, waiting for server to confirm");
var anyUploadsOpen = await _fileHub!.InvokeAsync<bool>("IsUploadFinished", uploadToken);
Logger.Verbose("Uploads open: " + anyUploadsOpen);
while (anyUploadsOpen && !uploadToken.IsCancellationRequested)
{
anyUploadsOpen = await _fileHub!.InvokeAsync<bool>("IsUploadFinished", uploadToken);
await Task.Delay(TimeSpan.FromSeconds(0.5), uploadToken);
Logger.Verbose("Waiting for uploads to finish");
}
CurrentUploads.Clear();
if (!uploadToken.IsCancellationRequested)
{
Logger.Verbose("=== Pushing character data ===");
await _userHub!.InvokeAsync("PushCharacterData", character, visibleCharacterIds, uploadToken);
}
else
{
Logger.Warn("=== Upload operation was cancelled ===");
}
Logger.Verbose("Upload complete for " + character.Hash);
_uploadCancellationTokenSource = null;
}
private async Task<(string, byte[])> GetCompressedFileData(string fileHash, CancellationToken uploadToken)