From 2ca3e639b42695470e5e4216f290990a4894b7f7 Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Tue, 31 Jan 2023 19:52:12 +0100 Subject: [PATCH] rework service disposal --- MareSynchronos/FileCache/FileCacheManager.cs | 1 + .../FileCache/PeriodicFileScanner.cs | 18 +- MareSynchronos/Managers/CachedPlayer.cs | 17 +- MareSynchronos/Managers/IpcManager.cs | 35 ++-- .../Managers/NotificationService.cs | 4 +- .../Managers/OnlinePlayerManager.cs | 4 +- MareSynchronos/Managers/PairManager.cs | 18 +- MareSynchronos/Managers/PlayerManager.cs | 3 - .../MareConfiguration/ConfigurationService.cs | 1 + MareSynchronos/MarePlugin.cs | 156 ++++++++++++++++++ MareSynchronos/Mediator/MareMediator.cs | 13 +- .../Mediator/MediatorSubscriberBase.cs | 31 +++- MareSynchronos/Plugin.cs | 143 +--------------- MareSynchronos/UI/CompactUI.cs | 20 +-- MareSynchronos/UI/DownloadUi.cs | 2 +- MareSynchronos/UI/GposeUi.cs | 13 +- MareSynchronos/UI/IntroUI.cs | 17 +- MareSynchronos/UI/SettingsUi.cs | 26 ++- MareSynchronos/UI/UIShared.cs | 1 + .../Utils/DalamudLoggingProvider.cs | 1 + MareSynchronos/Utils/DalamudUtil.cs | 3 +- .../WebAPI/ApIController.Functions.Files.cs | 4 +- .../ApiController.Functions.Callbacks.cs | 6 +- MareSynchronos/WebAPI/ApiController.cs | 27 ++- 24 files changed, 299 insertions(+), 265 deletions(-) create mode 100644 MareSynchronos/MarePlugin.cs diff --git a/MareSynchronos/FileCache/FileCacheManager.cs b/MareSynchronos/FileCache/FileCacheManager.cs index 49f88ba..e8168de 100644 --- a/MareSynchronos/FileCache/FileCacheManager.cs +++ b/MareSynchronos/FileCache/FileCacheManager.cs @@ -220,6 +220,7 @@ public class FileCacheManager : IDisposable public void Dispose() { + Logger.Verbose($"Disposing {GetType()}"); WriteOutFullCsv(); } } diff --git a/MareSynchronos/FileCache/PeriodicFileScanner.cs b/MareSynchronos/FileCache/PeriodicFileScanner.cs index dc66e2c..5942d3d 100644 --- a/MareSynchronos/FileCache/PeriodicFileScanner.cs +++ b/MareSynchronos/FileCache/PeriodicFileScanner.cs @@ -6,29 +6,27 @@ using MareSynchronos.Utils; namespace MareSynchronos.FileCache; -public class PeriodicFileScanner : IDisposable +public class PeriodicFileScanner : MediatorSubscriberBase, IDisposable { private readonly IpcManager _ipcManager; private readonly ConfigurationService _configService; private readonly FileCacheManager _fileDbManager; - 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, MareMediator mediator) + public PeriodicFileScanner(IpcManager ipcManager, ConfigurationService configService, FileCacheManager fileDbManager, MareMediator mediator) : base(mediator) { Logger.Verbose("Creating " + nameof(PeriodicFileScanner)); _ipcManager = ipcManager; _configService = configService; _fileDbManager = fileDbManager; - _mediator = mediator; - _mediator.Subscribe(this, (_) => StartScan()); - _mediator.Subscribe(this, (msg) => HaltScan(((HaltScanMessage)msg).Source)); - _mediator.Subscribe(this, (msg) => ResumeScan(((ResumeScanMessage)msg).Source)); - _mediator.Subscribe(this, (_) => StartScan()); + Mediator.Subscribe(this, (_) => StartScan()); + Mediator.Subscribe(this, (msg) => HaltScan(((HaltScanMessage)msg).Source)); + Mediator.Subscribe(this, (msg) => ResumeScan(((ResumeScanMessage)msg).Source)); + Mediator.Subscribe(this, (_) => StartScan()); } public void ResetLocks() @@ -76,9 +74,9 @@ public class PeriodicFileScanner : IDisposable private TimeSpan _timeUntilNextScan = TimeSpan.Zero; private int TimeBetweenScans => _configService.Current.TimeSpanBetweenScansInSeconds; - public void Dispose() + public override void Dispose() { - Logger.Verbose("Disposing " + nameof(PeriodicFileScanner)); + base.Dispose(); _scanCancellationTokenSource?.Cancel(); } diff --git a/MareSynchronos/Managers/CachedPlayer.cs b/MareSynchronos/Managers/CachedPlayer.cs index 1203614..2ccda0c 100644 --- a/MareSynchronos/Managers/CachedPlayer.cs +++ b/MareSynchronos/Managers/CachedPlayer.cs @@ -12,13 +12,12 @@ using MareSynchronos.WebAPI; namespace MareSynchronos.Managers; -public class CachedPlayer : IDisposable +public class CachedPlayer : MediatorSubscriberBase, IDisposable { private readonly ApiController _apiController; private readonly DalamudUtil _dalamudUtil; private readonly IpcManager _ipcManager; private readonly FileCacheManager _fileDbManager; - private readonly MareMediator _mediator; private API.Data.CharacterData _cachedData = new(); private PlayerRelatedObject? _currentCharacterEquipment; private CancellationTokenSource? _downloadCancellationTokenSource = new(); @@ -30,14 +29,13 @@ public class CachedPlayer : IDisposable private Task? _penumbraRedrawEventTask; - public CachedPlayer(OnlineUserIdentDto onlineUser, IpcManager ipcManager, ApiController apiController, DalamudUtil dalamudUtil, FileCacheManager fileDbManager, MareMediator mediator) + public CachedPlayer(OnlineUserIdentDto onlineUser, IpcManager ipcManager, ApiController apiController, DalamudUtil dalamudUtil, FileCacheManager fileDbManager, MareMediator mediator) : base(mediator) { OnlineUser = onlineUser; _ipcManager = ipcManager; _apiController = apiController; _dalamudUtil = dalamudUtil; _fileDbManager = fileDbManager; - _mediator = mediator; } public bool IsVisible @@ -173,7 +171,7 @@ public class CachedPlayer : IDisposable if (missingPluginsForData.Any()) { - _mediator.Publish(new NotificationMessage("Missing plugins for " + PlayerName, + Mediator.Publish(new NotificationMessage("Missing plugins for " + PlayerName, $"Received data for {PlayerName} that contained information for plugins you have not installed. Install {string.Join(", ", missingPluginsForData)} to experience their character fully.", NotificationType.Warning, 10000)); } @@ -202,9 +200,12 @@ public class CachedPlayer : IDisposable return true; } - public void Dispose() + public override void Dispose() { if (string.IsNullOrEmpty(PlayerName)) return; + + base.Dispose(); + Logger.Debug("Disposing " + PlayerName + " (" + OnlineUser + ")"); try { @@ -227,7 +228,7 @@ public class CachedPlayer : IDisposable } finally { - _mediator.UnsubscribeAll(this); + Mediator.UnsubscribeAll(this); _cachedData = new(); var tempPlayerName = PlayerName; PlayerName = string.Empty; @@ -244,7 +245,7 @@ public class CachedPlayer : IDisposable PlayerCharacter = character; Logger.Debug("Initializing Player " + this); - _mediator.Subscribe(this, (msg) => IpcManagerOnPenumbraRedrawEvent(((PenumbraRedrawMessage)msg))); + Mediator.Subscribe(this, (msg) => IpcManagerOnPenumbraRedrawEvent(((PenumbraRedrawMessage)msg))); _originalGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter); _currentCharacterEquipment = new PlayerRelatedObject(ObjectKind.Player, IntPtr.Zero, IntPtr.Zero, () => _dalamudUtil.GetPlayerCharacterFromObjectTableByName(PlayerName)?.Address ?? IntPtr.Zero); diff --git a/MareSynchronos/Managers/IpcManager.cs b/MareSynchronos/Managers/IpcManager.cs index 7b1cb82..00680ff 100644 --- a/MareSynchronos/Managers/IpcManager.cs +++ b/MareSynchronos/Managers/IpcManager.cs @@ -11,7 +11,7 @@ using MareSynchronos.Mediator; namespace MareSynchronos.Managers; -public class IpcManager : IDisposable +public class IpcManager : MediatorSubscriberBase, IDisposable { private readonly ICallGateSubscriber _glamourerApiVersion; private readonly ICallGateSubscriber? _glamourerApplyAll; @@ -57,18 +57,15 @@ 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, MareMediator mediator) + public IpcManager(DalamudPluginInterface pi, DalamudUtil dalamudUtil, MareMediator mediator) : base(mediator) { Logger.Verbose("Creating " + nameof(IpcManager)); - _mediator = mediator; - _penumbraInit = Penumbra.Api.Ipc.Initialized.Subscriber(pi, () => PenumbraInit()); _penumbraDispose = Penumbra.Api.Ipc.Disposed.Subscriber(pi, () => PenumbraDispose()); _penumbraResolvePlayer = Penumbra.Api.Ipc.ResolvePlayerPath.Subscriber(pi); @@ -121,13 +118,13 @@ public class IpcManager : IDisposable if (Initialized) { - _mediator.Publish(new PenumbraInitializedMessage()); + Mediator.Publish(new PenumbraInitializedMessage()); } _dalamudUtil = dalamudUtil; - _mediator.Subscribe(this, (_) => HandleActionQueue()); - _mediator.Subscribe(this, (_) => HandleGposeActionQueue()); - _mediator.Subscribe(this, (_) => ClearActionQueue()); + Mediator.Subscribe(this, (_) => HandleActionQueue()); + Mediator.Subscribe(this, (_) => HandleGposeActionQueue()); + Mediator.Subscribe(this, (_) => ClearActionQueue()); } private void HandleGposeActionQueue() @@ -147,7 +144,7 @@ public class IpcManager : IDisposable private void PenumbraModSettingChangedHandler() { - _mediator.Publish(new PenumbraModSettingChangedMessage()); + Mediator.Publish(new PenumbraModSettingChangedMessage()); } private void ClearActionQueue() @@ -162,7 +159,7 @@ public class IpcManager : IDisposable { if (ptr != IntPtr.Zero && string.Compare(arg1, arg2, ignoreCase: true, System.Globalization.CultureInfo.InvariantCulture) != 0) { - _mediator.Publish(new PenumbraResourceLoadMessage(ptr, arg1, arg2)); + Mediator.Publish(new PenumbraResourceLoadMessage(ptr, arg1, arg2)); } }); } @@ -238,9 +235,9 @@ public class IpcManager : IDisposable } } - public void Dispose() + public override void Dispose() { - Logger.Verbose("Disposing " + nameof(IpcManager)); + base.Dispose(); int totalSleepTime = 0; while (!ActionQueue.IsEmpty && totalSleepTime < 2000) @@ -500,31 +497,31 @@ public class IpcManager : IDisposable private void RedrawEvent(IntPtr objectAddress, int objectTableIndex) { - _mediator.Publish(new PenumbraRedrawMessage(objectAddress, objectTableIndex)); + Mediator.Publish(new PenumbraRedrawMessage(objectAddress, objectTableIndex)); } private void PenumbraInit() { - _mediator.Publish(new PenumbraInitializedMessage()); + Mediator.Publish(new PenumbraInitializedMessage()); _penumbraRedraw!.Invoke("self", RedrawType.Redraw); } private void HeelsOffsetChange(float offset) { - _mediator.Publish(new HeelsOffsetMessage(offset)); + Mediator.Publish(new HeelsOffsetMessage(offset)); } private void OnCustomizePlusScaleChange(string? scale) { if (scale != null) scale = Convert.ToBase64String(Encoding.UTF8.GetBytes(scale)); - _mediator.Publish(new CustomizePlusMessage(scale)); + Mediator.Publish(new CustomizePlusMessage(scale)); } private void OnPalettePlusPaletteChange(Character character, string palette) { if (character.Address == 0 || character.Address != _dalamudUtil.PlayerPointer) return; if (palette != null) palette = Convert.ToBase64String(Encoding.UTF8.GetBytes(palette)); - _mediator.Publish(new PalettePlusMessage(palette)); + Mediator.Publish(new PalettePlusMessage(palette)); } public void PalettePlusSetPalette(IntPtr character, string palette) @@ -575,7 +572,7 @@ public class IpcManager : IDisposable private void PenumbraDispose() { - _mediator.Publish(new PenumbraDisposedMessage()); + Mediator.Publish(new PenumbraDisposedMessage()); ActionQueue.Clear(); } } diff --git a/MareSynchronos/Managers/NotificationService.cs b/MareSynchronos/Managers/NotificationService.cs index b362426..79de09d 100644 --- a/MareSynchronos/Managers/NotificationService.cs +++ b/MareSynchronos/Managers/NotificationService.cs @@ -7,13 +7,13 @@ using MareSynchronos.Mediator; using MareSynchronos.Utils; namespace MareSynchronos.Managers; -public class NotificationService +public class NotificationService : MediatorSubscriberBase { private readonly UiBuilder _uiBuilder; private readonly ChatGui _chatGui; private readonly ConfigurationService _configurationService; - public NotificationService(MareMediator mediator, UiBuilder uiBuilder, ChatGui chatGui, ConfigurationService configurationService) + public NotificationService(MareMediator mediator, UiBuilder uiBuilder, ChatGui chatGui, ConfigurationService configurationService) : base(mediator) { _uiBuilder = uiBuilder; _chatGui = chatGui; diff --git a/MareSynchronos/Managers/OnlinePlayerManager.cs b/MareSynchronos/Managers/OnlinePlayerManager.cs index 7b75904..a74b040 100644 --- a/MareSynchronos/Managers/OnlinePlayerManager.cs +++ b/MareSynchronos/Managers/OnlinePlayerManager.cs @@ -15,7 +15,8 @@ public class OnlinePlayerManager : MediatorSubscriberBase, IDisposable private readonly FileCacheManager _fileDbManager; private readonly PairManager _pairManager; - public OnlinePlayerManager(ApiController apiController, DalamudUtil dalamudUtil, PlayerManager playerManager, FileCacheManager fileDbManager, PairManager pairManager, MareMediator mediator) : base(mediator) + public OnlinePlayerManager(ApiController apiController, DalamudUtil dalamudUtil, PlayerManager playerManager, + FileCacheManager fileDbManager, PairManager pairManager, MareMediator mediator) : base(mediator) { Logger.Verbose("Creating " + nameof(OnlinePlayerManager)); @@ -48,7 +49,6 @@ public class OnlinePlayerManager : MediatorSubscriberBase, IDisposable public override void Dispose() { - Logger.Verbose("Disposing " + nameof(OnlinePlayerManager)); base.Dispose(); } diff --git a/MareSynchronos/Managers/PairManager.cs b/MareSynchronos/Managers/PairManager.cs index cc54ea4..717f149 100644 --- a/MareSynchronos/Managers/PairManager.cs +++ b/MareSynchronos/Managers/PairManager.cs @@ -17,25 +17,22 @@ using System.Collections.Concurrent; namespace MareSynchronos.Managers; -public class PairManager : IDisposable +public class PairManager : MediatorSubscriberBase, IDisposable { private readonly ConcurrentDictionary _allClientPairs = new(UserDataComparer.Instance); private readonly ConcurrentDictionary _allGroups = new(GroupDataComparer.Instance); private readonly CachedPlayerFactory _cachedPlayerFactory; private readonly PairFactory _pairFactory; - private readonly UiBuilder _uiBuilder; private readonly ConfigurationService _configurationService; - private readonly MareMediator _mediator; - public PairManager(CachedPlayerFactory cachedPlayerFactory, PairFactory pairFactory, UiBuilder uiBuilder, ConfigurationService configurationService, MareMediator mediator) + public PairManager(CachedPlayerFactory cachedPlayerFactory, PairFactory pairFactory, + ConfigurationService configurationService, MareMediator mediator) : base(mediator) { _cachedPlayerFactory = cachedPlayerFactory; _pairFactory = pairFactory; - _uiBuilder = uiBuilder; _configurationService = configurationService; - _mediator = mediator; - _mediator.Subscribe(this, (_) => DalamudUtilOnZoneSwitched()); - _mediator.Subscribe(this, (_) => DalamudUtilOnDelayedFrameworkUpdate()); + Mediator.Subscribe(this, (_) => DalamudUtilOnZoneSwitched()); + Mediator.Subscribe(this, (_) => DalamudUtilOnDelayedFrameworkUpdate()); _directPairsInternal = DirectPairsLazy(); _groupPairsInternal = GroupPairsLazy(); } @@ -137,8 +134,9 @@ public class PairManager : IDisposable RecreateLazy(); } - public void Dispose() + public override void Dispose() { + base.Dispose(); DisposePairs(); } @@ -184,7 +182,7 @@ public class PairManager : IDisposable var msg = !string.IsNullOrEmpty(note) ? $"{note} ({pair.UserData.AliasOrUID}) is now online" : $"{pair.UserData.AliasOrUID} is now online"; - _mediator.Publish(new NotificationMessage("User online", msg, NotificationType.Info, 5000)); + Mediator.Publish(new NotificationMessage("User online", msg, NotificationType.Info, 5000)); } pair.CachedPlayer?.Dispose(); diff --git a/MareSynchronos/Managers/PlayerManager.cs b/MareSynchronos/Managers/PlayerManager.cs index ba038b7..d9d7841 100644 --- a/MareSynchronos/Managers/PlayerManager.cs +++ b/MareSynchronos/Managers/PlayerManager.cs @@ -10,7 +10,6 @@ using MareSynchronos.Mediator; namespace MareSynchronos.Managers; - public class PlayerManager : MediatorSubscriberBase, IDisposable { private readonly ApiController _apiController; @@ -123,8 +122,6 @@ public class PlayerManager : MediatorSubscriberBase, IDisposable public override void Dispose() { - Logger.Verbose("Disposing " + nameof(PlayerManager)); - base.Dispose(); _playerChangedCts?.Cancel(); diff --git a/MareSynchronos/MareConfiguration/ConfigurationService.cs b/MareSynchronos/MareConfiguration/ConfigurationService.cs index 151fd39..a2d382b 100644 --- a/MareSynchronos/MareConfiguration/ConfigurationService.cs +++ b/MareSynchronos/MareConfiguration/ConfigurationService.cs @@ -75,6 +75,7 @@ public class ConfigurationService : IDisposable public void Dispose() { + Logger.Verbose($"Disposing {GetType()}"); Save(); _periodicCheckCts.Cancel(); } diff --git a/MareSynchronos/MarePlugin.cs b/MareSynchronos/MarePlugin.cs new file mode 100644 index 0000000..2d3316b --- /dev/null +++ b/MareSynchronos/MarePlugin.cs @@ -0,0 +1,156 @@ +using Dalamud.Game.Command; +using Dalamud.Plugin; +using Dalamud.Interface.ImGuiFileDialog; +using MareSynchronos.Managers; +using MareSynchronos.WebAPI; +using Dalamud.Interface.Windowing; +using MareSynchronos.UI; +using MareSynchronos.Utils; +using MareSynchronos.FileCache; +using MareSynchronos.MareConfiguration; +using MareSynchronos.Mediator; +using Microsoft.Extensions.DependencyInjection; + +namespace MareSynchronos; + +public class MarePlugin : MediatorSubscriberBase, IDisposable +{ + private readonly ServiceProvider _serviceProvider; + private const string _commandName = "/mare"; + private IServiceScope? _runtimeServiceScope; + + public MarePlugin(ServiceProvider serviceProvider, MareMediator mediator) : base(mediator) + { + _serviceProvider = serviceProvider; + + mediator.Subscribe(this, (_) => Task.Run(WaitForPlayerAndLaunchCharacterManager)); + mediator.Subscribe(this, (_) => DalamudUtilOnLogIn()); + mediator.Subscribe(this, (_) => DalamudUtilOnLogOut()); + + serviceProvider.GetRequiredService(); + serviceProvider.GetRequiredService(); + serviceProvider.GetRequiredService(); + serviceProvider.GetRequiredService(); + serviceProvider.GetRequiredService(); + serviceProvider.GetRequiredService(); + } + + public override void Dispose() + { + base.Dispose(); + + _serviceProvider.GetRequiredService().RemoveHandler(_commandName); + + _runtimeServiceScope?.Dispose(); + _serviceProvider.Dispose(); + + Logger.Debug("Shut down"); + } + + private void DalamudUtilOnLogIn() + { + Logger.Debug("Client login"); + + 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 (!_serviceProvider.GetRequiredService().Current.HasValidSetup() + || !_serviceProvider.GetRequiredService().HasValidConfig()) + { + _serviceProvider.GetRequiredService().Publish(new SwitchToIntroUiMessage()); + return; + } + + _serviceProvider.GetRequiredService().StartScan(); + Task.Run(WaitForPlayerAndLaunchCharacterManager); + } + + private void DalamudUtilOnLogOut() + { + Logger.Debug("Client logout"); + _runtimeServiceScope?.Dispose(); + var pi = _serviceProvider.GetRequiredService(); + pi.UiBuilder.Draw -= Draw; + pi.UiBuilder.OpenConfigUi -= OpenUi; + _serviceProvider.GetRequiredService().RemoveHandler(_commandName); + } + + private async Task WaitForPlayerAndLaunchCharacterManager() + { + var dalamudUtil = _serviceProvider.GetRequiredService(); + while (!dalamudUtil.IsPlayerPresent) + { + await Task.Delay(100).ConfigureAwait(false); + } + + try + { + Logger.Debug("Launching Managers"); + + _runtimeServiceScope?.Dispose(); + _runtimeServiceScope = _serviceProvider.CreateScope(); + _runtimeServiceScope.ServiceProvider.GetRequiredService(); + _runtimeServiceScope.ServiceProvider.GetRequiredService(); + _runtimeServiceScope.ServiceProvider.GetRequiredService(); + } + catch (Exception ex) + { + Logger.Warn(ex.Message); + } + } + + private void Draw() + { + _serviceProvider.GetRequiredService().Draw(); + _serviceProvider.GetRequiredService().Draw(); + } + + private void OnCommand(string command, string args) + { + var splitArgs = args.ToLowerInvariant().Trim().Split(" ", StringSplitOptions.RemoveEmptyEntries); + + if (splitArgs == null || splitArgs.Length == 0) + { + // Interpret this as toggling the UI + OpenUi(); + return; + } + + if (string.Equals(splitArgs[0], "toggle", StringComparison.OrdinalIgnoreCase)) + { + var serverConfigurationManager = _serviceProvider.GetRequiredService(); + if (serverConfigurationManager.CurrentServer == null) return; + var fullPause = splitArgs.Length > 1 ? splitArgs[1] switch + { + "on" => false, + "off" => true, + _ => !serverConfigurationManager.CurrentServer.FullPause, + } : !serverConfigurationManager.CurrentServer.FullPause; + + if (fullPause != serverConfigurationManager.CurrentServer.FullPause) + { + serverConfigurationManager.CurrentServer.FullPause = fullPause; + serverConfigurationManager.Save(); + _ = _serviceProvider.GetRequiredService().CreateConnections(); + } + } + else if (string.Equals(splitArgs[0], "gpose", StringComparison.OrdinalIgnoreCase)) + { + _serviceProvider.GetRequiredService().Toggle(); + } + } + + private void OpenUi() + { + + if (_serviceProvider.GetRequiredService().Current.HasValidSetup()) + _serviceProvider.GetRequiredService().Toggle(); + else + _serviceProvider.GetRequiredService().Toggle(); + } +} diff --git a/MareSynchronos/Mediator/MareMediator.cs b/MareSynchronos/Mediator/MareMediator.cs index 9d1db6e..900fecc 100644 --- a/MareSynchronos/Mediator/MareMediator.cs +++ b/MareSynchronos/Mediator/MareMediator.cs @@ -4,11 +4,11 @@ namespace MareSynchronos.Mediator; public class MareMediator : IDisposable { - private record MediatorSubscriber(object Subscriber, Action Action); + private record MediatorSubscriber(IMediatorSubscriber Subscriber, Action Action); private readonly Dictionary> _subscriberDict = new(); - public void Subscribe(object subscriber, Action action) where T : IMessage + public void Subscribe(IMediatorSubscriber subscriber, Action action) where T : IMessage { _subscriberDict.TryAdd(typeof(T), new HashSet()); @@ -18,7 +18,7 @@ public class MareMediator : IDisposable } } - public void Unsubscribe(object subscriber) where T : IMessage + public void Unsubscribe(IMediatorSubscriber subscriber) where T : IMessage { if (_subscriberDict.TryGetValue(typeof(T), out var subscribers)) { @@ -30,7 +30,7 @@ public class MareMediator : IDisposable { if (_subscriberDict.TryGetValue(message.GetType(), out var subscribers)) { - foreach (var subscriber in subscribers) + foreach (var subscriber in subscribers.ToList()) { try { @@ -44,9 +44,9 @@ public class MareMediator : IDisposable } } - internal void UnsubscribeAll(object subscriber) + internal void UnsubscribeAll(IMediatorSubscriber subscriber) { - foreach (var kvp in _subscriberDict) + foreach (var kvp in _subscriberDict.ToList()) { kvp.Value.RemoveWhere(p => p.Subscriber == subscriber); } @@ -54,6 +54,7 @@ public class MareMediator : IDisposable public void Dispose() { + Logger.Verbose($"Disposing {GetType()}"); _subscriberDict.Clear(); } } \ No newline at end of file diff --git a/MareSynchronos/Mediator/MediatorSubscriberBase.cs b/MareSynchronos/Mediator/MediatorSubscriberBase.cs index 99cf79f..5b62d16 100644 --- a/MareSynchronos/Mediator/MediatorSubscriberBase.cs +++ b/MareSynchronos/Mediator/MediatorSubscriberBase.cs @@ -1,16 +1,39 @@ -namespace MareSynchronos.Mediator; +using Dalamud.Interface.Windowing; +using MareSynchronos.Utils; -public abstract class MediatorSubscriberBase : IDisposable +namespace MareSynchronos.Mediator; + +public abstract class MediatorSubscriberBase : IMediatorSubscriber { + public MareMediator Mediator { get; } protected MediatorSubscriberBase(MareMediator mediator) { Mediator = mediator; } - protected readonly MareMediator Mediator; - public virtual void Dispose() { + Logger.Verbose($"Disposing {GetType()}"); 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/Plugin.cs b/MareSynchronos/Plugin.cs index eb35a47..11324f0 100644 --- a/MareSynchronos/Plugin.cs +++ b/MareSynchronos/Plugin.cs @@ -23,9 +23,8 @@ namespace MareSynchronos; public sealed class Plugin : IDalamudPlugin { - private const string _commandName = "/mare"; - private IServiceScope? _runtimeServiceScope; - private readonly ServiceProvider _serviceProvider; + private readonly MarePlugin plugin; + public string Name => "Mare Synchronos"; public Plugin(DalamudPluginInterface pluginInterface, CommandManager commandManager, DataManager gameData, Framework framework, ObjectTable objectTable, ClientState clientState, Condition condition, ChatGui chatGui) @@ -76,142 +75,18 @@ public sealed class Plugin : IDalamudPlugin collection.AddScoped(); collection.AddScoped(); - _serviceProvider = collection.BuildServiceProvider(new ServiceProviderOptions() { ValidateOnBuild = true, ValidateScopes = true }); + var serviceProvider = collection.BuildServiceProvider(new ServiceProviderOptions() { ValidateOnBuild = true, ValidateScopes = true }); - _serviceProvider.GetRequiredService().SetupWithLangCode("en"); - _serviceProvider.GetRequiredService().UiBuilder.DisableGposeUiHide = true; + serviceProvider.GetRequiredService().SetupWithLangCode("en"); + serviceProvider.GetRequiredService().UiBuilder.DisableGposeUiHide = true; - var mediator = _serviceProvider.GetRequiredService(); - mediator.Subscribe(this, (_) => Task.Run(WaitForPlayerAndLaunchCharacterManager)); - mediator.Subscribe(this, (_) => DalamudUtilOnLogIn()); - mediator.Subscribe(this, (_) => DalamudUtilOnLogOut()); - - _serviceProvider.GetRequiredService(); - _serviceProvider.GetRequiredService(); - _serviceProvider.GetRequiredService(); - _serviceProvider.GetRequiredService(); - _serviceProvider.GetRequiredService(); - _serviceProvider.GetRequiredService(); + var mediator = serviceProvider.GetRequiredService(); + plugin = new MarePlugin(serviceProvider, mediator); } - public string Name => "Mare Synchronos"; - public void Dispose() { - Logger.Verbose("Disposing " + Name); - - _serviceProvider.GetRequiredService().RemoveHandler(_commandName); - - _runtimeServiceScope?.Dispose(); - _serviceProvider.Dispose(); - - Logger.Debug("Shut down"); - } - - private void DalamudUtilOnLogIn() - { - Logger.Debug("Client login"); - - 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 (!_serviceProvider.GetRequiredService().Current.HasValidSetup() - || !_serviceProvider.GetRequiredService().HasValidConfig()) - { - _serviceProvider.GetRequiredService().Publish(new SwitchToIntroUiMessage()); - return; - } - - _serviceProvider.GetRequiredService().StartScan(); - Task.Run(WaitForPlayerAndLaunchCharacterManager); - } - - private void DalamudUtilOnLogOut() - { - Logger.Debug("Client logout"); - _runtimeServiceScope?.Dispose(); - var pi = _serviceProvider.GetRequiredService(); - pi.UiBuilder.Draw -= Draw; - pi.UiBuilder.OpenConfigUi -= OpenUi; - _serviceProvider.GetRequiredService().RemoveHandler(_commandName); - } - - private async Task WaitForPlayerAndLaunchCharacterManager() - { - var dalamudUtil = _serviceProvider.GetRequiredService(); - while (!dalamudUtil.IsPlayerPresent) - { - await Task.Delay(100).ConfigureAwait(false); - } - - try - { - Logger.Debug("Launching Managers"); - - _runtimeServiceScope?.Dispose(); - _runtimeServiceScope = _serviceProvider.CreateScope(); - _runtimeServiceScope.ServiceProvider.GetRequiredService(); - _runtimeServiceScope.ServiceProvider.GetRequiredService(); - _runtimeServiceScope.ServiceProvider.GetRequiredService(); - } - catch (Exception ex) - { - Logger.Warn(ex.Message); - } - } - - private void Draw() - { - _serviceProvider.GetRequiredService().Draw(); - _serviceProvider.GetRequiredService().Draw(); - } - - private void OnCommand(string command, string args) - { - var splitArgs = args.ToLowerInvariant().Trim().Split(" ", StringSplitOptions.RemoveEmptyEntries); - - if (splitArgs == null || splitArgs.Length == 0) - { - // Interpret this as toggling the UI - OpenUi(); - return; - } - - if (string.Equals(splitArgs[0], "toggle", StringComparison.OrdinalIgnoreCase)) - { - var serverConfigurationManager = _serviceProvider.GetRequiredService(); - if (serverConfigurationManager.CurrentServer == null) return; - var fullPause = splitArgs.Length > 1 ? splitArgs[1] switch - { - "on" => false, - "off" => true, - _ => !serverConfigurationManager.CurrentServer.FullPause, - } : !serverConfigurationManager.CurrentServer.FullPause; - - if (fullPause != serverConfigurationManager.CurrentServer.FullPause) - { - serverConfigurationManager.CurrentServer.FullPause = fullPause; - serverConfigurationManager.Save(); - _ = _serviceProvider.GetRequiredService().CreateConnections(); - } - } - else if (string.Equals(splitArgs[0], "gpose", StringComparison.OrdinalIgnoreCase)) - { - _serviceProvider.GetRequiredService().Toggle(); - } - } - - private void OpenUi() - { - - if (_serviceProvider.GetRequiredService().Current.HasValidSetup()) - _serviceProvider.GetRequiredService().Toggle(); - else - _serviceProvider.GetRequiredService().Toggle(); + Logger.Verbose($"Disposing {GetType()}"); + plugin.Dispose(); } } diff --git a/MareSynchronos/UI/CompactUI.cs b/MareSynchronos/UI/CompactUI.cs index 2f04a72..a622ade 100644 --- a/MareSynchronos/UI/CompactUI.cs +++ b/MareSynchronos/UI/CompactUI.cs @@ -21,12 +21,11 @@ using MareSynchronos.WebAPI; namespace MareSynchronos.UI; -public class CompactUi : Window, IDisposable +public class CompactUi : WindowMediatorSubscriberBase, 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); @@ -58,7 +57,7 @@ public class CompactUi : Window, IDisposable public CompactUi(WindowSystem windowSystem, UiShared uiShared, ConfigurationService configService, ApiController apiController, PairManager pairManager, - ServerConfigurationManager serverManager, MareMediator mediator) : base("###MareSynchronosMainUI") + ServerConfigurationManager serverManager, MareMediator mediator) : base(mediator, "###MareSynchronosMainUI") { #if DEBUG @@ -89,7 +88,6 @@ public class CompactUi : Window, IDisposable _apiController = apiController; _pairManager = pairManager; _serverManager = serverManager; - _mediator = mediator; _tagHandler = new(_serverManager); _groupPanel = new(this, uiShared, _pairManager, _serverManager, _configService); @@ -97,10 +95,10 @@ public class CompactUi : Window, IDisposable _selectPairsForGroupUi = new(_tagHandler); _pairGroupsUi = new(_tagHandler, DrawPairedClient, apiController, _selectPairsForGroupUi); - _mediator.Subscribe(this, (_) => IsOpen = true); - _mediator.Subscribe(this, (_) => IsOpen = false); - _mediator.Subscribe(this, (_) => UiShared_GposeStart()); - _mediator.Subscribe(this, (_) => UiShared_GposeEnd()); + Mediator.Subscribe(this, (_) => IsOpen = true); + Mediator.Subscribe(this, (_) => IsOpen = false); + Mediator.Subscribe(this, (_) => UiShared_GposeStart()); + Mediator.Subscribe(this, (_) => UiShared_GposeEnd()); SizeConstraints = new WindowSizeConstraints() { @@ -122,9 +120,9 @@ public class CompactUi : Window, IDisposable IsOpen = false; } - public void Dispose() + public override void Dispose() { - Logger.Verbose("Disposing " + nameof(CompactUi)); + base.Dispose(); _windowSystem.RemoveWindow(this); } @@ -701,7 +699,7 @@ public class CompactUi : Window, IDisposable ImGui.SetCursorPosY(originalPos.Y + uidTextSize.Y / 2 - buttonSize.Y / 2); if (ImGuiComponents.IconButton(FontAwesomeIcon.Cog)) { - _mediator.Publish(new OpenSettingsUiMessage()); + Mediator.Publish(new OpenSettingsUiMessage()); } UiShared.AttachToolTip("Open the Mare Synchronos Settings"); diff --git a/MareSynchronos/UI/DownloadUi.cs b/MareSynchronos/UI/DownloadUi.cs index 1671e3d..1b5cce1 100644 --- a/MareSynchronos/UI/DownloadUi.cs +++ b/MareSynchronos/UI/DownloadUi.cs @@ -17,7 +17,7 @@ public class DownloadUi : Window, IDisposable public void Dispose() { - Logger.Verbose("Disposing " + nameof(DownloadUi)); + Logger.Verbose($"Disposing {GetType()}"); _windowSystem.RemoveWindow(this); } diff --git a/MareSynchronos/UI/GposeUi.cs b/MareSynchronos/UI/GposeUi.cs index c05afed..6413ab1 100644 --- a/MareSynchronos/UI/GposeUi.cs +++ b/MareSynchronos/UI/GposeUi.cs @@ -10,27 +10,25 @@ using MareSynchronos.Utils; namespace MareSynchronos.UI; -public class GposeUi : Window, IDisposable +public class GposeUi : WindowMediatorSubscriberBase, IDisposable { private readonly WindowSystem _windowSystem; private readonly MareCharaFileManager _mareCharaFileManager; 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, - MareMediator mediator) : base("Mare Synchronos Gpose Import UI###MareSynchronosGposeUI") + MareMediator mediator) : base(mediator, "Mare Synchronos Gpose Import UI###MareSynchronosGposeUI") { _windowSystem = windowSystem; _mareCharaFileManager = mareCharaFileManager; _dalamudUtil = dalamudUtil; _fileDialogManager = fileDialogManager; _configService = configService; - _mediator = mediator; - _mediator.Subscribe(this, (_) => StartGpose()); - _mediator.Subscribe(this, (_) => EndGpose()); + Mediator.Subscribe(this, (_) => StartGpose()); + Mediator.Subscribe(this, (_) => EndGpose()); IsOpen = _dalamudUtil.IsInGpose; Flags = ImGuiWindowFlags.AlwaysAutoResize; _windowSystem.AddWindow(this); @@ -47,8 +45,9 @@ public class GposeUi : Window, IDisposable IsOpen = _configService.Current.OpenGposeImportOnGposeStart; } - public void Dispose() + public override void Dispose() { + base.Dispose(); _windowSystem.RemoveWindow(this); } diff --git a/MareSynchronos/UI/IntroUI.cs b/MareSynchronos/UI/IntroUI.cs index 1c33fcf..7b44d2d 100644 --- a/MareSynchronos/UI/IntroUI.cs +++ b/MareSynchronos/UI/IntroUI.cs @@ -13,13 +13,12 @@ using MareSynchronos.Mediator; namespace MareSynchronos.UI; -internal class IntroUi : Window, IDisposable +internal class IntroUi : WindowMediatorSubscriberBase, IDisposable { private readonly UiShared _uiShared; private readonly ConfigurationService _configService; private readonly PeriodicFileScanner _fileCacheManager; private readonly ServerConfigurationManager _serverConfigurationManager; - private readonly MareMediator _mareMediator; private readonly WindowSystem _windowSystem; private bool _readFirstPage; @@ -31,15 +30,14 @@ internal class IntroUi : Window, IDisposable private readonly Dictionary _languages = new(StringComparer.Ordinal) { { "English", "en" }, { "Deutsch", "de" }, { "Français", "fr" } }; private int _currentLanguage; - public void Dispose() + public override void Dispose() { - Logger.Verbose("Disposing " + nameof(IntroUi)); - + base.Dispose(); _windowSystem.RemoveWindow(this); } public IntroUi(WindowSystem windowSystem, UiShared uiShared, ConfigurationService configService, - PeriodicFileScanner fileCacheManager, ServerConfigurationManager serverConfigurationManager, MareMediator mareMediator) : base("Mare Synchronos Setup") + PeriodicFileScanner fileCacheManager, ServerConfigurationManager serverConfigurationManager, MareMediator mareMediator) : base(mareMediator, "Mare Synchronos Setup") { Logger.Verbose("Creating " + nameof(IntroUi)); @@ -47,7 +45,6 @@ internal class IntroUi : Window, IDisposable _configService = configService; _fileCacheManager = fileCacheManager; _serverConfigurationManager = serverConfigurationManager; - _mareMediator = mareMediator; _windowSystem = windowSystem; IsOpen = false; @@ -59,8 +56,8 @@ internal class IntroUi : Window, IDisposable GetToSLocalization(); - _mareMediator.Subscribe(this, (_) => IsOpen = false); - _mareMediator.Subscribe(this, (_) => IsOpen = true); + Mediator.Subscribe(this, (_) => IsOpen = false); + Mediator.Subscribe(this, (_) => IsOpen = true); _windowSystem.AddWindow(this); } @@ -242,7 +239,7 @@ internal class IntroUi : Window, IDisposable } else { - _mareMediator.Publish(new SwitchToMainUiMessage()); + Mediator.Publish(new SwitchToMainUiMessage()); IsOpen = false; } } diff --git a/MareSynchronos/UI/SettingsUi.cs b/MareSynchronos/UI/SettingsUi.cs index fd34d81..2fb6e7f 100644 --- a/MareSynchronos/UI/SettingsUi.cs +++ b/MareSynchronos/UI/SettingsUi.cs @@ -14,12 +14,10 @@ using MareSynchronos.Managers; using MareSynchronos.API.Data.Comparer; using MareSynchronos.MareConfiguration; using MareSynchronos.Mediator; -using Lumina.Excel.GeneratedSheets; -using static System.Runtime.InteropServices.JavaScript.JSType; namespace MareSynchronos.UI; -public class SettingsUi : Window, IDisposable +public class SettingsUi : WindowMediatorSubscriberBase, IDisposable { private readonly ConfigurationService _configService; private readonly WindowSystem _windowSystem; @@ -27,7 +25,6 @@ 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; } @@ -39,7 +36,7 @@ public class SettingsUi : Window, IDisposable public SettingsUi(WindowSystem windowSystem, UiShared uiShared, ConfigurationService configService, MareCharaFileManager mareCharaFileManager, PairManager pairManager, - ServerConfigurationManager serverConfigurationManager, MareMediator mediator) : base("Mare Synchronos Settings") + ServerConfigurationManager serverConfigurationManager, MareMediator mediator) : base(mediator, "Mare Synchronos Settings") { Logger.Verbose("Creating " + nameof(SettingsUi)); @@ -54,15 +51,13 @@ public class SettingsUi : Window, IDisposable _mareCharaFileManager = mareCharaFileManager; _pairManager = pairManager; _serverConfigurationManager = serverConfigurationManager; - _mediator = mediator; _uiShared = uiShared; - - _mediator.Subscribe(this, (_) => Toggle()); - _mediator.Subscribe(this, (_) => IsOpen = false); - _mediator.Subscribe(this, (_) => UiShared_GposeStart()); - _mediator.Subscribe(this, (_) => UiShared_GposeEnd()); - _mediator.Subscribe(this, (msg) => LastCreatedCharacterData = ((PlayerChangedMessage)msg).Data); + Mediator.Subscribe(this, (_) => Toggle()); + Mediator.Subscribe(this, (_) => IsOpen = false); + Mediator.Subscribe(this, (_) => UiShared_GposeStart()); + Mediator.Subscribe(this, (_) => UiShared_GposeEnd()); + Mediator.Subscribe(this, (msg) => LastCreatedCharacterData = ((PlayerChangedMessage)msg).Data); windowSystem.AddWindow(this); } @@ -78,10 +73,9 @@ public class SettingsUi : Window, IDisposable IsOpen = false; } - public void Dispose() + public override void Dispose() { - Logger.Verbose("Disposing " + nameof(SettingsUi)); - + base.Dispose(); _windowSystem.RemoveWindow(this); } @@ -215,7 +209,7 @@ public class SettingsUi : Window, IDisposable { Task.Run(() => ApiController.UserDelete()); _deleteAccountPopupModalShown = false; - _mediator.Publish(new SwitchToIntroUiMessage()); + Mediator.Publish(new SwitchToIntroUiMessage()); } ImGui.SameLine(); diff --git a/MareSynchronos/UI/UIShared.cs b/MareSynchronos/UI/UIShared.cs index 3e1a3f5..d6a11c6 100644 --- a/MareSynchronos/UI/UIShared.cs +++ b/MareSynchronos/UI/UIShared.cs @@ -656,6 +656,7 @@ public partial class UiShared : IDisposable public void Dispose() { + Logger.Verbose($"Disposing {GetType()}"); _pluginInterface.UiBuilder.BuildFonts -= BuildFont; } } diff --git a/MareSynchronos/Utils/DalamudLoggingProvider.cs b/MareSynchronos/Utils/DalamudLoggingProvider.cs index 2c5de54..13d85db 100644 --- a/MareSynchronos/Utils/DalamudLoggingProvider.cs +++ b/MareSynchronos/Utils/DalamudLoggingProvider.cs @@ -20,6 +20,7 @@ public class DalamudLoggingProvider : ILoggerProvider public void Dispose() { + Logger.Verbose($"Disposing {GetType()}"); _loggers.Clear(); } } diff --git a/MareSynchronos/Utils/DalamudUtil.cs b/MareSynchronos/Utils/DalamudUtil.cs index ac4e2d2..5752bd3 100644 --- a/MareSynchronos/Utils/DalamudUtil.cs +++ b/MareSynchronos/Utils/DalamudUtil.cs @@ -3,8 +3,6 @@ using Dalamud.Game.ClientState; using Dalamud.Game.ClientState.Conditions; using Dalamud.Game.ClientState.Objects; using Dalamud.Game.ClientState.Objects.SubKinds; -using Dalamud.Game.Gui; -using Dalamud.Game.Text.SeStringHandling; using FFXIVClientStructs.FFXIV.Client.Game.Character; using FFXIVClientStructs.FFXIV.Client.Game.Control; using Lumina.Excel.GeneratedSheets; @@ -270,6 +268,7 @@ public class DalamudUtil : IDisposable public void Dispose() { + Logger.Verbose($"Disposing {GetType()}"); _framework.Update -= FrameworkOnUpdate; } } diff --git a/MareSynchronos/WebAPI/ApIController.Functions.Files.cs b/MareSynchronos/WebAPI/ApIController.Functions.Files.cs index 38d3ed2..b15f157 100644 --- a/MareSynchronos/WebAPI/ApIController.Functions.Files.cs +++ b/MareSynchronos/WebAPI/ApIController.Functions.Files.cs @@ -186,7 +186,7 @@ public partial class ApiController public async Task DownloadFiles(int currentDownloadId, List fileReplacementDto, CancellationToken ct) { - _mediator.Publish(new HaltScanMessage("Download")); + Mediator.Publish(new HaltScanMessage("Download")); try { await DownloadFilesInternal(currentDownloadId, fileReplacementDto, ct).ConfigureAwait(false); @@ -197,7 +197,7 @@ public partial class ApiController } finally { - _mediator.Publish(new ResumeScanMessage("Download")); + Mediator.Publish(new ResumeScanMessage("Download")); } } diff --git a/MareSynchronos/WebAPI/ApiController.Functions.Callbacks.cs b/MareSynchronos/WebAPI/ApiController.Functions.Callbacks.cs index 3da803d..32067cb 100644 --- a/MareSynchronos/WebAPI/ApiController.Functions.Callbacks.cs +++ b/MareSynchronos/WebAPI/ApiController.Functions.Callbacks.cs @@ -255,13 +255,13 @@ public partial class ApiController switch (severity) { case MessageSeverity.Error: - _mediator.Publish(new NotificationMessage("Warning from " + _serverManager.CurrentServer!.ServerName, message, NotificationType.Error, 7500)); + Mediator.Publish(new NotificationMessage("Warning from " + _serverManager.CurrentServer!.ServerName, message, NotificationType.Error, 7500)); break; case MessageSeverity.Warning: - _mediator.Publish(new NotificationMessage("Warning from " + _serverManager.CurrentServer!.ServerName, message, NotificationType.Warning, 7500)); + Mediator.Publish(new NotificationMessage("Warning from " + _serverManager.CurrentServer!.ServerName, message, NotificationType.Warning, 7500)); break; case MessageSeverity.Information: - _mediator.Publish(new NotificationMessage("Info from " + _serverManager.CurrentServer!.ServerName, message, NotificationType.Info, 5000)); + Mediator.Publish(new NotificationMessage("Info from " + _serverManager.CurrentServer!.ServerName, message, NotificationType.Info, 5000)); break; } diff --git a/MareSynchronos/WebAPI/ApiController.cs b/MareSynchronos/WebAPI/ApiController.cs index 8a495b2..6a663b1 100644 --- a/MareSynchronos/WebAPI/ApiController.cs +++ b/MareSynchronos/WebAPI/ApiController.cs @@ -15,7 +15,7 @@ using MareSynchronos.MareConfiguration; using MareSynchronos.Mediator; namespace MareSynchronos.WebAPI; -public partial class ApiController : IDisposable, IMareHubClient +public partial class ApiController : MediatorSubscriberBase, IDisposable, IMareHubClient { public const string MainServer = "Lunae Crescere Incipientis (Central Server EU)"; public const string MainServiceUri = "wss://maresynchronos.com"; @@ -27,7 +27,6 @@ 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; @@ -45,7 +44,8 @@ public partial class ApiController : IDisposable, IMareHubClient private HttpClient _httpClient; - public ApiController(ConfigurationService configService, DalamudUtil dalamudUtil, FileCacheManager fileDbManager, PairManager pairManager, ServerConfigurationManager serverManager, MareMediator mediator) + public ApiController(ConfigurationService configService, DalamudUtil dalamudUtil, FileCacheManager fileDbManager, + PairManager pairManager, ServerConfigurationManager serverManager, MareMediator mediator) : base(mediator) { Logger.Verbose("Creating " + nameof(ApiController)); @@ -54,11 +54,10 @@ public partial class ApiController : IDisposable, IMareHubClient _fileDbManager = fileDbManager; _pairManager = pairManager; _serverManager = serverManager; - _mediator = mediator; _connectionCancellationTokenSource = new CancellationTokenSource(); - _mediator.Subscribe(this, (_) => DalamudUtilOnLogIn()); - _mediator.Subscribe(this, (_) => DalamudUtilOnLogOut()); + Mediator.Subscribe(this, (_) => DalamudUtilOnLogIn()); + Mediator.Subscribe(this, (_) => DalamudUtilOnLogOut()); ServerState = ServerState.Offline; _verifiedUploadedHashes = new(StringComparer.Ordinal); _httpClient = new(); @@ -304,14 +303,12 @@ public partial class ApiController : IDisposable, IMareHubClient _ = ClientHealthCheck(_healthCheckTokenSource.Token); _initialized = true; - _mediator.Publish(new ConnectedMessage()); + Mediator.Publish(new ConnectedMessage()); } - public void Dispose() + public override void Dispose() { - Logger.Verbose("Disposing " + nameof(ApiController)); - - ServerState = ServerState.Offline; + base.Dispose(); Task.Run(async () => await StopConnection(_connectionCancellationTokenSource.Token, ServerState.Disconnected).ConfigureAwait(false)); _connectionCancellationTokenSource?.Cancel(); _healthCheckTokenSource?.Cancel(); @@ -341,7 +338,7 @@ public partial class ApiController : IDisposable, IMareHubClient CurrentDownloads.Clear(); _uploadCancellationTokenSource?.Cancel(); _healthCheckTokenSource?.Cancel(); - _mediator.Publish(new DisconnectedMessage()); + Mediator.Publish(new DisconnectedMessage()); _pairManager.ClearPairs(); ServerState = ServerState.Offline; Logger.Info("Connection closed"); @@ -353,11 +350,11 @@ public partial class ApiController : IDisposable, IMareHubClient _connectionDto = null; _healthCheckTokenSource?.Cancel(); ServerState = ServerState.Reconnecting; - _mediator.Publish(new NotificationMessage("Connection lost", "Connection lost to " + _serverManager.CurrentServer!.ServerName, NotificationType.Error, 5000)); + Mediator.Publish(new NotificationMessage("Connection lost", "Connection lost to " + _serverManager.CurrentServer!.ServerName, NotificationType.Error, 5000)); Logger.Warn("Connection closed... Reconnecting"); Logger.Warn(arg?.Message ?? string.Empty); Logger.Warn(arg?.StackTrace ?? string.Empty); - _mediator.Publish(new DisconnectedMessage()); + Mediator.Publish(new DisconnectedMessage()); _pairManager.ClearPairs(); return Task.CompletedTask; } @@ -387,7 +384,7 @@ public partial class ApiController : IDisposable, IMareHubClient await _mareHub.DisposeAsync().ConfigureAwait(false); CurrentUploads.Clear(); CurrentDownloads.Clear(); - _mediator.Publish(new DisconnectedMessage()); + Mediator.Publish(new DisconnectedMessage()); _pairManager.ClearPairs(); _mareHub = null; }