diff --git a/MareSynchronos/Interop/Ipc/IpcCallerMare.cs b/MareSynchronos/Interop/Ipc/IpcCallerMare.cs deleted file mode 100644 index ead5487..0000000 --- a/MareSynchronos/Interop/Ipc/IpcCallerMare.cs +++ /dev/null @@ -1,44 +0,0 @@ -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 IpcCallerMare : DisposableMediatorSubscriberBase -{ - private readonly ICallGateSubscriber> _mareHandledGameAddresses; - private readonly List _emptyList = []; - - private bool _pluginLoaded; - - public IpcCallerMare(ILogger logger, IDalamudPluginInterface pi, MareMediator mediator) : base(logger, mediator) - { - _mareHandledGameAddresses = pi.GetIpcSubscriber>("MareSynchronos.GetHandledAddresses"); - - _pluginLoaded = PluginWatcherService.GetInitialPluginState(pi, "MareSynchronos")?.IsLoaded ?? false; - - Mediator.SubscribeKeyed(this, "MareSynchronos", (msg) => - { - _pluginLoaded = msg.IsLoaded; - }); - } - - public bool APIAvailable { get; private set; } = false; - - // Must be called on framework thread - public IReadOnlyList GetHandledGameAddresses() - { - if (!_pluginLoaded) return _emptyList; - - try - { - return _mareHandledGameAddresses.InvokeFunc(); - } - catch - { - return _emptyList; - } - } -} diff --git a/MareSynchronos/Interop/Ipc/IpcCallerOtherSync.cs b/MareSynchronos/Interop/Ipc/IpcCallerOtherSync.cs new file mode 100644 index 0000000..ee998b9 --- /dev/null +++ b/MareSynchronos/Interop/Ipc/IpcCallerOtherSync.cs @@ -0,0 +1,83 @@ +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; + } + } +} diff --git a/MareSynchronos/Interop/Ipc/IpcProvider.cs b/MareSynchronos/Interop/Ipc/IpcProvider.cs index 5cd5fb7..bf7ddae 100644 --- a/MareSynchronos/Interop/Ipc/IpcProvider.cs +++ b/MareSynchronos/Interop/Ipc/IpcProvider.cs @@ -5,7 +5,6 @@ using MareSynchronos.MareConfiguration; using MareSynchronos.PlayerData.Handlers; using MareSynchronos.Services; using MareSynchronos.Services.Mediator; -using MareSynchronos.Utils; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; @@ -15,25 +14,12 @@ public class IpcProvider : IHostedService, IMediatorSubscriber { private readonly ILogger _logger; private readonly IDalamudPluginInterface _pi; - private readonly MareConfigService _mareConfig; private readonly CharaDataManager _charaDataManager; private ICallGateProvider? _loadFileProvider; private ICallGateProvider>? _loadFileAsyncProvider; private ICallGateProvider>? _handledGameAddresses; private readonly List _activeGameObjectHandlers = []; - private ICallGateProvider? _loadFileProviderMare; - private ICallGateProvider>? _loadFileAsyncProviderMare; - private ICallGateProvider>? _handledGameAddressesMare; - - private bool _marePluginEnabled = false; - private bool _impersonating = false; - private DateTime _unregisterTime = DateTime.UtcNow; - private CancellationTokenSource _registerDelayCts = new(); - - public bool MarePluginEnabled => _marePluginEnabled; - public bool ImpersonationActive => _impersonating; - public MareMediator Mediator { get; init; } public IpcProvider(ILogger logger, IDalamudPluginInterface pi, MareConfigService mareConfig, @@ -41,7 +27,6 @@ public class IpcProvider : IHostedService, IMediatorSubscriber { _logger = logger; _pi = pi; - _mareConfig = mareConfig; _charaDataManager = charaDataManager; Mediator = mareMediator; @@ -55,15 +40,6 @@ public class IpcProvider : IHostedService, IMediatorSubscriber if (msg.OwnedObject) return; _activeGameObjectHandlers.Remove(msg.GameObjectHandler); }); - - /* - _marePluginEnabled = PluginWatcherService.GetInitialPluginState(pi, "MareSynchronos")?.IsLoaded ?? false; - Mediator.SubscribeKeyed(this, "MareSynchronos", p => { - _marePluginEnabled = p.IsLoaded; - HandleMareImpersonation(automatic: true); - }); - */ - _marePluginEnabled = true; } public Task StartAsync(CancellationToken cancellationToken) @@ -76,72 +52,10 @@ public class IpcProvider : IHostedService, IMediatorSubscriber _handledGameAddresses = _pi.GetIpcProvider>("ClubPenguinSync.GetHandledAddresses"); _handledGameAddresses.RegisterFunc(GetHandledAddresses); - _loadFileProviderMare = _pi.GetIpcProvider("MareSynchronos.LoadMcdf"); - _loadFileAsyncProviderMare = _pi.GetIpcProvider>("MareSynchronos.LoadMcdfAsync"); - _handledGameAddressesMare = _pi.GetIpcProvider>("MareSynchronos.GetHandledAddresses"); - HandleMareImpersonation(automatic: true); - _logger.LogInformation("Started IpcProviderService"); return Task.CompletedTask; } - public void HandleMareImpersonation(bool automatic = false) - { - if (_marePluginEnabled) - { - if (_impersonating) - { - _loadFileProviderMare?.UnregisterFunc(); - _loadFileAsyncProviderMare?.UnregisterFunc(); - _handledGameAddressesMare?.UnregisterFunc(); - _impersonating = false; - _unregisterTime = DateTime.UtcNow; - _logger.LogDebug("Unregistered MareSynchronos API"); - } - } - else - { - if (_mareConfig.Current.MareAPI) - { - var cancelToken = _registerDelayCts.Token; - _ = Task.Run(async () => - { - // Wait before registering to reduce the chance of a race condition - if (automatic) - await Task.Delay(5000).ConfigureAwait(false); - - if (cancelToken.IsCancellationRequested) - return; - - if (_marePluginEnabled) - { - _logger.LogDebug("Not registering MareSynchronos API: Mare plugin is loaded"); - return; - } - - _loadFileProviderMare?.RegisterFunc(LoadMcdf); - _loadFileAsyncProviderMare?.RegisterFunc(LoadMcdfAsync); - _handledGameAddressesMare?.RegisterFunc(MareGetHandledAddresses); - _impersonating = true; - _logger.LogDebug("Registered MareSynchronos API"); - }, cancelToken); - } - else - { - _registerDelayCts = _registerDelayCts.CancelRecreate(); - if (_impersonating) - { - _loadFileProviderMare?.UnregisterFunc(); - _loadFileAsyncProviderMare?.UnregisterFunc(); - _handledGameAddressesMare?.UnregisterFunc(); - _impersonating = false; - _unregisterTime = DateTime.UtcNow; - _logger.LogDebug("Unregistered MareSynchronos API"); - } - } - } - } - public Task StopAsync(CancellationToken cancellationToken) { _logger.LogDebug("Stopping IpcProvider Service"); @@ -149,14 +63,6 @@ public class IpcProvider : IHostedService, IMediatorSubscriber _loadFileAsyncProvider?.UnregisterFunc(); _handledGameAddresses?.UnregisterFunc(); - _registerDelayCts.Cancel(); - if (_impersonating) - { - _loadFileProviderMare?.UnregisterFunc(); - _loadFileAsyncProviderMare?.UnregisterFunc(); - _handledGameAddressesMare?.UnregisterFunc(); - } - Mediator.UnsubscribeAll(this); return Task.CompletedTask; } @@ -186,19 +92,4 @@ public class IpcProvider : IHostedService, IMediatorSubscriber { return _activeGameObjectHandlers.Where(g => g.Address != nint.Zero).Select(g => g.Address).Distinct().ToList(); } - - private List MareGetHandledAddresses() - { - if (!_impersonating) - { - if ((DateTime.UtcNow - _unregisterTime).TotalSeconds >= 1.0) - { - _logger.LogWarning("GetHandledAddresses called when it should not be registered"); - _handledGameAddressesMare?.UnregisterFunc(); - } - return []; - } - - return GetHandledAddresses(); - } } diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index 417cc99..3d90a12 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -2,7 +2,7 @@ ClubPenguinSync - 1.7.0.8 + 1.7.1.0 https://github.com/Rawrington/ClubPenguinSync/ diff --git a/MareSynchronos/Plugin.cs b/MareSynchronos/Plugin.cs index 7b29d63..73ac8a9 100644 --- a/MareSynchronos/Plugin.cs +++ b/MareSynchronos/Plugin.cs @@ -178,7 +178,7 @@ public sealed class Plugin : IDalamudPlugin collection.AddSingleton(); collection.AddSingleton(); collection.AddSingleton(); - collection.AddSingleton(); + collection.AddSingleton(); collection.AddSingleton(); collection.AddSingleton(); diff --git a/MareSynchronos/Services/VisibilityService.cs b/MareSynchronos/Services/VisibilityService.cs index 3be2884..2b2cbfb 100644 --- a/MareSynchronos/Services/VisibilityService.cs +++ b/MareSynchronos/Services/VisibilityService.cs @@ -12,21 +12,21 @@ public class VisibilityService : DisposableMediatorSubscriberBase { NotVisible, Visible, - MareHandled + OtherSyncHandled }; private readonly DalamudUtilService _dalamudUtil; private readonly ConcurrentDictionary _trackedPlayerVisibility = new(StringComparer.Ordinal); private readonly List _makeVisibleNextFrame = new(); - private readonly IpcCallerMare _mare; - private readonly HashSet cachedMareAddresses = new(); + private readonly IpcCallerOtherSync _otherSync; + private readonly HashSet cachedOtherSyncAddresses = new(); private uint _cachedAddressSum = 0; private uint _cachedAddressSumDebounce = 1; - public VisibilityService(ILogger logger, MareMediator mediator, IpcCallerMare mare, DalamudUtilService dalamudUtil) + public VisibilityService(ILogger logger, MareMediator mediator, IpcCallerOtherSync otherSync, DalamudUtilService dalamudUtil) : base(logger, mediator) { - _mare = mare; + _otherSync = otherSync; _dalamudUtil = dalamudUtil; Mediator.Subscribe(this, (_) => FrameworkUpdate()); } @@ -44,19 +44,19 @@ public class VisibilityService : DisposableMediatorSubscriberBase private void FrameworkUpdate() { - var mareHandledAddresses = _mare.GetHandledGameAddresses(); + var otherSyncHandledAddresses = _otherSync.GetHandledGameAddresses(); uint addressSum = 0; - foreach (var addr in mareHandledAddresses) + foreach (var addr in otherSyncHandledAddresses) addressSum ^= (uint)addr.GetHashCode(); if (addressSum != _cachedAddressSum) { if (addressSum == _cachedAddressSumDebounce) { - cachedMareAddresses.Clear(); - foreach (var addr in mareHandledAddresses) - cachedMareAddresses.Add(addr); + cachedOtherSyncAddresses.Clear(); + foreach (var addr in otherSyncHandledAddresses) + cachedOtherSyncAddresses.Add(addr); _cachedAddressSum = addressSum; } else @@ -69,11 +69,11 @@ public class VisibilityService : DisposableMediatorSubscriberBase { string ident = player.Key; var findResult = _dalamudUtil.FindPlayerByNameHash(ident); - var isMareHandled = cachedMareAddresses.Contains(findResult.Address); - var isVisible = findResult.ObjectId != 0 && !isMareHandled; + var isOtherSyncHandled = cachedOtherSyncAddresses.Contains(findResult.Address); + var isVisible = findResult.ObjectId != 0 && !isOtherSyncHandled; - if (player.Value == TrackedPlayerStatus.MareHandled && !isMareHandled) - _trackedPlayerVisibility.TryUpdate(ident, newValue: TrackedPlayerStatus.NotVisible, comparisonValue: TrackedPlayerStatus.MareHandled); + if (player.Value == TrackedPlayerStatus.OtherSyncHandled && !isOtherSyncHandled) + _trackedPlayerVisibility.TryUpdate(ident, newValue: TrackedPlayerStatus.NotVisible, comparisonValue: TrackedPlayerStatus.OtherSyncHandled); if (player.Value == TrackedPlayerStatus.NotVisible && isVisible) { @@ -85,17 +85,17 @@ public class VisibilityService : DisposableMediatorSubscriberBase else _makeVisibleNextFrame.Add(ident); } - else if (player.Value == TrackedPlayerStatus.NotVisible && isMareHandled) + else if (player.Value == TrackedPlayerStatus.NotVisible && isOtherSyncHandled) { // Send a technically redundant visibility update with the added intent of triggering PairHandler to undo the application by name - if (_trackedPlayerVisibility.TryUpdate(ident, newValue: TrackedPlayerStatus.MareHandled, comparisonValue: TrackedPlayerStatus.NotVisible)) + if (_trackedPlayerVisibility.TryUpdate(ident, newValue: TrackedPlayerStatus.OtherSyncHandled, comparisonValue: TrackedPlayerStatus.NotVisible)) Mediator.Publish(new(ident, IsVisible: false, Invalidate: true)); } else if (player.Value == TrackedPlayerStatus.Visible && !isVisible) { - var newTrackedStatus = isMareHandled ? TrackedPlayerStatus.MareHandled : TrackedPlayerStatus.NotVisible; + var newTrackedStatus = isOtherSyncHandled ? TrackedPlayerStatus.OtherSyncHandled : TrackedPlayerStatus.NotVisible; if (_trackedPlayerVisibility.TryUpdate(ident, newValue: newTrackedStatus, comparisonValue: TrackedPlayerStatus.Visible)) - Mediator.Publish(new(ident, IsVisible: false, Invalidate: isMareHandled)); + Mediator.Publish(new(ident, IsVisible: false, Invalidate: isOtherSyncHandled)); } if (!isVisible) diff --git a/MareSynchronos/UI/SettingsUi.cs b/MareSynchronos/UI/SettingsUi.cs index 2891e2c..bd28345 100644 --- a/MareSynchronos/UI/SettingsUi.cs +++ b/MareSynchronos/UI/SettingsUi.cs @@ -585,43 +585,6 @@ public class SettingsUi : WindowMediatorSubscriberBase _uiShared.BigText("Advanced"); - bool mareApi = _configService.Current.MareAPI; - using (var disabled = ImRaii.Disabled(true)) - { - bool dummyFalse = false; - if (ImGui.Checkbox("Enable Mare Synchronos API", ref dummyFalse)) - { - _configService.Current.MareAPI = mareApi; - _configService.Save(); - _ipcProvider.HandleMareImpersonation(); - } - _uiShared.DrawHelpText("Enables handling of the Mare Synchronos API. This currently includes:\n\n" + - " - MCDF loading support for other plugins\n" + - " - Blocking Moodles applications to paired users\n\n" + - "If the Mare Synchronos plugin is loaded while this option is enabled, control of its API will be relinquished."); - } - - using (_ = ImRaii.PushIndent()) - { - ImGui.SameLine(300.0f * ImGuiHelpers.GlobalScale); - UiSharedService.ColorTextWrapped("Mare API impersonation is currently unavailable", ImGuiColors.DalamudGrey2); - /* - if (_ipcProvider.ImpersonationActive) - { - UiSharedService.ColorTextWrapped("Mare API active!", ImGuiColors.HealerGreen); - } - else - { - if (!mareApi) - UiSharedService.ColorTextWrapped("Mare API inactive: Option is disabled", ImGuiColors.DalamudYellow); - else if (_ipcProvider.MarePluginEnabled) - UiSharedService.ColorTextWrapped("Mare API inactive: Mare plugin is loaded", ImGuiColors.DalamudYellow); - else - UiSharedService.ColorTextWrapped("Mare API inactive: Unknown reason", ImGuiColors.DalamudRed); - } - */ - } - bool logEvents = _configService.Current.LogEvents; if (ImGui.Checkbox("Log Event Viewer data to disk", ref logEvents)) {