add fileswaps first test
This commit is contained in:
2
MareAPI
2
MareAPI
Submodule MareAPI updated: 645dd0b18f...9bb99a5e68
@@ -180,7 +180,7 @@ public class CharacterDataFactory
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddReplacement(string varPath, ObjectKind objectKind, CharacterData cache, int inheritanceLevel = 0)
|
private void AddReplacement(string varPath, ObjectKind objectKind, CharacterData cache, int inheritanceLevel = 0, bool doNotReverseResolve = false)
|
||||||
{
|
{
|
||||||
if (varPath.IsNullOrEmpty()) return;
|
if (varPath.IsNullOrEmpty()) return;
|
||||||
|
|
||||||
@@ -192,7 +192,7 @@ public class CharacterDataFactory
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var variousReplacement = CreateFileReplacement(varPath, false);
|
var variousReplacement = CreateFileReplacement(varPath, doNotReverseResolve);
|
||||||
DebugPrint(variousReplacement, objectKind, "Various", inheritanceLevel);
|
DebugPrint(variousReplacement, objectKind, "Various", inheritanceLevel);
|
||||||
|
|
||||||
cache.AddFileReplacement(objectKind, variousReplacement);
|
cache.AddFileReplacement(objectKind, variousReplacement);
|
||||||
@@ -343,7 +343,7 @@ public class CharacterDataFactory
|
|||||||
foreach (var item in transientResourceManager.GetTransientResources(charaPointer))
|
foreach (var item in transientResourceManager.GetTransientResources(charaPointer))
|
||||||
{
|
{
|
||||||
Logger.Verbose("Found transient resource: " + item);
|
Logger.Verbose("Found transient resource: " + item);
|
||||||
AddReplacement(item, objectKind, previousData, 1);
|
AddReplacement(item, objectKind, previousData, 1, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var item in transientResourceManager.GetSemiTransientResources(objectKind))
|
foreach (var item in transientResourceManager.GetSemiTransientResources(objectKind))
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ using MareSynchronos.FileCacheDB;
|
|||||||
using MareSynchronos.Models;
|
using MareSynchronos.Models;
|
||||||
using MareSynchronos.Utils;
|
using MareSynchronos.Utils;
|
||||||
using MareSynchronos.WebAPI;
|
using MareSynchronos.WebAPI;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace MareSynchronos.Managers;
|
namespace MareSynchronos.Managers;
|
||||||
|
|
||||||
@@ -141,6 +142,7 @@ public class CachedPlayer
|
|||||||
{
|
{
|
||||||
Dictionary<string, string> moddedPaths;
|
Dictionary<string, string> moddedPaths;
|
||||||
int attempts = 0;
|
int attempts = 0;
|
||||||
|
//Logger.Verbose(JsonConvert.SerializeObject(_cachedData, Formatting.Indented));
|
||||||
while ((toDownloadReplacements = TryCalculateModdedDictionary(out moddedPaths)).Count > 0 && attempts++ <= 10)
|
while ((toDownloadReplacements = TryCalculateModdedDictionary(out moddedPaths)).Count > 0 && attempts++ <= 10)
|
||||||
{
|
{
|
||||||
Logger.Debug("Downloading missing files for player " + PlayerName + ", kind: " + objectKind);
|
Logger.Debug("Downloading missing files for player " + PlayerName + ", kind: " + objectKind);
|
||||||
@@ -192,7 +194,7 @@ public class CachedPlayer
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
using var db = new FileCacheContext();
|
using var db = new FileCacheContext();
|
||||||
foreach (var item in _cachedData.FileReplacements.SelectMany(k => k.Value).ToList())
|
foreach (var item in _cachedData.FileReplacements.SelectMany(k => k.Value.Where(v => string.IsNullOrEmpty(v.FileSwapPath))).ToList())
|
||||||
{
|
{
|
||||||
foreach (var gamePath in item.GamePaths)
|
foreach (var gamePath in item.GamePaths)
|
||||||
{
|
{
|
||||||
@@ -207,6 +209,15 @@ public class CachedPlayer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var item in _cachedData.FileReplacements.SelectMany(k => k.Value.Where(v => !string.IsNullOrEmpty(v.FileSwapPath))).ToList())
|
||||||
|
{
|
||||||
|
foreach (var gamePath in item.GamePaths)
|
||||||
|
{
|
||||||
|
Logger.Verbose("Adding file swap for " + gamePath + ":" + item.FileSwapPath);
|
||||||
|
moddedDictionary[gamePath] = item.FileSwapPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ using FFXIVClientStructs.FFXIV.Client.Game.Character;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using MareSynchronos.Models;
|
using MareSynchronos.Models;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace MareSynchronos.Managers
|
namespace MareSynchronos.Managers
|
||||||
{
|
{
|
||||||
@@ -142,7 +143,9 @@ namespace MareSynchronos.Managers
|
|||||||
|
|
||||||
Logger.Verbose("Cache creation complete");
|
Logger.Verbose("Cache creation complete");
|
||||||
|
|
||||||
return PermanentDataCache.ToCharacterCacheDto();
|
var cache = PermanentDataCache.ToCharacterCacheDto();
|
||||||
|
//Logger.Verbose(JsonConvert.SerializeObject(cache, Formatting.Indented));
|
||||||
|
return cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void IpcManager_PenumbraRedrawEvent(IntPtr address, int idx)
|
private void IpcManager_PenumbraRedrawEvent(IntPtr address, int idx)
|
||||||
|
|||||||
@@ -88,12 +88,12 @@ namespace MareSynchronos.Managers
|
|||||||
filePath = filePath.Split("|")[2];
|
filePath = filePath.Split("|")[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
var newPath = filePath.ToLowerInvariant().Replace("\\", "/");
|
var newPath = gamePath.ToLowerInvariant().Replace("\\", "/");
|
||||||
|
|
||||||
if (filePath != gamePath && !TransientResources[gameObject].Contains(newPath) && !SemiTransientResources.Any(r => r.Value.Any(f => f.ResolvedPath.ToLowerInvariant() == newPath.ToLowerInvariant())))
|
if (filePath != gamePath && !TransientResources[gameObject].Contains(newPath) && !SemiTransientResources.Any(r => r.Value.Any(f => f.GamePaths.First().ToLowerInvariant() == newPath.ToLowerInvariant())))
|
||||||
{
|
{
|
||||||
TransientResources[gameObject].Add(newPath);
|
TransientResources[gameObject].Add(newPath);
|
||||||
Logger.Debug($"Adding {filePath.ToLowerInvariant().Replace("\\", "/")} for {gameObject}");
|
Logger.Debug($"Adding {newPath.ToLowerInvariant().Replace("\\", "/")} for {gameObject} ({filePath})");
|
||||||
TransientResourceLoaded?.Invoke(gameObject);
|
TransientResourceLoaded?.Invoke(gameObject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -124,7 +124,11 @@ namespace MareSynchronos.Managers
|
|||||||
{
|
{
|
||||||
if (!SemiTransientResources[objectKind].Any(f => f.ResolvedPath.ToLowerInvariant() == item.ToLowerInvariant()))
|
if (!SemiTransientResources[objectKind].Any(f => f.ResolvedPath.ToLowerInvariant() == item.ToLowerInvariant()))
|
||||||
{
|
{
|
||||||
SemiTransientResources[objectKind].Add(createFileReplacement(item.ToLowerInvariant(), false));
|
Logger.Debug("Persisting " + item.ToLowerInvariant());
|
||||||
|
var fileReplacement = createFileReplacement(item.ToLowerInvariant(), true);
|
||||||
|
if (!fileReplacement.HasFileReplacement)
|
||||||
|
fileReplacement = createFileReplacement(item.ToLowerInvariant(), false);
|
||||||
|
SemiTransientResources[objectKind].Add(fileReplacement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ 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;
|
||||||
|
using Lumina.Excel.GeneratedSheets;
|
||||||
|
|
||||||
namespace MareSynchronos.Models
|
namespace MareSynchronos.Models
|
||||||
{
|
{
|
||||||
@@ -39,16 +41,31 @@ namespace MareSynchronos.Models
|
|||||||
|
|
||||||
public CharacterCacheDto ToCharacterCacheDto()
|
public CharacterCacheDto ToCharacterCacheDto()
|
||||||
{
|
{
|
||||||
|
var fileReplacements = FileReplacements.ToDictionary(k => k.Key, k => k.Value.Where(f => f.HasFileReplacement && !f.IsFileSwap).GroupBy(f => f.Hash).Select(g =>
|
||||||
|
{
|
||||||
|
return new FileReplacementDto()
|
||||||
|
{
|
||||||
|
GamePaths = g.SelectMany(g => g.GamePaths).Distinct().ToArray(),
|
||||||
|
Hash = g.First().Hash,
|
||||||
|
};
|
||||||
|
}).ToList());
|
||||||
|
|
||||||
|
Logger.Debug("Adding fileSwaps");
|
||||||
|
foreach (var item in FileReplacements)
|
||||||
|
{
|
||||||
|
Logger.Debug("Checking fileSwaps for " + item.Key);
|
||||||
|
var fileSwapsToAdd = item.Value.Where(f => f.IsFileSwap).Select(f => f.ToFileReplacementDto());
|
||||||
|
Logger.Debug("Adding " + fileSwapsToAdd.Count() + " file swaps");
|
||||||
|
foreach (var swap in fileSwapsToAdd)
|
||||||
|
{
|
||||||
|
Logger.Debug("Adding: " + swap.GamePaths.First() + ":" + swap.FileSwapPath);
|
||||||
|
}
|
||||||
|
fileReplacements[item.Key].AddRange(fileSwapsToAdd);
|
||||||
|
}
|
||||||
|
|
||||||
return new CharacterCacheDto()
|
return new CharacterCacheDto()
|
||||||
{
|
{
|
||||||
FileReplacements = FileReplacements.ToDictionary(k => k.Key, k => k.Value.Where(f => f.HasFileReplacement).GroupBy(f => f.Hash).Select(g =>
|
FileReplacements = fileReplacements,
|
||||||
{
|
|
||||||
return new FileReplacementDto()
|
|
||||||
{
|
|
||||||
GamePaths = g.SelectMany(g => g.GamePaths).Distinct().ToArray(),
|
|
||||||
Hash = g.First().Hash
|
|
||||||
};
|
|
||||||
}).ToList()),
|
|
||||||
GlamourerData = GlamourerString.ToDictionary(d => d.Key, d => d.Value),
|
GlamourerData = GlamourerString.ToDictionary(d => d.Key, d => d.Value),
|
||||||
ManipulationData = ManipulationString
|
ManipulationData = ManipulationString
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ using MareSynchronos.FileCacheDB;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using MareSynchronos.API;
|
using MareSynchronos.API;
|
||||||
using MareSynchronos.Utils;
|
using MareSynchronos.Utils;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
namespace MareSynchronos.Models
|
namespace MareSynchronos.Models
|
||||||
{
|
{
|
||||||
@@ -20,12 +21,14 @@ namespace MareSynchronos.Models
|
|||||||
_penumbraDirectory = penumbraDirectory;
|
_penumbraDirectory = penumbraDirectory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Computed => !HasFileReplacement || !string.IsNullOrEmpty(Hash);
|
public bool Computed => IsFileSwap || !HasFileReplacement || !string.IsNullOrEmpty(Hash);
|
||||||
|
|
||||||
public List<string> GamePaths { get; set; } = new();
|
public List<string> GamePaths { get; set; } = new();
|
||||||
|
|
||||||
public bool HasFileReplacement => GamePaths.Count >= 1 && GamePaths.Any(p => p != ResolvedPath);
|
public bool HasFileReplacement => GamePaths.Count >= 1 && GamePaths.Any(p => p != ResolvedPath);
|
||||||
|
|
||||||
|
public bool IsFileSwap => !Regex.IsMatch(ResolvedPath, @"^[a-zA-Z]:(/|\\)", RegexOptions.ECMAScript) && GamePaths.First() != ResolvedPath;
|
||||||
|
|
||||||
public string Hash { get; set; } = string.Empty;
|
public string Hash { get; set; } = string.Empty;
|
||||||
|
|
||||||
public string ResolvedPath { get; set; } = string.Empty;
|
public string ResolvedPath { get; set; } = string.Empty;
|
||||||
@@ -33,7 +36,7 @@ namespace MareSynchronos.Models
|
|||||||
public void SetResolvedPath(string path)
|
public void SetResolvedPath(string path)
|
||||||
{
|
{
|
||||||
ResolvedPath = path.ToLowerInvariant().Replace('/', '\\').Replace(_penumbraDirectory, "").Replace('\\', '/');
|
ResolvedPath = path.ToLowerInvariant().Replace('/', '\\').Replace(_penumbraDirectory, "").Replace('\\', '/');
|
||||||
if (!HasFileReplacement) return;
|
if (!HasFileReplacement || IsFileSwap) return;
|
||||||
|
|
||||||
_ = Task.Run(() =>
|
_ = Task.Run(() =>
|
||||||
{
|
{
|
||||||
@@ -73,6 +76,7 @@ namespace MareSynchronos.Models
|
|||||||
{
|
{
|
||||||
GamePaths = GamePaths.ToArray(),
|
GamePaths = GamePaths.ToArray(),
|
||||||
Hash = Hash,
|
Hash = Hash,
|
||||||
|
FileSwapPath = IsFileSwap ? ResolvedPath : string.Empty
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
|||||||
@@ -34,16 +34,22 @@ namespace MareSynchronos.UI
|
|||||||
private float _windowContentWidth = 0;
|
private float _windowContentWidth = 0;
|
||||||
|
|
||||||
public CompactUi(WindowSystem windowSystem,
|
public CompactUi(WindowSystem windowSystem,
|
||||||
UiShared uiShared, Configuration configuration, ApiController apiController)
|
UiShared uiShared, Configuration configuration, ApiController apiController) : base("###MareSynchronosMainUI")
|
||||||
#if DEBUG
|
|
||||||
: base("Mare Synchronos " + new FileInfo(Assembly.GetExecutingAssembly().Location).LastWriteTime.ToString("yyyyMMddHHmmss")+ "###MareSynchronosMainUI")
|
|
||||||
#else
|
|
||||||
: base("Mare Synchronos " + Assembly.GetExecutingAssembly().GetName().Version + "###MareSynchronosMainUI")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
{
|
{
|
||||||
Logger.Verbose("Creating " + nameof(CompactUi));
|
Logger.Verbose("Creating " + nameof(CompactUi));
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
string dateTime = "DEV VERSION";
|
||||||
|
try
|
||||||
|
{
|
||||||
|
dateTime = new FileInfo(Assembly.GetExecutingAssembly().Location).LastWriteTime.ToString("yyyyMMddHHmmss");
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
this.WindowName = "Mare Synchronos " + dateTime + "###MareSynchronosMainUI";
|
||||||
|
#else
|
||||||
|
this.WindowName = "Mare Synchronos " + Assembly.GetExecutingAssembly().GetName().Version + "###MareSynchronosMainUI";
|
||||||
|
#endif
|
||||||
|
|
||||||
_windowSystem = windowSystem;
|
_windowSystem = windowSystem;
|
||||||
_uiShared = uiShared;
|
_uiShared = uiShared;
|
||||||
_configuration = configuration;
|
_configuration = configuration;
|
||||||
|
|||||||
@@ -40,9 +40,10 @@ namespace MareSynchronos.UI
|
|||||||
private Dictionary<string, string> _languages = new() { { "English", "en" }, { "Deutsch", "de" }, { "Français", "fr" } };
|
private Dictionary<string, string> _languages = new() { { "English", "en" }, { "Deutsch", "de" }, { "Français", "fr" } };
|
||||||
private int _currentLanguage;
|
private int _currentLanguage;
|
||||||
|
|
||||||
private bool DarkSoulsCaptchaValid => _darkSoulsCaptcha1.Item2 == _enteredDarkSoulsCaptcha1
|
private bool DarkSoulsCaptchaValid => _darkSoulsCaptcha1.Item2 == _enteredDarkSoulsCaptcha1.Trim()
|
||||||
&& _darkSoulsCaptcha2.Item2 == _enteredDarkSoulsCaptcha2
|
&& _darkSoulsCaptcha2.Item2 == _enteredDarkSoulsCaptcha2.Trim()
|
||||||
&& _darkSoulsCaptcha3.Item2 == _enteredDarkSoulsCaptcha3;
|
&& _darkSoulsCaptcha3.Item2 == _enteredDarkSoulsCaptcha3.Trim();
|
||||||
|
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ namespace MareSynchronos.WebAPI
|
|||||||
Logger.Verbose("New Token Created");
|
Logger.Verbose("New Token Created");
|
||||||
|
|
||||||
List<string> unverifiedUploadHashes = new();
|
List<string> unverifiedUploadHashes = new();
|
||||||
foreach (var item in character.FileReplacements.SelectMany(c => c.Value.Select(v => v.Hash).Distinct()).Distinct().ToList())
|
foreach (var item in character.FileReplacements.SelectMany(c => c.Value.Where(f => string.IsNullOrEmpty(f.FileSwapPath)).Select(v => v.Hash).Distinct()).Distinct().ToList())
|
||||||
{
|
{
|
||||||
if (!_verifiedUploadedHashes.Contains(item))
|
if (!_verifiedUploadedHashes.Contains(item))
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user