using Dalamud.Game.ClientState.Objects.SubKinds; using Dalamud.Plugin; using Dalamud.Plugin.Ipc; using LightlessSync.Interop.Ipc.Framework; using LightlessSync.Services; using LightlessSync.Services.Mediator; using Microsoft.Extensions.Logging; namespace LightlessSync.Interop.Ipc; public sealed class IpcCallerMoodles : IpcServiceBase { private static readonly IpcServiceDescriptor MoodlesDescriptor = new("Moodles", "Moodles", new Version(0, 0, 0, 0)); private readonly ICallGateSubscriber _moodlesApiVersion; private readonly ICallGateSubscriber _moodlesOnChange; private readonly ICallGateSubscriber _moodlesGetStatus; private readonly ICallGateSubscriber _moodlesSetStatus; private readonly ICallGateSubscriber _moodlesRevertStatus; private readonly ILogger _logger; private readonly DalamudUtilService _dalamudUtil; private readonly LightlessMediator _lightlessMediator; public IpcCallerMoodles(ILogger logger, IDalamudPluginInterface pi, DalamudUtilService dalamudUtil, LightlessMediator lightlessMediator) : base(logger, lightlessMediator, pi, MoodlesDescriptor) { _logger = logger; _dalamudUtil = dalamudUtil; _lightlessMediator = lightlessMediator; _moodlesApiVersion = pi.GetIpcSubscriber("Moodles.Version"); _moodlesOnChange = pi.GetIpcSubscriber("Moodles.StatusManagerModified"); _moodlesGetStatus = pi.GetIpcSubscriber("Moodles.GetStatusManagerByPtrV2"); _moodlesSetStatus = pi.GetIpcSubscriber("Moodles.SetStatusManagerByPtrV2"); _moodlesRevertStatus = pi.GetIpcSubscriber("Moodles.ClearStatusManagerByPtrV2"); _moodlesOnChange.Subscribe(OnMoodlesChange); CheckAPI(); } private void OnMoodlesChange(IPlayerCharacter character) { _lightlessMediator.Publish(new MoodlesMessage(character.Address)); } protected override void Dispose(bool disposing) { base.Dispose(disposing); if (!disposing) { return; } _moodlesOnChange.Unsubscribe(OnMoodlesChange); } public async Task GetStatusAsync(nint address) { if (!APIAvailable) return null; try { return await _dalamudUtil.RunOnFrameworkThread(() => _moodlesGetStatus.InvokeFunc(address)).ConfigureAwait(false); } catch (Exception e) { _logger.LogWarning(e, "Could not Get Moodles Status"); return null; } } public async Task SetStatusAsync(nint pointer, string status) { if (!APIAvailable) return; try { await _dalamudUtil.RunOnFrameworkThread(() => _moodlesSetStatus.InvokeAction(pointer, status)).ConfigureAwait(false); } catch (Exception e) { _logger.LogWarning(e, "Could not Set Moodles Status"); } } public async Task RevertStatusAsync(nint pointer) { if (!APIAvailable) return; try { await _dalamudUtil.RunOnFrameworkThread(() => _moodlesRevertStatus.InvokeAction(pointer)).ConfigureAwait(false); } catch (Exception e) { _logger.LogWarning(e, "Could not Set Moodles Status"); } } protected override IpcConnectionState EvaluateState() { var state = base.EvaluateState(); if (state != IpcConnectionState.Available) { return state; } try { return _moodlesApiVersion.InvokeFunc() == 3 ? IpcConnectionState.Available : IpcConnectionState.VersionMismatch; } catch (Exception ex) { _logger.LogDebug(ex, "Failed to query Moodles API version"); return IpcConnectionState.Error; } } }