adjust concurrency, fix upload crash
This commit is contained in:
@@ -260,10 +260,10 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
|
|||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetCustomizePlusScale()
|
public async Task<string> GetCustomizePlusScale()
|
||||||
{
|
{
|
||||||
if (!CheckCustomizePlusApi()) return string.Empty;
|
if (!CheckCustomizePlusApi()) return string.Empty;
|
||||||
var scale = _customizePlusGetBodyScale.InvokeFunc(_dalamudUtil.PlayerName);
|
var scale = await _dalamudUtil.RunOnFrameworkThread(() => _customizePlusGetBodyScale.InvokeFunc(_dalamudUtil.PlayerName)).ConfigureAwait(false);
|
||||||
if (string.IsNullOrEmpty(scale)) return string.Empty;
|
if (string.IsNullOrEmpty(scale)) return string.Empty;
|
||||||
return Convert.ToBase64String(Encoding.UTF8.GetBytes(scale));
|
return Convert.ToBase64String(Encoding.UTF8.GetBytes(scale));
|
||||||
}
|
}
|
||||||
@@ -310,7 +310,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GlamourerGetCharacterCustomization(IntPtr character)
|
public async Task<string> GlamourerGetCharacterCustomization(IntPtr character)
|
||||||
{
|
{
|
||||||
if (!CheckGlamourerApi()) return string.Empty;
|
if (!CheckGlamourerApi()) return string.Empty;
|
||||||
try
|
try
|
||||||
@@ -318,7 +318,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
|
|||||||
var gameObj = _dalamudUtil.CreateGameObject(character);
|
var gameObj = _dalamudUtil.CreateGameObject(character);
|
||||||
if (gameObj is Character c)
|
if (gameObj is Character c)
|
||||||
{
|
{
|
||||||
var glamourerString = _glamourerGetAllCustomization!.InvokeFunc(c);
|
var glamourerString = await _dalamudUtil.RunOnFrameworkThread(() => _glamourerGetAllCustomization!.InvokeFunc(c)).ConfigureAwait(false);
|
||||||
byte[] bytes = Convert.FromBase64String(glamourerString);
|
byte[] bytes = Convert.FromBase64String(glamourerString);
|
||||||
// ignore transparency
|
// ignore transparency
|
||||||
bytes[88] = 128;
|
bytes[88] = 128;
|
||||||
@@ -361,10 +361,10 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
|
|||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string PalettePlusBuildPalette()
|
public async Task<string> PalettePlusBuildPalette()
|
||||||
{
|
{
|
||||||
if (!CheckPalettePlusApi()) return string.Empty;
|
if (!CheckPalettePlusApi()) return string.Empty;
|
||||||
var palette = _palettePlusBuildCharaPalette.InvokeFunc(_dalamudUtil.PlayerCharacter);
|
var palette = await _dalamudUtil.RunOnFrameworkThread(() => _palettePlusBuildCharaPalette.InvokeFunc(_dalamudUtil.PlayerCharacter)).ConfigureAwait(false);
|
||||||
if (string.IsNullOrEmpty(palette)) return string.Empty;
|
if (string.IsNullOrEmpty(palette)) return string.Empty;
|
||||||
return Convert.ToBase64String(Encoding.UTF8.GetBytes(palette));
|
return Convert.ToBase64String(Encoding.UTF8.GetBytes(palette));
|
||||||
}
|
}
|
||||||
@@ -434,9 +434,9 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
|
|||||||
logger.LogTrace("[{applicationId}] RemoveTemporaryCollection: {ret2}", applicationId, ret2);
|
logger.LogTrace("[{applicationId}] RemoveTemporaryCollection: {ret2}", applicationId, ret2);
|
||||||
}
|
}
|
||||||
|
|
||||||
public (string[] forward, string[][] reverse) PenumbraResolvePaths(string[] forward, string[] reverse)
|
public async Task<(string[] forward, string[][] reverse)> PenumbraResolvePaths(string[] forward, string[] reverse)
|
||||||
{
|
{
|
||||||
return _penumbraResolvePaths.Invoke(forward, reverse);
|
return await _dalamudUtil.RunOnFrameworkThread(() => _penumbraResolvePaths.Invoke(forward, reverse));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PenumbraSetTemporaryMods(ILogger logger, Guid applicationId, string characterName, int? idx, Dictionary<string, string> modPaths, string manipulationData)
|
public void PenumbraSetTemporaryMods(ILogger logger, Guid applicationId, string characterName, int? idx, Dictionary<string, string> modPaths, string manipulationData)
|
||||||
|
|||||||
@@ -323,9 +323,9 @@ public class PlayerDataFactory
|
|||||||
// gather up data from ipc
|
// gather up data from ipc
|
||||||
previousData.ManipulationString = _ipcManager.PenumbraGetMetaManipulations();
|
previousData.ManipulationString = _ipcManager.PenumbraGetMetaManipulations();
|
||||||
previousData.HeelsOffset = _ipcManager.GetHeelsOffset();
|
previousData.HeelsOffset = _ipcManager.GetHeelsOffset();
|
||||||
Task<string> getGlamourerData = Task.Run(() => _ipcManager.GlamourerGetCharacterCustomization(playerRelatedObject.Address));
|
Task<string> getGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(playerRelatedObject.Address);
|
||||||
Task<string> getCustomizeData = Task.Run(_ipcManager.GetCustomizePlusScale);
|
Task<string> getCustomizeData = _ipcManager.GetCustomizePlusScale();
|
||||||
Task<string> getPalettePlusData = Task.Run(_ipcManager.PalettePlusBuildPalette);
|
Task<string> getPalettePlusData = _ipcManager.PalettePlusBuildPalette();
|
||||||
previousData.GlamourerString[playerRelatedObject.ObjectKind] = await getGlamourerData.ConfigureAwait(false);
|
previousData.GlamourerString[playerRelatedObject.ObjectKind] = await getGlamourerData.ConfigureAwait(false);
|
||||||
_logger.LogDebug("Glamourer is now: {data}", previousData.GlamourerString[playerRelatedObject.ObjectKind]);
|
_logger.LogDebug("Glamourer is now: {data}", previousData.GlamourerString[playerRelatedObject.ObjectKind]);
|
||||||
previousData.CustomizePlusScale = await getCustomizeData.ConfigureAwait(false);
|
previousData.CustomizePlusScale = await getCustomizeData.ConfigureAwait(false);
|
||||||
@@ -335,7 +335,7 @@ public class PlayerDataFactory
|
|||||||
|
|
||||||
// gather static replacements from render model
|
// gather static replacements from render model
|
||||||
var (forwardResolve, reverseResolve) = BuildDataFromModel(objectKind, charaPointer, token);
|
var (forwardResolve, reverseResolve) = BuildDataFromModel(objectKind, charaPointer, token);
|
||||||
Dictionary<string, List<string>> resolvedPaths = GetFileReplacementsFromPaths(forwardResolve, reverseResolve);
|
Dictionary<string, List<string>> resolvedPaths = await GetFileReplacementsFromPaths(forwardResolve, reverseResolve).ConfigureAwait(false);
|
||||||
previousData.FileReplacements[objectKind] =
|
previousData.FileReplacements[objectKind] =
|
||||||
new HashSet<FileReplacement>(resolvedPaths.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)), FileReplacementComparer.Instance)
|
new HashSet<FileReplacement>(resolvedPaths.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)), FileReplacementComparer.Instance)
|
||||||
.Where(p => p.HasFileReplacement).ToHashSet();
|
.Where(p => p.HasFileReplacement).ToHashSet();
|
||||||
@@ -363,7 +363,7 @@ public class PlayerDataFactory
|
|||||||
|
|
||||||
// get all remaining paths and resolve them
|
// get all remaining paths and resolve them
|
||||||
var transientPaths = ManageSemiTransientData(objectKind, charaPointer);
|
var transientPaths = ManageSemiTransientData(objectKind, charaPointer);
|
||||||
var resolvedTransientPaths = GetFileReplacementsFromPaths(transientPaths, new HashSet<string>(StringComparer.Ordinal));
|
var resolvedTransientPaths = await GetFileReplacementsFromPaths(transientPaths, new HashSet<string>(StringComparer.Ordinal)).ConfigureAwait(false);
|
||||||
|
|
||||||
_logger.LogDebug("== Transient Replacements ==");
|
_logger.LogDebug("== Transient Replacements ==");
|
||||||
foreach (var replacement in resolvedTransientPaths.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)).OrderBy(f => f.ResolvedPath, StringComparer.Ordinal))
|
foreach (var replacement in resolvedTransientPaths.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)).OrderBy(f => f.ResolvedPath, StringComparer.Ordinal))
|
||||||
@@ -387,12 +387,12 @@ public class PlayerDataFactory
|
|||||||
return previousData;
|
return previousData;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Dictionary<string, List<string>> GetFileReplacementsFromPaths(HashSet<string> forwardResolve, HashSet<string> reverseResolve)
|
private async Task<Dictionary<string, List<string>>> GetFileReplacementsFromPaths(HashSet<string> forwardResolve, HashSet<string> reverseResolve)
|
||||||
{
|
{
|
||||||
var forwardPaths = forwardResolve.ToArray();
|
var forwardPaths = forwardResolve.ToArray();
|
||||||
var reversePaths = reverseResolve.ToArray();
|
var reversePaths = reverseResolve.ToArray();
|
||||||
Dictionary<string, List<string>> resolvedPaths = new(StringComparer.Ordinal);
|
Dictionary<string, List<string>> resolvedPaths = new(StringComparer.Ordinal);
|
||||||
var (forward, reverse) = _ipcManager.PenumbraResolvePaths(forwardPaths, reversePaths);
|
var (forward, reverse) = await _ipcManager.PenumbraResolvePaths(forwardPaths, reversePaths).ConfigureAwait(false);
|
||||||
for (int i = 0; i < forwardPaths.Length; i++)
|
for (int i = 0; i < forwardPaths.Length; i++)
|
||||||
{
|
{
|
||||||
var filePath = forward[i].ToLowerInvariant();
|
var filePath = forward[i].ToLowerInvariant();
|
||||||
|
|||||||
@@ -113,20 +113,20 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Initialize(string name)
|
public async Task Initialize(string name)
|
||||||
{
|
{
|
||||||
PlayerName = name;
|
PlayerName = name;
|
||||||
_charaHandler = _gameObjectHandlerFactory(ObjectKind.Player, () => _dalamudUtil.GetPlayerCharacterFromObjectTableByName(PlayerName)?.Address ?? IntPtr.Zero, false);
|
_charaHandler = _gameObjectHandlerFactory(ObjectKind.Player, () => _dalamudUtil.GetPlayerCharacterFromObjectTableByName(PlayerName)?.Address ?? IntPtr.Zero, false);
|
||||||
|
|
||||||
_originalGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter);
|
_originalGlamourerData = await _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter).ConfigureAwait(false);
|
||||||
_lastGlamourerData = _originalGlamourerData;
|
_lastGlamourerData = _originalGlamourerData;
|
||||||
Mediator.Subscribe<PenumbraRedrawMessage>(this, IpcManagerOnPenumbraRedrawEvent);
|
Mediator.Subscribe<PenumbraRedrawMessage>(this, IpcManagerOnPenumbraRedrawEvent);
|
||||||
Mediator.Subscribe<CharacterChangedMessage>(this, (msg) =>
|
Mediator.Subscribe<CharacterChangedMessage>(this, async (msg) =>
|
||||||
{
|
{
|
||||||
if (msg.GameObjectHandler == _charaHandler && (_applicationTask?.IsCompleted ?? true))
|
if (msg.GameObjectHandler == _charaHandler && (_applicationTask?.IsCompleted ?? true))
|
||||||
{
|
{
|
||||||
Logger.LogTrace("Saving new Glamourer Data for {this}", this);
|
Logger.LogTrace("Saving new Glamourer Data for {this}", this);
|
||||||
_lastGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter);
|
_lastGlamourerData = await _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -183,7 +183,14 @@ public sealed class FileUploadManager : DisposableMediatorSubscriberBase
|
|||||||
|
|
||||||
Progress<UploadProgress> prog = new((prog) =>
|
Progress<UploadProgress> prog = new((prog) =>
|
||||||
{
|
{
|
||||||
CurrentUploads.Single(f => string.Equals(f.Hash, fileHash, StringComparison.Ordinal)).Transferred = prog.Uploaded;
|
try
|
||||||
|
{
|
||||||
|
CurrentUploads.Single(f => string.Equals(f.Hash, fileHash, StringComparison.Ordinal)).Transferred = prog.Uploaded;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.LogWarning(ex, "[{hash}] Could not set upload progress", fileHash);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
var streamContent = new ProgressableStreamContent(ms, prog);
|
var streamContent = new ProgressableStreamContent(ms, prog);
|
||||||
streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
|
streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
|
||||||
|
|||||||
Reference in New Issue
Block a user