From aaf24073f537c8afed1f876988ce3550dcaa8105 Mon Sep 17 00:00:00 2001 From: Loporrit <141286461+loporrit@users.noreply.github.com> Date: Sat, 9 Aug 2025 11:38:57 +0000 Subject: [PATCH] Fix PluginWatcher properly this time maybe --- .../Interop/Ipc/IpcCallerGlamourer.cs | 2 +- .../Interop/Ipc/IpcCallerPenumbra.cs | 2 +- MareSynchronos/Interop/Ipc/IpcProvider.cs | 2 +- MareSynchronos/Services/NoSnapService.cs | 4 +--- .../Services/PluginWatcherService.cs | 19 +++++++++++++++++++ 5 files changed, 23 insertions(+), 6 deletions(-) diff --git a/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs b/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs index 4d3739b..50d263f 100644 --- a/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs +++ b/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs @@ -48,7 +48,7 @@ public sealed class IpcCallerGlamourer : DisposableMediatorSubscriberBase, IIpcC _mareMediator = mareMediator; _redrawManager = redrawManager; - var plugin = pi.InstalledPlugins.FirstOrDefault(p => p.InternalName.Equals("Glamourer", StringComparison.Ordinal)); + var plugin = PluginWatcherService.GetInitialPluginState(pi, "Glamourer"); _pluginLoaded = plugin?.IsLoaded ?? false; _pluginVersion = plugin?.Version ?? new(0, 0, 0, 0); diff --git a/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs b/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs index 992989a..c0df819 100644 --- a/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs +++ b/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs @@ -84,7 +84,7 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa _penumbraGameObjectResourcePathResolved = GameObjectResourcePathResolved.Subscriber(pi, ResourceLoaded); - var plugin = pi.InstalledPlugins.FirstOrDefault(p => p.InternalName.Equals("Penumbra", StringComparison.Ordinal)); + var plugin = PluginWatcherService.GetInitialPluginState(pi, "Penumbra"); _pluginLoaded = plugin?.IsLoaded ?? false; _pluginVersion = plugin?.Version ?? new(0, 0, 0, 0); diff --git a/MareSynchronos/Interop/Ipc/IpcProvider.cs b/MareSynchronos/Interop/Ipc/IpcProvider.cs index 83b17e6..697e842 100644 --- a/MareSynchronos/Interop/Ipc/IpcProvider.cs +++ b/MareSynchronos/Interop/Ipc/IpcProvider.cs @@ -53,7 +53,7 @@ public class IpcProvider : IHostedService, IMediatorSubscriber _activeGameObjectHandlers.Remove(msg.GameObjectHandler); }); - _marePluginEnabled = pi.InstalledPlugins.Any(p => p.InternalName.Equals("MareSynchronos", StringComparison.Ordinal) && p.IsLoaded); + _marePluginEnabled = PluginWatcherService.GetInitialPluginState(pi, "MareSynchronos")?.IsLoaded ?? false; Mediator.SubscribeKeyed(this, "MareSynchronos", p => { _marePluginEnabled = p.IsLoaded; HandleMareImpersonation(); diff --git a/MareSynchronos/Services/NoSnapService.cs b/MareSynchronos/Services/NoSnapService.cs index 5daa903..7ba9472 100644 --- a/MareSynchronos/Services/NoSnapService.cs +++ b/MareSynchronos/Services/NoSnapService.cs @@ -182,9 +182,7 @@ public sealed class NoSnapService : IHostedService, IMediatorSubscriber foreach (var pluginName in _listOfPlugins.Keys) { - var plugin = _pluginInterface.InstalledPlugins.FirstOrDefault(p => p.InternalName.Equals(pluginName, StringComparison.Ordinal)); - if (plugin?.IsLoaded ?? false) - _listOfPlugins[pluginName] = true; + _listOfPlugins[pluginName] = PluginWatcherService.GetInitialPluginState(_pluginInterface, pluginName)?.IsLoaded ?? false; Mediator.SubscribeKeyed(this, pluginName, (msg) => { _listOfPlugins[pluginName] = msg.IsLoaded; diff --git a/MareSynchronos/Services/PluginWatcherService.cs b/MareSynchronos/Services/PluginWatcherService.cs index eda967a..4062352 100644 --- a/MareSynchronos/Services/PluginWatcherService.cs +++ b/MareSynchronos/Services/PluginWatcherService.cs @@ -88,6 +88,25 @@ public class PluginWatcherService : MediatorSubscriberBase Update(publish: false); } + public static PluginChangeMessage? GetInitialPluginState(IDalamudPluginInterface pi, string internalName) + { + try + { + var plugin = pi.InstalledPlugins.Where(p => p.InternalName.Equals(internalName, StringComparison.Ordinal)) + .OrderBy(p => (!p.IsLoaded, p.Version)) + .FirstOrDefault(); + + if (plugin == null) + return null; + + return new PluginChangeMessage(plugin.InternalName, plugin.Version, plugin.IsLoaded); + } + catch + { + return null; + } + } + private void Update(bool publish = true) { if (!ExposedPluginsEqual(_pluginInterface.InstalledPlugins, _prevInstalledPluginState))