using Dalamud.Game.ClientState.Objects.SubKinds; 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 IpcCallerMoodles : IIpcCaller { 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 MareMediator _mareMediator; public IpcCallerMoodles(ILogger logger, IDalamudPluginInterface pi, DalamudUtilService dalamudUtil, MareMediator mareMediator) { _logger = logger; _dalamudUtil = dalamudUtil; _mareMediator = mareMediator; _moodlesApiVersion = pi.GetIpcSubscriber("Moodles.Version"); _moodlesOnChange = pi.GetIpcSubscriber("Moodles.StatusManagerModified"); _moodlesGetStatus = pi.GetIpcSubscriber("Moodles.GetStatusManagerByPtr"); _moodlesSetStatus = pi.GetIpcSubscriber("Moodles.SetStatusManagerByPtr"); _moodlesRevertStatus = pi.GetIpcSubscriber("Moodles.ClearStatusManagerByPtr"); _moodlesOnChange.Subscribe(OnMoodlesChange); CheckAPI(); } private void OnMoodlesChange(IPlayerCharacter character) { _mareMediator.Publish(new MoodlesMessage(character.Address)); } public bool APIAvailable { get; private set; } = false; public void CheckAPI() { try { APIAvailable = _moodlesApiVersion.InvokeFunc() == 1; } catch { APIAvailable = false; } } public void Dispose() { _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"); } } }