From 5e7beb8518226a3a332017ef74909f4c103a81db Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Tue, 31 Jan 2023 00:05:47 +0100 Subject: [PATCH] add DI, start implementing mediator pattern instead of events --- .../FileCache/PeriodicFileScanner.cs | 19 +- MareSynchronos/Managers/IpcManager.cs | 15 +- .../Managers/OnlinePlayerManager.cs | 20 ++- MareSynchronos/Managers/PairManager.cs | 11 +- MareSynchronos/Managers/PlayerManager.cs | 14 +- .../Managers/TransientResourceManager.cs | 14 +- MareSynchronos/Mediator/Messages.cs | 23 +++ MareSynchronos/Plugin.cs | 165 ++++++------------ MareSynchronos/UI/CompactUI.cs | 11 +- MareSynchronos/UI/GposeUi.cs | 12 +- MareSynchronos/UI/IntroUI.cs | 13 +- MareSynchronos/UI/SettingsUi.cs | 12 +- MareSynchronos/UI/UIShared.cs | 11 +- MareSynchronos/Utils/DalamudUtil.cs | 77 ++------ MareSynchronos/WebAPI/ApiController.cs | 13 +- 15 files changed, 190 insertions(+), 240 deletions(-) create mode 100644 MareSynchronos/Mediator/Messages.cs diff --git a/MareSynchronos/FileCache/PeriodicFileScanner.cs b/MareSynchronos/FileCache/PeriodicFileScanner.cs index 204cfef..3845aed 100644 --- a/MareSynchronos/FileCache/PeriodicFileScanner.cs +++ b/MareSynchronos/FileCache/PeriodicFileScanner.cs @@ -1,6 +1,7 @@ using System.Collections.Concurrent; using MareSynchronos.Managers; using MareSynchronos.MareConfiguration; +using MareSynchronos.Mediator; using MareSynchronos.Utils; using MareSynchronos.WebAPI; @@ -13,10 +14,11 @@ public class PeriodicFileScanner : IDisposable private readonly FileCacheManager _fileDbManager; private readonly ApiController _apiController; private readonly DalamudUtil _dalamudUtil; + private readonly MareMediator _mediator; private CancellationTokenSource? _scanCancellationTokenSource; private Task? _fileScannerTask = null; public ConcurrentDictionary haltScanLocks = new(StringComparer.Ordinal); - public PeriodicFileScanner(IpcManager ipcManager, ConfigurationService configService, FileCacheManager fileDbManager, ApiController apiController, DalamudUtil dalamudUtil) + public PeriodicFileScanner(IpcManager ipcManager, ConfigurationService configService, FileCacheManager fileDbManager, ApiController apiController, DalamudUtil dalamudUtil, MareMediator mediator) { Logger.Verbose("Creating " + nameof(PeriodicFileScanner)); @@ -25,11 +27,14 @@ public class PeriodicFileScanner : IDisposable _fileDbManager = fileDbManager; _apiController = apiController; _dalamudUtil = dalamudUtil; + _mediator = mediator; _ipcManager.PenumbraInitialized += StartScan; _apiController.DownloadStarted += ApiHaltScan; _apiController.DownloadFinished += ApiResumeScan; - _dalamudUtil.ZoneSwitchStart += ZoneSwitchHaltScan; - _dalamudUtil.ZoneSwitchEnd += ZoneSwitchResumeScan; + + _mediator.Subscribe(this, (_) => ZoneSwitchHaltScan()); + _mediator.Subscribe(this, (_) => ZoneSwitchResumeScan()); + _mediator.Subscribe(this, (_) => StartScan()); } private void ApiHaltScan() @@ -104,8 +109,6 @@ public class PeriodicFileScanner : IDisposable _ipcManager.PenumbraInitialized -= StartScan; _apiController.DownloadStarted -= ApiHaltScan; _apiController.DownloadFinished -= ApiResumeScan; - _dalamudUtil.ZoneSwitchStart -= ZoneSwitchHaltScan; - _dalamudUtil.ZoneSwitchEnd -= ZoneSwitchResumeScan; _scanCancellationTokenSource?.Cancel(); } @@ -201,9 +204,9 @@ public class PeriodicFileScanner : IDisposable var scannedFiles = new ConcurrentDictionary(Directory.EnumerateFiles(penumbraDir!, "*.*", SearchOption.AllDirectories) .Select(s => s.ToLowerInvariant()) - .Where(f => ext.Any(e => f.EndsWith(e, StringComparison.OrdinalIgnoreCase)) - && !f.Contains(@"\bg\", StringComparison.OrdinalIgnoreCase) - && !f.Contains(@"\bgcommon\", StringComparison.OrdinalIgnoreCase) + .Where(f => ext.Any(e => f.EndsWith(e, StringComparison.OrdinalIgnoreCase)) + && !f.Contains(@"\bg\", StringComparison.OrdinalIgnoreCase) + && !f.Contains(@"\bgcommon\", StringComparison.OrdinalIgnoreCase) && !f.Contains(@"\ui\", StringComparison.OrdinalIgnoreCase)) .Concat(Directory.EnumerateFiles(_configService.Current.CacheFolder, "*.*", SearchOption.TopDirectoryOnly) .Where(f => new FileInfo(f).Name.Length == 40) diff --git a/MareSynchronos/Managers/IpcManager.cs b/MareSynchronos/Managers/IpcManager.cs index 94c0df1..1b1e867 100644 --- a/MareSynchronos/Managers/IpcManager.cs +++ b/MareSynchronos/Managers/IpcManager.cs @@ -8,10 +8,10 @@ using System.Text; using Penumbra.Api.Enums; using Penumbra.Api.Helpers; using MareSynchronos.Delegates; +using MareSynchronos.Mediator; namespace MareSynchronos.Managers; - public class IpcManager : IDisposable { private readonly ICallGateSubscriber _glamourerApiVersion; @@ -58,12 +58,13 @@ public class IpcManager : IDisposable private readonly ICallGateSubscriber _palettePlusPaletteChanged; private readonly DalamudUtil _dalamudUtil; + private readonly MareMediator _mediator; private bool _inGposeQueueMode = false; private ConcurrentQueue ActionQueue => _inGposeQueueMode ? _gposeActionQueue : _normalQueue; private readonly ConcurrentQueue _normalQueue = new(); private readonly ConcurrentQueue _gposeActionQueue = new(); - public IpcManager(DalamudPluginInterface pi, DalamudUtil dalamudUtil) + public IpcManager(DalamudPluginInterface pi, DalamudUtil dalamudUtil, MareMediator mediator) { Logger.Verbose("Creating " + nameof(IpcManager)); @@ -123,9 +124,10 @@ public class IpcManager : IDisposable } _dalamudUtil = dalamudUtil; - _dalamudUtil.FrameworkUpdate += HandleActionQueue; - _dalamudUtil.GposeFrameworkUpdate += HandleGposeActionQueue; - _dalamudUtil.ZoneSwitchEnd += ClearActionQueue; + _mediator = mediator; + _mediator.Subscribe(this, (_) => HandleActionQueue()); + _mediator.Subscribe(this, (_) => HandleGposeActionQueue()); + _mediator.Subscribe(this, (_) => ClearActionQueue()); } private void HandleGposeActionQueue() @@ -263,9 +265,6 @@ public class IpcManager : IDisposable Logger.Verbose("Action queue clear or not, disposing"); } - _dalamudUtil.FrameworkUpdate -= HandleActionQueue; - _dalamudUtil.ZoneSwitchEnd -= ClearActionQueue; - _dalamudUtil.GposeFrameworkUpdate -= HandleGposeActionQueue; ActionQueue.Clear(); _penumbraGameObjectResourcePathResolved.Dispose(); diff --git a/MareSynchronos/Managers/OnlinePlayerManager.cs b/MareSynchronos/Managers/OnlinePlayerManager.cs index ba74bec..cb9cd03 100644 --- a/MareSynchronos/Managers/OnlinePlayerManager.cs +++ b/MareSynchronos/Managers/OnlinePlayerManager.cs @@ -1,6 +1,7 @@ using MareSynchronos.API.Data; using MareSynchronos.API.Dto.User; using MareSynchronos.FileCache; +using MareSynchronos.Mediator; using MareSynchronos.Utils; using MareSynchronos.WebAPI; @@ -13,8 +14,9 @@ public class OnlinePlayerManager : IDisposable private readonly PlayerManager _playerManager; private readonly FileCacheManager _fileDbManager; private readonly PairManager _pairManager; + private readonly MareMediator _mediator; - public OnlinePlayerManager(ApiController apiController, DalamudUtil dalamudUtil, PlayerManager playerManager, FileCacheManager fileDbManager, PairManager pairManager) + public OnlinePlayerManager(ApiController apiController, DalamudUtil dalamudUtil, PlayerManager playerManager, FileCacheManager fileDbManager, PairManager pairManager, MareMediator mediator) { Logger.Verbose("Creating " + nameof(OnlinePlayerManager)); @@ -23,11 +25,11 @@ public class OnlinePlayerManager : IDisposable _playerManager = playerManager; _fileDbManager = fileDbManager; _pairManager = pairManager; - + _mediator = mediator; _playerManager.PlayerHasChanged += PlayerManagerOnPlayerHasChanged; - _dalamudUtil.LogIn += DalamudUtilOnLogIn; - _dalamudUtil.LogOut += DalamudUtilOnLogOut; + _mediator.Subscribe(this, (_) => DalamudUtilOnLogIn()); + _mediator.Subscribe(this, (_) => DalamudUtilOnLogOut()); if (_dalamudUtil.IsLoggedIn) { @@ -42,12 +44,12 @@ public class OnlinePlayerManager : IDisposable private void DalamudUtilOnLogIn() { - _dalamudUtil.DelayedFrameworkUpdate += FrameworkOnUpdate; + _mediator.Subscribe(this, (_) => FrameworkOnUpdate()); } private void DalamudUtilOnLogOut() { - _dalamudUtil.DelayedFrameworkUpdate -= FrameworkOnUpdate; + _mediator.Unsubscribe(this); } public void Dispose() @@ -55,9 +57,9 @@ public class OnlinePlayerManager : IDisposable Logger.Verbose("Disposing " + nameof(OnlinePlayerManager)); _playerManager.PlayerHasChanged -= PlayerManagerOnPlayerHasChanged; - _dalamudUtil.LogIn -= DalamudUtilOnLogIn; - _dalamudUtil.LogOut -= DalamudUtilOnLogOut; - _dalamudUtil.DelayedFrameworkUpdate -= FrameworkOnUpdate; + _mediator.Unsubscribe(this); + _mediator.Unsubscribe(this); + _mediator.Unsubscribe(this); } private void FrameworkOnUpdate() diff --git a/MareSynchronos/Managers/PairManager.cs b/MareSynchronos/Managers/PairManager.cs index 6dfe0b4..217d089 100644 --- a/MareSynchronos/Managers/PairManager.cs +++ b/MareSynchronos/Managers/PairManager.cs @@ -8,6 +8,7 @@ using MareSynchronos.API.Dto.Group; using MareSynchronos.API.Dto.User; using MareSynchronos.Factories; using MareSynchronos.MareConfiguration; +using MareSynchronos.Mediator; using MareSynchronos.Models; using MareSynchronos.Utils; using MareSynchronos.WebAPI; @@ -24,16 +25,18 @@ public class PairManager : IDisposable private readonly PairFactory _pairFactory; private readonly UiBuilder _uiBuilder; private readonly ConfigurationService _configurationService; + private readonly MareMediator _mediator; - public PairManager(CachedPlayerFactory cachedPlayerFactory, DalamudUtil dalamudUtil, PairFactory pairFactory, UiBuilder uiBuilder, ConfigurationService configurationService) + public PairManager(CachedPlayerFactory cachedPlayerFactory, DalamudUtil dalamudUtil, PairFactory pairFactory, UiBuilder uiBuilder, ConfigurationService configurationService, MareMediator mediator) { _cachedPlayerFactory = cachedPlayerFactory; _dalamudUtil = dalamudUtil; _pairFactory = pairFactory; _uiBuilder = uiBuilder; _configurationService = configurationService; - _dalamudUtil.ZoneSwitchStart += DalamudUtilOnZoneSwitched; - _dalamudUtil.DelayedFrameworkUpdate += DalamudUtilOnDelayedFrameworkUpdate; + _mediator = mediator; + _mediator.Subscribe(this, (_) => DalamudUtilOnZoneSwitched()); + _mediator.Subscribe(this, (_) => DalamudUtilOnDelayedFrameworkUpdate()); _directPairsInternal = DirectPairsLazy(); _groupPairsInternal = GroupPairsLazy(); } @@ -137,8 +140,6 @@ public class PairManager : IDisposable public void Dispose() { - _dalamudUtil.DelayedFrameworkUpdate -= DalamudUtilOnDelayedFrameworkUpdate; - _dalamudUtil.ZoneSwitchStart -= DalamudUtilOnZoneSwitched; DisposePairs(); } diff --git a/MareSynchronos/Managers/PlayerManager.cs b/MareSynchronos/Managers/PlayerManager.cs index 1cea862..d69dee9 100644 --- a/MareSynchronos/Managers/PlayerManager.cs +++ b/MareSynchronos/Managers/PlayerManager.cs @@ -7,6 +7,7 @@ using MareSynchronos.FileCache; using MareSynchronos.UI; using MareSynchronos.API.Data.Enum; using MareSynchronos.Delegates; +using MareSynchronos.Mediator; #if DEBUG #endif @@ -21,6 +22,7 @@ public class PlayerManager : IDisposable private readonly TransientResourceManager _transientResourceManager; private readonly PeriodicFileScanner _periodicFileScanner; private readonly SettingsUi _settingsUi; + private readonly MareMediator _mediator; private readonly IpcManager _ipcManager; public event CharacterDataDelegate? PlayerHasChanged; public API.Data.CharacterData? LastCreatedCharacterData { get; private set; } @@ -34,7 +36,7 @@ public class PlayerManager : IDisposable public unsafe PlayerManager(ApiController apiController, IpcManager ipcManager, CharacterDataFactory characterDataFactory, DalamudUtil dalamudUtil, TransientResourceManager transientResourceManager, - PeriodicFileScanner periodicFileScanner, SettingsUi settingsUi) + PeriodicFileScanner periodicFileScanner, SettingsUi settingsUi, MareMediator mediator) { Logger.Verbose("Creating " + nameof(PlayerManager)); @@ -45,15 +47,16 @@ public class PlayerManager : IDisposable _transientResourceManager = transientResourceManager; _periodicFileScanner = periodicFileScanner; _settingsUi = settingsUi; + _mediator = mediator; _apiController.Connected += ApiControllerOnConnected; _apiController.Disconnected += ApiController_Disconnected; _transientResourceManager.TransientResourceLoaded += HandleTransientResourceLoad; - _dalamudUtil.DelayedFrameworkUpdate += DalamudUtilOnDelayedFrameworkUpdate; _ipcManager.HeelsOffsetChangeEvent += HeelsOffsetChanged; _ipcManager.CustomizePlusScaleChange += CustomizePlusChanged; _ipcManager.PalettePlusPaletteChange += PalettePlusChanged; - _dalamudUtil.FrameworkUpdate += DalamudUtilOnFrameworkUpdate; + _mediator.Subscribe(this, (_) => DalamudUtilOnDelayedFrameworkUpdate()); + _mediator.Subscribe(this, (_) => DalamudUtilOnFrameworkUpdate()); Logger.Debug("Watching Player, ApiController is Connected: " + _apiController.IsConnected); if (_apiController.IsConnected) @@ -134,12 +137,13 @@ public class PlayerManager : IDisposable { Logger.Verbose("Disposing " + nameof(PlayerManager)); + _mediator.Unsubscribe(this); + _mediator.Unsubscribe(this); + _apiController.Connected -= ApiControllerOnConnected; _apiController.Disconnected -= ApiController_Disconnected; _ipcManager.PenumbraRedrawEvent -= IpcManager_PenumbraRedrawEvent; - _dalamudUtil.DelayedFrameworkUpdate -= DalamudUtilOnDelayedFrameworkUpdate; - _dalamudUtil.FrameworkUpdate -= DalamudUtilOnFrameworkUpdate; _transientResourceManager.TransientResourceLoaded -= HandleTransientResourceLoad; diff --git a/MareSynchronos/Managers/TransientResourceManager.cs b/MareSynchronos/Managers/TransientResourceManager.cs index 24e9287..45e1431 100644 --- a/MareSynchronos/Managers/TransientResourceManager.cs +++ b/MareSynchronos/Managers/TransientResourceManager.cs @@ -2,6 +2,7 @@ using MareSynchronos.Delegates; using MareSynchronos.Factories; using MareSynchronos.MareConfiguration; +using MareSynchronos.Mediator; using MareSynchronos.Models; using MareSynchronos.Utils; using System.Collections.Concurrent; @@ -14,6 +15,8 @@ public class TransientResourceManager : IDisposable private readonly IpcManager _ipcManager; private readonly ConfigurationService _configurationService; private readonly DalamudUtil _dalamudUtil; + private readonly MareMediator _mediator; + public event DrawObjectDelegate? TransientResourceLoaded; public IntPtr[] PlayerRelatedPointers = Array.Empty(); private readonly string[] _fileTypesToHandle = new[] { "tmb", "pap", "avfx", "atex", "sklb", "eid", "phyb", "scd", "skp", "shpk" }; @@ -23,15 +26,16 @@ public class TransientResourceManager : IDisposable private ConcurrentDictionary> TransientResources { get; } = new(); private ConcurrentDictionary> SemiTransientResources { get; } = new(); - public TransientResourceManager(IpcManager manager, ConfigurationService configurationService, DalamudUtil dalamudUtil, FileReplacementFactory fileReplacementFactory) + public TransientResourceManager(IpcManager manager, ConfigurationService configurationService, DalamudUtil dalamudUtil, FileReplacementFactory fileReplacementFactory, MareMediator mediator) { manager.PenumbraResourceLoadEvent += Manager_PenumbraResourceLoadEvent; manager.PenumbraModSettingChanged += Manager_PenumbraModSettingChanged; _ipcManager = manager; _configurationService = configurationService; _dalamudUtil = dalamudUtil; - dalamudUtil.FrameworkUpdate += DalamudUtil_FrameworkUpdate; - dalamudUtil.ClassJobChanged += DalamudUtil_ClassJobChanged; + _mediator = mediator; + _mediator.Subscribe(this, (_) => DalamudUtil_FrameworkUpdate()); + _mediator.Subscribe(this, (_) => DalamudUtil_ClassJobChanged()); // migrate obsolete data to new format if (File.Exists(PersistentDataCache)) { @@ -248,9 +252,9 @@ public class TransientResourceManager : IDisposable public void Dispose() { - _dalamudUtil.FrameworkUpdate -= DalamudUtil_FrameworkUpdate; + _mediator.Unsubscribe(this); + _mediator.Unsubscribe(this); _ipcManager.PenumbraResourceLoadEvent -= Manager_PenumbraResourceLoadEvent; - _dalamudUtil.ClassJobChanged -= DalamudUtil_ClassJobChanged; _ipcManager.PenumbraModSettingChanged -= Manager_PenumbraModSettingChanged; TransientResources.Clear(); SemiTransientResources.Clear(); diff --git a/MareSynchronos/Mediator/Messages.cs b/MareSynchronos/Mediator/Messages.cs new file mode 100644 index 0000000..abefc51 --- /dev/null +++ b/MareSynchronos/Mediator/Messages.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MareSynchronos.Mediator; + +#pragma warning disable MA0048 // File name must match type name +public record SwitchToIntroUiMessage : IMessage; +public record SwitchToMainUiMessage : IMessage; +public record OpenSettingsUiMessage : IMessage; +public record DalamudLoginMessage : IMessage; +public record DalamudLogoutMessage : IMessage; +public record FrameworkUpdateMessage : IMessage; +public record ClassJobChangedMessage : IMessage; +public record DelayedFrameworkUpdateMessage : IMessage; +public record ZoneSwitchStartMessage : IMessage; +public record ZoneSwitchEndMessage : IMessage; +public record GposeStartMessage : IMessage; +public record GposeEndMessage : IMessage; +public record GposeFrameworkUpdateMessage : IMessage; +#pragma warning restore MA0048 // File name must match type name \ No newline at end of file diff --git a/MareSynchronos/Plugin.cs b/MareSynchronos/Plugin.cs index ff48319..9db0d77 100644 --- a/MareSynchronos/Plugin.cs +++ b/MareSynchronos/Plugin.cs @@ -18,38 +18,13 @@ using Dalamud.Data; using MareSynchronos.MareConfiguration; using MareSynchronos.Mediator; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; namespace MareSynchronos; public sealed class Plugin : IDalamudPlugin { private const string _commandName = "/mare"; - private readonly ApiController _apiController; - private readonly CommandManager _commandManager; - private readonly PeriodicFileScanner _periodicFileScanner; - private readonly IntroUi _introUi; - private readonly IpcManager _ipcManager; - private readonly DalamudPluginInterface _pluginInterface; - private readonly SettingsUi _settingsUi; - private readonly WindowSystem _windowSystem; - private PlayerManager? _playerManager; - private TransientResourceManager? _transientResourceManager; - private readonly DalamudUtil _dalamudUtil; - private OnlinePlayerManager? _characterCacheManager; - private readonly DownloadUi _downloadUi; - private readonly FileDialogManager _fileDialogManager; - private readonly FileCacheManager _fileCacheManager; - private readonly PairManager _pairManager; - private readonly CompactUi _compactUi; - private readonly UiShared _uiSharedComponent; - private readonly Dalamud.Localization _localization; - private readonly FileReplacementFactory _fileReplacementFactory; - private readonly MareCharaFileManager _mareCharaFileManager; - private readonly ServerConfigurationManager _serverConfigurationManager; - private readonly GposeUi _gposeUi; - private readonly ConfigurationService _configurationService; - private readonly MareMediator _mediator; + private IServiceScope? _runtimeServiceServiceScope; private readonly ServiceProvider _serviceProvider; @@ -57,9 +32,6 @@ public sealed class Plugin : IDalamudPlugin Framework framework, ObjectTable objectTable, ClientState clientState, Condition condition, ChatGui chatGui) { Logger.Debug("Launching " + Name); - _pluginInterface = pluginInterface; - _pluginInterface.UiBuilder.DisableGposeUiHide = true; - _commandManager = commandManager; IServiceCollection collection = new ServiceCollection(); // inject dalamud stuff @@ -71,6 +43,7 @@ public sealed class Plugin : IDalamudPlugin collection.AddSingleton(clientState); collection.AddSingleton(condition); collection.AddSingleton(chatGui); + collection.AddSingleton(pluginInterface.UiBuilder); collection.AddSingleton(new WindowSystem("MareSynchronos")); collection.AddSingleton(); @@ -82,6 +55,8 @@ public sealed class Plugin : IDalamudPlugin collection.AddSingleton(); collection.AddSingleton(); collection.AddSingleton(); + collection.AddSingleton(); + collection.AddSingleton(); collection.AddSingleton(); collection.AddSingleton(); collection.AddSingleton(); @@ -94,44 +69,30 @@ public sealed class Plugin : IDalamudPlugin collection.AddSingleton(); collection.AddSingleton(); collection.AddSingleton(); + collection.AddSingleton(); - collection.AddTransient(); - collection.AddTransient(); - collection.AddTransient(); - collection.AddTransient(); + collection.AddScoped(); + collection.AddScoped(); + collection.AddScoped(); + collection.AddScoped(); _serviceProvider = collection.BuildServiceProvider(new ServiceProviderOptions() { ValidateOnBuild = true, ValidateScopes = true }); - _serviceProvider.GetRequiredService().SetupWithLangCode("en"); - // those can be initialized outside of game login - _settingsUi.SwitchToIntroUi += () => - { - _introUi.IsOpen = true; - _settingsUi.IsOpen = false; - _compactUi.IsOpen = false; - }; - _introUi.SwitchToMainUi += () => - { - _introUi.IsOpen = false; - _compactUi.IsOpen = true; - _periodicFileScanner.StartScan(); - ReLaunchCharacterManager(); - }; - _compactUi.OpenSettingsUi += () => - { - _settingsUi.Toggle(); - }; - _downloadUi = new DownloadUi(_windowSystem, _configurationService, _apiController, _uiSharedComponent); + _serviceProvider.GetRequiredService().SetupWithLangCode("en"); + _serviceProvider.GetRequiredService().UiBuilder.DisableGposeUiHide = true; - _dalamudUtil.LogIn += DalamudUtilOnLogIn; - _dalamudUtil.LogOut += DalamudUtilOnLogOut; + var mediator = _serviceProvider.GetRequiredService(); + mediator.Subscribe(this, (_) => ReLaunchCharacterManager()); + mediator.Subscribe(this, (_) => DalamudUtilOnLogIn()); + mediator.Subscribe(this, (_) => DalamudUtilOnLogOut()); - if (_dalamudUtil.IsLoggedIn) - { - DalamudUtilOnLogIn(); - } + _serviceProvider.GetRequiredService(); + _serviceProvider.GetRequiredService(); + _serviceProvider.GetRequiredService(); + _serviceProvider.GetRequiredService(); + _serviceProvider.GetRequiredService(); } public string Name => "Mare Synchronos"; @@ -140,33 +101,10 @@ public sealed class Plugin : IDalamudPlugin { Logger.Verbose("Disposing " + Name); - var services = _serviceProvider.GetServices().ToList(); - services.ForEach(c => c.Dispose()); + _serviceProvider.GetRequiredService().RemoveHandler(_commandName); - _apiController?.Dispose(); - - _commandManager.RemoveHandler(_commandName); - _dalamudUtil.LogIn -= DalamudUtilOnLogIn; - _dalamudUtil.LogOut -= DalamudUtilOnLogOut; - - _uiSharedComponent.Dispose(); - _settingsUi?.Dispose(); - _introUi?.Dispose(); - _downloadUi?.Dispose(); - _compactUi?.Dispose(); - _gposeUi?.Dispose(); - - _pairManager.Dispose(); - _periodicFileScanner?.Dispose(); - _fileCacheManager?.Dispose(); - _playerManager?.Dispose(); - _characterCacheManager?.Dispose(); - _ipcManager?.Dispose(); - _transientResourceManager?.Dispose(); - _dalamudUtil.Dispose(); - _configurationService?.Dispose(); - - _mediator.Dispose(); + _runtimeServiceServiceScope?.Dispose(); + _serviceProvider.Dispose(); Logger.Debug("Shut down"); } @@ -176,47 +114,46 @@ public sealed class Plugin : IDalamudPlugin { Logger.Debug("Client login"); - _pluginInterface.UiBuilder.Draw += Draw; - _pluginInterface.UiBuilder.OpenConfigUi += OpenUi; - _commandManager.AddHandler(_commandName, new CommandInfo(OnCommand) + var pi = _serviceProvider.GetRequiredService(); + pi.UiBuilder.Draw += Draw; + pi.UiBuilder.OpenConfigUi += OpenUi; + _serviceProvider.GetRequiredService().AddHandler(_commandName, new CommandInfo(OnCommand) { HelpMessage = "Opens the Mare Synchronos UI", }); - if (!_configurationService.Current.HasValidSetup() || !_serverConfigurationManager.HasValidConfig()) + if (!_serviceProvider.GetRequiredService().Current.HasValidSetup() + || !_serviceProvider.GetRequiredService().HasValidConfig()) { - _introUi.IsOpen = true; - _compactUi.IsOpen = false; + _serviceProvider.GetRequiredService().Publish(new SwitchToIntroUiMessage()); return; } - _periodicFileScanner.StartScan(); + _serviceProvider.GetRequiredService().StartScan(); ReLaunchCharacterManager(); } private void DalamudUtilOnLogOut() { Logger.Debug("Client logout"); - _characterCacheManager?.Dispose(); - _playerManager?.Dispose(); - _transientResourceManager?.Dispose(); - _pluginInterface.UiBuilder.Draw -= Draw; - _pluginInterface.UiBuilder.OpenConfigUi -= OpenUi; - _commandManager.RemoveHandler(_commandName); + _runtimeServiceServiceScope?.Dispose(); + var pi = _serviceProvider.GetRequiredService(); + pi.UiBuilder.Draw -= Draw; + pi.UiBuilder.OpenConfigUi -= OpenUi; + _serviceProvider.GetRequiredService().RemoveHandler(_commandName); } public void ReLaunchCharacterManager() { - _characterCacheManager?.Dispose(); - _playerManager?.Dispose(); - _transientResourceManager?.Dispose(); + _runtimeServiceServiceScope?.Dispose(); Task.Run(WaitForPlayerAndLaunchCharacterManager); } private async Task WaitForPlayerAndLaunchCharacterManager() { - while (!_dalamudUtil.IsPlayerPresent) + var dalamudUtil = _serviceProvider.GetRequiredService(); + while (!dalamudUtil.IsPlayerPresent) { await Task.Delay(100).ConfigureAwait(false); } @@ -225,9 +162,10 @@ public sealed class Plugin : IDalamudPlugin { Logger.Debug("Launching Managers"); - _transientResourceManager = _serviceProvider.GetRequiredService(); - _playerManager = _serviceProvider.GetRequiredService(); - _characterCacheManager = _serviceProvider.GetRequiredService(); + _runtimeServiceServiceScope = _serviceProvider.CreateScope(); + _runtimeServiceServiceScope.ServiceProvider.GetRequiredService(); + _runtimeServiceServiceScope.ServiceProvider.GetRequiredService(); + _runtimeServiceServiceScope.ServiceProvider.GetRequiredService(); } catch (Exception ex) { @@ -237,8 +175,8 @@ public sealed class Plugin : IDalamudPlugin private void Draw() { - _windowSystem.Draw(); - _fileDialogManager.Draw(); + _serviceProvider.GetRequiredService().Draw(); + _serviceProvider.GetRequiredService().Draw(); } private void OnCommand(string command, string args) @@ -254,6 +192,8 @@ public sealed class Plugin : IDalamudPlugin if (string.Equals(splitArgs[0], "toggle", StringComparison.OrdinalIgnoreCase)) { + var _serverConfigurationManager = _serviceProvider.GetRequiredService(); + var _apiController = _serviceProvider.GetRequiredService(); if (_serverConfigurationManager.CurrentServer == null) return; var fullPause = splitArgs.Length > 1 ? splitArgs[1] switch { @@ -266,20 +206,21 @@ public sealed class Plugin : IDalamudPlugin { _serverConfigurationManager.CurrentServer.FullPause = fullPause; _serverConfigurationManager.Save(); - _ = _apiController.CreateConnections(); + _ = _serviceProvider.GetRequiredService().CreateConnections(); } } else if (string.Equals(splitArgs[0], "gpose", StringComparison.OrdinalIgnoreCase)) { - _gposeUi.Toggle(); + _serviceProvider.GetRequiredService().Toggle(); } } private void OpenUi() { - if (_configurationService.Current.HasValidSetup()) - _compactUi.Toggle(); + + if (_serviceProvider.GetRequiredService().Current.HasValidSetup()) + _serviceProvider.GetRequiredService().Toggle(); else - _introUi.Toggle(); + _serviceProvider.GetRequiredService().Toggle(); } } diff --git a/MareSynchronos/UI/CompactUI.cs b/MareSynchronos/UI/CompactUI.cs index e59e096..38e180d 100644 --- a/MareSynchronos/UI/CompactUI.cs +++ b/MareSynchronos/UI/CompactUI.cs @@ -13,6 +13,7 @@ using MareSynchronos.API.Dto.User; using MareSynchronos.Delegates; using MareSynchronos.Managers; using MareSynchronos.MareConfiguration; +using MareSynchronos.Mediator; using MareSynchronos.Models; using MareSynchronos.UI.Components; using MareSynchronos.UI.Handlers; @@ -26,6 +27,7 @@ public class CompactUi : Window, IDisposable private readonly ApiController _apiController; private readonly PairManager _pairManager; private readonly ServerConfigurationManager _serverManager; + private readonly MareMediator _mediator; private readonly ConfigurationService _configService; private readonly TagHandler _tagHandler; public readonly Dictionary ShowUidForEntry = new(StringComparer.Ordinal); @@ -57,7 +59,7 @@ public class CompactUi : Window, IDisposable public CompactUi(WindowSystem windowSystem, UiShared uiShared, ConfigurationService configService, ApiController apiController, PairManager pairManager, - ServerConfigurationManager serverManager) : base("###MareSynchronosMainUI") + ServerConfigurationManager serverManager, MareMediator mediator) : base("###MareSynchronosMainUI") { #if DEBUG @@ -88,6 +90,7 @@ public class CompactUi : Window, IDisposable _apiController = apiController; _pairManager = pairManager; _serverManager = serverManager; + _mediator = mediator; _tagHandler = new(_serverManager); _groupPanel = new(this, uiShared, _pairManager, _serverManager, _configService); @@ -95,6 +98,9 @@ public class CompactUi : Window, IDisposable _selectPairsForGroupUi = new(_tagHandler); _pairGroupsUi = new(_tagHandler, DrawPairedClient, apiController, _selectPairsForGroupUi); + _mediator.Subscribe(this, (_) => IsOpen = true); + _mediator.Subscribe(this, (_) => IsOpen = false); + _uiShared.GposeStart += UiShared_GposeStart; _uiShared.GposeEnd += UiShared_GposeEnd; @@ -118,7 +124,6 @@ public class CompactUi : Window, IDisposable IsOpen = false; } - public event VoidDelegate? OpenSettingsUi; public void Dispose() { Logger.Verbose("Disposing " + nameof(CompactUi)); @@ -700,7 +705,7 @@ public class CompactUi : Window, IDisposable ImGui.SetCursorPosY(originalPos.Y + uidTextSize.Y / 2 - buttonSize.Y / 2); if (ImGuiComponents.IconButton(FontAwesomeIcon.Cog)) { - OpenSettingsUi?.Invoke(); + _mediator.Publish(new OpenSettingsUiMessage()); } UiShared.AttachToolTip("Open the Mare Synchronos Settings"); diff --git a/MareSynchronos/UI/GposeUi.cs b/MareSynchronos/UI/GposeUi.cs index 79ac8f0..c05afed 100644 --- a/MareSynchronos/UI/GposeUi.cs +++ b/MareSynchronos/UI/GposeUi.cs @@ -5,6 +5,7 @@ using Dalamud.Interface.Windowing; using ImGuiNET; using MareSynchronos.Export; using MareSynchronos.MareConfiguration; +using MareSynchronos.Mediator; using MareSynchronos.Utils; namespace MareSynchronos.UI; @@ -16,17 +17,20 @@ public class GposeUi : Window, IDisposable private readonly DalamudUtil _dalamudUtil; private readonly FileDialogManager _fileDialogManager; private readonly ConfigurationService _configService; + private readonly MareMediator _mediator; public GposeUi(WindowSystem windowSystem, MareCharaFileManager mareCharaFileManager, - DalamudUtil dalamudUtil, FileDialogManager fileDialogManager, ConfigurationService configService) : base("Mare Synchronos Gpose Import UI###MareSynchronosGposeUI") + DalamudUtil dalamudUtil, FileDialogManager fileDialogManager, ConfigurationService configService, + MareMediator mediator) : base("Mare Synchronos Gpose Import UI###MareSynchronosGposeUI") { _windowSystem = windowSystem; _mareCharaFileManager = mareCharaFileManager; _dalamudUtil = dalamudUtil; _fileDialogManager = fileDialogManager; _configService = configService; - _dalamudUtil.GposeStart += StartGpose; - _dalamudUtil.GposeEnd += EndGpose; + _mediator = mediator; + _mediator.Subscribe(this, (_) => StartGpose()); + _mediator.Subscribe(this, (_) => EndGpose()); IsOpen = _dalamudUtil.IsInGpose; Flags = ImGuiWindowFlags.AlwaysAutoResize; _windowSystem.AddWindow(this); @@ -45,8 +49,6 @@ public class GposeUi : Window, IDisposable public void Dispose() { - _dalamudUtil.GposeStart -= StartGpose; - _dalamudUtil.GposeEnd -= EndGpose; _windowSystem.RemoveWindow(this); } diff --git a/MareSynchronos/UI/IntroUI.cs b/MareSynchronos/UI/IntroUI.cs index bc78aec..1c33fcf 100644 --- a/MareSynchronos/UI/IntroUI.cs +++ b/MareSynchronos/UI/IntroUI.cs @@ -9,7 +9,7 @@ using MareSynchronos.FileCache; using Dalamud.Interface; using MareSynchronos.Managers; using MareSynchronos.MareConfiguration; -using MareSynchronos.Delegates; +using MareSynchronos.Mediator; namespace MareSynchronos.UI; @@ -19,11 +19,10 @@ internal class IntroUi : Window, IDisposable private readonly ConfigurationService _configService; private readonly PeriodicFileScanner _fileCacheManager; private readonly ServerConfigurationManager _serverConfigurationManager; + private readonly MareMediator _mareMediator; private readonly WindowSystem _windowSystem; private bool _readFirstPage; - public event VoidDelegate? SwitchToMainUi; - private string[]? _tosParagraphs; private Task? _timeoutTask; @@ -40,7 +39,7 @@ internal class IntroUi : Window, IDisposable } public IntroUi(WindowSystem windowSystem, UiShared uiShared, ConfigurationService configService, - PeriodicFileScanner fileCacheManager, ServerConfigurationManager serverConfigurationManager) : base("Mare Synchronos Setup") + PeriodicFileScanner fileCacheManager, ServerConfigurationManager serverConfigurationManager, MareMediator mareMediator) : base("Mare Synchronos Setup") { Logger.Verbose("Creating " + nameof(IntroUi)); @@ -48,6 +47,7 @@ internal class IntroUi : Window, IDisposable _configService = configService; _fileCacheManager = fileCacheManager; _serverConfigurationManager = serverConfigurationManager; + _mareMediator = mareMediator; _windowSystem = windowSystem; IsOpen = false; @@ -59,6 +59,9 @@ internal class IntroUi : Window, IDisposable GetToSLocalization(); + _mareMediator.Subscribe(this, (_) => IsOpen = false); + _mareMediator.Subscribe(this, (_) => IsOpen = true); + _windowSystem.AddWindow(this); } @@ -239,7 +242,7 @@ internal class IntroUi : Window, IDisposable } else { - SwitchToMainUi?.Invoke(); + _mareMediator.Publish(new SwitchToMainUiMessage()); IsOpen = false; } } diff --git a/MareSynchronos/UI/SettingsUi.cs b/MareSynchronos/UI/SettingsUi.cs index f8015ae..02b9244 100644 --- a/MareSynchronos/UI/SettingsUi.cs +++ b/MareSynchronos/UI/SettingsUi.cs @@ -13,7 +13,7 @@ using MareSynchronos.API.Data; using MareSynchronos.Managers; using MareSynchronos.API.Data.Comparer; using MareSynchronos.MareConfiguration; -using MareSynchronos.Delegates; +using MareSynchronos.Mediator; namespace MareSynchronos.UI; @@ -25,10 +25,10 @@ public class SettingsUi : Window, IDisposable private readonly MareCharaFileManager _mareCharaFileManager; private readonly PairManager _pairManager; private readonly ServerConfigurationManager _serverConfigurationManager; + private readonly MareMediator _mediator; private readonly UiShared _uiShared; public CharacterData? LastCreatedCharacterData { private get; set; } - public event VoidDelegate? SwitchToIntroUi; private bool _overwriteExistingLabels = false; private bool? _notesSuccessfullyApplied = null; private string _lastTab = string.Empty; @@ -36,7 +36,8 @@ public class SettingsUi : Window, IDisposable public SettingsUi(WindowSystem windowSystem, UiShared uiShared, ConfigurationService configService, - MareCharaFileManager mareCharaFileManager, PairManager pairManager, ServerConfigurationManager serverConfigurationManager) : base("Mare Synchronos Settings") + MareCharaFileManager mareCharaFileManager, PairManager pairManager, + ServerConfigurationManager serverConfigurationManager, MareMediator mediator) : base("Mare Synchronos Settings") { Logger.Verbose("Creating " + nameof(SettingsUi)); @@ -51,9 +52,12 @@ public class SettingsUi : Window, IDisposable _mareCharaFileManager = mareCharaFileManager; _pairManager = pairManager; _serverConfigurationManager = serverConfigurationManager; + _mediator = mediator; _uiShared = uiShared; + _mediator.Subscribe(this, (_) => Toggle()); + _mediator.Subscribe(this, (_) => IsOpen = false); _uiShared.GposeStart += UiShared_GposeStart; _uiShared.GposeEnd += UiShared_GposeEnd; @@ -211,7 +215,7 @@ public class SettingsUi : Window, IDisposable { Task.Run(() => ApiController.UserDelete()); _deleteAccountPopupModalShown = false; - SwitchToIntroUi?.Invoke(); + _mediator.Publish(new SwitchToIntroUiMessage()); } ImGui.SameLine(); diff --git a/MareSynchronos/UI/UIShared.cs b/MareSynchronos/UI/UIShared.cs index 44388e0..9143003 100644 --- a/MareSynchronos/UI/UIShared.cs +++ b/MareSynchronos/UI/UIShared.cs @@ -14,6 +14,7 @@ using MareSynchronos.FileCache; using MareSynchronos.Localization; using MareSynchronos.Managers; using MareSynchronos.MareConfiguration; +using MareSynchronos.Mediator; using MareSynchronos.Models; using MareSynchronos.Utils; using MareSynchronos.WebAPI; @@ -34,6 +35,7 @@ public partial class UiShared : IDisposable private readonly DalamudPluginInterface _pluginInterface; private readonly Dalamud.Localization _localization; private readonly ServerConfigurationManager _serverConfigurationManager; + private readonly MareMediator _mediator; public long FileCacheSize => _cacheScanner.FileCacheSize; public string PlayerName => _dalamudUtil.PlayerName; @@ -57,7 +59,7 @@ public partial class UiShared : IDisposable public UiShared(IpcManager ipcManager, ApiController apiController, PeriodicFileScanner cacheScanner, FileDialogManager fileDialogManager, ConfigurationService configService, DalamudUtil dalamudUtil, DalamudPluginInterface pluginInterface, Dalamud.Localization localization, - ServerConfigurationManager serverManager) + ServerConfigurationManager serverManager, MareMediator mediator) { _ipcManager = ipcManager; _apiController = apiController; @@ -68,13 +70,14 @@ public partial class UiShared : IDisposable _pluginInterface = pluginInterface; _localization = localization; _serverConfigurationManager = serverManager; + _mediator = mediator; _isDirectoryWritable = IsDirectoryWritable(_configService.Current.CacheFolder); _pluginInterface.UiBuilder.BuildFonts += BuildFont; _pluginInterface.UiBuilder.RebuildFonts(); - _dalamudUtil.GposeStart += DalamudUtil_GposeStart; - _dalamudUtil.GposeEnd += DalamudUtil_GposeEnd; + _mediator.Subscribe(this, (_) => DalamudUtil_GposeStart()); + _mediator.Subscribe(this, (_) => DalamudUtil_GposeEnd()); } private void DalamudUtil_GposeEnd() @@ -673,7 +676,5 @@ public partial class UiShared : IDisposable public void Dispose() { _pluginInterface.UiBuilder.BuildFonts -= BuildFont; - _dalamudUtil.GposeStart -= DalamudUtil_GposeStart; - _dalamudUtil.GposeEnd -= DalamudUtil_GposeEnd; } } diff --git a/MareSynchronos/Utils/DalamudUtil.cs b/MareSynchronos/Utils/DalamudUtil.cs index cf8bf99..b1de653 100644 --- a/MareSynchronos/Utils/DalamudUtil.cs +++ b/MareSynchronos/Utils/DalamudUtil.cs @@ -8,13 +8,11 @@ using Dalamud.Game.Text.SeStringHandling; using FFXIVClientStructs.FFXIV.Client.Game.Character; using FFXIVClientStructs.FFXIV.Client.Game.Control; using Lumina.Excel.GeneratedSheets; -using MareSynchronos.Delegates; +using MareSynchronos.Mediator; using GameObject = FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject; - namespace MareSynchronos.Utils; - public class DalamudUtil : IDisposable { private readonly ClientState _clientState; @@ -23,18 +21,9 @@ public class DalamudUtil : IDisposable private readonly Dalamud.Game.ClientState.Conditions.Condition _condition; private readonly ChatGui _chatGui; private readonly Dalamud.Data.DataManager _gameData; + private readonly MareMediator _mediator; - public event VoidDelegate? LogIn; - public event VoidDelegate? LogOut; - public event VoidDelegate? FrameworkUpdate; - public event VoidDelegate? ClassJobChanged; private uint? _classJobId = 0; - public event VoidDelegate? DelayedFrameworkUpdate; - public event VoidDelegate? ZoneSwitchStart; - public event VoidDelegate? ZoneSwitchEnd; - public event VoidDelegate? GposeStart; - public event VoidDelegate? GposeEnd; - public event VoidDelegate? GposeFrameworkUpdate; private DateTime _delayedFrameworkUpdateCheck = DateTime.Now; private bool _sentBetweenAreas = false; public bool IsInGpose { get; private set; } = false; @@ -52,8 +41,9 @@ public class DalamudUtil : IDisposable return false; } - public DalamudUtil(ClientState clientState, ObjectTable objectTable, Framework framework, Dalamud.Game.ClientState.Conditions.Condition condition, ChatGui chatGui, - Dalamud.Data.DataManager gameData) + public DalamudUtil(ClientState clientState, ObjectTable objectTable, Framework framework, + Dalamud.Game.ClientState.Conditions.Condition condition, ChatGui chatGui, + Dalamud.Data.DataManager gameData, MareMediator mediator) { _clientState = clientState; _objectTable = objectTable; @@ -61,11 +51,11 @@ public class DalamudUtil : IDisposable _condition = condition; _chatGui = chatGui; _gameData = gameData; + _mediator = mediator; _framework.Update += FrameworkOnUpdate; if (IsLoggedIn) { _classJobId = _clientState.LocalPlayer!.ClassJob.Id; - ClientStateOnLogin(sender: null, EventArgs.Empty); } WorldData = new(() => { @@ -101,13 +91,13 @@ public class DalamudUtil : IDisposable { Logger.Debug("Gpose start"); IsInGpose = true; - GposeStart?.Invoke(); + _mediator.Publish(new GposeStartMessage()); } else if (GposeTarget == null && IsInGpose) { Logger.Debug("Gpose end"); IsInGpose = false; - GposeEnd?.Invoke(); + _mediator.Publish(new GposeEndMessage()); } if (_condition[ConditionFlag.BetweenAreas] || _condition[ConditionFlag.BetweenAreas51] || IsInGpose) @@ -116,10 +106,10 @@ public class DalamudUtil : IDisposable { Logger.Debug("Zone switch/Gpose start"); _sentBetweenAreas = true; - ZoneSwitchStart?.Invoke(); + _mediator.Publish(new ZoneSwitchStartMessage()); } - if (IsInGpose) GposeFrameworkUpdate?.Invoke(); + if (IsInGpose) _mediator.Publish(new GposeFrameworkUpdateMessage()); return; } @@ -128,21 +118,10 @@ public class DalamudUtil : IDisposable { Logger.Debug("Zone switch/Gpose end"); _sentBetweenAreas = false; - ZoneSwitchEnd?.Invoke(); + _mediator.Publish(new ZoneSwitchEndMessage()); } - foreach (VoidDelegate? frameworkInvocation in (FrameworkUpdate?.GetInvocationList() ?? Array.Empty()).Cast()) - { - try - { - frameworkInvocation?.Invoke(); - } - catch (Exception ex) - { - Logger.Warn(ex.Message); - Logger.Warn(ex.StackTrace ?? string.Empty); - } - } + _mediator.Publish(new FrameworkUpdateMessage()); if (DateTime.Now < _delayedFrameworkUpdateCheck.AddSeconds(1)) return; @@ -152,13 +131,13 @@ public class DalamudUtil : IDisposable { Logger.Debug("Logged in"); IsLoggedIn = true; - LogIn?.Invoke(); + _mediator.Publish(new DalamudLoginMessage()); } else if (localPlayer == null && IsLoggedIn) { Logger.Debug("Logged out"); IsLoggedIn = false; - LogOut?.Invoke(); + _mediator.Publish(new DalamudLogoutMessage()); } if (_clientState.LocalPlayer != null && _clientState.LocalPlayer.IsValid()) @@ -168,35 +147,15 @@ public class DalamudUtil : IDisposable if (_classJobId != newclassJobId) { _classJobId = newclassJobId; - ClassJobChanged?.Invoke(); + _mediator.Publish(new ClassJobChangedMessage()); } } - foreach (VoidDelegate? frameworkInvocation in (DelayedFrameworkUpdate?.GetInvocationList() ?? Array.Empty()).Cast()) - { - try - { - frameworkInvocation?.Invoke(); - } - catch (Exception ex) - { - Logger.Warn(ex.Message); - Logger.Warn(ex.StackTrace ?? string.Empty); - } - } + _mediator.Publish(new DelayedFrameworkUpdateMessage()); + _delayedFrameworkUpdateCheck = DateTime.Now; } - private void ClientStateOnLogout(object? sender, EventArgs e) - { - LogOut?.Invoke(); - } - - private void ClientStateOnLogin(object? sender, EventArgs e) - { - LogIn?.Invoke(); - } - public Dalamud.Game.ClientState.Objects.Types.GameObject? CreateGameObject(IntPtr reference) { return _objectTable.CreateObjectReference(reference); @@ -331,8 +290,6 @@ public class DalamudUtil : IDisposable public void Dispose() { - _clientState.Login -= ClientStateOnLogin; - _clientState.Logout -= ClientStateOnLogout; _framework.Update -= FrameworkOnUpdate; } } diff --git a/MareSynchronos/WebAPI/ApiController.cs b/MareSynchronos/WebAPI/ApiController.cs index d8a1c88..dd19f88 100644 --- a/MareSynchronos/WebAPI/ApiController.cs +++ b/MareSynchronos/WebAPI/ApiController.cs @@ -12,6 +12,7 @@ using MareSynchronos.Managers; using Dalamud.Utility; using MareSynchronos.MareConfiguration; using MareSynchronos.Delegates; +using MareSynchronos.Mediator; namespace MareSynchronos.WebAPI; public partial class ApiController : IDisposable, IMareHubClient @@ -26,6 +27,7 @@ public partial class ApiController : IDisposable, IMareHubClient private readonly FileCacheManager _fileDbManager; private readonly PairManager _pairManager; private readonly ServerConfigurationManager _serverManager; + private readonly MareMediator _mediator; private CancellationTokenSource _connectionCancellationTokenSource; private HubConnection? _mareHub; @@ -43,7 +45,7 @@ public partial class ApiController : IDisposable, IMareHubClient private HttpClient _httpClient; - public ApiController(ConfigurationService configService, DalamudUtil dalamudUtil, FileCacheManager fileDbManager, PairManager pairManager, ServerConfigurationManager serverManager) + public ApiController(ConfigurationService configService, DalamudUtil dalamudUtil, FileCacheManager fileDbManager, PairManager pairManager, ServerConfigurationManager serverManager, MareMediator mediator) { Logger.Verbose("Creating " + nameof(ApiController)); @@ -52,9 +54,11 @@ public partial class ApiController : IDisposable, IMareHubClient _fileDbManager = fileDbManager; _pairManager = pairManager; _serverManager = serverManager; + _mediator = mediator; _connectionCancellationTokenSource = new CancellationTokenSource(); - _dalamudUtil.LogIn += DalamudUtilOnLogIn; - _dalamudUtil.LogOut += DalamudUtilOnLogOut; + + _mediator.Subscribe(this, (_) => DalamudUtilOnLogIn()); + _mediator.Subscribe(this, (_) => DalamudUtilOnLogOut()); ServerState = ServerState.Offline; _verifiedUploadedHashes = new(StringComparer.Ordinal); _httpClient = new(); @@ -312,9 +316,6 @@ public partial class ApiController : IDisposable, IMareHubClient { Logger.Verbose("Disposing " + nameof(ApiController)); - _dalamudUtil.LogIn -= DalamudUtilOnLogIn; - _dalamudUtil.LogOut -= DalamudUtilOnLogOut; - ServerState = ServerState.Offline; Task.Run(async () => await StopConnection(_connectionCancellationTokenSource.Token, ServerState.Disconnected).ConfigureAwait(false)); _connectionCancellationTokenSource?.Cancel();