diff --git a/MareSynchronos/Export/MareCharaFileManager.cs b/MareSynchronos/Export/MareCharaFileManager.cs index d6b108f..3ba1e24 100644 --- a/MareSynchronos/Export/MareCharaFileManager.cs +++ b/MareSynchronos/Export/MareCharaFileManager.cs @@ -12,13 +12,13 @@ public class MareCharaFileManager { private readonly FileCacheManager _manager; private readonly IpcManager _ipcManager; - private readonly ConfigurationService _configService; + private readonly MareConfigService _configService; private readonly DalamudUtil _dalamudUtil; private readonly MareCharaFileDataFactory _factory; public MareCharaFileHeader? LoadedCharaFile { get; private set; } public bool CurrentlyWorking { get; private set; } = false; - public MareCharaFileManager(FileCacheManager manager, IpcManager ipcManager, ConfigurationService configService, DalamudUtil dalamudUtil) + public MareCharaFileManager(FileCacheManager manager, IpcManager ipcManager, MareConfigService configService, DalamudUtil dalamudUtil) { _factory = new(manager); _manager = manager; diff --git a/MareSynchronos/Factories/PairFactory.cs b/MareSynchronos/Factories/PairFactory.cs index 3b5ac52..8e8e228 100644 --- a/MareSynchronos/Factories/PairFactory.cs +++ b/MareSynchronos/Factories/PairFactory.cs @@ -6,10 +6,10 @@ namespace MareSynchronos.Factories; public class PairFactory { - private readonly ConfigurationService _configService; + private readonly MareConfigService _configService; private readonly ServerConfigurationManager _serverConfigurationManager; - public PairFactory(ConfigurationService configService, ServerConfigurationManager serverConfigurationManager) + public PairFactory(MareConfigService configService, ServerConfigurationManager serverConfigurationManager) { _configService = configService; _serverConfigurationManager = serverConfigurationManager; diff --git a/MareSynchronos/FileCache/FileCacheManager.cs b/MareSynchronos/FileCache/FileCacheManager.cs index 2661f99..2a39c7d 100644 --- a/MareSynchronos/FileCache/FileCacheManager.cs +++ b/MareSynchronos/FileCache/FileCacheManager.cs @@ -12,14 +12,14 @@ public class FileCacheManager : IDisposable private const string _penumbraPrefix = "{penumbra}"; private const string _cachePrefix = "{cache}"; private readonly IpcManager _ipcManager; - private readonly ConfigurationService _configService; + private readonly MareConfigService _configService; private readonly string _csvPath; private string CsvBakPath => _csvPath + ".bak"; private readonly ConcurrentDictionary _fileCaches = new(StringComparer.Ordinal); public const string CsvSplit = "|"; private readonly object _fileWriteLock = new(); - public FileCacheManager(IpcManager ipcManager, ConfigurationService configService) + public FileCacheManager(IpcManager ipcManager, MareConfigService configService) { _ipcManager = ipcManager; _configService = configService; diff --git a/MareSynchronos/FileCache/PeriodicFileScanner.cs b/MareSynchronos/FileCache/PeriodicFileScanner.cs index a7c5e65..dae43c8 100644 --- a/MareSynchronos/FileCache/PeriodicFileScanner.cs +++ b/MareSynchronos/FileCache/PeriodicFileScanner.cs @@ -9,13 +9,13 @@ namespace MareSynchronos.FileCache; public class PeriodicFileScanner : MediatorSubscriberBase, IDisposable { private readonly IpcManager _ipcManager; - private readonly ConfigurationService _configService; + private readonly MareConfigService _configService; private readonly FileCacheManager _fileDbManager; private CancellationTokenSource? _scanCancellationTokenSource; private Task? _fileScannerTask = null; public ConcurrentDictionary haltScanLocks = new(StringComparer.Ordinal); - public PeriodicFileScanner(IpcManager ipcManager, ConfigurationService configService, FileCacheManager fileDbManager, MareMediator mediator) : base(mediator) + public PeriodicFileScanner(IpcManager ipcManager, MareConfigService configService, FileCacheManager fileDbManager, MareMediator mediator) : base(mediator) { Logger.Verbose("Creating " + nameof(PeriodicFileScanner)); diff --git a/MareSynchronos/Managers/NotificationService.cs b/MareSynchronos/Managers/NotificationService.cs index fe7eac3..a429df6 100644 --- a/MareSynchronos/Managers/NotificationService.cs +++ b/MareSynchronos/Managers/NotificationService.cs @@ -3,6 +3,7 @@ using Dalamud.Game.Text.SeStringHandling; using Dalamud.Interface; using Dalamud.Interface.Internal.Notifications; using MareSynchronos.MareConfiguration; +using MareSynchronos.MareConfiguration.Models; using MareSynchronos.Mediator; using MareSynchronos.Utils; @@ -11,9 +12,9 @@ public class NotificationService : MediatorSubscriberBase { private readonly UiBuilder _uiBuilder; private readonly ChatGui _chatGui; - private readonly ConfigurationService _configurationService; + private readonly MareConfigService _configurationService; - public NotificationService(MareMediator mediator, UiBuilder uiBuilder, ChatGui chatGui, ConfigurationService configurationService) : base(mediator) + public NotificationService(MareMediator mediator, UiBuilder uiBuilder, ChatGui chatGui, MareConfigService configurationService) : base(mediator) { _uiBuilder = uiBuilder; _chatGui = chatGui; diff --git a/MareSynchronos/Managers/PairManager.cs b/MareSynchronos/Managers/PairManager.cs index a25298e..95ff577 100644 --- a/MareSynchronos/Managers/PairManager.cs +++ b/MareSynchronos/Managers/PairManager.cs @@ -22,10 +22,10 @@ public class PairManager : MediatorSubscriberBase, IDisposable private readonly ConcurrentDictionary _allGroups = new(GroupDataComparer.Instance); private readonly CachedPlayerFactory _cachedPlayerFactory; private readonly PairFactory _pairFactory; - private readonly ConfigurationService _configurationService; + private readonly MareConfigService _configurationService; public PairManager(CachedPlayerFactory cachedPlayerFactory, PairFactory pairFactory, - ConfigurationService configurationService, MareMediator mediator) : base(mediator) + MareConfigService configurationService, MareMediator mediator) : base(mediator) { _cachedPlayerFactory = cachedPlayerFactory; _pairFactory = pairFactory; diff --git a/MareSynchronos/Managers/ServerConfigurationManager.cs b/MareSynchronos/Managers/ServerConfigurationManager.cs index d14873a..96856e3 100644 --- a/MareSynchronos/Managers/ServerConfigurationManager.cs +++ b/MareSynchronos/Managers/ServerConfigurationManager.cs @@ -1,22 +1,40 @@ using MareSynchronos.MareConfiguration; +using MareSynchronos.MareConfiguration.Models; using MareSynchronos.Models; using MareSynchronos.Utils; using MareSynchronos.WebAPI; +using Microsoft.Extensions.Logging.Abstractions; +using System.Diagnostics; namespace MareSynchronos.Managers; public class ServerConfigurationManager { private readonly Dictionary _tokenDictionary = new(); - private readonly ConfigurationService _configService; + private readonly ServerConfigService _configService; + private readonly ServerTagConfigService _serverTagConfig; + private readonly NotesConfigService _notesConfig; private readonly DalamudUtil _dalamudUtil; public string CurrentApiUrl => string.IsNullOrEmpty(_configService.Current.CurrentServer) ? ApiController.MainServiceUri : _configService.Current.CurrentServer; public ServerStorage? CurrentServer => (_configService.Current.ServerStorage.ContainsKey(CurrentApiUrl) ? _configService.Current.ServerStorage[CurrentApiUrl] : null); + private ServerTagStorage CurrentServerTagStorage() + { + TryCreateCurrentServerTagStorage(); + return _serverTagConfig.Current.ServerTagStorage[CurrentApiUrl]; + } - public ServerConfigurationManager(ConfigurationService configService, DalamudUtil dalamudUtil) + private ServerNotesStorage CurrentNotesStorage() + { + TryCreateCurrentNotesStorage(); + return _notesConfig.Current.ServerNotes[CurrentApiUrl]; + } + + public ServerConfigurationManager(ServerConfigService configService, ServerTagConfigService serverTagConfig, NotesConfigService notesConfig, DalamudUtil dalamudUtil) { _configService = configService; + _serverTagConfig = serverTagConfig; + _notesConfig = notesConfig; _dalamudUtil = dalamudUtil; } @@ -48,7 +66,7 @@ public class ServerConfigurationManager { _configService.Current.ServerStorage.Add(_configService.Current.CurrentServer, new ServerStorage() { ServerUri = ApiController.MainServiceUri, ServerName = ApiController.MainServer }); } - _configService.Save(); + Save(); return CurrentServer!; } } @@ -60,6 +78,8 @@ public class ServerConfigurationManager public void Save() { + var caller = new StackTrace().GetFrame(1)?.GetMethod()?.ReflectedType?.Name ?? "Unknown"; + Logger.Debug(caller + " Calling config save"); _configService.Save(); } @@ -138,14 +158,14 @@ public class ServerConfigurationManager WorldId = _dalamudUtil.WorldId, SecretKeyIdx = addLastSecretKey ? server.SecretKeys.Last().Key : -1, }); - _configService.Save(); + Save(); } internal void AddEmptyCharacterToServer(int serverSelectionIndex) { var server = GetServerByIndex(serverSelectionIndex); server.Authentications.Add(new Authentication()); - _configService.Save(); + Save(); } internal void RemoveCharacterFromServer(int serverSelectionIndex, Authentication item) @@ -157,11 +177,160 @@ public class ServerConfigurationManager internal void AddServer(ServerStorage serverStorage) { _configService.Current.ServerStorage[serverStorage.ServerUri] = serverStorage; - _configService.Save(); + Save(); } internal void DeleteServer(ServerStorage selectedServer) { _configService.Current.ServerStorage.Remove(selectedServer.ServerUri); + Save(); + } + + internal void AddOpenPairTag(string tag) + { + CurrentServerTagStorage().OpenPairTags.Add(tag); + _serverTagConfig.Save(); + } + + internal void RemoveOpenPairTag(string tag) + { + CurrentServerTagStorage().OpenPairTags.Remove(tag); + _serverTagConfig.Save(); + } + + internal bool ContainsOpenPairTag(string tag) + { + return CurrentServerTagStorage().OpenPairTags.Contains(tag); + } + + internal Dictionary> GetUidServerPairedUserTags() + { + return CurrentServerTagStorage().UidServerPairedUserTags; + } + + internal HashSet GetServerAvailablePairTags() + { + return CurrentServerTagStorage().ServerAvailablePairTags; + } + + internal void AddTag(string tag) + { + CurrentServerTagStorage().ServerAvailablePairTags.Add(tag); + _serverTagConfig.Save(); + } + + internal void RemoveTag(string tag) + { + CurrentServerTagStorage().ServerAvailablePairTags.Remove(tag); + foreach (var uid in GetUidsForTag(tag)) + { + RemoveTagForUid(uid, tag, false); + } + _serverTagConfig.Save(); + } + + private void TryCreateCurrentServerTagStorage() + { + if (!_serverTagConfig.Current.ServerTagStorage.ContainsKey(CurrentApiUrl)) + { + _serverTagConfig.Current.ServerTagStorage[CurrentApiUrl] = new(); + } + } + + private void TryCreateCurrentNotesStorage() + { + if (!_notesConfig.Current.ServerNotes.ContainsKey(CurrentApiUrl)) + { + _notesConfig.Current.ServerNotes[CurrentApiUrl] = new(); + } + } + + internal void AddTagForUid(string uid, string tagName) + { + if (CurrentServerTagStorage().UidServerPairedUserTags.TryGetValue(uid, out var tags)) + { + tags.Add(tagName); + } + else + { + CurrentServerTagStorage().UidServerPairedUserTags[uid] = new() { tagName }; + } + + _serverTagConfig.Save(); + } + + internal void RemoveTagForUid(string uid, string tagName, bool save = true) + { + if (CurrentServerTagStorage().UidServerPairedUserTags.TryGetValue(uid, out var tags)) + { + tags.Remove(tagName); + if (save) + _serverTagConfig.Save(); + } + } + + internal bool ContainsTag(string uid, string tag) + { + if (CurrentServerTagStorage().UidServerPairedUserTags.TryGetValue(uid, out var tags)) + { + return tags.Contains(tag, StringComparer.Ordinal); + } + + return false; + } + + internal bool HasTags(string uid) + { + if (CurrentServerTagStorage().UidServerPairedUserTags.TryGetValue(uid, out var tags)) + { + return tags.Any(); + } + + return false; + } + + internal HashSet GetUidsForTag(string tag) + { + return CurrentServerTagStorage().UidServerPairedUserTags.Where(p => p.Value.Contains(tag, StringComparer.Ordinal)).Select(p => p.Key).ToHashSet(StringComparer.Ordinal); + } + + internal string? GetNoteForUid(string uid) + { + if (CurrentNotesStorage().UidServerComments.TryGetValue(uid, out var note)) + { + if (string.IsNullOrEmpty(note)) return null; + return note; + } + return null; + } + + internal void SetNoteForUid(string uid, string note, bool save = true) + { + CurrentNotesStorage().UidServerComments[uid] = note; + if (save) + _notesConfig.Save(); + } + + internal void SaveNotes() + { + _notesConfig.Save(); + } + + internal string? GetNoteForGid(string gID) + { + if (CurrentNotesStorage().GidServerComments.TryGetValue(gID, out var note)) + { + if (string.IsNullOrEmpty(note)) return null; + return note; + } + + return null; + } + + internal void SetNoteForGid(string gid, string note, bool save = true) + { + CurrentNotesStorage().GidServerComments[gid] = note; + if (save) + _notesConfig.Save(); } } diff --git a/MareSynchronos/Managers/TransientResourceManager.cs b/MareSynchronos/Managers/TransientResourceManager.cs index 6dafc50..a129f3f 100644 --- a/MareSynchronos/Managers/TransientResourceManager.cs +++ b/MareSynchronos/Managers/TransientResourceManager.cs @@ -10,7 +10,7 @@ namespace MareSynchronos.Managers; public class TransientResourceManager : MediatorSubscriberBase, IDisposable { - private readonly ConfigurationService _configurationService; + private readonly TransientConfigService _configurationService; private readonly DalamudUtil _dalamudUtil; public IntPtr[] PlayerRelatedPointers = Array.Empty(); @@ -19,7 +19,7 @@ public class TransientResourceManager : MediatorSubscriberBase, IDisposable private ConcurrentDictionary> TransientResources { get; } = new(); private ConcurrentDictionary> SemiTransientResources { get; } = new(); - public TransientResourceManager(ConfigurationService configurationService, DalamudUtil dalamudUtil, MareMediator mediator) : base(mediator) + public TransientResourceManager(TransientConfigService configurationService, DalamudUtil dalamudUtil, MareMediator mediator) : base(mediator) { _configurationService = configurationService; _dalamudUtil = dalamudUtil; diff --git a/MareSynchronos/MareConfiguration/ConfigurationExtensions.cs b/MareSynchronos/MareConfiguration/ConfigurationExtensions.cs index 88f08cd..1a6d34a 100644 --- a/MareSynchronos/MareConfiguration/ConfigurationExtensions.cs +++ b/MareSynchronos/MareConfiguration/ConfigurationExtensions.cs @@ -1,4 +1,6 @@ -namespace MareSynchronos.MareConfiguration; +using MareSynchronos.MareConfiguration.Configurations; + +namespace MareSynchronos.MareConfiguration; public static class ConfigurationExtensions { diff --git a/MareSynchronos/MareConfiguration/ConfigurationMigrator.cs b/MareSynchronos/MareConfiguration/ConfigurationMigrator.cs new file mode 100644 index 0000000..3e0ae5a --- /dev/null +++ b/MareSynchronos/MareConfiguration/ConfigurationMigrator.cs @@ -0,0 +1,89 @@ +using Dalamud.Plugin; +using MareSynchronos.MareConfiguration.Configurations; +using MareSynchronos.MareConfiguration.Configurations.Obsolete; +using MareSynchronos.MareConfiguration.Models; +using MareSynchronos.Utils; +using Newtonsoft.Json; + +namespace MareSynchronos.MareConfiguration; + +public class ConfigurationMigrator +{ + private readonly DalamudPluginInterface _pi; + + public ConfigurationMigrator(DalamudPluginInterface pi) + { + _pi = pi; + } + + public void Migrate() + { +#pragma warning disable CS0618 // ignore Obsolete tag, the point of this migrator is to migrate obsolete configs to new ones + if (_pi.GetPluginConfig() is Configuration oldConfig) + { + Logger.Info("Migrating Configuration from old config style to 1"); + + var config = oldConfig.ToMareConfig(); + File.Move(_pi.ConfigFile.FullName, _pi.ConfigFile.FullName + ".old", overwrite: true); + MigrateMareConfigV0ToV1(config); + } + + var mareConfig = JsonConvert.DeserializeObject(File.ReadAllText(ConfigurationPath(MareConfigService.ConfigName)))!; + + if (mareConfig.Version == 0) + { + MigrateMareConfigV0ToV1(mareConfig); + } + } + + private void MigrateMareConfigV0ToV1(MareConfigV0 mareConfigV0) + { + Logger.Info("Migrating Configuration from version 0 to 1"); + if (File.Exists(ConfigurationPath(MareConfigService.ConfigName))) + File.Copy(ConfigurationPath(MareConfigService.ConfigName), ConfigurationPath(MareConfigService.ConfigName) + ".migrated." + mareConfigV0.Version + ".bak", true); + + MareConfig mareConfigV1 = mareConfigV0.ToV1(); + + var serverConfig = new ServerConfig() + { + CurrentServer = mareConfigV0.CurrentServer, + ServerStorage = mareConfigV0.ServerStorage.ToDictionary(p => p.Key, p => p.Value.ToV1(), StringComparer.Ordinal) + }; + var transientConfig = new TransientConfig() + { + PlayerPersistentTransientCache = mareConfigV0.PlayerPersistentTransientCache + }; + var tagConfig = new ServerTagConfig() + { + ServerTagStorage = mareConfigV0.ServerStorage.ToDictionary(p => p.Key, p => new ServerTagStorage() + { + UidServerPairedUserTags = p.Value.UidServerPairedUserTags.ToDictionary(p => p.Key, p => p.Value.ToList(), StringComparer.Ordinal), + OpenPairTags = p.Value.OpenPairTags.ToHashSet(StringComparer.Ordinal), + ServerAvailablePairTags = p.Value.ServerAvailablePairTags.ToHashSet(StringComparer.Ordinal) + }, StringComparer.Ordinal) + }; + var notesConfig = new UidNotesConfig() + { + ServerNotes = mareConfigV0.ServerStorage.ToDictionary(p => p.Key, p => new ServerNotesStorage() + { + GidServerComments = p.Value.GidServerComments, + UidServerComments = p.Value.UidServerComments + }, StringComparer.Ordinal) + }; + + SaveConfig(mareConfigV1, ConfigurationPath(MareConfigService.ConfigName)); + SaveConfig(serverConfig, ConfigurationPath(ServerConfigService.ConfigName)); + SaveConfig(transientConfig, ConfigurationPath(TransientConfigService.ConfigName)); + SaveConfig(tagConfig, ConfigurationPath(ServerTagConfigService.ConfigName)); + SaveConfig(notesConfig, ConfigurationPath(NotesConfigService.ConfigName)); + } +#pragma warning restore CS0618 // ignore Obsolete tag, the point of this migrator is to migrate obsolete configs to new ones + + private string ConfigurationPath(string configName) => Path.Combine(_pi.ConfigDirectory.FullName, configName); + + + private void SaveConfig(IMareConfiguration config, string path) + { + File.WriteAllText(path, JsonConvert.SerializeObject(config, Formatting.Indented)); + } +} \ No newline at end of file diff --git a/MareSynchronos/MareConfiguration/ConfigurationService.cs b/MareSynchronos/MareConfiguration/ConfigurationService.cs deleted file mode 100644 index a2d382b..0000000 --- a/MareSynchronos/MareConfiguration/ConfigurationService.cs +++ /dev/null @@ -1,82 +0,0 @@ -using Dalamud.Plugin; -using MareSynchronos.Utils; -using Newtonsoft.Json; - -namespace MareSynchronos.MareConfiguration; - -public class ConfigurationService : IDisposable -{ - private const string _configurationName = "Config.json"; - private string ConfigurationPath => Path.Combine(_pluginInterface.ConfigDirectory.FullName, _configurationName); - public string ConfigurationDirectory => _pluginInterface.ConfigDirectory.FullName; - private readonly DalamudPluginInterface _pluginInterface; - private readonly CancellationTokenSource _periodicCheckCts = new(); - private DateTime _configLastWriteTime; - - public MareConfig Current { get; private set; } - - public ConfigurationService(DalamudPluginInterface pluginInterface) - { - _pluginInterface = pluginInterface; - - if (pluginInterface.GetPluginConfig() is Configuration oldConfig) - { - Current = oldConfig.ToMareConfig(); - File.Move(pluginInterface.ConfigFile.FullName, pluginInterface.ConfigFile.FullName + ".old", overwrite: true); - } - else - { - Current = LoadConfig(); - } - - Save(); - - Task.Run(CheckForConfigUpdatesInternal, _periodicCheckCts.Token); - } - - private async Task CheckForConfigUpdatesInternal() - { - while (!_periodicCheckCts.IsCancellationRequested) - { - var lastWriteTime = GetConfigLastWriteTime(); - if (lastWriteTime != _configLastWriteTime) - { - Logger.Debug("Config changed, reloading config"); - Current = LoadConfig(); - } - - await Task.Delay(TimeSpan.FromSeconds(5), _periodicCheckCts.Token).ConfigureAwait(false); - } - } - - private MareConfig LoadConfig() - { - MareConfig config; - if (!File.Exists(ConfigurationPath)) - { - config = new(); - } - else - { - config = JsonConvert.DeserializeObject(File.ReadAllText(ConfigurationPath)) ?? new MareConfig(); - } - - _configLastWriteTime = GetConfigLastWriteTime(); - return config; - } - - private DateTime GetConfigLastWriteTime() => new FileInfo(ConfigurationPath).LastWriteTimeUtc; - - public void Save() - { - File.WriteAllText(ConfigurationPath, JsonConvert.SerializeObject(Current, Formatting.Indented)); - _configLastWriteTime = new FileInfo(ConfigurationPath).LastWriteTimeUtc; - } - - public void Dispose() - { - Logger.Verbose($"Disposing {GetType()}"); - Save(); - _periodicCheckCts.Cancel(); - } -} diff --git a/MareSynchronos/MareConfiguration/ConfigurationServiceBase.cs b/MareSynchronos/MareConfiguration/ConfigurationServiceBase.cs new file mode 100644 index 0000000..d3e9368 --- /dev/null +++ b/MareSynchronos/MareConfiguration/ConfigurationServiceBase.cs @@ -0,0 +1,123 @@ +using Dalamud.Plugin; +using MareSynchronos.MareConfiguration.Configurations; +using MareSynchronos.Utils; +using Newtonsoft.Json; + +namespace MareSynchronos.MareConfiguration; + +public abstract class ConfigurationServiceBase : IDisposable where T : IMareConfiguration +{ + protected abstract string ConfigurationName { get; } + public string ConfigurationDirectory => _pluginInterface.ConfigDirectory.FullName; + public T Current => _currentConfigInternal.Value; + + protected readonly DalamudPluginInterface _pluginInterface; + private readonly CancellationTokenSource _periodicCheckCts = new(); + private DateTime _configLastWriteTime; + private bool _configIsDirty = false; + private Lazy _currentConfigInternal; + + protected string ConfigurationPath => Path.Combine(ConfigurationDirectory, ConfigurationName); + protected ConfigurationServiceBase(DalamudPluginInterface pluginInterface) + { + _pluginInterface = pluginInterface; + + Task.Run(CheckForConfigUpdatesInternal, _periodicCheckCts.Token); + Task.Run(CheckForDirtyConfigInternal, _periodicCheckCts.Token); + + _currentConfigInternal = LazyConfig(); + } + + private Lazy LazyConfig() + { + _configLastWriteTime = GetConfigLastWriteTime(); + return new Lazy(() => LoadConfig()); + } + private DateTime GetConfigLastWriteTime() => new FileInfo(ConfigurationPath).LastWriteTimeUtc; + + private async Task CheckForConfigUpdatesInternal() + { + while (!_periodicCheckCts.IsCancellationRequested) + { + await Task.Delay(TimeSpan.FromSeconds(5), _periodicCheckCts.Token).ConfigureAwait(false); + + var lastWriteTime = GetConfigLastWriteTime(); + if (lastWriteTime != _configLastWriteTime) + { + Logger.Debug($"Config {ConfigurationName} changed, reloading config"); + _currentConfigInternal = LazyConfig(); + } + } + } + + private async Task CheckForDirtyConfigInternal() + { + while (!_periodicCheckCts.IsCancellationRequested) + { + if (_configIsDirty) + { + SaveDirtyConfig(); + } + + await Task.Delay(TimeSpan.FromSeconds(1), _periodicCheckCts.Token).ConfigureAwait(false); + } + } + + protected T LoadConfig() + { + T? config; + if (!File.Exists(ConfigurationPath)) + { + config = (T)Activator.CreateInstance(typeof(T))!; + Save(); + } + else + { + config = JsonConvert.DeserializeObject(File.ReadAllText(ConfigurationPath)); + if (config == null) + { + config = (T)Activator.CreateInstance(typeof(T))!; + Save(); + } + } + + _configLastWriteTime = GetConfigLastWriteTime(); + return config; + } + + protected void SaveDirtyConfig() + { + _configIsDirty = false; + var existingConfigs = Directory.EnumerateFiles(ConfigurationDirectory, ConfigurationName + ".bak.*").Select(c => new FileInfo(c)) + .OrderByDescending(c => c.LastWriteTime).ToList(); + if (existingConfigs.Skip(10).Any()) + { + foreach (var config in existingConfigs.Skip(10).ToList()) + { + config.Delete(); + } + } + + Logger.Debug("Saving dirty config " + ConfigurationName); + + try + { + File.Copy(ConfigurationPath, ConfigurationPath + ".bak." + DateTime.Now.ToString("yyyyMMddHHmmss"), true); + } + catch { } + + File.WriteAllText(ConfigurationPath, JsonConvert.SerializeObject(Current, Formatting.Indented)); + _configLastWriteTime = new FileInfo(ConfigurationPath).LastWriteTimeUtc; + } + + public void Save() + { + _configIsDirty = true; + } + + public void Dispose() + { + Logger.Verbose($"Disposing {GetType()}"); + _periodicCheckCts.Cancel(); + } +} diff --git a/MareSynchronos/MareConfiguration/Configurations/IMareConfiguration.cs b/MareSynchronos/MareConfiguration/Configurations/IMareConfiguration.cs new file mode 100644 index 0000000..280f4e4 --- /dev/null +++ b/MareSynchronos/MareConfiguration/Configurations/IMareConfiguration.cs @@ -0,0 +1,6 @@ +namespace MareSynchronos.MareConfiguration.Configurations; + +public interface IMareConfiguration +{ + int Version { get; set; } +} diff --git a/MareSynchronos/MareConfiguration/MareConfig.cs b/MareSynchronos/MareConfiguration/Configurations/MareConfig.cs similarity index 61% rename from MareSynchronos/MareConfiguration/MareConfig.cs rename to MareSynchronos/MareConfiguration/Configurations/MareConfig.cs index 2710cde..e494ea4 100644 --- a/MareSynchronos/MareConfiguration/MareConfig.cs +++ b/MareSynchronos/MareConfiguration/Configurations/MareConfig.cs @@ -1,17 +1,11 @@ -using Dalamud.Configuration; -using MareSynchronos.WebAPI; +using MareSynchronos.MareConfiguration.Models; -namespace MareSynchronos.MareConfiguration; +namespace MareSynchronos.MareConfiguration.Configurations; [Serializable] -public class MareConfig : IPluginConfiguration +public class MareConfig : IMareConfiguration { - public int Version { get; set; } = 0; - public Dictionary ServerStorage { get; set; } = new(StringComparer.OrdinalIgnoreCase) - { - { ApiController.MainServiceUri, new ServerStorage() { ServerName = ApiController.MainServer, ServerUri = ApiController.MainServiceUri } }, - }; - public Dictionary> PlayerPersistentTransientCache { get; set; } = new(StringComparer.Ordinal); + public int Version { get; set; } = 1; public bool AcceptedAgreement { get; set; } = false; public string CacheFolder { get; set; } = string.Empty; public double MaxLocalCacheInGiB { get; set; } = 20; @@ -23,12 +17,11 @@ public class MareConfig : IPluginConfiguration public bool OpenGposeImportOnGposeStart { get; set; } = false; public bool ShowTransferWindow { get; set; } = true; public bool OpenPopupOnAdd { get; set; } = true; - public string CurrentServer { get; set; } = string.Empty; public bool ShowOnlineNotifications { get; set; } = false; public bool ShowOnlineNotificationsOnlyForIndividualPairs { get; set; } = true; public bool ShowOnlineNotificationsOnlyForNamedPairs { get; set; } = false; public bool ShowCharacterNameInsteadOfNotesForVisible { get; set; } = false; public NotificationLocation InfoNotification { get; set; } = NotificationLocation.Toast; public NotificationLocation WarningNotification { get; set; } = NotificationLocation.Both; - public NotificationLocation ErrorNotification { get; set;} = NotificationLocation.Both; -} \ No newline at end of file + public NotificationLocation ErrorNotification { get; set; } = NotificationLocation.Both; +} diff --git a/MareSynchronos/MareConfiguration/Configuration.cs b/MareSynchronos/MareConfiguration/Configurations/Obsolete/Configuration.cs similarity index 91% rename from MareSynchronos/MareConfiguration/Configuration.cs rename to MareSynchronos/MareConfiguration/Configurations/Obsolete/Configuration.cs index e30f54d..7df0072 100644 --- a/MareSynchronos/MareConfiguration/Configuration.cs +++ b/MareSynchronos/MareConfiguration/Configurations/Obsolete/Configuration.cs @@ -1,20 +1,21 @@ using Dalamud.Configuration; using Dalamud.Plugin; +using MareSynchronos.MareConfiguration.Models; using MareSynchronos.Utils; using MareSynchronos.WebAPI; -namespace MareSynchronos.MareConfiguration; +namespace MareSynchronos.MareConfiguration.Configurations.Obsolete; [Serializable] -[Obsolete("Migrated to MareConfig")] +[Obsolete("Deprecated, use MareConfig")] public class Configuration : IPluginConfiguration { public int Version { get; set; } = 6; [NonSerialized] private DalamudPluginInterface? _pluginInterface; - public Dictionary ServerStorage { get; set; } = new(StringComparer.OrdinalIgnoreCase) + public Dictionary ServerStorage { get; set; } = new(StringComparer.OrdinalIgnoreCase) { - { ApiController.MainServiceUri, new ServerStorage() { ServerName = ApiController.MainServer, ServerUri = ApiController.MainServiceUri } }, + { ApiController.MainServiceUri, new ServerStorageV0() { ServerName = ApiController.MainServer, ServerUri = ApiController.MainServiceUri } }, }; public bool AcceptedAgreement { get; set; } = false; public string CacheFolder { get; set; } = string.Empty; @@ -73,9 +74,9 @@ public class Configuration : IPluginConfiguration _pluginInterface!.SavePluginConfig(this); } - public MareConfig ToMareConfig() + public MareConfigV0 ToMareConfig() { - MareConfig newConfig = new(); + MareConfigV0 newConfig = new(); Logger.Info("Migrating Config to MareConfig"); newConfig.AcceptedAgreement = AcceptedAgreement; @@ -97,7 +98,7 @@ public class Configuration : IPluginConfiguration Logger.Debug("Migrating " + secret.Key); var apiuri = secret.Key; var secretkey = secret.Value; - ServerStorage toAdd = new(); + ServerStorageV0 toAdd = new(); if (string.Equals(apiuri, ApiController.MainServiceUri, StringComparison.OrdinalIgnoreCase)) { toAdd.ServerUri = ApiController.MainServiceUri; diff --git a/MareSynchronos/MareConfiguration/Configurations/Obsolete/MareConfigV0.cs b/MareSynchronos/MareConfiguration/Configurations/Obsolete/MareConfigV0.cs new file mode 100644 index 0000000..bbb07c0 --- /dev/null +++ b/MareSynchronos/MareConfiguration/Configurations/Obsolete/MareConfigV0.cs @@ -0,0 +1,56 @@ +using MareSynchronos.MareConfiguration.Models; + +namespace MareSynchronos.MareConfiguration.Configurations.Obsolete; + +[Serializable] +[Obsolete("Deprecated, use MareConfig")] +public class MareConfigV0 : IMareConfiguration +{ + public int Version { get; set; } = 0; + public Dictionary ServerStorage { get; set; } = new(StringComparer.OrdinalIgnoreCase); + public Dictionary> PlayerPersistentTransientCache { get; set; } = new(StringComparer.Ordinal); + public bool AcceptedAgreement { get; set; } = false; + public string CacheFolder { get; set; } = string.Empty; + public double MaxLocalCacheInGiB { get; set; } = 20; + public bool ReverseUserSort { get; set; } = false; + public int TimeSpanBetweenScansInSeconds { get; set; } = 30; + public bool FileScanPaused { get; set; } = false; + public bool InitialScanComplete { get; set; } = false; + public bool DisableOptionalPluginWarnings { get; set; } = false; + public bool OpenGposeImportOnGposeStart { get; set; } = false; + public bool ShowTransferWindow { get; set; } = true; + public bool OpenPopupOnAdd { get; set; } = true; + public string CurrentServer { get; set; } = string.Empty; + public bool ShowOnlineNotifications { get; set; } = false; + public bool ShowOnlineNotificationsOnlyForIndividualPairs { get; set; } = true; + public bool ShowOnlineNotificationsOnlyForNamedPairs { get; set; } = false; + public bool ShowCharacterNameInsteadOfNotesForVisible { get; set; } = false; + public NotificationLocation InfoNotification { get; set; } = NotificationLocation.Toast; + public NotificationLocation WarningNotification { get; set; } = NotificationLocation.Both; + public NotificationLocation ErrorNotification { get; set; } = NotificationLocation.Both; + + public MareConfig ToV1() + { + return new MareConfig() + { + AcceptedAgreement = this.AcceptedAgreement, + CacheFolder = this.CacheFolder, + MaxLocalCacheInGiB = this.MaxLocalCacheInGiB, + ReverseUserSort = this.ReverseUserSort, + TimeSpanBetweenScansInSeconds = this.TimeSpanBetweenScansInSeconds, + FileScanPaused = this.FileScanPaused, + InitialScanComplete = this.InitialScanComplete, + DisableOptionalPluginWarnings = this.DisableOptionalPluginWarnings, + OpenGposeImportOnGposeStart = this.OpenGposeImportOnGposeStart, + ShowTransferWindow = this.ShowTransferWindow, + OpenPopupOnAdd = this.OpenPopupOnAdd, + ShowOnlineNotifications = this.ShowOnlineNotifications, + ShowOnlineNotificationsOnlyForIndividualPairs = this.ShowOnlineNotificationsOnlyForIndividualPairs, + ShowCharacterNameInsteadOfNotesForVisible = this.ShowCharacterNameInsteadOfNotesForVisible, + ShowOnlineNotificationsOnlyForNamedPairs = this.ShowOnlineNotificationsOnlyForNamedPairs, + ErrorNotification = this.ErrorNotification, + InfoNotification = this.InfoNotification, + WarningNotification = this.WarningNotification, + }; + } +} diff --git a/MareSynchronos/MareConfiguration/Configurations/ServerConfig.cs b/MareSynchronos/MareConfiguration/Configurations/ServerConfig.cs new file mode 100644 index 0000000..20262db --- /dev/null +++ b/MareSynchronos/MareConfiguration/Configurations/ServerConfig.cs @@ -0,0 +1,16 @@ +using MareSynchronos.MareConfiguration.Models; +using MareSynchronos.WebAPI; + +namespace MareSynchronos.MareConfiguration.Configurations; + +[Serializable] +public class ServerConfig : IMareConfiguration +{ + public int Version { get; set; } = 0; + + public Dictionary ServerStorage { get; set; } = new(StringComparer.OrdinalIgnoreCase) + { + { ApiController.MainServiceUri, new ServerStorage() { ServerName = ApiController.MainServer, ServerUri = ApiController.MainServiceUri } }, + }; + public string CurrentServer { get; set; } = string.Empty; +} diff --git a/MareSynchronos/MareConfiguration/Configurations/ServerTagConfig.cs b/MareSynchronos/MareConfiguration/Configurations/ServerTagConfig.cs new file mode 100644 index 0000000..7b34d2d --- /dev/null +++ b/MareSynchronos/MareConfiguration/Configurations/ServerTagConfig.cs @@ -0,0 +1,9 @@ +using MareSynchronos.MareConfiguration.Models; + +namespace MareSynchronos.MareConfiguration.Configurations; + +public class ServerTagConfig : IMareConfiguration +{ + public int Version { get; set; } = 0; + public Dictionary ServerTagStorage { get; set; } = new(StringComparer.OrdinalIgnoreCase); +} diff --git a/MareSynchronos/MareConfiguration/Configurations/TransientConfig.cs b/MareSynchronos/MareConfiguration/Configurations/TransientConfig.cs new file mode 100644 index 0000000..5c7a124 --- /dev/null +++ b/MareSynchronos/MareConfiguration/Configurations/TransientConfig.cs @@ -0,0 +1,9 @@ +namespace MareSynchronos.MareConfiguration.Configurations; + +public class TransientConfig : IMareConfiguration +{ + public int Version { get; set; } = 0; + + public Dictionary> PlayerPersistentTransientCache { get; set; } = new(StringComparer.Ordinal); + +} \ No newline at end of file diff --git a/MareSynchronos/MareConfiguration/Configurations/UidNotesConfig.cs b/MareSynchronos/MareConfiguration/Configurations/UidNotesConfig.cs new file mode 100644 index 0000000..f0b1045 --- /dev/null +++ b/MareSynchronos/MareConfiguration/Configurations/UidNotesConfig.cs @@ -0,0 +1,9 @@ +using MareSynchronos.MareConfiguration.Models; + +namespace MareSynchronos.MareConfiguration.Configurations; + +public class UidNotesConfig : IMareConfiguration +{ + public int Version { get; set; } = 0; + public Dictionary ServerNotes = new(StringComparer.Ordinal); +} diff --git a/MareSynchronos/MareConfiguration/MareConfigService.cs b/MareSynchronos/MareConfiguration/MareConfigService.cs new file mode 100644 index 0000000..60e8009 --- /dev/null +++ b/MareSynchronos/MareConfiguration/MareConfigService.cs @@ -0,0 +1,12 @@ +using Dalamud.Plugin; +using MareSynchronos.MareConfiguration.Configurations; + +namespace MareSynchronos.MareConfiguration; + +public class MareConfigService : ConfigurationServiceBase +{ + public const string ConfigName = "config.json"; + protected override string ConfigurationName => ConfigName; + + public MareConfigService(DalamudPluginInterface pluginInterface) : base(pluginInterface) { } +} diff --git a/MareSynchronos/MareConfiguration/Authentication.cs b/MareSynchronos/MareConfiguration/Models/Authentication.cs similarity index 78% rename from MareSynchronos/MareConfiguration/Authentication.cs rename to MareSynchronos/MareConfiguration/Models/Authentication.cs index af6492a..fcf13a5 100644 --- a/MareSynchronos/MareConfiguration/Authentication.cs +++ b/MareSynchronos/MareConfiguration/Models/Authentication.cs @@ -1,4 +1,4 @@ -namespace MareSynchronos.MareConfiguration; +namespace MareSynchronos.MareConfiguration.Models; [Serializable] public record Authentication diff --git a/MareSynchronos/MareConfiguration/NotificationLocation.cs b/MareSynchronos/MareConfiguration/Models/NotificationLocation.cs similarity index 58% rename from MareSynchronos/MareConfiguration/NotificationLocation.cs rename to MareSynchronos/MareConfiguration/Models/NotificationLocation.cs index 8e72a23..36d1d61 100644 --- a/MareSynchronos/MareConfiguration/NotificationLocation.cs +++ b/MareSynchronos/MareConfiguration/Models/NotificationLocation.cs @@ -1,4 +1,4 @@ -namespace MareSynchronos.MareConfiguration; +namespace MareSynchronos.MareConfiguration.Models; public enum NotificationLocation { diff --git a/MareSynchronos/MareConfiguration/ServerStorage.cs b/MareSynchronos/MareConfiguration/Models/Obsolete/ServerStorageV0.cs similarity index 62% rename from MareSynchronos/MareConfiguration/ServerStorage.cs rename to MareSynchronos/MareConfiguration/Models/Obsolete/ServerStorageV0.cs index 8093fba..a3a0d44 100644 --- a/MareSynchronos/MareConfiguration/ServerStorage.cs +++ b/MareSynchronos/MareConfiguration/Models/Obsolete/ServerStorageV0.cs @@ -1,7 +1,8 @@ -namespace MareSynchronos.MareConfiguration; +namespace MareSynchronos.MareConfiguration.Models; [Serializable] -public class ServerStorage +[Obsolete("Deprecated, use ServerStorage")] +public class ServerStorageV0 { public string ServerUri { get; set; } = string.Empty; public string ServerName { get; set; } = string.Empty; @@ -13,4 +14,16 @@ public class ServerStorage public HashSet OpenPairTags { get; set; } = new(StringComparer.Ordinal); public Dictionary SecretKeys { get; set; } = new(); public bool FullPause { get; set; } = false; + + public ServerStorage ToV1() + { + return new ServerStorage() + { + ServerUri = this.ServerUri, + ServerName = this.ServerName, + Authentications = this.Authentications.ToList(), + FullPause = this.FullPause, + SecretKeys = this.SecretKeys.ToDictionary(p => p.Key, p => p.Value) + }; + } } diff --git a/MareSynchronos/MareConfiguration/SecretKey.cs b/MareSynchronos/MareConfiguration/Models/SecretKey.cs similarity index 74% rename from MareSynchronos/MareConfiguration/SecretKey.cs rename to MareSynchronos/MareConfiguration/Models/SecretKey.cs index 726844e..6b42fc8 100644 --- a/MareSynchronos/MareConfiguration/SecretKey.cs +++ b/MareSynchronos/MareConfiguration/Models/SecretKey.cs @@ -1,4 +1,4 @@ -namespace MareSynchronos.MareConfiguration; +namespace MareSynchronos.MareConfiguration.Models; [Serializable] public class SecretKey diff --git a/MareSynchronos/MareConfiguration/Models/ServerStorage.cs b/MareSynchronos/MareConfiguration/Models/ServerStorage.cs new file mode 100644 index 0000000..6291315 --- /dev/null +++ b/MareSynchronos/MareConfiguration/Models/ServerStorage.cs @@ -0,0 +1,11 @@ +namespace MareSynchronos.MareConfiguration.Models; + +[Serializable] +public class ServerStorage +{ + public string ServerUri { get; set; } = string.Empty; + public string ServerName { get; set; } = string.Empty; + public List Authentications { get; set; } = new(); + public Dictionary SecretKeys { get; set; } = new(); + public bool FullPause { get; set; } = false; +} diff --git a/MareSynchronos/MareConfiguration/Models/ServerTagStorage.cs b/MareSynchronos/MareConfiguration/Models/ServerTagStorage.cs new file mode 100644 index 0000000..261caec --- /dev/null +++ b/MareSynchronos/MareConfiguration/Models/ServerTagStorage.cs @@ -0,0 +1,9 @@ +namespace MareSynchronos.MareConfiguration.Models; + +[Serializable] +public class ServerTagStorage +{ + public Dictionary> UidServerPairedUserTags = new(StringComparer.Ordinal); + public HashSet ServerAvailablePairTags { get; set; } = new(StringComparer.Ordinal); + public HashSet OpenPairTags { get; set; } = new(StringComparer.Ordinal); +} diff --git a/MareSynchronos/MareConfiguration/Models/UidNoteStorage.cs b/MareSynchronos/MareConfiguration/Models/UidNoteStorage.cs new file mode 100644 index 0000000..82e5508 --- /dev/null +++ b/MareSynchronos/MareConfiguration/Models/UidNoteStorage.cs @@ -0,0 +1,7 @@ +namespace MareSynchronos.MareConfiguration.Models; + +public class ServerNotesStorage +{ + public Dictionary UidServerComments { get; set; } = new(StringComparer.Ordinal); + public Dictionary GidServerComments { get; set; } = new(StringComparer.Ordinal); +} diff --git a/MareSynchronos/MareConfiguration/NotesConfigService.cs b/MareSynchronos/MareConfiguration/NotesConfigService.cs new file mode 100644 index 0000000..3af540d --- /dev/null +++ b/MareSynchronos/MareConfiguration/NotesConfigService.cs @@ -0,0 +1,11 @@ +using Dalamud.Plugin; +using MareSynchronos.MareConfiguration.Configurations; + +namespace MareSynchronos.MareConfiguration; + +public class NotesConfigService : ConfigurationServiceBase +{ + public const string ConfigName = "notes.json"; + protected override string ConfigurationName => ConfigName; + public NotesConfigService(DalamudPluginInterface pluginInterface) : base(pluginInterface) { } +} \ No newline at end of file diff --git a/MareSynchronos/MareConfiguration/ServerConfigService.cs b/MareSynchronos/MareConfiguration/ServerConfigService.cs new file mode 100644 index 0000000..1b566e8 --- /dev/null +++ b/MareSynchronos/MareConfiguration/ServerConfigService.cs @@ -0,0 +1,11 @@ +using Dalamud.Plugin; +using MareSynchronos.MareConfiguration.Configurations; + +namespace MareSynchronos.MareConfiguration; + +public class ServerConfigService : ConfigurationServiceBase +{ + public const string ConfigName = "server.json"; + protected override string ConfigurationName => ConfigName; + public ServerConfigService(DalamudPluginInterface pluginInterface) : base(pluginInterface) { } +} diff --git a/MareSynchronos/MareConfiguration/ServerTagConfigService.cs b/MareSynchronos/MareConfiguration/ServerTagConfigService.cs new file mode 100644 index 0000000..6fdfce5 --- /dev/null +++ b/MareSynchronos/MareConfiguration/ServerTagConfigService.cs @@ -0,0 +1,11 @@ +using Dalamud.Plugin; +using MareSynchronos.MareConfiguration.Configurations; + +namespace MareSynchronos.MareConfiguration; + +public class ServerTagConfigService : ConfigurationServiceBase +{ + public const string ConfigName = "servertags.json"; + protected override string ConfigurationName => ConfigName; + public ServerTagConfigService(DalamudPluginInterface pluginInterface) : base(pluginInterface) { } +} \ No newline at end of file diff --git a/MareSynchronos/MareConfiguration/TransientConfigService.cs b/MareSynchronos/MareConfiguration/TransientConfigService.cs new file mode 100644 index 0000000..5e8e18e --- /dev/null +++ b/MareSynchronos/MareConfiguration/TransientConfigService.cs @@ -0,0 +1,11 @@ +using Dalamud.Plugin; +using MareSynchronos.MareConfiguration.Configurations; + +namespace MareSynchronos.MareConfiguration; + +public class TransientConfigService : ConfigurationServiceBase +{ + public const string ConfigName = "transient.json"; + protected override string ConfigurationName => ConfigName; + public TransientConfigService(DalamudPluginInterface pluginInterface) : base(pluginInterface) { } +} diff --git a/MareSynchronos/MarePlugin.cs b/MareSynchronos/MarePlugin.cs index c6596ac..740a1b2 100644 --- a/MareSynchronos/MarePlugin.cs +++ b/MareSynchronos/MarePlugin.cs @@ -23,6 +23,8 @@ public class MarePlugin : MediatorSubscriberBase, IDisposable { _serviceProvider = serviceProvider; + _serviceProvider.GetRequiredService().Migrate(); + mediator.Subscribe(this, (_) => Task.Run(WaitForPlayerAndLaunchCharacterManager)); mediator.Subscribe(this, (_) => DalamudUtilOnLogIn()); mediator.Subscribe(this, (_) => DalamudUtilOnLogOut()); @@ -59,7 +61,7 @@ public class MarePlugin : MediatorSubscriberBase, IDisposable HelpMessage = "Opens the Mare Synchronos UI", }); - if (!_serviceProvider.GetRequiredService().Current.HasValidSetup() + if (!_serviceProvider.GetRequiredService().Current.HasValidSetup() || !_serviceProvider.GetRequiredService().HasValidConfig()) { _serviceProvider.GetRequiredService().Publish(new SwitchToIntroUiMessage()); @@ -148,7 +150,7 @@ public class MarePlugin : MediatorSubscriberBase, IDisposable private void OpenUi() { - if (_serviceProvider.GetRequiredService().Current.HasValidSetup()) + if (_serviceProvider.GetRequiredService().Current.HasValidSetup()) _serviceProvider.GetRequiredService().Toggle(); else _serviceProvider.GetRequiredService().Toggle(); diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index 5a7a726..03d68ff 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -3,7 +3,7 @@ - 0.7.17 + 0.7.18 https://github.com/Penumbra-Sync/client diff --git a/MareSynchronos/Mediator/IMediatorSubscriber.cs b/MareSynchronos/Mediator/IMediatorSubscriber.cs new file mode 100644 index 0000000..f4d46f2 --- /dev/null +++ b/MareSynchronos/Mediator/IMediatorSubscriber.cs @@ -0,0 +1,6 @@ +namespace MareSynchronos.Mediator; + +public interface IMediatorSubscriber : IDisposable +{ + MareMediator Mediator { get; } +} diff --git a/MareSynchronos/Mediator/MediatorSubscriberBase.cs b/MareSynchronos/Mediator/MediatorSubscriberBase.cs index 5b62d16..1577ae7 100644 --- a/MareSynchronos/Mediator/MediatorSubscriberBase.cs +++ b/MareSynchronos/Mediator/MediatorSubscriberBase.cs @@ -1,5 +1,4 @@ -using Dalamud.Interface.Windowing; -using MareSynchronos.Utils; +using MareSynchronos.Utils; namespace MareSynchronos.Mediator; @@ -17,23 +16,3 @@ public abstract class MediatorSubscriberBase : IMediatorSubscriber Mediator.UnsubscribeAll(this); } } - -public abstract class WindowMediatorSubscriberBase : Window, IMediatorSubscriber -{ - public MareMediator Mediator { get; } - protected WindowMediatorSubscriberBase(MareMediator mediator, string name) : base(name) - { - Mediator = mediator; - } - - public virtual void Dispose() - { - Logger.Verbose($"Disposing {GetType()}"); - Mediator.UnsubscribeAll(this); - } -} - -public interface IMediatorSubscriber : IDisposable -{ - MareMediator Mediator { get; } -} diff --git a/MareSynchronos/Mediator/WindowMediatorSubscriberBase.cs b/MareSynchronos/Mediator/WindowMediatorSubscriberBase.cs new file mode 100644 index 0000000..dd7e3c6 --- /dev/null +++ b/MareSynchronos/Mediator/WindowMediatorSubscriberBase.cs @@ -0,0 +1,19 @@ +using Dalamud.Interface.Windowing; +using MareSynchronos.Utils; + +namespace MareSynchronos.Mediator; + +public abstract class WindowMediatorSubscriberBase : Window, IMediatorSubscriber +{ + public MareMediator Mediator { get; } + protected WindowMediatorSubscriberBase(MareMediator mediator, string name) : base(name) + { + Mediator = mediator; + } + + public virtual void Dispose() + { + Logger.Verbose($"Disposing {GetType()}"); + Mediator.UnsubscribeAll(this); + } +} diff --git a/MareSynchronos/Models/Pair.cs b/MareSynchronos/Models/Pair.cs index 54ec7eb..0ba2fd6 100644 --- a/MareSynchronos/Models/Pair.cs +++ b/MareSynchronos/Models/Pair.cs @@ -12,11 +12,11 @@ namespace MareSynchronos.Models; public class Pair { - private readonly ConfigurationService _configService; + private readonly MareConfigService _configService; private readonly ServerConfigurationManager _serverConfigurationManager; private OptionalPluginWarning? _pluginWarnings; - public Pair(ConfigurationService configService, ServerConfigurationManager serverConfigurationManager) + public Pair(MareConfigService configService, ServerConfigurationManager serverConfigurationManager) { _configService = configService; _serverConfigurationManager = serverConfigurationManager; @@ -36,18 +36,12 @@ public class Pair public string? GetNote() { - if (_serverConfigurationManager.CurrentServer!.UidServerComments.TryGetValue(UserData.UID, out string? note)) - { - return string.IsNullOrEmpty(note) ? null : note; - } - - return null; + return _serverConfigurationManager.GetNoteForUid(UserData.UID); } public void SetNote(string note) { - _serverConfigurationManager.CurrentServer!.UidServerComments[UserData.UID] = note; - _serverConfigurationManager.Save(); + _serverConfigurationManager.SetNoteForUid(UserData.UID, note); } public bool HasAnyConnection() diff --git a/MareSynchronos/Plugin.cs b/MareSynchronos/Plugin.cs index 63782be..39c6ccb 100644 --- a/MareSynchronos/Plugin.cs +++ b/MareSynchronos/Plugin.cs @@ -48,7 +48,12 @@ public sealed class Plugin : IDalamudPlugin // add mare related stuff collection.AddSingleton(new Dalamud.Localization("MareSynchronos.Localization.", "", useEmbedded: true)); - collection.AddSingleton(); + collection.AddSingleton(); + collection.AddSingleton(); + collection.AddSingleton(); + collection.AddSingleton(); + collection.AddSingleton(); + collection.AddSingleton(); collection.AddSingleton(); collection.AddSingleton(); collection.AddSingleton(); diff --git a/MareSynchronos/UI/CompactUI.cs b/MareSynchronos/UI/CompactUI.cs index 04fdbae..8e18efc 100644 --- a/MareSynchronos/UI/CompactUI.cs +++ b/MareSynchronos/UI/CompactUI.cs @@ -26,7 +26,7 @@ public class CompactUi : WindowMediatorSubscriberBase, IDisposable private readonly ApiController _apiController; private readonly PairManager _pairManager; private readonly ServerConfigurationManager _serverManager; - private readonly ConfigurationService _configService; + private readonly MareConfigService _configService; private readonly TagHandler _tagHandler; public readonly Dictionary ShowUidForEntry = new(StringComparer.Ordinal); private readonly UiShared _uiShared; @@ -56,7 +56,7 @@ public class CompactUi : WindowMediatorSubscriberBase, IDisposable private readonly PairGroupsUi _pairGroupsUi; public CompactUi(WindowSystem windowSystem, - UiShared uiShared, ConfigurationService configService, ApiController apiController, PairManager pairManager, + UiShared uiShared, MareConfigService configService, ApiController apiController, PairManager pairManager, ServerConfigurationManager serverManager, MareMediator mediator) : base(mediator, "###MareSynchronosMainUI") { @@ -199,8 +199,7 @@ public class CompactUi : WindowMediatorSubscriberBase, IDisposable ImGui.InputTextWithHint("##noteforuser", $"Note for {_lastAddedUser.UserData.AliasOrUID}", ref _lastAddedUserComment, 100); if (UiShared.IconTextButton(FontAwesomeIcon.Save, "Save Note")) { - _serverManager.CurrentServer!.UidServerComments[_lastAddedUser.UserData.UID] = _lastAddedUserComment; - _serverManager.Save(); + _serverManager.SetNoteForUid(_lastAddedUser.UserData.UID, _lastAddedUserComment); _lastAddedUser = null; _lastAddedUserComment = string.Empty; _showModalForUserAddition = false; @@ -385,7 +384,8 @@ public class CompactUi : WindowMediatorSubscriberBase, IDisposable var textIsUid = true; ShowUidForEntry.TryGetValue(entry.UserPair!.User.UID, out var showUidInsteadOfName); - if (!showUidInsteadOfName && _serverManager.CurrentServer!.UidServerComments.TryGetValue(entry.UserPair!.User.UID, out var playerText)) + string? playerText = _serverManager.GetNoteForUid(entry.UserPair!.User.UID); + if (!showUidInsteadOfName && playerText != null) { if (string.IsNullOrEmpty(playerText)) { @@ -446,8 +446,7 @@ public class CompactUi : WindowMediatorSubscriberBase, IDisposable ImGui.SetNextItemWidth(UiShared.GetWindowContentRegionWidth() - ImGui.GetCursorPosX() - buttonSizes - ImGui.GetStyle().ItemSpacing.X * 2); if (ImGui.InputTextWithHint("", "Nick/Notes", ref EditUserComment, 255, ImGuiInputTextFlags.EnterReturnsTrue)) { - _serverManager.CurrentServer!.UidServerComments[entry.UserPair!.User.UID] = EditUserComment; - _serverManager.Save(); + _serverManager.SetNoteForUid(entry.UserPair!.User.UID, EditUserComment); EditNickEntry = string.Empty; } diff --git a/MareSynchronos/UI/DownloadUi.cs b/MareSynchronos/UI/DownloadUi.cs index 1b5cce1..5137142 100644 --- a/MareSynchronos/UI/DownloadUi.cs +++ b/MareSynchronos/UI/DownloadUi.cs @@ -10,7 +10,7 @@ namespace MareSynchronos.UI; public class DownloadUi : Window, IDisposable { private readonly WindowSystem _windowSystem; - private readonly ConfigurationService _configService; + private readonly MareConfigService _configService; private readonly ApiController _apiController; private readonly UiShared _uiShared; private bool _wasOpen = false; @@ -21,7 +21,7 @@ public class DownloadUi : Window, IDisposable _windowSystem.RemoveWindow(this); } - public DownloadUi(WindowSystem windowSystem, ConfigurationService configService, ApiController apiController, UiShared uiShared) : base("Mare Synchronos Downloads") + public DownloadUi(WindowSystem windowSystem, MareConfigService configService, ApiController apiController, UiShared uiShared) : base("Mare Synchronos Downloads") { Logger.Verbose("Creating " + nameof(DownloadUi)); _windowSystem = windowSystem; diff --git a/MareSynchronos/UI/GposeUi.cs b/MareSynchronos/UI/GposeUi.cs index 6413ab1..06dfb6a 100644 --- a/MareSynchronos/UI/GposeUi.cs +++ b/MareSynchronos/UI/GposeUi.cs @@ -16,10 +16,10 @@ public class GposeUi : WindowMediatorSubscriberBase, IDisposable private readonly MareCharaFileManager _mareCharaFileManager; private readonly DalamudUtil _dalamudUtil; private readonly FileDialogManager _fileDialogManager; - private readonly ConfigurationService _configService; + private readonly MareConfigService _configService; public GposeUi(WindowSystem windowSystem, MareCharaFileManager mareCharaFileManager, - DalamudUtil dalamudUtil, FileDialogManager fileDialogManager, ConfigurationService configService, + DalamudUtil dalamudUtil, FileDialogManager fileDialogManager, MareConfigService configService, MareMediator mediator) : base(mediator, "Mare Synchronos Gpose Import UI###MareSynchronosGposeUI") { _windowSystem = windowSystem; diff --git a/MareSynchronos/UI/GroupPanel.cs b/MareSynchronos/UI/GroupPanel.cs index 0514a63..82bbbd9 100644 --- a/MareSynchronos/UI/GroupPanel.cs +++ b/MareSynchronos/UI/GroupPanel.cs @@ -25,7 +25,7 @@ namespace MareSynchronos.UI private ApiController ApiController => _uiShared.ApiController; private readonly PairManager _pairManager; private readonly ServerConfigurationManager _serverConfigurationManager; - private readonly ConfigurationService _configService; + private readonly MareConfigService _configService; private readonly Dictionary _showGidForEntry = new(StringComparer.Ordinal); private string _editGroupEntry = string.Empty; private string _editGroupComment = string.Empty; @@ -53,7 +53,7 @@ namespace MareSynchronos.UI private bool _modalChangePwOpened; private int _bulkInviteCount = 10; - public GroupPanel(CompactUi mainUi, UiShared uiShared, PairManager pairManager, ServerConfigurationManager serverConfigurationManager, ConfigurationService configurationService) + public GroupPanel(CompactUi mainUi, UiShared uiShared, PairManager pairManager, ServerConfigurationManager serverConfigurationManager, MareConfigService configurationService) { _mainUi = mainUi; _uiShared = uiShared; @@ -241,13 +241,11 @@ namespace MareSynchronos.UI } _showGidForEntry.TryGetValue(groupDto.GID, out var showGidInsteadOfName); - if (!showGidInsteadOfName && _serverConfigurationManager.CurrentServer!.GidServerComments.TryGetValue(groupDto.GID, out var groupComment)) + var groupComment = _serverConfigurationManager.GetNoteForGid(groupDto.GID); + if (!showGidInsteadOfName && !string.IsNullOrEmpty(groupComment)) { - if (!string.IsNullOrEmpty(groupComment)) - { - groupName = groupComment; - textIsGid = false; - } + groupName = groupComment; + textIsGid = false; } if (!string.Equals(_editGroupEntry, groupDto.GID, StringComparison.Ordinal)) @@ -271,9 +269,8 @@ namespace MareSynchronos.UI if (ImGui.IsItemClicked(ImGuiMouseButton.Right)) { - _serverConfigurationManager.CurrentServer!.GidServerComments[_editGroupEntry] = _editGroupComment; - _serverConfigurationManager.Save(); - _editGroupComment = _serverConfigurationManager.CurrentServer!.GidServerComments.TryGetValue(groupDto.GID, out string? value) ? value : string.Empty; + _serverConfigurationManager.SetNoteForGid(_editGroupEntry, _editGroupComment); + _editGroupComment = _serverConfigurationManager.GetNoteForGid(groupDto.GID) ?? string.Empty; _editGroupEntry = groupDto.GID; } } @@ -283,8 +280,7 @@ namespace MareSynchronos.UI ImGui.SetNextItemWidth(UiShared.GetWindowContentRegionWidth() - ImGui.GetCursorPosX() - buttonSizes - ImGui.GetStyle().ItemSpacing.X * 2); if (ImGui.InputTextWithHint("", "Comment/Notes", ref _editGroupComment, 255, ImGuiInputTextFlags.EnterReturnsTrue)) { - _serverConfigurationManager.CurrentServer!.GidServerComments[groupDto.GID] = _editGroupComment; - _serverConfigurationManager.Save(); + _serverConfigurationManager.SetNoteForGid(groupDto.GID, _editGroupComment); _editGroupEntry = string.Empty; } @@ -436,7 +432,7 @@ namespace MareSynchronos.UI .ThenByDescending(u => u.GroupPair[groupDto].GroupPairStatusInfo.IsPinned()) .ThenBy(u => u.GetNote() ?? u.UserData.AliasOrUID, StringComparer.OrdinalIgnoreCase) .ToList(); - + if (visibleUsers.Any()) { ImGui.Text("Visible"); @@ -820,18 +816,8 @@ namespace MareSynchronos.UI var textIsUid = true; _mainUi.ShowUidForEntry.TryGetValue(entry.UID, out var showUidInsteadOfName); - if (!showUidInsteadOfName && _serverConfigurationManager.CurrentServer!.UidServerComments.TryGetValue(entry.UID, out var playerText)) - { - if (string.IsNullOrEmpty(playerText)) - { - playerText = entryUID; - } - else - { - textIsUid = false; - } - } - else + var playerText = _serverConfigurationManager.GetNoteForUid(entry.UID); + if (showUidInsteadOfName || string.IsNullOrEmpty(playerText)) { playerText = entryUID; } @@ -866,9 +852,8 @@ namespace MareSynchronos.UI if (ImGui.IsItemClicked(ImGuiMouseButton.Right)) { - _serverConfigurationManager.CurrentServer!.UidServerComments[_mainUi.EditNickEntry] = _mainUi.EditUserComment; - _serverConfigurationManager.Save(); - _mainUi.EditUserComment = _serverConfigurationManager.CurrentServer.UidServerComments.TryGetValue(entry.UID, out string? value) ? value : string.Empty; + _serverConfigurationManager.SetNoteForUid(_mainUi.EditNickEntry, _mainUi.EditUserComment); + _mainUi.EditUserComment = _serverConfigurationManager.GetNoteForUid(entry.UID) ?? string.Empty; _mainUi.EditNickEntry = entry.UID; } } @@ -881,8 +866,7 @@ namespace MareSynchronos.UI ImGui.SetNextItemWidth(UiShared.GetWindowContentRegionWidth() - ImGui.GetCursorPosX() - buttonSizes - ImGui.GetStyle().ItemSpacing.X * buttons); if (ImGui.InputTextWithHint("", "Nick/Notes", ref _mainUi.EditUserComment, 255, ImGuiInputTextFlags.EnterReturnsTrue)) { - _serverConfigurationManager.CurrentServer!.UidServerComments[entry.UID] = _mainUi.EditUserComment; - _serverConfigurationManager.Save(); + _serverConfigurationManager.SetNoteForUid(entry.UID, _mainUi.EditUserComment); _mainUi.EditNickEntry = string.Empty; } diff --git a/MareSynchronos/UI/Handlers/TagHandler.cs b/MareSynchronos/UI/Handlers/TagHandler.cs index 648cab1..f60cdf7 100644 --- a/MareSynchronos/UI/Handlers/TagHandler.cs +++ b/MareSynchronos/UI/Handlers/TagHandler.cs @@ -1,5 +1,6 @@ using MareSynchronos.API.Dto.User; using MareSynchronos.Managers; +using MareSynchronos.Models; namespace MareSynchronos.UI.Handlers { @@ -17,34 +18,27 @@ namespace MareSynchronos.UI.Handlers public void AddTag(string tag) { - GetAvailableTagsForCurrentServer().Add(tag); - _serverConfigurationManager.Save(); + _serverConfigurationManager.AddTag(tag); } public void RemoveTag(string tag) { // First remove the tag from teh available pair tags - GetAvailableTagsForCurrentServer().Remove(tag); - // Then also clean up the tag in all the pairs - GetUidTagDictionaryForCurrentServer().Keys - .ToList() - .ForEach(otherUid => RemoveTagFromPairedUid(otherUid, tag)); - _serverConfigurationManager.Save(); + _serverConfigurationManager.RemoveTag(tag); } public void SetTagOpen(string tag, bool open) { if (open) { - _serverConfigurationManager.CurrentServer!.OpenPairTags.Add(tag); + _serverConfigurationManager.AddOpenPairTag(tag); } else { - _serverConfigurationManager.CurrentServer!.OpenPairTags.Remove(tag); + _serverConfigurationManager.RemoveOpenPairTag(tag); } - _serverConfigurationManager.Save(); } - + /// /// Is this tag opened in the paired clients UI? /// @@ -52,73 +46,39 @@ namespace MareSynchronos.UI.Handlers /// open true/false public bool IsTagOpen(string tag) { - return _serverConfigurationManager.CurrentServer!.OpenPairTags.Contains(tag); + return _serverConfigurationManager.ContainsOpenPairTag(tag); } public List GetAllTagsSorted() { - return GetAvailableTagsForCurrentServer() + return _serverConfigurationManager.GetServerAvailablePairTags() .OrderBy(s => s, StringComparer.OrdinalIgnoreCase) .ToList(); } public HashSet GetOtherUidsForTag(string tag) { - return GetUidTagDictionaryForCurrentServer() - .Where(pair => pair.Value.Contains(tag, StringComparer.Ordinal)) - .Select(pair => pair.Key) - .ToHashSet(StringComparer.Ordinal); + return _serverConfigurationManager.GetUidsForTag(tag); } public void AddTagToPairedUid(UserPairDto pair, string tagName) { - var tagDictionary = GetUidTagDictionaryForCurrentServer(); - var tagsForPair = tagDictionary.GetValueOrDefault(pair.User.UID, new List()); - tagsForPair.Add(tagName); - tagDictionary[pair.User.UID] = tagsForPair; - _serverConfigurationManager.Save(); + _serverConfigurationManager.AddTagForUid(pair.User.UID, tagName); } - + public void RemoveTagFromPairedUid(UserPairDto pair, string tagName) { - RemoveTagFromPairedUid(pair.User.UID, tagName); - _serverConfigurationManager.Save(); + _serverConfigurationManager.RemoveTagForUid(pair.User.UID, tagName); } public bool HasTag(UserPairDto pair, string tagName) { - var tagsForPair = GetUidTagDictionaryForCurrentServer().GetValueOrDefault(pair.User.UID, new List()); - return tagsForPair.Contains(tagName, StringComparer.Ordinal); + return _serverConfigurationManager.ContainsTag(pair.User.UID, tagName); } public bool HasAnyTag(UserPairDto pair) { - return GetUidTagDictionaryForCurrentServer().ContainsKey(pair.User.UID); - } - - private void RemoveTagFromPairedUid(string otherUid, string tagName) - { - var tagsForPair = GetUidTagDictionaryForCurrentServer().GetValueOrDefault(otherUid, new List()); - tagsForPair.Remove(tagName); - if (!tagsForPair.Any()) - { - // No more entries in list -> we can kick out that entry completely - GetUidTagDictionaryForCurrentServer().Remove(otherUid); - } - else - { - GetUidTagDictionaryForCurrentServer()[otherUid] = tagsForPair; - } - } - - private Dictionary> GetUidTagDictionaryForCurrentServer() - { - return _serverConfigurationManager.CurrentServer!.UidServerPairedUserTags; - } - - private HashSet GetAvailableTagsForCurrentServer() - { - return _serverConfigurationManager.CurrentServer!.ServerAvailablePairTags; + return _serverConfigurationManager.HasTags(pair.User.UID); } } } \ No newline at end of file diff --git a/MareSynchronos/UI/IntroUI.cs b/MareSynchronos/UI/IntroUI.cs index 7b44d2d..65306cb 100644 --- a/MareSynchronos/UI/IntroUI.cs +++ b/MareSynchronos/UI/IntroUI.cs @@ -10,13 +10,14 @@ using Dalamud.Interface; using MareSynchronos.Managers; using MareSynchronos.MareConfiguration; using MareSynchronos.Mediator; +using MareSynchronos.MareConfiguration.Models; namespace MareSynchronos.UI; internal class IntroUi : WindowMediatorSubscriberBase, IDisposable { private readonly UiShared _uiShared; - private readonly ConfigurationService _configService; + private readonly MareConfigService _configService; private readonly PeriodicFileScanner _fileCacheManager; private readonly ServerConfigurationManager _serverConfigurationManager; private readonly WindowSystem _windowSystem; @@ -36,7 +37,7 @@ internal class IntroUi : WindowMediatorSubscriberBase, IDisposable _windowSystem.RemoveWindow(this); } - public IntroUi(WindowSystem windowSystem, UiShared uiShared, ConfigurationService configService, + public IntroUi(WindowSystem windowSystem, UiShared uiShared, MareConfigService configService, PeriodicFileScanner fileCacheManager, ServerConfigurationManager serverConfigurationManager, MareMediator mareMediator) : base(mareMediator, "Mare Synchronos Setup") { Logger.Verbose("Creating " + nameof(IntroUi)); diff --git a/MareSynchronos/UI/SettingsUi.cs b/MareSynchronos/UI/SettingsUi.cs index 1cf5b0a..6b435c4 100644 --- a/MareSynchronos/UI/SettingsUi.cs +++ b/MareSynchronos/UI/SettingsUi.cs @@ -14,12 +14,13 @@ using MareSynchronos.Managers; using MareSynchronos.API.Data.Comparer; using MareSynchronos.MareConfiguration; using MareSynchronos.Mediator; +using MareSynchronos.MareConfiguration.Models; namespace MareSynchronos.UI; public class SettingsUi : WindowMediatorSubscriberBase, IDisposable { - private readonly ConfigurationService _configService; + private readonly MareConfigService _configService; private readonly WindowSystem _windowSystem; private ApiController ApiController => _uiShared.ApiController; private readonly MareCharaFileManager _mareCharaFileManager; @@ -34,7 +35,7 @@ public class SettingsUi : WindowMediatorSubscriberBase, IDisposable private bool _wasOpen = false; public SettingsUi(WindowSystem windowSystem, - UiShared uiShared, ConfigurationService configService, + UiShared uiShared, MareConfigService configService, MareCharaFileManager mareCharaFileManager, PairManager pairManager, ServerConfigurationManager serverConfigurationManager, MareMediator mediator) : base(mediator, "Mare Synchronos Settings") { diff --git a/MareSynchronos/UI/UIShared.cs b/MareSynchronos/UI/UIShared.cs index cc9e375..f6fbcf4 100644 --- a/MareSynchronos/UI/UIShared.cs +++ b/MareSynchronos/UI/UIShared.cs @@ -13,6 +13,7 @@ using MareSynchronos.FileCache; using MareSynchronos.Localization; using MareSynchronos.Managers; using MareSynchronos.MareConfiguration; +using MareSynchronos.MareConfiguration.Models; using MareSynchronos.Models; using MareSynchronos.Utils; using MareSynchronos.WebAPI; @@ -28,7 +29,7 @@ public partial class UiShared : IDisposable private readonly ApiController _apiController; private readonly PeriodicFileScanner _cacheScanner; public readonly FileDialogManager FileDialogManager; - private readonly ConfigurationService _configService; + private readonly MareConfigService _configService; private readonly DalamudUtil _dalamudUtil; private readonly DalamudPluginInterface _pluginInterface; private readonly Dalamud.Localization _localization; @@ -53,7 +54,7 @@ public partial class UiShared : IDisposable public ApiController ApiController => _apiController; public UiShared(IpcManager ipcManager, ApiController apiController, PeriodicFileScanner cacheScanner, FileDialogManager fileDialogManager, - ConfigurationService configService, DalamudUtil dalamudUtil, DalamudPluginInterface pluginInterface, Dalamud.Localization localization, + MareConfigService configService, DalamudUtil dalamudUtil, DalamudPluginInterface pluginInterface, Dalamud.Localization localization, ServerConfigurationManager serverManager) { _ipcManager = ipcManager; @@ -631,8 +632,6 @@ public partial class UiShared : IDisposable splitNotes.RemoveAll(n => string.Equals(n, _notesStart) || string.Equals(n, _notesEnd)); - var comments = _serverConfigurationManager.CurrentServer!.UidServerComments; - foreach (var note in splitNotes) { try @@ -640,8 +639,8 @@ public partial class UiShared : IDisposable var splittedEntry = note.Split(":", 2, StringSplitOptions.RemoveEmptyEntries); var uid = splittedEntry[0]; var comment = splittedEntry[1].Trim('"'); - if (comments.ContainsKey(uid) && !overwrite) continue; - _serverConfigurationManager.CurrentServer.UidServerComments[uid] = comment; + if (_serverConfigurationManager.GetNoteForUid(uid) != null && !overwrite) continue; + _serverConfigurationManager.SetNoteForUid(uid, comment); } catch { @@ -649,7 +648,7 @@ public partial class UiShared : IDisposable } } - _serverConfigurationManager.Save(); + _serverConfigurationManager.SaveNotes(); return true; } diff --git a/MareSynchronos/Utils/Logger.cs b/MareSynchronos/Utils/Logger.cs index eae44d1..8f8142e 100644 --- a/MareSynchronos/Utils/Logger.cs +++ b/MareSynchronos/Utils/Logger.cs @@ -31,13 +31,13 @@ internal class Logger : ILogger public static void Error(string? msg, Exception ex) { var caller = new StackTrace().GetFrame(1)?.GetMethod()?.ReflectedType?.Name ?? "Unknown"; - PluginLog.Error($"[{caller}] {msg} {Environment.NewLine} Exception: {ex.Message} {Environment.NewLine} {ex.StackTrace}"); + PluginLog.Error($"[{caller}] {msg} {Environment.NewLine} Exception: {ex?.ToString()}"); } public static void Warn(string? msg, Exception ex) { var caller = new StackTrace().GetFrame(1)?.GetMethod()?.ReflectedType?.Name ?? "Unknown"; - PluginLog.Warning($"[{caller}] {msg} {Environment.NewLine} Exception: {ex.Message} {Environment.NewLine} {ex.StackTrace}"); + PluginLog.Warning($"[{caller}] {msg} {Environment.NewLine} Exception: {ex?.ToString()}"); } public static void Error(string? msg) diff --git a/MareSynchronos/WebAPI/ApIController.Functions.Files.cs b/MareSynchronos/WebAPI/ApIController.Functions.Files.cs index b15f157..1225c47 100644 --- a/MareSynchronos/WebAPI/ApIController.Functions.Files.cs +++ b/MareSynchronos/WebAPI/ApIController.Functions.Files.cs @@ -337,6 +337,7 @@ public partial class ApiController { if (!IsConnected) return; Logger.Debug("Sending Character data to service " + _serverManager.CurrentApiUrl); + visibleCharacters = visibleCharacters.ToList(); CancelUpload(); _uploadCancellationTokenSource = new CancellationTokenSource(); diff --git a/MareSynchronos/WebAPI/ApiController.cs b/MareSynchronos/WebAPI/ApiController.cs index ec48cef..7511480 100644 --- a/MareSynchronos/WebAPI/ApiController.cs +++ b/MareSynchronos/WebAPI/ApiController.cs @@ -22,7 +22,7 @@ public partial class ApiController : MediatorSubscriberBase, IDisposable, IMareH public readonly int[] SupportedServerVersions = { IMareHub.ApiVersion }; - private readonly ConfigurationService _configService; + private readonly MareConfigService _configService; private readonly DalamudUtil _dalamudUtil; private readonly FileCacheManager _fileDbManager; private readonly PairManager _pairManager; @@ -45,7 +45,7 @@ public partial class ApiController : MediatorSubscriberBase, IDisposable, IMareH private HttpClient _httpClient; - public ApiController(ConfigurationService configService, DalamudUtil dalamudUtil, FileCacheManager fileDbManager, + public ApiController(MareConfigService configService, DalamudUtil dalamudUtil, FileCacheManager fileDbManager, PairManager pairManager, ServerConfigurationManager serverManager, MareMediator mediator) : base(mediator) { Logger.Verbose("Creating " + nameof(ApiController));