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