diff --git a/MareSynchronos/Configuration.cs b/MareSynchronos/Configuration.cs index 0de804c..5c2a6cf 100644 --- a/MareSynchronos/Configuration.cs +++ b/MareSynchronos/Configuration.cs @@ -55,6 +55,7 @@ namespace MareSynchronos public string CacheFolder { get; set; } = string.Empty; public Dictionary ClientSecret { get; set; } = new(); public Dictionary CustomServerList { get; set; } = new(); + public int MaxLocalCacheInGiB { get; set; } = 20; public bool InitialScanComplete { get; set; } = false; public int MaxParallelScan diff --git a/MareSynchronos/Factories/CharacterDataFactory.cs b/MareSynchronos/Factories/CharacterDataFactory.cs index 95340e0..998232f 100644 --- a/MareSynchronos/Factories/CharacterDataFactory.cs +++ b/MareSynchronos/Factories/CharacterDataFactory.cs @@ -122,7 +122,6 @@ public class CharacterDataFactory _dalamudUtil.WaitWhileCharacterIsDrawing(_dalamudUtil.PlayerPointer); var cache = new CharacterData { - JobId = _dalamudUtil.PlayerJobId, GlamourerString = _ipcManager.GlamourerGetCharacterCustomization(_dalamudUtil.PlayerCharacter), ManipulationString = _ipcManager.PenumbraGetMetaManipulations(_dalamudUtil.PlayerName) }; diff --git a/MareSynchronos/Managers/FileCacheManager.cs b/MareSynchronos/Managers/FileCacheManager.cs index 159d498..dbc5ca7 100644 --- a/MareSynchronos/Managers/FileCacheManager.cs +++ b/MareSynchronos/Managers/FileCacheManager.cs @@ -19,10 +19,9 @@ namespace MareSynchronos.Managers private FileSystemWatcher? _cacheDirWatcher; private FileSystemWatcher? _penumbraDirWatcher; private Task? _rescanTask; - private CancellationTokenSource _rescanTaskCancellationTokenSource = new CancellationTokenSource(); - private CancellationTokenSource _rescanTaskRunCancellationTokenSource = new CancellationTokenSource(); + private readonly CancellationTokenSource _rescanTaskCancellationTokenSource = new(); + private CancellationTokenSource _rescanTaskRunCancellationTokenSource = new(); private CancellationTokenSource? _scanCancellationTokenSource; - private Task? _scanTask; public FileCacheManager(IpcManager ipcManager, Configuration pluginConfiguration) { Logger.Verbose("Creating " + nameof(FileCacheManager)); @@ -143,17 +142,18 @@ namespace MareSynchronos.Managers private void RecalculateFileCacheSize() { - FileCacheSize = 0; - foreach (var file in Directory.EnumerateFiles(_pluginConfiguration.CacheFolder)) + FileCacheSize = Directory.EnumerateFiles(_pluginConfiguration.CacheFolder).Sum(f => new FileInfo(f).Length); + + if (FileCacheSize <= _pluginConfiguration.MaxLocalCacheInGiB * 1024 * 1024 * 1024) return; + + var allFiles = Directory.EnumerateFiles(_pluginConfiguration.CacheFolder) + .Select(f => new FileInfo(f)).OrderBy(f => f.LastAccessTime).ToList(); + while (FileCacheSize > _pluginConfiguration.MaxLocalCacheInGiB * 1024 * 1024 * 1024) { - try - { - FileCacheSize += new FileInfo(file).Length; - } - catch - { - // whatever - } + var oldestFile = allFiles.First(); + FileCacheSize -= oldestFile.Length; + File.Delete(oldestFile.FullName); + allFiles.Remove(oldestFile); } } @@ -182,7 +182,6 @@ namespace MareSynchronos.Managers await using var db = new FileCacheContext(); foreach (var item in listCopy.Distinct()) { - var fi = new FileInfo(item); if (!fi.Exists) { @@ -215,10 +214,13 @@ namespace MareSynchronos.Managers Directory.EnumerateFiles(penumbraDir, "*.*", SearchOption.AllDirectories) .Select(s => s.ToLowerInvariant()) .Where(f => f.Contains(@"\chara\")) + .Where(f => + (f.EndsWith(".tex", StringComparison.OrdinalIgnoreCase) + || f.EndsWith(".mdl", StringComparison.OrdinalIgnoreCase) + || f.EndsWith(".mtrl", StringComparison.OrdinalIgnoreCase))) .Concat(Directory.EnumerateFiles(_pluginConfiguration.CacheFolder, "*.*", SearchOption.AllDirectories) .Select(s => s.ToLowerInvariant())) - .Where(f => (f.EndsWith(".tex", StringComparison.OrdinalIgnoreCase) || f.EndsWith(".mdl", StringComparison.OrdinalIgnoreCase) || f.EndsWith(".mtrl", StringComparison.OrdinalIgnoreCase))) - .Select(p => new KeyValuePair(p, false))); + .Select(p => new KeyValuePair(p, false)).ToList()); List fileCaches; await using (var db = new FileCacheContext()) fileCaches = db.FileCaches.ToList(); diff --git a/MareSynchronos/Models/CharacterData.cs b/MareSynchronos/Models/CharacterData.cs index 541bba7..b46b0cd 100644 --- a/MareSynchronos/Models/CharacterData.cs +++ b/MareSynchronos/Models/CharacterData.cs @@ -16,9 +16,6 @@ namespace MareSynchronos.Models public bool IsReady => FileReplacements.All(f => f.Computed); - [JsonProperty] - public int JobId { get; set; } = 0; - public string ManipulationString { get; set; } = string.Empty; public void AddFileReplacement(FileReplacement fileReplacement) @@ -49,7 +46,6 @@ namespace MareSynchronos.Models }; }).ToList(), GlamourerData = GlamourerString, - JobId = JobId, ManipulationData = ManipulationString }; } diff --git a/MareSynchronos/UI/UIShared.cs b/MareSynchronos/UI/UIShared.cs index 8c0d08e..5629b13 100644 --- a/MareSynchronos/UI/UIShared.cs +++ b/MareSynchronos/UI/UIShared.cs @@ -344,6 +344,13 @@ namespace MareSynchronos.UI { ColorTextWrapped("The folder you selected does not exist or cannot be written to. Please provide a valid path.", ImGuiColors.DalamudRed); } + + int maxCacheSize = _pluginConfiguration.MaxLocalCacheInGiB; + if (ImGui.SliderInt("Maximum Cache Size in GB", ref maxCacheSize, 1, 50, "%d GB")) + { + _pluginConfiguration.MaxLocalCacheInGiB = maxCacheSize; + _pluginConfiguration.Save(); + } } private bool _isDirectoryWritable = false; diff --git a/MareSynchronos/Utils/DalamudUtil.cs b/MareSynchronos/Utils/DalamudUtil.cs index 289f604..68e7b81 100644 --- a/MareSynchronos/Utils/DalamudUtil.cs +++ b/MareSynchronos/Utils/DalamudUtil.cs @@ -23,7 +23,6 @@ namespace MareSynchronos.Utils private readonly ClientState _clientState; private readonly ObjectTable _objectTable; private readonly Framework _framework; - public event PlayerChange? PlayerChanged; public event LogIn? LogIn; public event LogOut? LogOut; public event FrameworkUpdate? FrameworkUpdate; @@ -59,43 +58,16 @@ namespace MareSynchronos.Utils public bool IsLoggedIn => _clientState.IsLoggedIn; - private void WatcherOnPlayerChanged(Character actor) - { - PlayerChanged?.Invoke(actor); - } - public bool IsPlayerPresent => _clientState.LocalPlayer != null; public string PlayerName => _clientState.LocalPlayer?.Name.ToString() ?? "--"; - public int PlayerJobId => (int)_clientState.LocalPlayer!.ClassJob.Id; - public IntPtr PlayerPointer => _clientState.LocalPlayer!.Address; public PlayerCharacter PlayerCharacter => _clientState.LocalPlayer!; public string PlayerNameHashed => Crypto.GetHash256(PlayerName + _clientState.LocalPlayer!.HomeWorld.Id); - public Dictionary GetLocalPlayers() - { - if (!_clientState.IsLoggedIn) - { - return new Dictionary(); - } - - Dictionary allLocalPlayers = new(); - foreach (var obj in _objectTable) - { - if (obj.ObjectKind != Dalamud.Game.ClientState.Objects.Enums.ObjectKind.Player) continue; - string playerName = obj.Name.ToString(); - if (playerName == PlayerName) continue; - var playerObject = (PlayerCharacter)obj; - allLocalPlayers[Crypto.GetHash256(playerObject.Name.ToString() + playerObject.HomeWorld.Id.ToString())] = playerObject; - } - - return allLocalPlayers; - } - public List GetPlayerCharacters() { return _objectTable.Where(obj =>