using Dalamud.Plugin; using Dalamud.Plugin.Ipc; using Dalamud.Plugin.Services; namespace Glamourer.Api.Helpers; /// /// Specialized disposable Provider for Events. /// Will execute the unsubscriber action on dispose if any is provided. /// Can only be invoked and disposed. /// public sealed class EventProvider : IDisposable { private readonly IPluginLog _log; private ICallGateProvider? _provider; private Delegate? _unsubscriber; public EventProvider(IDalamudPluginInterface pi, string label, (Action Add, Action Del)? subscribe = null) { _unsubscriber = null; _log = PluginLogHelper.GetLog(pi); try { _provider = pi.GetIpcProvider(label); subscribe?.Add(Invoke); _unsubscriber = subscribe?.Del; } catch (Exception e) { _log.Error($"Error registering IPC Provider for {label}\n{e}"); _provider = null; } } public EventProvider(IDalamudPluginInterface pi, string label, Action add, Action del) { _unsubscriber = null; _log = PluginLogHelper.GetLog(pi); try { _provider = pi.GetIpcProvider(label); add(this); _unsubscriber = del; } catch (Exception e) { _log.Error($"Error registering IPC Provider for {label}\n{e}"); _provider = null; } } /// Invoke the event. public void Invoke() { try { _provider?.SendMessage(); } catch (Exception e) { _log.Error($"Exception thrown on IPC event:\n{e}"); } } public void Dispose() { switch (_unsubscriber) { case Action a: a(Invoke); break; case Action b: b(this); break; } _unsubscriber = null; _provider = null; GC.SuppressFinalize(this); } ~EventProvider() => Dispose(); } /// public sealed class EventProvider : IDisposable { private readonly IPluginLog _log; private ICallGateProvider? _provider; private Delegate? _unsubscriber; public EventProvider(IDalamudPluginInterface pi, string label, (Action> Add, Action> Del)? subscribe = null) { _unsubscriber = null; _log = PluginLogHelper.GetLog(pi); try { _provider = pi.GetIpcProvider(label); subscribe?.Add(Invoke); _unsubscriber = subscribe?.Del; } catch (Exception e) { _log.Error($"Error registering IPC Provider for {label}\n{e}"); _provider = null; } } public EventProvider(IDalamudPluginInterface pi, string label, Action> add, Action> del) { _unsubscriber = null; _log = PluginLogHelper.GetLog(pi); try { _provider = pi.GetIpcProvider(label); add(this); _unsubscriber = del; } catch (Exception e) { _log.Error($"Error registering IPC Provider for {label}\n{e}"); _provider = null; } } /// public void Invoke(T1 a) { try { _provider?.SendMessage(a); } catch (Exception e) { _log.Error($"Exception thrown on IPC event:\n{e}"); } } public void Dispose() { switch (_unsubscriber) { case Action> a: a(Invoke); break; case Action> b: b(this); break; } _unsubscriber = null; _provider = null; GC.SuppressFinalize(this); } ~EventProvider() => Dispose(); } /// public sealed class EventProvider : IDisposable { private readonly IPluginLog _log; private ICallGateProvider? _provider; private Delegate? _unsubscriber; public EventProvider(IDalamudPluginInterface pi, string label, (Action> Add, Action> Del)? subscribe = null) { _unsubscriber = null; _log = PluginLogHelper.GetLog(pi); try { _provider = pi.GetIpcProvider(label); subscribe?.Add(Invoke); _unsubscriber = subscribe?.Del; } catch (Exception e) { _log.Error($"Error registering IPC Provider for {label}\n{e}"); _provider = null; } } public EventProvider(IDalamudPluginInterface pi, string label, Action> add, Action> del) { _unsubscriber = null; _log = PluginLogHelper.GetLog(pi); try { _provider = pi.GetIpcProvider(label); add(this); _unsubscriber = del; } catch (Exception e) { _log.Error($"Error registering IPC Provider for {label}\n{e}"); _provider = null; } } /// public void Invoke(T1 a, T2 b) { try { _provider?.SendMessage(a, b); } catch (Exception e) { _log.Error($"Exception thrown on IPC event:\n{e}"); } } public void Dispose() { switch (_unsubscriber) { case Action> a: a(Invoke); break; case Action> b: b(this); break; } _unsubscriber = null; _provider = null; GC.SuppressFinalize(this); } ~EventProvider() => Dispose(); }