some fixes for models sharing materials and code cleanup

This commit is contained in:
Stanley Dimant
2022-06-28 12:20:40 +02:00
parent 1021cca912
commit 3ee082d371
9 changed files with 95 additions and 170 deletions

View File

@@ -1,5 +1,7 @@
using System; using System;
using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq;
using System.Threading; using System.Threading;
using FFXIVClientStructs.FFXIV.Client.Game.Character; using FFXIVClientStructs.FFXIV.Client.Game.Character;
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
@@ -25,9 +27,33 @@ namespace MareSynchronos.Factories
_ipcManager = ipcManager; _ipcManager = ipcManager;
} }
private FileReplacement CreateBaseFileReplacement() private FileReplacement CreateFileReplacement(string path)
{ {
return new FileReplacement(_ipcManager.PenumbraModDirectory()!); var fileReplacement = new FileReplacement(_ipcManager.PenumbraModDirectory()!);
if (!path.Contains(".tex", StringComparison.OrdinalIgnoreCase))
{
fileReplacement.GamePaths =
_ipcManager.PenumbraReverseResolvePath(path, _dalamudUtil.PlayerName).ToList();
fileReplacement.SetResolvedPath(path);
}
else
{
fileReplacement.GamePaths = new List<string> { path };
fileReplacement.SetResolvedPath(_ipcManager.PenumbraResolvePath(path, _dalamudUtil.PlayerName)!);
if (!fileReplacement.HasFileReplacement)
{
// try resolving tex with -- in name instead
path = path.Insert(path.LastIndexOf('/') + 1, "--");
var reResolvedPath = _ipcManager.PenumbraResolvePath(path, _dalamudUtil.PlayerName)!;
if (reResolvedPath != path)
{
fileReplacement.GamePaths = new List<string>() { path };
fileReplacement.SetResolvedPath(reResolvedPath);
}
}
}
return fileReplacement;
} }
public CharacterData BuildCharacterData() public CharacterData BuildCharacterData()
@@ -55,9 +81,9 @@ namespace MareSynchronos.Factories
ManipulationString = _ipcManager.PenumbraGetMetaManipulations(_dalamudUtil.PlayerName) ManipulationString = _ipcManager.PenumbraGetMetaManipulations(_dalamudUtil.PlayerName)
}; };
var model = (CharacterBase*)((Character*)_dalamudUtil.PlayerPointer)->GameObject.GetDrawObject(); var model = (CharacterBase*)((Character*)_dalamudUtil.PlayerPointer)->GameObject.GetDrawObject();
for (var idx = 0; idx < model->SlotCount; ++idx) for (var mdlIdx = 0; mdlIdx < model->SlotCount; ++mdlIdx)
{ {
var mdl = (RenderModel*)model->ModelArray[idx]; var mdl = (RenderModel*)model->ModelArray[mdlIdx];
if (mdl == null || mdl->ResourceHandle == null || mdl->ResourceHandle->Category != ResourceCategory.Chara) if (mdl == null || mdl->ResourceHandle == null || mdl->ResourceHandle->Category != ResourceCategory.Chara)
{ {
continue; continue;
@@ -65,58 +91,40 @@ namespace MareSynchronos.Factories
var mdlPath = new Utf8String(mdl->ResourceHandle->FileName()).ToString(); var mdlPath = new Utf8String(mdl->ResourceHandle->FileName()).ToString();
FileReplacement cachedMdlResource = CreateBaseFileReplacement(); FileReplacement mdlFileReplacement = CreateFileReplacement(mdlPath);
cachedMdlResource.GamePaths = _ipcManager.PenumbraReverseResolvePath(mdlPath, _dalamudUtil.PlayerName); Logger.Verbose("Model " + string.Join(", ", mdlFileReplacement.GamePaths));
//Logger.Debug("Model " + string.Join(", ", cachedMdlResource.GamePaths)); Logger.Verbose("\t\t=> " + mdlFileReplacement.ResolvedPath);
cachedMdlResource.SetResolvedPath(mdlPath);
//Logger.Debug("\t\t=> " + cachedMdlResource.ResolvedPath);
cache.AddAssociatedResource(cachedMdlResource, null!, null!); cache.AddFileReplacement(mdlFileReplacement);
for (int mtrlIdx = 0; mtrlIdx < mdl->MaterialCount; mtrlIdx++) for (var mtrlIdx = 0; mtrlIdx < mdl->MaterialCount; mtrlIdx++)
{ {
var mtrl = (Material*)mdl->Materials[mtrlIdx]; var mtrl = (Material*)mdl->Materials[mtrlIdx];
if (mtrl == null) continue; if (mtrl == null) continue;
//var mtrlFileResource = factory.CreateBaseFileReplacement();
var mtrlPath = new Utf8String(mtrl->ResourceHandle->FileName()).ToString().Split("|")[2]; var mtrlPath = new Utf8String(mtrl->ResourceHandle->FileName()).ToString().Split("|")[2];
var cachedMtrlResource = CreateBaseFileReplacement(); var mtrlFileReplacement = CreateFileReplacement(mtrlPath);
cachedMtrlResource.GamePaths = _ipcManager.PenumbraReverseResolvePath(mtrlPath, _dalamudUtil.PlayerName); Logger.Verbose("\tMaterial " + string.Join(", ", mtrlFileReplacement.GamePaths));
//Logger.Debug("\tMaterial " + string.Join(", ", cachedMtrlResource.GamePaths)); Logger.Verbose("\t\t\t=> " + mtrlFileReplacement.ResolvedPath);
cachedMtrlResource.SetResolvedPath(mtrlPath); cache.AddFileReplacement(mtrlFileReplacement);
cache.AddAssociatedResource(cachedMtrlResource, cachedMdlResource, null!);
//Logger.Debug("\t\t\t=> " + cachedMtrlResource.ResolvedPath);
var mtrlResource = (MtrlResource*)mtrl->ResourceHandle; var mtrlResourceHandle = (MtrlResource*)mtrl->ResourceHandle;
for (int resIdx = 0; resIdx < mtrlResource->NumTex; resIdx++) for (var resIdx = 0; resIdx < mtrlResourceHandle->NumTex; resIdx++)
{ {
var texPath = new Utf8String(mtrlResource->TexString(resIdx)).ToString(); var texPath = new Utf8String(mtrlResourceHandle->TexString(resIdx)).ToString();
if (string.IsNullOrEmpty(texPath.ToString())) continue; if (string.IsNullOrEmpty(texPath)) continue;
var cachedTexResource = CreateBaseFileReplacement(); var texFileReplacement = CreateFileReplacement(texPath);
cachedTexResource.GamePaths = new[] { texPath }; Logger.Verbose("\t\tTexture " + string.Join(", ", texFileReplacement.GamePaths));
cachedTexResource.SetResolvedPath(_ipcManager.PenumbraResolvePath(texPath, _dalamudUtil.PlayerName)!); Logger.Verbose("\t\t\t\t=> " + texFileReplacement.ResolvedPath);
if (!cachedTexResource.HasFileReplacement) cache.AddFileReplacement(texFileReplacement);
{
// try resolving tex with -- in name instead
texPath = texPath.Insert(texPath.LastIndexOf('/') + 1, "--");
var reResolvedPath = _ipcManager.PenumbraResolvePath(texPath, _dalamudUtil.PlayerName)!;
if (reResolvedPath != texPath)
{
cachedTexResource.GamePaths = new[] { texPath };
cachedTexResource.SetResolvedPath(reResolvedPath);
}
}
//Logger.Debug("\t\tTexture " + string.Join(", ", cachedTexResource.GamePaths));
//Logger.Debug("\t\t\t\t=> " + cachedTexResource.ResolvedPath);
cache.AddAssociatedResource(cachedTexResource, cachedMdlResource, cachedMtrlResource);
} }
} }
} }
st.Stop(); st.Stop();
Logger.Debug("Building Character Data took " + st.Elapsed); Logger.Verbose("Building Character Data took " + st.Elapsed);
return cache; return cache;
} }

View File

@@ -113,21 +113,21 @@ namespace MareSynchronos.Managers
public void GlamourerApplyAll(string customization, string characterName) public void GlamourerApplyAll(string customization, string characterName)
{ {
if (!CheckGlamourerApi()) return; if (!CheckGlamourerApi()) return;
Logger.Debug("GlamourerString: " + customization); Logger.Debug("Glamourer apply all to " + characterName);
_glamourerApplyAll!.InvokeAction(customization, characterName); _glamourerApplyAll!.InvokeAction(customization, characterName);
} }
public void GlamourerApplyOnlyEquipment(string customization, string characterName) public void GlamourerApplyOnlyEquipment(string customization, string characterName)
{ {
if (!CheckGlamourerApi()) return; if (!CheckGlamourerApi()) return;
Logger.Debug("GlamourerString: " + customization); Logger.Debug("Glamourer apply only equipment to " + characterName);
_glamourerApplyOnlyEquipment!.InvokeAction(customization, characterName); _glamourerApplyOnlyEquipment!.InvokeAction(customization, characterName);
} }
public void GlamourerApplyOnlyCustomization(string customization, string characterName) public void GlamourerApplyOnlyCustomization(string customization, string characterName)
{ {
if (!CheckGlamourerApi()) return; if (!CheckGlamourerApi()) return;
Logger.Debug("GlamourerString: " + customization); Logger.Debug("Glamourer apply only customization to " + characterName);
_glamourerApplyOnlyCustomization!.InvokeAction(customization, characterName); _glamourerApplyOnlyCustomization!.InvokeAction(customization, characterName);
} }
@@ -148,7 +148,6 @@ namespace MareSynchronos.Managers
if (!CheckPenumbraApi()) return string.Empty; if (!CheckPenumbraApi()) return string.Empty;
Logger.Debug("Creating temp collection for " + characterName); Logger.Debug("Creating temp collection for " + characterName);
var ret = _penumbraCreateTemporaryCollection.InvokeFunc("MareSynchronos", characterName, true); var ret = _penumbraCreateTemporaryCollection.InvokeFunc("MareSynchronos", characterName, true);
Logger.Debug("Penumbra ret: " + ret.Item1);
return ret.Item2; return ret.Item2;
} }
@@ -198,13 +197,6 @@ namespace MareSynchronos.Managers
if (!CheckPenumbraApi()) return; if (!CheckPenumbraApi()) return;
Logger.Debug("Assigning temp mods for " + collectionName); Logger.Debug("Assigning temp mods for " + collectionName);
Logger.Debug("ManipulationString: " + manipulationData);
var orderedModPaths = modPaths.OrderBy(p => p.Key.EndsWith(".mdl") ? 0 : p.Key.EndsWith(".mtrl") ? 1 : 2)
.ToDictionary(k => k.Key, k => k.Value);
foreach (var item in orderedModPaths)
{
//Logger.Debug(item.Key + " => " + item.Value);
}
var ret = _penumbraSetTemporaryMod.InvokeFunc("MareSynchronos", collectionName, modPaths, manipulationData, 0); var ret = _penumbraSetTemporaryMod.InvokeFunc("MareSynchronos", collectionName, modPaths, manipulationData, 0);
Logger.Debug("Penumbra Ret: " + ret.ToString()); Logger.Debug("Penumbra Ret: " + ret.ToString());
} }

View File

@@ -20,7 +20,6 @@ namespace MareSynchronos.Managers
private readonly DalamudUtil _dalamudUtil; private readonly DalamudUtil _dalamudUtil;
private readonly IpcManager _ipcManager; private readonly IpcManager _ipcManager;
private string _lastSentHash = string.Empty; private string _lastSentHash = string.Empty;
private Task? _playerChangedTask;
private CancellationTokenSource? _playerChangedCts; private CancellationTokenSource? _playerChangedCts;
public PlayerManager(ApiController apiController, IpcManager ipcManager, public PlayerManager(ApiController apiController, IpcManager ipcManager,
@@ -68,8 +67,8 @@ namespace MareSynchronos.Managers
_cachedPlayersManager.AddInitialPairs(apiTask.Result); _cachedPlayersManager.AddInitialPairs(apiTask.Result);
_ipcManager.PenumbraRedrawEvent += IpcManager_PenumbraRedrawEvent; _ipcManager.PenumbraRedrawEvent += IpcManager_PenumbraRedrawEvent;
_ipcManager.PenumbraRedraw(_dalamudUtil.PlayerName);
_dalamudUtil.PlayerChanged += Watcher_PlayerChanged; _dalamudUtil.PlayerChanged += Watcher_PlayerChanged;
PlayerChanged(_dalamudUtil.PlayerName);
} }
private void ApiController_Disconnected(object? sender, EventArgs args) private void ApiController_Disconnected(object? sender, EventArgs args)
@@ -111,24 +110,18 @@ namespace MareSynchronos.Managers
private void PlayerChanged(string name) private void PlayerChanged(string name)
{ {
//if (sender == null) return;
Logger.Debug("Player changed: " + name); Logger.Debug("Player changed: " + name);
_playerChangedCts?.Cancel(); _playerChangedCts?.Cancel();
_playerChangedCts = new CancellationTokenSource(); _playerChangedCts = new CancellationTokenSource();
var token = _playerChangedCts.Token;/* var token = _playerChangedCts.Token;
if (_playerChangedTask is { IsCompleted: false })
{
PluginLog.Warning("PlayerChanged Task still running");
return;
}*/
if (!_ipcManager.Initialized) if (!_ipcManager.Initialized)
{ {
PluginLog.Warning("Penumbra not active, doing nothing."); Logger.Warn("Penumbra not active, doing nothing.");
return; return;
} }
_playerChangedTask = Task.Run(async () => Task.Run(async () =>
{ {
int attempts = 0; int attempts = 0;
while (!_apiController.IsConnected && attempts < 10 && !token.IsCancellationRequested) while (!_apiController.IsConnected && attempts < 10 && !token.IsCancellationRequested)

View File

@@ -146,7 +146,6 @@ public class CachedPlayer
Logger.Debug( Logger.Debug(
$"Request Redraw for {PlayerName}"); $"Request Redraw for {PlayerName}");
_ipcManager.PenumbraSetTemporaryMods(tempCollection, moddedPaths, cache.ManipulationData); _ipcManager.PenumbraSetTemporaryMods(tempCollection, moddedPaths, cache.ManipulationData);
_ipcManager.GlamourerRevertCharacterCustomization(PlayerName!);
_ipcManager.GlamourerApplyAll(cache.GlamourerData, PlayerName!); _ipcManager.GlamourerApplyAll(cache.GlamourerData, PlayerName!);
} }
@@ -164,7 +163,6 @@ public class CachedPlayer
_ipcManager.PenumbraRemoveTemporaryCollection(PlayerName); _ipcManager.PenumbraRemoveTemporaryCollection(PlayerName);
if (IsVisible) if (IsVisible)
{ {
_ipcManager.GlamourerRevertCharacterCustomization(PlayerName);
_ipcManager.GlamourerApplyOnlyCustomization(_originalGlamourerData, PlayerName); _ipcManager.GlamourerApplyOnlyCustomization(_originalGlamourerData, PlayerName);
_ipcManager.GlamourerApplyOnlyEquipment(_lastGlamourerData, PlayerName); _ipcManager.GlamourerApplyOnlyEquipment(_lastGlamourerData, PlayerName);
} }

View File

@@ -1,10 +1,8 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using MareSynchronos.API; using MareSynchronos.API;
using MareSynchronos.Utils;
namespace MareSynchronos.Models namespace MareSynchronos.Models
{ {
@@ -12,12 +10,7 @@ namespace MareSynchronos.Models
public class CharacterData public class CharacterData
{ {
[JsonProperty] [JsonProperty]
public List<FileReplacement> AllReplacements => public List<FileReplacement> AllReplacements => FileReplacements.Where(f => f.HasFileReplacement).GroupBy(f => f.Hash).Select(g => g.First()).ToList();
FileReplacements.Where(f => f.HasFileReplacement)
.Concat(FileReplacements.SelectMany(f => f.Associated)).Where(f => f.HasFileReplacement)
.Concat(FileReplacements.SelectMany(f => f.Associated).SelectMany(f => f.Associated)).Where(f => f.HasFileReplacement)
.Distinct().OrderBy(f => f.GamePaths[0])
.ToList();
[JsonProperty] [JsonProperty]
public string CacheHash { get; set; } = string.Empty; public string CacheHash { get; set; } = string.Empty;
@@ -34,53 +27,18 @@ namespace MareSynchronos.Models
public string ManipulationString { get; set; } = string.Empty; public string ManipulationString { get; set; } = string.Empty;
public void AddAssociatedResource(FileReplacement resource, FileReplacement? mdlParent, FileReplacement? mtrlParent) public void AddFileReplacement(FileReplacement fileReplacement)
{ {
try if (!fileReplacement.HasFileReplacement) return;
{
if (mdlParent == null)
{
resource.IsInUse = true;
FileReplacements.Add(resource);
return;
}
var mdlReplacements = FileReplacements.Where(f => f == mdlParent && mtrlParent == null); var existingReplacement = FileReplacements.SingleOrDefault(f => f.ResolvedPath == fileReplacement.ResolvedPath);
foreach (var mdlReplacement in mdlReplacements) if (existingReplacement != null)
{
mdlReplacement.AddAssociated(resource);
}
var mtrlReplacements = FileReplacements.Where(f => f == mdlParent).SelectMany(a => a.Associated).Where(f => f == mtrlParent);
foreach (var mtrlReplacement in mtrlReplacements)
{
mtrlReplacement.AddAssociated(resource);
}
}
catch (Exception ex)
{ {
Logger.Debug(ex.Message); existingReplacement.GamePaths.AddRange(fileReplacement.GamePaths.Where(e => !existingReplacement.GamePaths.Contains(e)));
} }
} else
public void Invalidate(List<FileReplacement>? fileReplacements = null)
{
try
{ {
var fileReplacement = fileReplacements ?? FileReplacements.ToList(); FileReplacements.Add(fileReplacement);
foreach (var item in fileReplacement)
{
item.IsInUse = false;
Invalidate(item.Associated);
if (FileReplacements.Contains(item))
{
FileReplacements.Remove(item);
}
}
}
catch (Exception ex)
{
Logger.Debug(ex.Message);
} }
} }
@@ -95,6 +53,7 @@ namespace MareSynchronos.Models
ManipulationData = ManipulationString ManipulationData = ManipulationString
}; };
} }
public override string ToString() public override string ToString()
{ {
StringBuilder stringBuilder = new(); StringBuilder stringBuilder = new();

View File

@@ -24,14 +24,12 @@ namespace MareSynchronos.Models
this._penumbraDirectory = penumbraDirectory; this._penumbraDirectory = penumbraDirectory;
} }
public List<FileReplacement> Associated { get; set; } = new(); public bool Computed => (_computationTask == null || (_computationTask?.IsCompleted ?? true));
public bool Computed => (_computationTask == null || (_computationTask?.IsCompleted ?? true)) && Associated.All(f => f.Computed);
[JsonProperty] [JsonProperty]
public string[] GamePaths { get; set; } = Array.Empty<string>(); public List<string> GamePaths { get; set; } = new();
public bool HasFileReplacement => GamePaths.Length >= 1 && GamePaths[0] != ResolvedPath; public bool HasFileReplacement => GamePaths.Count >= 1 && GamePaths.Any(p => p != ResolvedPath);
[JsonProperty] [JsonProperty]
public string Hash { get; set; } = string.Empty; public string Hash { get; set; } = string.Empty;
@@ -43,35 +41,7 @@ namespace MareSynchronos.Models
[JsonProperty] [JsonProperty]
public string ResolvedPath { get; set; } = string.Empty; public string ResolvedPath { get; set; } = string.Empty;
public void AddAssociated(FileReplacement fileReplacement)
{
fileReplacement.IsInUse = true;
Associated.Add(fileReplacement);
}
public override bool Equals(object? obj)
{
if (obj == null) return true;
if (obj.GetType() == typeof(FileReplacement))
{
return Hash == ((FileReplacement)obj).Hash;
}
return base.Equals(obj);
}
public override int GetHashCode()
{
int result = 13;
result *= 397;
result += Hash.GetHashCode();
result += ResolvedPath.GetHashCode();
return result;
}
public void SetResolvedPath(string path) public void SetResolvedPath(string path)
{ {
ResolvedPath = path.ToLower().Replace('/', '\\').Replace(_penumbraDirectory, "").Replace('\\', '/'); ResolvedPath = path.ToLower().Replace('/', '\\').Replace(_penumbraDirectory, "").Replace('\\', '/');
@@ -113,7 +83,7 @@ namespace MareSynchronos.Models
{ {
return new FileReplacementDto return new FileReplacementDto
{ {
GamePaths = GamePaths, GamePaths = GamePaths.ToArray(),
Hash = Hash, Hash = Hash,
}; };
} }
@@ -121,14 +91,6 @@ namespace MareSynchronos.Models
{ {
StringBuilder builder = new(); StringBuilder builder = new();
builder.AppendLine($"Modded: {HasFileReplacement} - {string.Join(",", GamePaths)} => {ResolvedPath}"); builder.AppendLine($"Modded: {HasFileReplacement} - {string.Join(",", GamePaths)} => {ResolvedPath}");
foreach (var l1 in Associated)
{
builder.AppendLine($" + Modded: {l1.HasFileReplacement} - {string.Join(",", l1.GamePaths)} => {l1.ResolvedPath}");
foreach (var l2 in l1.Associated)
{
builder.AppendLine($" + Modded: {l2.HasFileReplacement} - {string.Join(",", l2.GamePaths)} => {l2.ResolvedPath}");
}
}
return builder.ToString(); return builder.ToString();
} }

View File

@@ -184,7 +184,7 @@ namespace MareSynchronos.UI
{ {
_pluginConfiguration.FullPause = false; _pluginConfiguration.FullPause = false;
_pluginConfiguration.Save(); _pluginConfiguration.Save();
Task.WaitAll(_apiController.Register()); Task.Run(_apiController.Register);
} }
} }
else else

View File

@@ -16,5 +16,11 @@ namespace MareSynchronos.Utils
var caller = new StackTrace().GetFrame(1)?.GetMethod()?.ReflectedType?.Name ?? "Unknown"; var caller = new StackTrace().GetFrame(1)?.GetMethod()?.ReflectedType?.Name ?? "Unknown";
PluginLog.Warning($"[{caller}] {warn}"); PluginLog.Warning($"[{caller}] {warn}");
} }
public static void Verbose(string verbose)
{
var caller = new StackTrace().GetFrame(1)?.GetMethod()?.ReflectedType?.Name ?? "Unknown";
PluginLog.Verbose($"[{caller}] {verbose}");
}
} }
} }

View File

@@ -13,6 +13,7 @@ using MareSynchronos.API;
using MareSynchronos.FileCacheDB; using MareSynchronos.FileCacheDB;
using MareSynchronos.Utils; using MareSynchronos.Utils;
using Microsoft.AspNetCore.SignalR.Client; using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.EntityFrameworkCore.Metadata.Conventions;
namespace MareSynchronos.WebAPI namespace MareSynchronos.WebAPI
{ {
@@ -226,7 +227,7 @@ namespace MareSynchronos.WebAPI
{ {
if (_uploadCancellationTokenSource != null) if (_uploadCancellationTokenSource != null)
{ {
PluginLog.Warning("Cancelling upload"); Logger.Warn("Cancelling upload");
_uploadCancellationTokenSource?.Cancel(); _uploadCancellationTokenSource?.Cancel();
_fileHub!.InvokeAsync("AbortUpload"); _fileHub!.InvokeAsync("AbortUpload");
} }
@@ -319,7 +320,7 @@ namespace MareSynchronos.WebAPI
public Task ReceiveCharacterData(CharacterCacheDto character, string characterHash) public Task ReceiveCharacterData(CharacterCacheDto character, string characterHash)
{ {
Logger.Debug("Received DTO for " + characterHash); Logger.Verbose("Received DTO for " + characterHash);
CharacterReceived?.Invoke(null, new CharacterReceivedEventArgs(characterHash, character)); CharacterReceived?.Invoke(null, new CharacterReceivedEventArgs(characterHash, character));
return Task.CompletedTask; return Task.CompletedTask;
} }
@@ -342,33 +343,39 @@ namespace MareSynchronos.WebAPI
CancelUpload(); CancelUpload();
_uploadCancellationTokenSource = new CancellationTokenSource(); _uploadCancellationTokenSource = new CancellationTokenSource();
var uploadToken = _uploadCancellationTokenSource.Token; var uploadToken = _uploadCancellationTokenSource.Token;
Logger.Debug("New Token Created"); Logger.Verbose("New Token Created");
var filesToUpload = await _fileHub!.InvokeAsync<List<string>>("SendFiles", character.FileReplacements.Select(c => c.Hash).Distinct(), uploadToken); var filesToUpload = await _fileHub!.InvokeAsync<List<string>>("SendFiles", character.FileReplacements.Select(c => c.Hash).Distinct(), uploadToken);
IsUploading = true; IsUploading = true;
Logger.Debug("Compressing files");
foreach (var file in filesToUpload) foreach (var file in filesToUpload)
{ {
Logger.Debug(file); await using var db = new FileCacheContext();
CurrentUploads[file] = (0, new FileInfo(db.FileCaches.First(f => f.Hash == file).Filepath).Length);
}
Logger.Verbose("Compressing and uploading files");
foreach (var file in filesToUpload)
{
Logger.Verbose("Compressing and uploading " + file);
var data = await GetCompressedFileData(file, uploadToken); var data = await GetCompressedFileData(file, uploadToken);
CurrentUploads[data.Item1] = (0, data.Item2.Length); CurrentUploads[data.Item1] = (0, data.Item2.Length);
_ = UploadFile(data.Item2, file, uploadToken); _ = UploadFile(data.Item2, file, uploadToken);
if (!uploadToken.IsCancellationRequested) continue; if (!uploadToken.IsCancellationRequested) continue;
PluginLog.Warning("Cancel in filesToUpload loop detected"); Logger.Warn("Cancel in filesToUpload loop detected");
CurrentUploads.Clear(); CurrentUploads.Clear();
break; break;
} }
Logger.Debug("Upload tasks complete, waiting for server to confirm"); Logger.Verbose("Upload tasks complete, waiting for server to confirm");
var anyUploadsOpen = await _fileHub!.InvokeAsync<bool>("IsUploadFinished", uploadToken); var anyUploadsOpen = await _fileHub!.InvokeAsync<bool>("IsUploadFinished", uploadToken);
Logger.Debug("Uploads open: " + anyUploadsOpen); Logger.Verbose("Uploads open: " + anyUploadsOpen);
while (anyUploadsOpen && !uploadToken.IsCancellationRequested) while (anyUploadsOpen && !uploadToken.IsCancellationRequested)
{ {
anyUploadsOpen = await _fileHub!.InvokeAsync<bool>("IsUploadFinished", uploadToken); anyUploadsOpen = await _fileHub!.InvokeAsync<bool>("IsUploadFinished", uploadToken);
await Task.Delay(TimeSpan.FromSeconds(0.5), uploadToken); await Task.Delay(TimeSpan.FromSeconds(0.5), uploadToken);
Logger.Debug("Waiting for uploads to finish"); Logger.Verbose("Waiting for uploads to finish");
} }
CurrentUploads.Clear(); CurrentUploads.Clear();
@@ -376,15 +383,15 @@ namespace MareSynchronos.WebAPI
if (!uploadToken.IsCancellationRequested) if (!uploadToken.IsCancellationRequested)
{ {
Logger.Debug("=== Pushing character data ==="); Logger.Verbose("=== Pushing character data ===");
await _userHub!.InvokeAsync("PushCharacterData", character, visibleCharacterIds, uploadToken); await _userHub!.InvokeAsync("PushCharacterData", character, visibleCharacterIds, uploadToken);
} }
else else
{ {
PluginLog.Warning("=== Upload operation was cancelled ==="); Logger.Warn("=== Upload operation was cancelled ===");
} }
Logger.Debug("== Upload complete for " + character.JobId); Logger.Verbose("Upload complete for " + character.Hash);
_uploadCancellationTokenSource = null; _uploadCancellationTokenSource = null;
} }