add DI, start implementing mediator pattern instead of events

This commit is contained in:
rootdarkarchon
2023-01-31 00:05:47 +01:00
parent 7f2bb9aff7
commit 5e7beb8518
15 changed files with 190 additions and 240 deletions

View File

@@ -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<string, int> 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<ZoneSwitchStartMessage>(this, (_) => ZoneSwitchHaltScan());
_mediator.Subscribe<ZoneSwitchEndMessage>(this, (_) => ZoneSwitchResumeScan());
_mediator.Subscribe<SwitchToMainUiMessage>(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();
}

View File

@@ -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<int> _glamourerApiVersion;
@@ -58,12 +58,13 @@ public class IpcManager : IDisposable
private readonly ICallGateSubscriber<Character, string, object> _palettePlusPaletteChanged;
private readonly DalamudUtil _dalamudUtil;
private readonly MareMediator _mediator;
private bool _inGposeQueueMode = false;
private ConcurrentQueue<Action> ActionQueue => _inGposeQueueMode ? _gposeActionQueue : _normalQueue;
private readonly ConcurrentQueue<Action> _normalQueue = new();
private readonly ConcurrentQueue<Action> _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<FrameworkUpdateMessage>(this, (_) => HandleActionQueue());
_mediator.Subscribe<GposeFrameworkUpdateMessage>(this, (_) => HandleGposeActionQueue());
_mediator.Subscribe<ZoneSwitchEndMessage>(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();

View File

@@ -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<DalamudLoginMessage>(this, (_) => DalamudUtilOnLogIn());
_mediator.Subscribe<DalamudLogoutMessage>(this, (_) => DalamudUtilOnLogOut());
if (_dalamudUtil.IsLoggedIn)
{
@@ -42,12 +44,12 @@ public class OnlinePlayerManager : IDisposable
private void DalamudUtilOnLogIn()
{
_dalamudUtil.DelayedFrameworkUpdate += FrameworkOnUpdate;
_mediator.Subscribe<DelayedFrameworkUpdateMessage>(this, (_) => FrameworkOnUpdate());
}
private void DalamudUtilOnLogOut()
{
_dalamudUtil.DelayedFrameworkUpdate -= FrameworkOnUpdate;
_mediator.Unsubscribe<DelayedFrameworkUpdateMessage>(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<DalamudLoginMessage>(this);
_mediator.Unsubscribe<DalamudLogoutMessage>(this);
_mediator.Unsubscribe<DelayedFrameworkUpdateMessage>(this);
}
private void FrameworkOnUpdate()

View File

@@ -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<ZoneSwitchStartMessage>(this, (_) => DalamudUtilOnZoneSwitched());
_mediator.Subscribe<DelayedFrameworkUpdateMessage>(this, (_) => DalamudUtilOnDelayedFrameworkUpdate());
_directPairsInternal = DirectPairsLazy();
_groupPairsInternal = GroupPairsLazy();
}
@@ -137,8 +140,6 @@ public class PairManager : IDisposable
public void Dispose()
{
_dalamudUtil.DelayedFrameworkUpdate -= DalamudUtilOnDelayedFrameworkUpdate;
_dalamudUtil.ZoneSwitchStart -= DalamudUtilOnZoneSwitched;
DisposePairs();
}

View File

@@ -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<DelayedFrameworkUpdateMessage>(this, (_) => DalamudUtilOnDelayedFrameworkUpdate());
_mediator.Subscribe<FrameworkUpdateMessage>(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<DelayedFrameworkUpdateMessage>(this);
_mediator.Unsubscribe<FrameworkUpdateMessage>(this);
_apiController.Connected -= ApiControllerOnConnected;
_apiController.Disconnected -= ApiController_Disconnected;
_ipcManager.PenumbraRedrawEvent -= IpcManager_PenumbraRedrawEvent;
_dalamudUtil.DelayedFrameworkUpdate -= DalamudUtilOnDelayedFrameworkUpdate;
_dalamudUtil.FrameworkUpdate -= DalamudUtilOnFrameworkUpdate;
_transientResourceManager.TransientResourceLoaded -= HandleTransientResourceLoad;

View File

@@ -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<IntPtr>();
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<IntPtr, HashSet<string>> TransientResources { get; } = new();
private ConcurrentDictionary<ObjectKind, HashSet<FileReplacement>> 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<FrameworkUpdateMessage>(this, (_) => DalamudUtil_FrameworkUpdate());
_mediator.Subscribe<ClassJobChangedMessage>(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<FrameworkUpdateMessage>(this);
_mediator.Unsubscribe<ClassJobChangedMessage>(this);
_ipcManager.PenumbraResourceLoadEvent -= Manager_PenumbraResourceLoadEvent;
_dalamudUtil.ClassJobChanged -= DalamudUtil_ClassJobChanged;
_ipcManager.PenumbraModSettingChanged -= Manager_PenumbraModSettingChanged;
TransientResources.Clear();
SemiTransientResources.Clear();

View File

@@ -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

View File

@@ -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<FileDialogManager>();
@@ -82,6 +55,8 @@ public sealed class Plugin : IDalamudPlugin
collection.AddSingleton<DalamudUtil>();
collection.AddSingleton<IpcManager>();
collection.AddSingleton<FileCacheManager>();
collection.AddSingleton<CachedPlayerFactory>();
collection.AddSingleton<PairFactory>();
collection.AddSingleton<ServerConfigurationManager>();
collection.AddSingleton<PairManager>();
collection.AddSingleton<ApiController>();
@@ -94,44 +69,30 @@ public sealed class Plugin : IDalamudPlugin
collection.AddSingleton<CompactUi>();
collection.AddSingleton<GposeUi>();
collection.AddSingleton<IntroUi>();
collection.AddSingleton<DownloadUi>();
collection.AddTransient<TransientResourceManager>();
collection.AddTransient<CharacterDataFactory>();
collection.AddTransient<PlayerManager>();
collection.AddTransient<OnlinePlayerManager>();
collection.AddScoped<TransientResourceManager>();
collection.AddScoped<CharacterDataFactory>();
collection.AddScoped<PlayerManager>();
collection.AddScoped<OnlinePlayerManager>();
_serviceProvider = collection.BuildServiceProvider(new ServiceProviderOptions() { ValidateOnBuild = true, ValidateScopes = true });
_serviceProvider.GetRequiredService<Dalamud.Localization>().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<Dalamud.Localization>().SetupWithLangCode("en");
_serviceProvider.GetRequiredService<DalamudPluginInterface>().UiBuilder.DisableGposeUiHide = true;
_dalamudUtil.LogIn += DalamudUtilOnLogIn;
_dalamudUtil.LogOut += DalamudUtilOnLogOut;
var mediator = _serviceProvider.GetRequiredService<MareMediator>();
mediator.Subscribe<SwitchToMainUiMessage>(this, (_) => ReLaunchCharacterManager());
mediator.Subscribe<DalamudLoginMessage>(this, (_) => DalamudUtilOnLogIn());
mediator.Subscribe<DalamudLogoutMessage>(this, (_) => DalamudUtilOnLogOut());
if (_dalamudUtil.IsLoggedIn)
{
DalamudUtilOnLogIn();
}
_serviceProvider.GetRequiredService<SettingsUi>();
_serviceProvider.GetRequiredService<CompactUi>();
_serviceProvider.GetRequiredService<GposeUi>();
_serviceProvider.GetRequiredService<IntroUi>();
_serviceProvider.GetRequiredService<DownloadUi>();
}
public string Name => "Mare Synchronos";
@@ -140,33 +101,10 @@ public sealed class Plugin : IDalamudPlugin
{
Logger.Verbose("Disposing " + Name);
var services = _serviceProvider.GetServices<IDisposable>().ToList();
services.ForEach(c => c.Dispose());
_serviceProvider.GetRequiredService<CommandManager>().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<DalamudPluginInterface>();
pi.UiBuilder.Draw += Draw;
pi.UiBuilder.OpenConfigUi += OpenUi;
_serviceProvider.GetRequiredService<CommandManager>().AddHandler(_commandName, new CommandInfo(OnCommand)
{
HelpMessage = "Opens the Mare Synchronos UI",
});
if (!_configurationService.Current.HasValidSetup() || !_serverConfigurationManager.HasValidConfig())
if (!_serviceProvider.GetRequiredService<ConfigurationService>().Current.HasValidSetup()
|| !_serviceProvider.GetRequiredService<ServerConfigurationManager>().HasValidConfig())
{
_introUi.IsOpen = true;
_compactUi.IsOpen = false;
_serviceProvider.GetRequiredService<MareMediator>().Publish(new SwitchToIntroUiMessage());
return;
}
_periodicFileScanner.StartScan();
_serviceProvider.GetRequiredService<PeriodicFileScanner>().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<DalamudPluginInterface>();
pi.UiBuilder.Draw -= Draw;
pi.UiBuilder.OpenConfigUi -= OpenUi;
_serviceProvider.GetRequiredService<CommandManager>().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<DalamudUtil>();
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<TransientResourceManager>();
_playerManager = _serviceProvider.GetRequiredService<PlayerManager>();
_characterCacheManager = _serviceProvider.GetRequiredService<OnlinePlayerManager>();
_runtimeServiceServiceScope = _serviceProvider.CreateScope();
_runtimeServiceServiceScope.ServiceProvider.GetRequiredService<TransientResourceManager>();
_runtimeServiceServiceScope.ServiceProvider.GetRequiredService<PlayerManager>();
_runtimeServiceServiceScope.ServiceProvider.GetRequiredService<OnlinePlayerManager>();
}
catch (Exception ex)
{
@@ -237,8 +175,8 @@ public sealed class Plugin : IDalamudPlugin
private void Draw()
{
_windowSystem.Draw();
_fileDialogManager.Draw();
_serviceProvider.GetRequiredService<WindowSystem>().Draw();
_serviceProvider.GetRequiredService<FileDialogManager>().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<ServerConfigurationManager>();
var _apiController = _serviceProvider.GetRequiredService<ApiController>();
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<ApiController>().CreateConnections();
}
}
else if (string.Equals(splitArgs[0], "gpose", StringComparison.OrdinalIgnoreCase))
{
_gposeUi.Toggle();
_serviceProvider.GetRequiredService<GposeUi>().Toggle();
}
}
private void OpenUi()
{
if (_configurationService.Current.HasValidSetup())
_compactUi.Toggle();
if (_serviceProvider.GetRequiredService<ConfigurationService>().Current.HasValidSetup())
_serviceProvider.GetRequiredService<CompactUi>().Toggle();
else
_introUi.Toggle();
_serviceProvider.GetRequiredService<IntroUi>().Toggle();
}
}

View File

@@ -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<string, bool> 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<SwitchToMainUiMessage>(this, (_) => IsOpen = true);
_mediator.Subscribe<SwitchToIntroUiMessage>(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");

View File

@@ -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<GposeStartMessage>(this, (_) => StartGpose());
_mediator.Subscribe<GposeEndMessage>(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);
}

View File

@@ -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<SwitchToMainUiMessage>(this, (_) => IsOpen = false);
_mareMediator.Subscribe<SwitchToIntroUiMessage>(this, (_) => IsOpen = true);
_windowSystem.AddWindow(this);
}
@@ -239,7 +242,7 @@ internal class IntroUi : Window, IDisposable
}
else
{
SwitchToMainUi?.Invoke();
_mareMediator.Publish(new SwitchToMainUiMessage());
IsOpen = false;
}
}

View File

@@ -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<OpenSettingsUiMessage>(this, (_) => Toggle());
_mediator.Subscribe<SwitchToIntroUiMessage>(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();

View File

@@ -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<GposeStartMessage>(this, (_) => DalamudUtil_GposeStart());
_mediator.Subscribe<GposeEndMessage>(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;
}
}

View File

@@ -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<VoidDelegate>()).Cast<VoidDelegate>())
{
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<VoidDelegate>()).Cast<VoidDelegate>())
{
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;
}
}

View File

@@ -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<DalamudLoginMessage>(this, (_) => DalamudUtilOnLogIn());
_mediator.Subscribe<DalamudLogoutMessage>(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();