using Dalamud.Plugin; using Dalamud.Plugin.Ipc; using MareSynchronos.Services; using MareSynchronos.Services.Mediator; using Microsoft.Extensions.Logging; namespace MareSynchronos.Interop.Ipc; public sealed class IpcCallerOtherSync : DisposableMediatorSubscriberBase { private readonly ICallGateSubscriber> _lightlessHandledGameAddresses; private readonly ICallGateSubscriber> _snowcloakHandledGameAddresses; private readonly List _emptyList = []; private bool _lightlessLoaded; private bool _snowcloakLoaded; public IpcCallerOtherSync(ILogger logger, IDalamudPluginInterface pi, MareMediator mediator) : base(logger, mediator) { _lightlessHandledGameAddresses = pi.GetIpcSubscriber>("LightlessSync.GetHandledAddresses"); _snowcloakHandledGameAddresses = pi.GetIpcSubscriber>("SnowcloakSync.GetHandledAddresses"); _lightlessLoaded = PluginWatcherService.GetInitialPluginState(pi, "LightlessSync")?.IsLoaded ?? false; Mediator.SubscribeKeyed(this, "LightlessSync", (msg) => { _lightlessLoaded = msg.IsLoaded; }); _snowcloakLoaded = PluginWatcherService.GetInitialPluginState(pi, "SnowcloakSync")?.IsLoaded ?? false; Mediator.SubscribeKeyed(this, "SnowcloakSync", (msg) => { _snowcloakLoaded = msg.IsLoaded; }); } public bool APIAvailable { get; private set; } = false; // Must be called on framework thread public IReadOnlyList GetHandledGameAddresses() { if (!_lightlessLoaded && !_snowcloakLoaded) return _emptyList; try { return GetLightlessHandledGameAddresses().Concat(GetSnowcloakHandledGameAddresses()).ToList(); } catch { return _emptyList; } } private List GetLightlessHandledGameAddresses() { if (!_lightlessLoaded) return _emptyList; try { return _lightlessHandledGameAddresses.InvokeFunc(); } catch { return _emptyList; } } private List GetSnowcloakHandledGameAddresses() { if (!_snowcloakLoaded) return _emptyList; try { return _snowcloakHandledGameAddresses.InvokeFunc(); } catch { return _emptyList; } } }