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 System.Collections.Concurrent;
using MareSynchronos.Managers; using MareSynchronos.Managers;
using MareSynchronos.MareConfiguration; using MareSynchronos.MareConfiguration;
using MareSynchronos.Mediator;
using MareSynchronos.Utils; using MareSynchronos.Utils;
using MareSynchronos.WebAPI; using MareSynchronos.WebAPI;
@@ -13,10 +14,11 @@ public class PeriodicFileScanner : IDisposable
private readonly FileCacheManager _fileDbManager; private readonly FileCacheManager _fileDbManager;
private readonly ApiController _apiController; private readonly ApiController _apiController;
private readonly DalamudUtil _dalamudUtil; private readonly DalamudUtil _dalamudUtil;
private readonly MareMediator _mediator;
private CancellationTokenSource? _scanCancellationTokenSource; private CancellationTokenSource? _scanCancellationTokenSource;
private Task? _fileScannerTask = null; private Task? _fileScannerTask = null;
public ConcurrentDictionary<string, int> haltScanLocks = new(StringComparer.Ordinal); 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)); Logger.Verbose("Creating " + nameof(PeriodicFileScanner));
@@ -25,11 +27,14 @@ public class PeriodicFileScanner : IDisposable
_fileDbManager = fileDbManager; _fileDbManager = fileDbManager;
_apiController = apiController; _apiController = apiController;
_dalamudUtil = dalamudUtil; _dalamudUtil = dalamudUtil;
_mediator = mediator;
_ipcManager.PenumbraInitialized += StartScan; _ipcManager.PenumbraInitialized += StartScan;
_apiController.DownloadStarted += ApiHaltScan; _apiController.DownloadStarted += ApiHaltScan;
_apiController.DownloadFinished += ApiResumeScan; _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() private void ApiHaltScan()
@@ -104,8 +109,6 @@ public class PeriodicFileScanner : IDisposable
_ipcManager.PenumbraInitialized -= StartScan; _ipcManager.PenumbraInitialized -= StartScan;
_apiController.DownloadStarted -= ApiHaltScan; _apiController.DownloadStarted -= ApiHaltScan;
_apiController.DownloadFinished -= ApiResumeScan; _apiController.DownloadFinished -= ApiResumeScan;
_dalamudUtil.ZoneSwitchStart -= ZoneSwitchHaltScan;
_dalamudUtil.ZoneSwitchEnd -= ZoneSwitchResumeScan;
_scanCancellationTokenSource?.Cancel(); _scanCancellationTokenSource?.Cancel();
} }
@@ -201,9 +204,9 @@ public class PeriodicFileScanner : IDisposable
var scannedFiles = new ConcurrentDictionary<string, bool>(Directory.EnumerateFiles(penumbraDir!, "*.*", SearchOption.AllDirectories) var scannedFiles = new ConcurrentDictionary<string, bool>(Directory.EnumerateFiles(penumbraDir!, "*.*", SearchOption.AllDirectories)
.Select(s => s.ToLowerInvariant()) .Select(s => s.ToLowerInvariant())
.Where(f => ext.Any(e => f.EndsWith(e, StringComparison.OrdinalIgnoreCase)) .Where(f => ext.Any(e => f.EndsWith(e, StringComparison.OrdinalIgnoreCase))
&& !f.Contains(@"\bg\", StringComparison.OrdinalIgnoreCase) && !f.Contains(@"\bg\", StringComparison.OrdinalIgnoreCase)
&& !f.Contains(@"\bgcommon\", StringComparison.OrdinalIgnoreCase) && !f.Contains(@"\bgcommon\", StringComparison.OrdinalIgnoreCase)
&& !f.Contains(@"\ui\", StringComparison.OrdinalIgnoreCase)) && !f.Contains(@"\ui\", StringComparison.OrdinalIgnoreCase))
.Concat(Directory.EnumerateFiles(_configService.Current.CacheFolder, "*.*", SearchOption.TopDirectoryOnly) .Concat(Directory.EnumerateFiles(_configService.Current.CacheFolder, "*.*", SearchOption.TopDirectoryOnly)
.Where(f => new FileInfo(f).Name.Length == 40) .Where(f => new FileInfo(f).Name.Length == 40)

View File

@@ -8,10 +8,10 @@ using System.Text;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Api.Helpers; using Penumbra.Api.Helpers;
using MareSynchronos.Delegates; using MareSynchronos.Delegates;
using MareSynchronos.Mediator;
namespace MareSynchronos.Managers; namespace MareSynchronos.Managers;
public class IpcManager : IDisposable public class IpcManager : IDisposable
{ {
private readonly ICallGateSubscriber<int> _glamourerApiVersion; private readonly ICallGateSubscriber<int> _glamourerApiVersion;
@@ -58,12 +58,13 @@ public class IpcManager : IDisposable
private readonly ICallGateSubscriber<Character, string, object> _palettePlusPaletteChanged; private readonly ICallGateSubscriber<Character, string, object> _palettePlusPaletteChanged;
private readonly DalamudUtil _dalamudUtil; private readonly DalamudUtil _dalamudUtil;
private readonly MareMediator _mediator;
private bool _inGposeQueueMode = false; private bool _inGposeQueueMode = false;
private ConcurrentQueue<Action> ActionQueue => _inGposeQueueMode ? _gposeActionQueue : _normalQueue; private ConcurrentQueue<Action> ActionQueue => _inGposeQueueMode ? _gposeActionQueue : _normalQueue;
private readonly ConcurrentQueue<Action> _normalQueue = new(); private readonly ConcurrentQueue<Action> _normalQueue = new();
private readonly ConcurrentQueue<Action> _gposeActionQueue = 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)); Logger.Verbose("Creating " + nameof(IpcManager));
@@ -123,9 +124,10 @@ public class IpcManager : IDisposable
} }
_dalamudUtil = dalamudUtil; _dalamudUtil = dalamudUtil;
_dalamudUtil.FrameworkUpdate += HandleActionQueue; _mediator = mediator;
_dalamudUtil.GposeFrameworkUpdate += HandleGposeActionQueue; _mediator.Subscribe<FrameworkUpdateMessage>(this, (_) => HandleActionQueue());
_dalamudUtil.ZoneSwitchEnd += ClearActionQueue; _mediator.Subscribe<GposeFrameworkUpdateMessage>(this, (_) => HandleGposeActionQueue());
_mediator.Subscribe<ZoneSwitchEndMessage>(this, (_) => ClearActionQueue());
} }
private void HandleGposeActionQueue() private void HandleGposeActionQueue()
@@ -263,9 +265,6 @@ public class IpcManager : IDisposable
Logger.Verbose("Action queue clear or not, disposing"); Logger.Verbose("Action queue clear or not, disposing");
} }
_dalamudUtil.FrameworkUpdate -= HandleActionQueue;
_dalamudUtil.ZoneSwitchEnd -= ClearActionQueue;
_dalamudUtil.GposeFrameworkUpdate -= HandleGposeActionQueue;
ActionQueue.Clear(); ActionQueue.Clear();
_penumbraGameObjectResourcePathResolved.Dispose(); _penumbraGameObjectResourcePathResolved.Dispose();

View File

@@ -1,6 +1,7 @@
using MareSynchronos.API.Data; using MareSynchronos.API.Data;
using MareSynchronos.API.Dto.User; using MareSynchronos.API.Dto.User;
using MareSynchronos.FileCache; using MareSynchronos.FileCache;
using MareSynchronos.Mediator;
using MareSynchronos.Utils; using MareSynchronos.Utils;
using MareSynchronos.WebAPI; using MareSynchronos.WebAPI;
@@ -13,8 +14,9 @@ public class OnlinePlayerManager : IDisposable
private readonly PlayerManager _playerManager; private readonly PlayerManager _playerManager;
private readonly FileCacheManager _fileDbManager; private readonly FileCacheManager _fileDbManager;
private readonly PairManager _pairManager; 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)); Logger.Verbose("Creating " + nameof(OnlinePlayerManager));
@@ -23,11 +25,11 @@ public class OnlinePlayerManager : IDisposable
_playerManager = playerManager; _playerManager = playerManager;
_fileDbManager = fileDbManager; _fileDbManager = fileDbManager;
_pairManager = pairManager; _pairManager = pairManager;
_mediator = mediator;
_playerManager.PlayerHasChanged += PlayerManagerOnPlayerHasChanged; _playerManager.PlayerHasChanged += PlayerManagerOnPlayerHasChanged;
_dalamudUtil.LogIn += DalamudUtilOnLogIn; _mediator.Subscribe<DalamudLoginMessage>(this, (_) => DalamudUtilOnLogIn());
_dalamudUtil.LogOut += DalamudUtilOnLogOut; _mediator.Subscribe<DalamudLogoutMessage>(this, (_) => DalamudUtilOnLogOut());
if (_dalamudUtil.IsLoggedIn) if (_dalamudUtil.IsLoggedIn)
{ {
@@ -42,12 +44,12 @@ public class OnlinePlayerManager : IDisposable
private void DalamudUtilOnLogIn() private void DalamudUtilOnLogIn()
{ {
_dalamudUtil.DelayedFrameworkUpdate += FrameworkOnUpdate; _mediator.Subscribe<DelayedFrameworkUpdateMessage>(this, (_) => FrameworkOnUpdate());
} }
private void DalamudUtilOnLogOut() private void DalamudUtilOnLogOut()
{ {
_dalamudUtil.DelayedFrameworkUpdate -= FrameworkOnUpdate; _mediator.Unsubscribe<DelayedFrameworkUpdateMessage>(this);
} }
public void Dispose() public void Dispose()
@@ -55,9 +57,9 @@ public class OnlinePlayerManager : IDisposable
Logger.Verbose("Disposing " + nameof(OnlinePlayerManager)); Logger.Verbose("Disposing " + nameof(OnlinePlayerManager));
_playerManager.PlayerHasChanged -= PlayerManagerOnPlayerHasChanged; _playerManager.PlayerHasChanged -= PlayerManagerOnPlayerHasChanged;
_dalamudUtil.LogIn -= DalamudUtilOnLogIn; _mediator.Unsubscribe<DalamudLoginMessage>(this);
_dalamudUtil.LogOut -= DalamudUtilOnLogOut; _mediator.Unsubscribe<DalamudLogoutMessage>(this);
_dalamudUtil.DelayedFrameworkUpdate -= FrameworkOnUpdate; _mediator.Unsubscribe<DelayedFrameworkUpdateMessage>(this);
} }
private void FrameworkOnUpdate() private void FrameworkOnUpdate()

View File

@@ -8,6 +8,7 @@ using MareSynchronos.API.Dto.Group;
using MareSynchronos.API.Dto.User; using MareSynchronos.API.Dto.User;
using MareSynchronos.Factories; using MareSynchronos.Factories;
using MareSynchronos.MareConfiguration; using MareSynchronos.MareConfiguration;
using MareSynchronos.Mediator;
using MareSynchronos.Models; using MareSynchronos.Models;
using MareSynchronos.Utils; using MareSynchronos.Utils;
using MareSynchronos.WebAPI; using MareSynchronos.WebAPI;
@@ -24,16 +25,18 @@ public class PairManager : IDisposable
private readonly PairFactory _pairFactory; private readonly PairFactory _pairFactory;
private readonly UiBuilder _uiBuilder; private readonly UiBuilder _uiBuilder;
private readonly ConfigurationService _configurationService; 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; _cachedPlayerFactory = cachedPlayerFactory;
_dalamudUtil = dalamudUtil; _dalamudUtil = dalamudUtil;
_pairFactory = pairFactory; _pairFactory = pairFactory;
_uiBuilder = uiBuilder; _uiBuilder = uiBuilder;
_configurationService = configurationService; _configurationService = configurationService;
_dalamudUtil.ZoneSwitchStart += DalamudUtilOnZoneSwitched; _mediator = mediator;
_dalamudUtil.DelayedFrameworkUpdate += DalamudUtilOnDelayedFrameworkUpdate; _mediator.Subscribe<ZoneSwitchStartMessage>(this, (_) => DalamudUtilOnZoneSwitched());
_mediator.Subscribe<DelayedFrameworkUpdateMessage>(this, (_) => DalamudUtilOnDelayedFrameworkUpdate());
_directPairsInternal = DirectPairsLazy(); _directPairsInternal = DirectPairsLazy();
_groupPairsInternal = GroupPairsLazy(); _groupPairsInternal = GroupPairsLazy();
} }
@@ -137,8 +140,6 @@ public class PairManager : IDisposable
public void Dispose() public void Dispose()
{ {
_dalamudUtil.DelayedFrameworkUpdate -= DalamudUtilOnDelayedFrameworkUpdate;
_dalamudUtil.ZoneSwitchStart -= DalamudUtilOnZoneSwitched;
DisposePairs(); DisposePairs();
} }

View File

@@ -7,6 +7,7 @@ using MareSynchronos.FileCache;
using MareSynchronos.UI; using MareSynchronos.UI;
using MareSynchronos.API.Data.Enum; using MareSynchronos.API.Data.Enum;
using MareSynchronos.Delegates; using MareSynchronos.Delegates;
using MareSynchronos.Mediator;
#if DEBUG #if DEBUG
#endif #endif
@@ -21,6 +22,7 @@ public class PlayerManager : IDisposable
private readonly TransientResourceManager _transientResourceManager; private readonly TransientResourceManager _transientResourceManager;
private readonly PeriodicFileScanner _periodicFileScanner; private readonly PeriodicFileScanner _periodicFileScanner;
private readonly SettingsUi _settingsUi; private readonly SettingsUi _settingsUi;
private readonly MareMediator _mediator;
private readonly IpcManager _ipcManager; private readonly IpcManager _ipcManager;
public event CharacterDataDelegate? PlayerHasChanged; public event CharacterDataDelegate? PlayerHasChanged;
public API.Data.CharacterData? LastCreatedCharacterData { get; private set; } public API.Data.CharacterData? LastCreatedCharacterData { get; private set; }
@@ -34,7 +36,7 @@ public class PlayerManager : IDisposable
public unsafe PlayerManager(ApiController apiController, IpcManager ipcManager, public unsafe PlayerManager(ApiController apiController, IpcManager ipcManager,
CharacterDataFactory characterDataFactory, DalamudUtil dalamudUtil, TransientResourceManager transientResourceManager, CharacterDataFactory characterDataFactory, DalamudUtil dalamudUtil, TransientResourceManager transientResourceManager,
PeriodicFileScanner periodicFileScanner, SettingsUi settingsUi) PeriodicFileScanner periodicFileScanner, SettingsUi settingsUi, MareMediator mediator)
{ {
Logger.Verbose("Creating " + nameof(PlayerManager)); Logger.Verbose("Creating " + nameof(PlayerManager));
@@ -45,15 +47,16 @@ public class PlayerManager : IDisposable
_transientResourceManager = transientResourceManager; _transientResourceManager = transientResourceManager;
_periodicFileScanner = periodicFileScanner; _periodicFileScanner = periodicFileScanner;
_settingsUi = settingsUi; _settingsUi = settingsUi;
_mediator = mediator;
_apiController.Connected += ApiControllerOnConnected; _apiController.Connected += ApiControllerOnConnected;
_apiController.Disconnected += ApiController_Disconnected; _apiController.Disconnected += ApiController_Disconnected;
_transientResourceManager.TransientResourceLoaded += HandleTransientResourceLoad; _transientResourceManager.TransientResourceLoaded += HandleTransientResourceLoad;
_dalamudUtil.DelayedFrameworkUpdate += DalamudUtilOnDelayedFrameworkUpdate;
_ipcManager.HeelsOffsetChangeEvent += HeelsOffsetChanged; _ipcManager.HeelsOffsetChangeEvent += HeelsOffsetChanged;
_ipcManager.CustomizePlusScaleChange += CustomizePlusChanged; _ipcManager.CustomizePlusScaleChange += CustomizePlusChanged;
_ipcManager.PalettePlusPaletteChange += PalettePlusChanged; _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); Logger.Debug("Watching Player, ApiController is Connected: " + _apiController.IsConnected);
if (_apiController.IsConnected) if (_apiController.IsConnected)
@@ -134,12 +137,13 @@ public class PlayerManager : IDisposable
{ {
Logger.Verbose("Disposing " + nameof(PlayerManager)); Logger.Verbose("Disposing " + nameof(PlayerManager));
_mediator.Unsubscribe<DelayedFrameworkUpdateMessage>(this);
_mediator.Unsubscribe<FrameworkUpdateMessage>(this);
_apiController.Connected -= ApiControllerOnConnected; _apiController.Connected -= ApiControllerOnConnected;
_apiController.Disconnected -= ApiController_Disconnected; _apiController.Disconnected -= ApiController_Disconnected;
_ipcManager.PenumbraRedrawEvent -= IpcManager_PenumbraRedrawEvent; _ipcManager.PenumbraRedrawEvent -= IpcManager_PenumbraRedrawEvent;
_dalamudUtil.DelayedFrameworkUpdate -= DalamudUtilOnDelayedFrameworkUpdate;
_dalamudUtil.FrameworkUpdate -= DalamudUtilOnFrameworkUpdate;
_transientResourceManager.TransientResourceLoaded -= HandleTransientResourceLoad; _transientResourceManager.TransientResourceLoaded -= HandleTransientResourceLoad;

View File

@@ -2,6 +2,7 @@
using MareSynchronos.Delegates; using MareSynchronos.Delegates;
using MareSynchronos.Factories; using MareSynchronos.Factories;
using MareSynchronos.MareConfiguration; using MareSynchronos.MareConfiguration;
using MareSynchronos.Mediator;
using MareSynchronos.Models; using MareSynchronos.Models;
using MareSynchronos.Utils; using MareSynchronos.Utils;
using System.Collections.Concurrent; using System.Collections.Concurrent;
@@ -14,6 +15,8 @@ public class TransientResourceManager : IDisposable
private readonly IpcManager _ipcManager; private readonly IpcManager _ipcManager;
private readonly ConfigurationService _configurationService; private readonly ConfigurationService _configurationService;
private readonly DalamudUtil _dalamudUtil; private readonly DalamudUtil _dalamudUtil;
private readonly MareMediator _mediator;
public event DrawObjectDelegate? TransientResourceLoaded; public event DrawObjectDelegate? TransientResourceLoaded;
public IntPtr[] PlayerRelatedPointers = Array.Empty<IntPtr>(); public IntPtr[] PlayerRelatedPointers = Array.Empty<IntPtr>();
private readonly string[] _fileTypesToHandle = new[] { "tmb", "pap", "avfx", "atex", "sklb", "eid", "phyb", "scd", "skp", "shpk" }; 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<IntPtr, HashSet<string>> TransientResources { get; } = new();
private ConcurrentDictionary<ObjectKind, HashSet<FileReplacement>> SemiTransientResources { 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.PenumbraResourceLoadEvent += Manager_PenumbraResourceLoadEvent;
manager.PenumbraModSettingChanged += Manager_PenumbraModSettingChanged; manager.PenumbraModSettingChanged += Manager_PenumbraModSettingChanged;
_ipcManager = manager; _ipcManager = manager;
_configurationService = configurationService; _configurationService = configurationService;
_dalamudUtil = dalamudUtil; _dalamudUtil = dalamudUtil;
dalamudUtil.FrameworkUpdate += DalamudUtil_FrameworkUpdate; _mediator = mediator;
dalamudUtil.ClassJobChanged += DalamudUtil_ClassJobChanged; _mediator.Subscribe<FrameworkUpdateMessage>(this, (_) => DalamudUtil_FrameworkUpdate());
_mediator.Subscribe<ClassJobChangedMessage>(this, (_) => DalamudUtil_ClassJobChanged());
// migrate obsolete data to new format // migrate obsolete data to new format
if (File.Exists(PersistentDataCache)) if (File.Exists(PersistentDataCache))
{ {
@@ -248,9 +252,9 @@ public class TransientResourceManager : IDisposable
public void Dispose() public void Dispose()
{ {
_dalamudUtil.FrameworkUpdate -= DalamudUtil_FrameworkUpdate; _mediator.Unsubscribe<FrameworkUpdateMessage>(this);
_mediator.Unsubscribe<ClassJobChangedMessage>(this);
_ipcManager.PenumbraResourceLoadEvent -= Manager_PenumbraResourceLoadEvent; _ipcManager.PenumbraResourceLoadEvent -= Manager_PenumbraResourceLoadEvent;
_dalamudUtil.ClassJobChanged -= DalamudUtil_ClassJobChanged;
_ipcManager.PenumbraModSettingChanged -= Manager_PenumbraModSettingChanged; _ipcManager.PenumbraModSettingChanged -= Manager_PenumbraModSettingChanged;
TransientResources.Clear(); TransientResources.Clear();
SemiTransientResources.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.MareConfiguration;
using MareSynchronos.Mediator; using MareSynchronos.Mediator;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
namespace MareSynchronos; namespace MareSynchronos;
public sealed class Plugin : IDalamudPlugin public sealed class Plugin : IDalamudPlugin
{ {
private const string _commandName = "/mare"; private const string _commandName = "/mare";
private readonly ApiController _apiController; private IServiceScope? _runtimeServiceServiceScope;
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 readonly ServiceProvider _serviceProvider; private readonly ServiceProvider _serviceProvider;
@@ -57,9 +32,6 @@ public sealed class Plugin : IDalamudPlugin
Framework framework, ObjectTable objectTable, ClientState clientState, Condition condition, ChatGui chatGui) Framework framework, ObjectTable objectTable, ClientState clientState, Condition condition, ChatGui chatGui)
{ {
Logger.Debug("Launching " + Name); Logger.Debug("Launching " + Name);
_pluginInterface = pluginInterface;
_pluginInterface.UiBuilder.DisableGposeUiHide = true;
_commandManager = commandManager;
IServiceCollection collection = new ServiceCollection(); IServiceCollection collection = new ServiceCollection();
// inject dalamud stuff // inject dalamud stuff
@@ -71,6 +43,7 @@ public sealed class Plugin : IDalamudPlugin
collection.AddSingleton(clientState); collection.AddSingleton(clientState);
collection.AddSingleton(condition); collection.AddSingleton(condition);
collection.AddSingleton(chatGui); collection.AddSingleton(chatGui);
collection.AddSingleton(pluginInterface.UiBuilder);
collection.AddSingleton(new WindowSystem("MareSynchronos")); collection.AddSingleton(new WindowSystem("MareSynchronos"));
collection.AddSingleton<FileDialogManager>(); collection.AddSingleton<FileDialogManager>();
@@ -82,6 +55,8 @@ public sealed class Plugin : IDalamudPlugin
collection.AddSingleton<DalamudUtil>(); collection.AddSingleton<DalamudUtil>();
collection.AddSingleton<IpcManager>(); collection.AddSingleton<IpcManager>();
collection.AddSingleton<FileCacheManager>(); collection.AddSingleton<FileCacheManager>();
collection.AddSingleton<CachedPlayerFactory>();
collection.AddSingleton<PairFactory>();
collection.AddSingleton<ServerConfigurationManager>(); collection.AddSingleton<ServerConfigurationManager>();
collection.AddSingleton<PairManager>(); collection.AddSingleton<PairManager>();
collection.AddSingleton<ApiController>(); collection.AddSingleton<ApiController>();
@@ -94,44 +69,30 @@ public sealed class Plugin : IDalamudPlugin
collection.AddSingleton<CompactUi>(); collection.AddSingleton<CompactUi>();
collection.AddSingleton<GposeUi>(); collection.AddSingleton<GposeUi>();
collection.AddSingleton<IntroUi>(); collection.AddSingleton<IntroUi>();
collection.AddSingleton<DownloadUi>();
collection.AddTransient<TransientResourceManager>(); collection.AddScoped<TransientResourceManager>();
collection.AddTransient<CharacterDataFactory>(); collection.AddScoped<CharacterDataFactory>();
collection.AddTransient<PlayerManager>(); collection.AddScoped<PlayerManager>();
collection.AddTransient<OnlinePlayerManager>(); collection.AddScoped<OnlinePlayerManager>();
_serviceProvider = collection.BuildServiceProvider(new ServiceProviderOptions() { ValidateOnBuild = true, ValidateScopes = true }); _serviceProvider = collection.BuildServiceProvider(new ServiceProviderOptions() { ValidateOnBuild = true, ValidateScopes = true });
_serviceProvider.GetRequiredService<Dalamud.Localization>().SetupWithLangCode("en");
// those can be initialized outside of game login // those can be initialized outside of game login
_settingsUi.SwitchToIntroUi += () => _serviceProvider.GetRequiredService<Dalamud.Localization>().SetupWithLangCode("en");
{ _serviceProvider.GetRequiredService<DalamudPluginInterface>().UiBuilder.DisableGposeUiHide = true;
_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);
_dalamudUtil.LogIn += DalamudUtilOnLogIn; var mediator = _serviceProvider.GetRequiredService<MareMediator>();
_dalamudUtil.LogOut += DalamudUtilOnLogOut; mediator.Subscribe<SwitchToMainUiMessage>(this, (_) => ReLaunchCharacterManager());
mediator.Subscribe<DalamudLoginMessage>(this, (_) => DalamudUtilOnLogIn());
mediator.Subscribe<DalamudLogoutMessage>(this, (_) => DalamudUtilOnLogOut());
if (_dalamudUtil.IsLoggedIn) _serviceProvider.GetRequiredService<SettingsUi>();
{ _serviceProvider.GetRequiredService<CompactUi>();
DalamudUtilOnLogIn(); _serviceProvider.GetRequiredService<GposeUi>();
} _serviceProvider.GetRequiredService<IntroUi>();
_serviceProvider.GetRequiredService<DownloadUi>();
} }
public string Name => "Mare Synchronos"; public string Name => "Mare Synchronos";
@@ -140,33 +101,10 @@ public sealed class Plugin : IDalamudPlugin
{ {
Logger.Verbose("Disposing " + Name); Logger.Verbose("Disposing " + Name);
var services = _serviceProvider.GetServices<IDisposable>().ToList(); _serviceProvider.GetRequiredService<CommandManager>().RemoveHandler(_commandName);
services.ForEach(c => c.Dispose());
_apiController?.Dispose(); _runtimeServiceServiceScope?.Dispose();
_serviceProvider.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();
Logger.Debug("Shut down"); Logger.Debug("Shut down");
} }
@@ -176,47 +114,46 @@ public sealed class Plugin : IDalamudPlugin
{ {
Logger.Debug("Client login"); Logger.Debug("Client login");
_pluginInterface.UiBuilder.Draw += Draw; var pi = _serviceProvider.GetRequiredService<DalamudPluginInterface>();
_pluginInterface.UiBuilder.OpenConfigUi += OpenUi; pi.UiBuilder.Draw += Draw;
_commandManager.AddHandler(_commandName, new CommandInfo(OnCommand) pi.UiBuilder.OpenConfigUi += OpenUi;
_serviceProvider.GetRequiredService<CommandManager>().AddHandler(_commandName, new CommandInfo(OnCommand)
{ {
HelpMessage = "Opens the Mare Synchronos UI", 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; _serviceProvider.GetRequiredService<MareMediator>().Publish(new SwitchToIntroUiMessage());
_compactUi.IsOpen = false;
return; return;
} }
_periodicFileScanner.StartScan(); _serviceProvider.GetRequiredService<PeriodicFileScanner>().StartScan();
ReLaunchCharacterManager(); ReLaunchCharacterManager();
} }
private void DalamudUtilOnLogOut() private void DalamudUtilOnLogOut()
{ {
Logger.Debug("Client logout"); Logger.Debug("Client logout");
_characterCacheManager?.Dispose(); _runtimeServiceServiceScope?.Dispose();
_playerManager?.Dispose(); var pi = _serviceProvider.GetRequiredService<DalamudPluginInterface>();
_transientResourceManager?.Dispose(); pi.UiBuilder.Draw -= Draw;
_pluginInterface.UiBuilder.Draw -= Draw; pi.UiBuilder.OpenConfigUi -= OpenUi;
_pluginInterface.UiBuilder.OpenConfigUi -= OpenUi; _serviceProvider.GetRequiredService<CommandManager>().RemoveHandler(_commandName);
_commandManager.RemoveHandler(_commandName);
} }
public void ReLaunchCharacterManager() public void ReLaunchCharacterManager()
{ {
_characterCacheManager?.Dispose(); _runtimeServiceServiceScope?.Dispose();
_playerManager?.Dispose();
_transientResourceManager?.Dispose();
Task.Run(WaitForPlayerAndLaunchCharacterManager); Task.Run(WaitForPlayerAndLaunchCharacterManager);
} }
private async Task WaitForPlayerAndLaunchCharacterManager() private async Task WaitForPlayerAndLaunchCharacterManager()
{ {
while (!_dalamudUtil.IsPlayerPresent) var dalamudUtil = _serviceProvider.GetRequiredService<DalamudUtil>();
while (!dalamudUtil.IsPlayerPresent)
{ {
await Task.Delay(100).ConfigureAwait(false); await Task.Delay(100).ConfigureAwait(false);
} }
@@ -225,9 +162,10 @@ public sealed class Plugin : IDalamudPlugin
{ {
Logger.Debug("Launching Managers"); Logger.Debug("Launching Managers");
_transientResourceManager = _serviceProvider.GetRequiredService<TransientResourceManager>(); _runtimeServiceServiceScope = _serviceProvider.CreateScope();
_playerManager = _serviceProvider.GetRequiredService<PlayerManager>(); _runtimeServiceServiceScope.ServiceProvider.GetRequiredService<TransientResourceManager>();
_characterCacheManager = _serviceProvider.GetRequiredService<OnlinePlayerManager>(); _runtimeServiceServiceScope.ServiceProvider.GetRequiredService<PlayerManager>();
_runtimeServiceServiceScope.ServiceProvider.GetRequiredService<OnlinePlayerManager>();
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -237,8 +175,8 @@ public sealed class Plugin : IDalamudPlugin
private void Draw() private void Draw()
{ {
_windowSystem.Draw(); _serviceProvider.GetRequiredService<WindowSystem>().Draw();
_fileDialogManager.Draw(); _serviceProvider.GetRequiredService<FileDialogManager>().Draw();
} }
private void OnCommand(string command, string args) private void OnCommand(string command, string args)
@@ -254,6 +192,8 @@ public sealed class Plugin : IDalamudPlugin
if (string.Equals(splitArgs[0], "toggle", StringComparison.OrdinalIgnoreCase)) if (string.Equals(splitArgs[0], "toggle", StringComparison.OrdinalIgnoreCase))
{ {
var _serverConfigurationManager = _serviceProvider.GetRequiredService<ServerConfigurationManager>();
var _apiController = _serviceProvider.GetRequiredService<ApiController>();
if (_serverConfigurationManager.CurrentServer == null) return; if (_serverConfigurationManager.CurrentServer == null) return;
var fullPause = splitArgs.Length > 1 ? splitArgs[1] switch var fullPause = splitArgs.Length > 1 ? splitArgs[1] switch
{ {
@@ -266,20 +206,21 @@ public sealed class Plugin : IDalamudPlugin
{ {
_serverConfigurationManager.CurrentServer.FullPause = fullPause; _serverConfigurationManager.CurrentServer.FullPause = fullPause;
_serverConfigurationManager.Save(); _serverConfigurationManager.Save();
_ = _apiController.CreateConnections(); _ = _serviceProvider.GetRequiredService<ApiController>().CreateConnections();
} }
} }
else if (string.Equals(splitArgs[0], "gpose", StringComparison.OrdinalIgnoreCase)) else if (string.Equals(splitArgs[0], "gpose", StringComparison.OrdinalIgnoreCase))
{ {
_gposeUi.Toggle(); _serviceProvider.GetRequiredService<GposeUi>().Toggle();
} }
} }
private void OpenUi() private void OpenUi()
{ {
if (_configurationService.Current.HasValidSetup())
_compactUi.Toggle(); if (_serviceProvider.GetRequiredService<ConfigurationService>().Current.HasValidSetup())
_serviceProvider.GetRequiredService<CompactUi>().Toggle();
else else
_introUi.Toggle(); _serviceProvider.GetRequiredService<IntroUi>().Toggle();
} }
} }

View File

@@ -13,6 +13,7 @@ using MareSynchronos.API.Dto.User;
using MareSynchronos.Delegates; using MareSynchronos.Delegates;
using MareSynchronos.Managers; using MareSynchronos.Managers;
using MareSynchronos.MareConfiguration; using MareSynchronos.MareConfiguration;
using MareSynchronos.Mediator;
using MareSynchronos.Models; using MareSynchronos.Models;
using MareSynchronos.UI.Components; using MareSynchronos.UI.Components;
using MareSynchronos.UI.Handlers; using MareSynchronos.UI.Handlers;
@@ -26,6 +27,7 @@ public class CompactUi : Window, IDisposable
private readonly ApiController _apiController; private readonly ApiController _apiController;
private readonly PairManager _pairManager; private readonly PairManager _pairManager;
private readonly ServerConfigurationManager _serverManager; private readonly ServerConfigurationManager _serverManager;
private readonly MareMediator _mediator;
private readonly ConfigurationService _configService; private readonly ConfigurationService _configService;
private readonly TagHandler _tagHandler; private readonly TagHandler _tagHandler;
public readonly Dictionary<string, bool> ShowUidForEntry = new(StringComparer.Ordinal); public readonly Dictionary<string, bool> ShowUidForEntry = new(StringComparer.Ordinal);
@@ -57,7 +59,7 @@ public class CompactUi : Window, IDisposable
public CompactUi(WindowSystem windowSystem, public CompactUi(WindowSystem windowSystem,
UiShared uiShared, ConfigurationService configService, ApiController apiController, PairManager pairManager, UiShared uiShared, ConfigurationService configService, ApiController apiController, PairManager pairManager,
ServerConfigurationManager serverManager) : base("###MareSynchronosMainUI") ServerConfigurationManager serverManager, MareMediator mediator) : base("###MareSynchronosMainUI")
{ {
#if DEBUG #if DEBUG
@@ -88,6 +90,7 @@ public class CompactUi : Window, IDisposable
_apiController = apiController; _apiController = apiController;
_pairManager = pairManager; _pairManager = pairManager;
_serverManager = serverManager; _serverManager = serverManager;
_mediator = mediator;
_tagHandler = new(_serverManager); _tagHandler = new(_serverManager);
_groupPanel = new(this, uiShared, _pairManager, _serverManager, _configService); _groupPanel = new(this, uiShared, _pairManager, _serverManager, _configService);
@@ -95,6 +98,9 @@ public class CompactUi : Window, IDisposable
_selectPairsForGroupUi = new(_tagHandler); _selectPairsForGroupUi = new(_tagHandler);
_pairGroupsUi = new(_tagHandler, DrawPairedClient, apiController, _selectPairsForGroupUi); _pairGroupsUi = new(_tagHandler, DrawPairedClient, apiController, _selectPairsForGroupUi);
_mediator.Subscribe<SwitchToMainUiMessage>(this, (_) => IsOpen = true);
_mediator.Subscribe<SwitchToIntroUiMessage>(this, (_) => IsOpen = false);
_uiShared.GposeStart += UiShared_GposeStart; _uiShared.GposeStart += UiShared_GposeStart;
_uiShared.GposeEnd += UiShared_GposeEnd; _uiShared.GposeEnd += UiShared_GposeEnd;
@@ -118,7 +124,6 @@ public class CompactUi : Window, IDisposable
IsOpen = false; IsOpen = false;
} }
public event VoidDelegate? OpenSettingsUi;
public void Dispose() public void Dispose()
{ {
Logger.Verbose("Disposing " + nameof(CompactUi)); Logger.Verbose("Disposing " + nameof(CompactUi));
@@ -700,7 +705,7 @@ public class CompactUi : Window, IDisposable
ImGui.SetCursorPosY(originalPos.Y + uidTextSize.Y / 2 - buttonSize.Y / 2); ImGui.SetCursorPosY(originalPos.Y + uidTextSize.Y / 2 - buttonSize.Y / 2);
if (ImGuiComponents.IconButton(FontAwesomeIcon.Cog)) if (ImGuiComponents.IconButton(FontAwesomeIcon.Cog))
{ {
OpenSettingsUi?.Invoke(); _mediator.Publish(new OpenSettingsUiMessage());
} }
UiShared.AttachToolTip("Open the Mare Synchronos Settings"); UiShared.AttachToolTip("Open the Mare Synchronos Settings");

View File

@@ -5,6 +5,7 @@ using Dalamud.Interface.Windowing;
using ImGuiNET; using ImGuiNET;
using MareSynchronos.Export; using MareSynchronos.Export;
using MareSynchronos.MareConfiguration; using MareSynchronos.MareConfiguration;
using MareSynchronos.Mediator;
using MareSynchronos.Utils; using MareSynchronos.Utils;
namespace MareSynchronos.UI; namespace MareSynchronos.UI;
@@ -16,17 +17,20 @@ public class GposeUi : Window, IDisposable
private readonly DalamudUtil _dalamudUtil; private readonly DalamudUtil _dalamudUtil;
private readonly FileDialogManager _fileDialogManager; private readonly FileDialogManager _fileDialogManager;
private readonly ConfigurationService _configService; private readonly ConfigurationService _configService;
private readonly MareMediator _mediator;
public GposeUi(WindowSystem windowSystem, MareCharaFileManager mareCharaFileManager, 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; _windowSystem = windowSystem;
_mareCharaFileManager = mareCharaFileManager; _mareCharaFileManager = mareCharaFileManager;
_dalamudUtil = dalamudUtil; _dalamudUtil = dalamudUtil;
_fileDialogManager = fileDialogManager; _fileDialogManager = fileDialogManager;
_configService = configService; _configService = configService;
_dalamudUtil.GposeStart += StartGpose; _mediator = mediator;
_dalamudUtil.GposeEnd += EndGpose; _mediator.Subscribe<GposeStartMessage>(this, (_) => StartGpose());
_mediator.Subscribe<GposeEndMessage>(this, (_) => EndGpose());
IsOpen = _dalamudUtil.IsInGpose; IsOpen = _dalamudUtil.IsInGpose;
Flags = ImGuiWindowFlags.AlwaysAutoResize; Flags = ImGuiWindowFlags.AlwaysAutoResize;
_windowSystem.AddWindow(this); _windowSystem.AddWindow(this);
@@ -45,8 +49,6 @@ public class GposeUi : Window, IDisposable
public void Dispose() public void Dispose()
{ {
_dalamudUtil.GposeStart -= StartGpose;
_dalamudUtil.GposeEnd -= EndGpose;
_windowSystem.RemoveWindow(this); _windowSystem.RemoveWindow(this);
} }

View File

@@ -9,7 +9,7 @@ using MareSynchronos.FileCache;
using Dalamud.Interface; using Dalamud.Interface;
using MareSynchronos.Managers; using MareSynchronos.Managers;
using MareSynchronos.MareConfiguration; using MareSynchronos.MareConfiguration;
using MareSynchronos.Delegates; using MareSynchronos.Mediator;
namespace MareSynchronos.UI; namespace MareSynchronos.UI;
@@ -19,11 +19,10 @@ internal class IntroUi : Window, IDisposable
private readonly ConfigurationService _configService; private readonly ConfigurationService _configService;
private readonly PeriodicFileScanner _fileCacheManager; private readonly PeriodicFileScanner _fileCacheManager;
private readonly ServerConfigurationManager _serverConfigurationManager; private readonly ServerConfigurationManager _serverConfigurationManager;
private readonly MareMediator _mareMediator;
private readonly WindowSystem _windowSystem; private readonly WindowSystem _windowSystem;
private bool _readFirstPage; private bool _readFirstPage;
public event VoidDelegate? SwitchToMainUi;
private string[]? _tosParagraphs; private string[]? _tosParagraphs;
private Task? _timeoutTask; private Task? _timeoutTask;
@@ -40,7 +39,7 @@ internal class IntroUi : Window, IDisposable
} }
public IntroUi(WindowSystem windowSystem, UiShared uiShared, ConfigurationService configService, 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)); Logger.Verbose("Creating " + nameof(IntroUi));
@@ -48,6 +47,7 @@ internal class IntroUi : Window, IDisposable
_configService = configService; _configService = configService;
_fileCacheManager = fileCacheManager; _fileCacheManager = fileCacheManager;
_serverConfigurationManager = serverConfigurationManager; _serverConfigurationManager = serverConfigurationManager;
_mareMediator = mareMediator;
_windowSystem = windowSystem; _windowSystem = windowSystem;
IsOpen = false; IsOpen = false;
@@ -59,6 +59,9 @@ internal class IntroUi : Window, IDisposable
GetToSLocalization(); GetToSLocalization();
_mareMediator.Subscribe<SwitchToMainUiMessage>(this, (_) => IsOpen = false);
_mareMediator.Subscribe<SwitchToIntroUiMessage>(this, (_) => IsOpen = true);
_windowSystem.AddWindow(this); _windowSystem.AddWindow(this);
} }
@@ -239,7 +242,7 @@ internal class IntroUi : Window, IDisposable
} }
else else
{ {
SwitchToMainUi?.Invoke(); _mareMediator.Publish(new SwitchToMainUiMessage());
IsOpen = false; IsOpen = false;
} }
} }

View File

@@ -13,7 +13,7 @@ using MareSynchronos.API.Data;
using MareSynchronos.Managers; using MareSynchronos.Managers;
using MareSynchronos.API.Data.Comparer; using MareSynchronos.API.Data.Comparer;
using MareSynchronos.MareConfiguration; using MareSynchronos.MareConfiguration;
using MareSynchronos.Delegates; using MareSynchronos.Mediator;
namespace MareSynchronos.UI; namespace MareSynchronos.UI;
@@ -25,10 +25,10 @@ public class SettingsUi : Window, IDisposable
private readonly MareCharaFileManager _mareCharaFileManager; private readonly MareCharaFileManager _mareCharaFileManager;
private readonly PairManager _pairManager; private readonly PairManager _pairManager;
private readonly ServerConfigurationManager _serverConfigurationManager; private readonly ServerConfigurationManager _serverConfigurationManager;
private readonly MareMediator _mediator;
private readonly UiShared _uiShared; private readonly UiShared _uiShared;
public CharacterData? LastCreatedCharacterData { private get; set; } public CharacterData? LastCreatedCharacterData { private get; set; }
public event VoidDelegate? SwitchToIntroUi;
private bool _overwriteExistingLabels = false; private bool _overwriteExistingLabels = false;
private bool? _notesSuccessfullyApplied = null; private bool? _notesSuccessfullyApplied = null;
private string _lastTab = string.Empty; private string _lastTab = string.Empty;
@@ -36,7 +36,8 @@ public class SettingsUi : Window, IDisposable
public SettingsUi(WindowSystem windowSystem, public SettingsUi(WindowSystem windowSystem,
UiShared uiShared, ConfigurationService configService, 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)); Logger.Verbose("Creating " + nameof(SettingsUi));
@@ -51,9 +52,12 @@ public class SettingsUi : Window, IDisposable
_mareCharaFileManager = mareCharaFileManager; _mareCharaFileManager = mareCharaFileManager;
_pairManager = pairManager; _pairManager = pairManager;
_serverConfigurationManager = serverConfigurationManager; _serverConfigurationManager = serverConfigurationManager;
_mediator = mediator;
_uiShared = uiShared; _uiShared = uiShared;
_mediator.Subscribe<OpenSettingsUiMessage>(this, (_) => Toggle());
_mediator.Subscribe<SwitchToIntroUiMessage>(this, (_) => IsOpen = false);
_uiShared.GposeStart += UiShared_GposeStart; _uiShared.GposeStart += UiShared_GposeStart;
_uiShared.GposeEnd += UiShared_GposeEnd; _uiShared.GposeEnd += UiShared_GposeEnd;
@@ -211,7 +215,7 @@ public class SettingsUi : Window, IDisposable
{ {
Task.Run(() => ApiController.UserDelete()); Task.Run(() => ApiController.UserDelete());
_deleteAccountPopupModalShown = false; _deleteAccountPopupModalShown = false;
SwitchToIntroUi?.Invoke(); _mediator.Publish(new SwitchToIntroUiMessage());
} }
ImGui.SameLine(); ImGui.SameLine();

View File

@@ -14,6 +14,7 @@ using MareSynchronos.FileCache;
using MareSynchronos.Localization; using MareSynchronos.Localization;
using MareSynchronos.Managers; using MareSynchronos.Managers;
using MareSynchronos.MareConfiguration; using MareSynchronos.MareConfiguration;
using MareSynchronos.Mediator;
using MareSynchronos.Models; using MareSynchronos.Models;
using MareSynchronos.Utils; using MareSynchronos.Utils;
using MareSynchronos.WebAPI; using MareSynchronos.WebAPI;
@@ -34,6 +35,7 @@ public partial class UiShared : IDisposable
private readonly DalamudPluginInterface _pluginInterface; private readonly DalamudPluginInterface _pluginInterface;
private readonly Dalamud.Localization _localization; private readonly Dalamud.Localization _localization;
private readonly ServerConfigurationManager _serverConfigurationManager; private readonly ServerConfigurationManager _serverConfigurationManager;
private readonly MareMediator _mediator;
public long FileCacheSize => _cacheScanner.FileCacheSize; public long FileCacheSize => _cacheScanner.FileCacheSize;
public string PlayerName => _dalamudUtil.PlayerName; public string PlayerName => _dalamudUtil.PlayerName;
@@ -57,7 +59,7 @@ public partial class UiShared : IDisposable
public UiShared(IpcManager ipcManager, ApiController apiController, PeriodicFileScanner cacheScanner, FileDialogManager fileDialogManager, public UiShared(IpcManager ipcManager, ApiController apiController, PeriodicFileScanner cacheScanner, FileDialogManager fileDialogManager,
ConfigurationService configService, DalamudUtil dalamudUtil, DalamudPluginInterface pluginInterface, Dalamud.Localization localization, ConfigurationService configService, DalamudUtil dalamudUtil, DalamudPluginInterface pluginInterface, Dalamud.Localization localization,
ServerConfigurationManager serverManager) ServerConfigurationManager serverManager, MareMediator mediator)
{ {
_ipcManager = ipcManager; _ipcManager = ipcManager;
_apiController = apiController; _apiController = apiController;
@@ -68,13 +70,14 @@ public partial class UiShared : IDisposable
_pluginInterface = pluginInterface; _pluginInterface = pluginInterface;
_localization = localization; _localization = localization;
_serverConfigurationManager = serverManager; _serverConfigurationManager = serverManager;
_mediator = mediator;
_isDirectoryWritable = IsDirectoryWritable(_configService.Current.CacheFolder); _isDirectoryWritable = IsDirectoryWritable(_configService.Current.CacheFolder);
_pluginInterface.UiBuilder.BuildFonts += BuildFont; _pluginInterface.UiBuilder.BuildFonts += BuildFont;
_pluginInterface.UiBuilder.RebuildFonts(); _pluginInterface.UiBuilder.RebuildFonts();
_dalamudUtil.GposeStart += DalamudUtil_GposeStart; _mediator.Subscribe<GposeStartMessage>(this, (_) => DalamudUtil_GposeStart());
_dalamudUtil.GposeEnd += DalamudUtil_GposeEnd; _mediator.Subscribe<GposeEndMessage>(this, (_) => DalamudUtil_GposeEnd());
} }
private void DalamudUtil_GposeEnd() private void DalamudUtil_GposeEnd()
@@ -673,7 +676,5 @@ public partial class UiShared : IDisposable
public void Dispose() public void Dispose()
{ {
_pluginInterface.UiBuilder.BuildFonts -= BuildFont; _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.Character;
using FFXIVClientStructs.FFXIV.Client.Game.Control; using FFXIVClientStructs.FFXIV.Client.Game.Control;
using Lumina.Excel.GeneratedSheets; using Lumina.Excel.GeneratedSheets;
using MareSynchronos.Delegates; using MareSynchronos.Mediator;
using GameObject = FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject; using GameObject = FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject;
namespace MareSynchronos.Utils; namespace MareSynchronos.Utils;
public class DalamudUtil : IDisposable public class DalamudUtil : IDisposable
{ {
private readonly ClientState _clientState; private readonly ClientState _clientState;
@@ -23,18 +21,9 @@ public class DalamudUtil : IDisposable
private readonly Dalamud.Game.ClientState.Conditions.Condition _condition; private readonly Dalamud.Game.ClientState.Conditions.Condition _condition;
private readonly ChatGui _chatGui; private readonly ChatGui _chatGui;
private readonly Dalamud.Data.DataManager _gameData; 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; 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 DateTime _delayedFrameworkUpdateCheck = DateTime.Now;
private bool _sentBetweenAreas = false; private bool _sentBetweenAreas = false;
public bool IsInGpose { get; private set; } = false; public bool IsInGpose { get; private set; } = false;
@@ -52,8 +41,9 @@ public class DalamudUtil : IDisposable
return false; return false;
} }
public DalamudUtil(ClientState clientState, ObjectTable objectTable, Framework framework, Dalamud.Game.ClientState.Conditions.Condition condition, ChatGui chatGui, public DalamudUtil(ClientState clientState, ObjectTable objectTable, Framework framework,
Dalamud.Data.DataManager gameData) Dalamud.Game.ClientState.Conditions.Condition condition, ChatGui chatGui,
Dalamud.Data.DataManager gameData, MareMediator mediator)
{ {
_clientState = clientState; _clientState = clientState;
_objectTable = objectTable; _objectTable = objectTable;
@@ -61,11 +51,11 @@ public class DalamudUtil : IDisposable
_condition = condition; _condition = condition;
_chatGui = chatGui; _chatGui = chatGui;
_gameData = gameData; _gameData = gameData;
_mediator = mediator;
_framework.Update += FrameworkOnUpdate; _framework.Update += FrameworkOnUpdate;
if (IsLoggedIn) if (IsLoggedIn)
{ {
_classJobId = _clientState.LocalPlayer!.ClassJob.Id; _classJobId = _clientState.LocalPlayer!.ClassJob.Id;
ClientStateOnLogin(sender: null, EventArgs.Empty);
} }
WorldData = new(() => WorldData = new(() =>
{ {
@@ -101,13 +91,13 @@ public class DalamudUtil : IDisposable
{ {
Logger.Debug("Gpose start"); Logger.Debug("Gpose start");
IsInGpose = true; IsInGpose = true;
GposeStart?.Invoke(); _mediator.Publish(new GposeStartMessage());
} }
else if (GposeTarget == null && IsInGpose) else if (GposeTarget == null && IsInGpose)
{ {
Logger.Debug("Gpose end"); Logger.Debug("Gpose end");
IsInGpose = false; IsInGpose = false;
GposeEnd?.Invoke(); _mediator.Publish(new GposeEndMessage());
} }
if (_condition[ConditionFlag.BetweenAreas] || _condition[ConditionFlag.BetweenAreas51] || IsInGpose) if (_condition[ConditionFlag.BetweenAreas] || _condition[ConditionFlag.BetweenAreas51] || IsInGpose)
@@ -116,10 +106,10 @@ public class DalamudUtil : IDisposable
{ {
Logger.Debug("Zone switch/Gpose start"); Logger.Debug("Zone switch/Gpose start");
_sentBetweenAreas = true; _sentBetweenAreas = true;
ZoneSwitchStart?.Invoke(); _mediator.Publish(new ZoneSwitchStartMessage());
} }
if (IsInGpose) GposeFrameworkUpdate?.Invoke(); if (IsInGpose) _mediator.Publish(new GposeFrameworkUpdateMessage());
return; return;
} }
@@ -128,21 +118,10 @@ public class DalamudUtil : IDisposable
{ {
Logger.Debug("Zone switch/Gpose end"); Logger.Debug("Zone switch/Gpose end");
_sentBetweenAreas = false; _sentBetweenAreas = false;
ZoneSwitchEnd?.Invoke(); _mediator.Publish(new ZoneSwitchEndMessage());
} }
foreach (VoidDelegate? frameworkInvocation in (FrameworkUpdate?.GetInvocationList() ?? Array.Empty<VoidDelegate>()).Cast<VoidDelegate>()) _mediator.Publish(new FrameworkUpdateMessage());
{
try
{
frameworkInvocation?.Invoke();
}
catch (Exception ex)
{
Logger.Warn(ex.Message);
Logger.Warn(ex.StackTrace ?? string.Empty);
}
}
if (DateTime.Now < _delayedFrameworkUpdateCheck.AddSeconds(1)) return; if (DateTime.Now < _delayedFrameworkUpdateCheck.AddSeconds(1)) return;
@@ -152,13 +131,13 @@ public class DalamudUtil : IDisposable
{ {
Logger.Debug("Logged in"); Logger.Debug("Logged in");
IsLoggedIn = true; IsLoggedIn = true;
LogIn?.Invoke(); _mediator.Publish(new DalamudLoginMessage());
} }
else if (localPlayer == null && IsLoggedIn) else if (localPlayer == null && IsLoggedIn)
{ {
Logger.Debug("Logged out"); Logger.Debug("Logged out");
IsLoggedIn = false; IsLoggedIn = false;
LogOut?.Invoke(); _mediator.Publish(new DalamudLogoutMessage());
} }
if (_clientState.LocalPlayer != null && _clientState.LocalPlayer.IsValid()) if (_clientState.LocalPlayer != null && _clientState.LocalPlayer.IsValid())
@@ -168,35 +147,15 @@ public class DalamudUtil : IDisposable
if (_classJobId != newclassJobId) if (_classJobId != newclassJobId)
{ {
_classJobId = newclassJobId; _classJobId = newclassJobId;
ClassJobChanged?.Invoke(); _mediator.Publish(new ClassJobChangedMessage());
} }
} }
foreach (VoidDelegate? frameworkInvocation in (DelayedFrameworkUpdate?.GetInvocationList() ?? Array.Empty<VoidDelegate>()).Cast<VoidDelegate>()) _mediator.Publish(new DelayedFrameworkUpdateMessage());
{
try
{
frameworkInvocation?.Invoke();
}
catch (Exception ex)
{
Logger.Warn(ex.Message);
Logger.Warn(ex.StackTrace ?? string.Empty);
}
}
_delayedFrameworkUpdateCheck = DateTime.Now; _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) public Dalamud.Game.ClientState.Objects.Types.GameObject? CreateGameObject(IntPtr reference)
{ {
return _objectTable.CreateObjectReference(reference); return _objectTable.CreateObjectReference(reference);
@@ -331,8 +290,6 @@ public class DalamudUtil : IDisposable
public void Dispose() public void Dispose()
{ {
_clientState.Login -= ClientStateOnLogin;
_clientState.Logout -= ClientStateOnLogout;
_framework.Update -= FrameworkOnUpdate; _framework.Update -= FrameworkOnUpdate;
} }
} }

View File

@@ -12,6 +12,7 @@ using MareSynchronos.Managers;
using Dalamud.Utility; using Dalamud.Utility;
using MareSynchronos.MareConfiguration; using MareSynchronos.MareConfiguration;
using MareSynchronos.Delegates; using MareSynchronos.Delegates;
using MareSynchronos.Mediator;
namespace MareSynchronos.WebAPI; namespace MareSynchronos.WebAPI;
public partial class ApiController : IDisposable, IMareHubClient public partial class ApiController : IDisposable, IMareHubClient
@@ -26,6 +27,7 @@ public partial class ApiController : IDisposable, IMareHubClient
private readonly FileCacheManager _fileDbManager; private readonly FileCacheManager _fileDbManager;
private readonly PairManager _pairManager; private readonly PairManager _pairManager;
private readonly ServerConfigurationManager _serverManager; private readonly ServerConfigurationManager _serverManager;
private readonly MareMediator _mediator;
private CancellationTokenSource _connectionCancellationTokenSource; private CancellationTokenSource _connectionCancellationTokenSource;
private HubConnection? _mareHub; private HubConnection? _mareHub;
@@ -43,7 +45,7 @@ public partial class ApiController : IDisposable, IMareHubClient
private HttpClient _httpClient; 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)); Logger.Verbose("Creating " + nameof(ApiController));
@@ -52,9 +54,11 @@ public partial class ApiController : IDisposable, IMareHubClient
_fileDbManager = fileDbManager; _fileDbManager = fileDbManager;
_pairManager = pairManager; _pairManager = pairManager;
_serverManager = serverManager; _serverManager = serverManager;
_mediator = mediator;
_connectionCancellationTokenSource = new CancellationTokenSource(); _connectionCancellationTokenSource = new CancellationTokenSource();
_dalamudUtil.LogIn += DalamudUtilOnLogIn;
_dalamudUtil.LogOut += DalamudUtilOnLogOut; _mediator.Subscribe<DalamudLoginMessage>(this, (_) => DalamudUtilOnLogIn());
_mediator.Subscribe<DalamudLogoutMessage>(this, (_) => DalamudUtilOnLogOut());
ServerState = ServerState.Offline; ServerState = ServerState.Offline;
_verifiedUploadedHashes = new(StringComparer.Ordinal); _verifiedUploadedHashes = new(StringComparer.Ordinal);
_httpClient = new(); _httpClient = new();
@@ -312,9 +316,6 @@ public partial class ApiController : IDisposable, IMareHubClient
{ {
Logger.Verbose("Disposing " + nameof(ApiController)); Logger.Verbose("Disposing " + nameof(ApiController));
_dalamudUtil.LogIn -= DalamudUtilOnLogIn;
_dalamudUtil.LogOut -= DalamudUtilOnLogOut;
ServerState = ServerState.Offline; ServerState = ServerState.Offline;
Task.Run(async () => await StopConnection(_connectionCancellationTokenSource.Token, ServerState.Disconnected).ConfigureAwait(false)); Task.Run(async () => await StopConnection(_connectionCancellationTokenSource.Token, ServerState.Disconnected).ConfigureAwait(false));
_connectionCancellationTokenSource?.Cancel(); _connectionCancellationTokenSource?.Cancel();