rework a lot of stuff: downloads, how to watch a player
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user