add file picker for cache folder, revert manually made glamourer changes while mare is active

This commit is contained in:
Stanley Dimant
2022-06-26 19:15:16 +02:00
parent b42de9a8a7
commit 404ba8e278
4 changed files with 95 additions and 15 deletions

View File

@@ -308,7 +308,17 @@ namespace MareSynchronos.Managers
db.FileCaches.Remove(entry); db.FileCaches.Remove(entry);
} }
await db.SaveChangesAsync(ct); await db.SaveChangesAsync(ct);
db.FileCaches.AddRange(fileCachesToAdd); foreach (var entry in fileCachesToAdd)
{
try
{
db.FileCaches.Add(entry);
}
catch
{
// ignored
}
}
await db.SaveChangesAsync(ct); await db.SaveChangesAsync(ct);
} }
catch (Exception ex) catch (Exception ex)

View File

@@ -54,6 +54,7 @@ public class CachedPlayer
public string? PlayerName { get; private set; } public string? PlayerName { get; private set; }
public string PlayerNameHash { get; } public string PlayerNameHash { get; }
private string _lastAppliedEquipmentHash = string.Empty;
public bool RequestedPenumbraRedraw { get; set; } public bool RequestedPenumbraRedraw { get; set; }
@@ -66,28 +67,34 @@ public class CachedPlayer
if (string.IsNullOrEmpty(PlayerName) || e.CharacterNameHash != PlayerNameHash) return; if (string.IsNullOrEmpty(PlayerName) || e.CharacterNameHash != PlayerNameHash) return;
Logger.Debug("Received data for " + this); Logger.Debug("Received data for " + this);
_downloadCancellationTokenSource?.Cancel();
_downloadCancellationTokenSource = new CancellationTokenSource();
var downloadToken = _downloadCancellationTokenSource.Token;
Logger.Debug("Checking for files to download for player " + PlayerName); Logger.Debug("Checking for files to download for player " + PlayerName);
Logger.Debug("Hash for data is " + e.CharacterData.Hash); Logger.Debug("Hash for data is " + e.CharacterData.Hash);
if (!_cache.ContainsKey(e.CharacterData.Hash)) if (!_cache.ContainsKey(e.CharacterData.Hash))
{ {
Logger.Debug("Received total " + e.CharacterData.FileReplacements.Count + " file replacement data"); Logger.Debug("Received total " + e.CharacterData.FileReplacements.Count + " file replacement data");
_cache[e.CharacterData.Hash] = e.CharacterData; _cache[e.CharacterData.Hash] = e.CharacterData;
_lastAppliedEquipmentHash = e.CharacterData.Hash;
} }
else else
{ {
Logger.Debug("Had valid local cache for " + PlayerName); Logger.Debug("Had valid local cache for " + PlayerName);
} }
DownloadAndApplyCharacter();
}
private void DownloadAndApplyCharacter()
{
_downloadCancellationTokenSource?.Cancel();
_downloadCancellationTokenSource = new CancellationTokenSource();
var downloadToken = _downloadCancellationTokenSource.Token;
Task.Run(async () => Task.Run(async () =>
{ {
List<FileReplacementDto> toDownloadReplacements; List<FileReplacementDto> toDownloadReplacements;
Dictionary<string, string> moddedPaths; Dictionary<string, string> moddedPaths;
while ((toDownloadReplacements = TryCalculateModdedDictionary(_cache[e.CharacterData.Hash], out moddedPaths)).Count > 0) while ((toDownloadReplacements = TryCalculateModdedDictionary(_cache[_lastAppliedEquipmentHash], out moddedPaths)).Count > 0)
{ {
Logger.Debug("Downloading missing files for player " + PlayerName); Logger.Debug("Downloading missing files for player " + PlayerName);
await _apiController.DownloadFiles(toDownloadReplacements, downloadToken); await _apiController.DownloadFiles(toDownloadReplacements, downloadToken);
@@ -98,7 +105,7 @@ public class CachedPlayer
return; return;
} }
ApplyCharacterData(e.CharacterData, moddedPaths); ApplyCharacterData(_cache[_lastAppliedEquipmentHash], moddedPaths);
}, downloadToken); }, downloadToken);
} }
@@ -196,18 +203,29 @@ public class CachedPlayer
return PlayerNameHash + ":" + PlayerName + ":HasChar " + (PlayerCharacter != null); return PlayerNameHash + ":" + PlayerName + ":HasChar " + (PlayerCharacter != null);
} }
private Task? penumbraRedrawEventTask;
private void IpcManagerOnPenumbraRedrawEvent(object? sender, EventArgs e) private void IpcManagerOnPenumbraRedrawEvent(object? sender, EventArgs e)
{ {
var player = _dalamudUtil.GetPlayerCharacterFromObjectTableIndex((int)sender!); var player = _dalamudUtil.GetPlayerCharacterFromObjectTableIndex((int)sender!);
if (player == null || player.Name.ToString() != PlayerName) return; if (player == null || player.Name.ToString() != PlayerName) return;
Task.Run(() => if (!penumbraRedrawEventTask?.IsCompleted ?? false) return;
penumbraRedrawEventTask = Task.Run(() =>
{ {
PlayerCharacter = player; PlayerCharacter = player;
_dalamudUtil.WaitWhileCharacterIsDrawing(PlayerCharacter.Address); _dalamudUtil.WaitWhileCharacterIsDrawing(PlayerCharacter.Address);
RequestedPenumbraRedraw = false; if (RequestedPenumbraRedraw == false && !string.IsNullOrEmpty(_lastAppliedEquipmentHash))
Logger.Debug( {
$"Penumbra Redraw done for {PlayerName}"); DownloadAndApplyCharacter();
}
else
{
RequestedPenumbraRedraw = false;
Logger.Debug(
$"Penumbra Redraw done for {PlayerName}");
}
}); });
} }

View File

@@ -7,6 +7,7 @@ using Dalamud.Game;
using Dalamud.Game.ClientState.Objects; using Dalamud.Game.ClientState.Objects;
using Dalamud.Game.ClientState; using Dalamud.Game.ClientState;
using System; using System;
using Dalamud.Interface.ImGuiFileDialog;
using MareSynchronos.Managers; using MareSynchronos.Managers;
using MareSynchronos.WebAPI; using MareSynchronos.WebAPI;
using Dalamud.Interface.Windowing; using Dalamud.Interface.Windowing;
@@ -36,6 +37,7 @@ namespace MareSynchronos
private CachedPlayersManager? _characterCacheManager; private CachedPlayersManager? _characterCacheManager;
private readonly IPlayerWatcher _playerWatcher; private readonly IPlayerWatcher _playerWatcher;
private readonly DownloadUi _downloadUi; private readonly DownloadUi _downloadUi;
private readonly FileDialogManager _fileDialogManager;
public Plugin(DalamudPluginInterface pluginInterface, CommandManager commandManager, public Plugin(DalamudPluginInterface pluginInterface, CommandManager commandManager,
Framework framework, ObjectTable objectTable, ClientState clientState) Framework framework, ObjectTable objectTable, ClientState clientState)
@@ -58,9 +60,10 @@ namespace MareSynchronos
_ipcManager = new IpcManager(PluginInterface); _ipcManager = new IpcManager(PluginInterface);
_fileCacheManager = new FileCacheManager(_ipcManager, _configuration); _fileCacheManager = new FileCacheManager(_ipcManager, _configuration);
_fileDialogManager = new FileDialogManager();
var uiSharedComponent = var uiSharedComponent =
new UiShared(_ipcManager, _apiController, _fileCacheManager, _configuration); new UiShared(_ipcManager, _apiController, _fileCacheManager, _fileDialogManager, _configuration);
_pluginUi = new PluginUi(_windowSystem, uiSharedComponent, _configuration, _apiController); _pluginUi = new PluginUi(_windowSystem, uiSharedComponent, _configuration, _apiController);
_introUi = new IntroUi(_windowSystem, uiSharedComponent, _configuration, _fileCacheManager); _introUi = new IntroUi(_windowSystem, uiSharedComponent, _configuration, _fileCacheManager);
_introUi.FinishedRegistration += (_, _) => _introUi.FinishedRegistration += (_, _) =>
@@ -178,6 +181,7 @@ namespace MareSynchronos
private void Draw() private void Draw()
{ {
_windowSystem.Draw(); _windowSystem.Draw();
_fileDialogManager.Draw();
} }
private void OnCommand(string command, string args) private void OnCommand(string command, string args)

View File

@@ -2,7 +2,9 @@
using System.IO; using System.IO;
using System.Numerics; using System.Numerics;
using System.Threading.Tasks; using System.Threading.Tasks;
using Dalamud.Interface;
using Dalamud.Interface.Colors; using Dalamud.Interface.Colors;
using Dalamud.Interface.ImGuiFileDialog;
using ImGuiNET; using ImGuiNET;
using MareSynchronos.Managers; using MareSynchronos.Managers;
using MareSynchronos.WebAPI; using MareSynchronos.WebAPI;
@@ -14,14 +16,16 @@ namespace MareSynchronos.UI
private readonly IpcManager _ipcManager; private readonly IpcManager _ipcManager;
private readonly ApiController _apiController; private readonly ApiController _apiController;
private readonly FileCacheManager _fileCacheManager; private readonly FileCacheManager _fileCacheManager;
private readonly FileDialogManager _fileDialogManager;
private readonly Configuration _pluginConfiguration; private readonly Configuration _pluginConfiguration;
public long FileCacheSize => _fileCacheManager.FileCacheSize; public long FileCacheSize => _fileCacheManager.FileCacheSize;
public UiShared(IpcManager ipcManager, ApiController apiController, FileCacheManager fileCacheManager, Configuration pluginConfiguration) public UiShared(IpcManager ipcManager, ApiController apiController, FileCacheManager fileCacheManager, FileDialogManager fileDialogManager, Configuration pluginConfiguration)
{ {
_ipcManager = ipcManager; _ipcManager = ipcManager;
_apiController = apiController; _apiController = apiController;
_fileCacheManager = fileCacheManager; _fileCacheManager = fileCacheManager;
_fileDialogManager = fileDialogManager;
_pluginConfiguration = pluginConfiguration; _pluginConfiguration = pluginConfiguration;
} }
@@ -186,7 +190,11 @@ namespace MareSynchronos.UI
public static void DrawHelpText(string helpText) public static void DrawHelpText(string helpText)
{ {
ImGui.SameLine(); ImGui.SameLine();
ImGui.TextDisabled("(?)"); ImGui.PushFont(UiBuilder.IconFont);
ImGui.SetWindowFontScale(0.8f);
ImGui.TextDisabled(FontAwesomeIcon.Question.ToIconString());
ImGui.SetWindowFontScale(1.0f);
ImGui.PopFont();
if (ImGui.IsItemHovered()) if (ImGui.IsItemHovered())
{ {
ImGui.BeginTooltip(); ImGui.BeginTooltip();
@@ -210,7 +218,23 @@ namespace MareSynchronos.UI
} }
} }
if (!Directory.Exists(cacheDirectory)) ImGui.SameLine();
ImGui.PushFont(UiBuilder.IconFont);
string folderIcon = FontAwesomeIcon.Folder.ToIconString();
if (ImGui.Button(folderIcon + "##chooseCacheFolder"))
{
_fileDialogManager.OpenFolderDialog("Pick Mare Synchronos Cache Folder", (success, path) =>
{
if (!success) return;
_pluginConfiguration.CacheFolder = path;
_pluginConfiguration.Save();
_fileCacheManager.StartWatchers();
});
}
ImGui.PopFont();
if (!Directory.Exists(cacheDirectory) || !IsDirectoryWritable(cacheDirectory))
{ {
ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudRed); ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudRed);
TextWrapped("The folder you selected does not exist. Please provide a valid path."); TextWrapped("The folder you selected does not exist. Please provide a valid path.");
@@ -218,6 +242,30 @@ namespace MareSynchronos.UI
} }
} }
public bool IsDirectoryWritable(string dirPath, bool throwIfFails = false)
{
try
{
using (FileStream fs = File.Create(
Path.Combine(
dirPath,
Path.GetRandomFileName()
),
1,
FileOptions.DeleteOnClose)
)
{ }
return true;
}
catch
{
if (throwIfFails)
throw;
else
return false;
}
}
public void DrawParallelScansSetting() public void DrawParallelScansSetting()
{ {
var parallelScans = _pluginConfiguration.MaxParallelScan; var parallelScans = _pluginConfiguration.MaxParallelScan;