This commit is contained in:
2025-08-22 02:19:48 +01:00
commit a4c82452be
373 changed files with 52044 additions and 0 deletions

View File

@@ -0,0 +1,114 @@
using Dalamud.Plugin;
using Dalamud.Plugin.Ipc;
namespace Glamourer.Api.Helpers;
/// <summary>
/// Specialized subscriber only allowing to invoke actions.
/// </summary>
public class ActionSubscriber
{
private readonly ICallGateSubscriber<object?>? _subscriber;
/// <summary> Whether the subscriber could successfully be created. </summary>
public bool Valid
=> _subscriber != null;
protected ActionSubscriber(IDalamudPluginInterface pi, string label)
{
try
{
_subscriber = pi.GetIpcSubscriber<object?>(label);
}
catch (Exception e)
{
PluginLogHelper.WriteError(pi, $"Error registering IPC Subscriber for {label}\n{e}");
_subscriber = null;
}
}
/// <summary> Invoke the action. See the source of the subscriber for details.</summary>
protected void Invoke()
=> _subscriber?.InvokeAction();
}
/// <inheritdoc cref="ActionSubscriber"/>
public class ActionSubscriber<T1>
{
private readonly ICallGateSubscriber<T1, object?>? _subscriber;
/// <summary> Whether the subscriber could successfully be created. </summary>
public bool Valid
=> _subscriber != null;
protected ActionSubscriber(IDalamudPluginInterface pi, string label)
{
try
{
_subscriber = pi.GetIpcSubscriber<T1, object?>(label);
}
catch (Exception e)
{
PluginLogHelper.WriteError(pi, $"Error registering IPC Subscriber for {label}\n{e}");
_subscriber = null;
}
}
/// <summary> Invoke the action. See the source of the subscriber for details.</summary>
protected void Invoke(T1 a)
=> _subscriber?.InvokeAction(a);
}
/// <inheritdoc cref="ActionSubscriber"/>
public class ActionSubscriber<T1, T2>
{
private readonly ICallGateSubscriber<T1, T2, object?>? _subscriber;
/// <inheritdoc cref="ActionSubscriber{T1}.Valid"/>
public bool Valid
=> _subscriber != null;
protected ActionSubscriber(IDalamudPluginInterface pi, string label)
{
try
{
_subscriber = pi.GetIpcSubscriber<T1, T2, object?>(label);
}
catch (Exception e)
{
PluginLogHelper.WriteError(pi, $"Error registering IPC Subscriber for {label}\n{e}");
_subscriber = null;
}
}
/// <inheritdoc cref="ActionSubscriber.Invoke"/>
protected void Invoke(T1 a, T2 b)
=> _subscriber?.InvokeAction(a, b);
}
/// <inheritdoc cref="ActionSubscriber"/>
public class ActionSubscriber<T1, T2, T3>
{
private readonly ICallGateSubscriber<T1, T2, T3, object?>? _subscriber;
/// <inheritdoc cref="ActionSubscriber{T1}.Valid"/>
public bool Valid
=> _subscriber != null;
protected ActionSubscriber(IDalamudPluginInterface pi, string label)
{
try
{
_subscriber = pi.GetIpcSubscriber<T1, T2, T3, object?>(label);
}
catch (Exception e)
{
PluginLogHelper.WriteError(pi, $"Error registering IPC Subscriber for {label}\n{e}");
_subscriber = null;
}
}
/// <inheritdoc cref="ActionSubscriber.Invoke"/>
protected void Invoke(T1 a, T2 b, T3 c)
=> _subscriber?.InvokeAction(a, b, c);
}

View File

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

View File

@@ -0,0 +1,394 @@
using Dalamud.Plugin;
using Dalamud.Plugin.Ipc;
using Dalamud.Plugin.Services;
namespace Glamourer.Api.Helpers;
/// <summary>
/// Specialized disposable Subscriber for Events.<para />
/// Subscriptions are wrapped to be individually exception-safe.<para/>
/// Can be enabled and disabled.<para/>
/// </summary>
public sealed class EventSubscriber : IDisposable
{
private readonly string _label;
private readonly IPluginLog _log;
private readonly Dictionary<Action, Action> _delegates = new();
private ICallGateSubscriber<object?>? _subscriber;
private bool _disabled;
public EventSubscriber(IDalamudPluginInterface pi, string label, params Action[] actions)
{
_label = label;
_log = PluginLogHelper.GetLog(pi);
try
{
_subscriber = pi.GetIpcSubscriber<object?>(label);
foreach (var action in actions)
Event += action;
_disabled = false;
}
catch (Exception e)
{
_log.Error($"Error registering IPC Subscriber for {label}\n{e}");
_subscriber = null;
}
}
/// <summary>
/// Enable all currently subscribed actions registered with this EventSubscriber.
/// Does nothing if it is already enabled.
/// </summary>
public void Enable()
{
if (_disabled && _subscriber != null)
{
foreach (var action in _delegates.Values)
_subscriber.Subscribe(action);
_disabled = false;
}
}
/// <summary>
/// Disable all subscribed actions registered with this EventSubscriber.
/// Does nothing if it is already disabled.
/// Does not forget the actions, only disables them.
/// </summary>
public void Disable()
{
if (!_disabled)
{
if (_subscriber != null)
foreach (var action in _delegates.Values)
_subscriber.Unsubscribe(action);
_disabled = true;
}
}
/// <summary>
/// Add or remove an action to the IPC event, if it is valid.
/// </summary>
public event Action Event
{
add
{
if (_subscriber != null && !_delegates.ContainsKey(value))
{
void Action()
{
try
{
value();
}
catch (Exception e)
{
_log.Error($"Exception invoking IPC event {_label}:\n{e}");
}
}
if (_delegates.TryAdd(value, Action) && !_disabled)
_subscriber.Subscribe(Action);
}
}
remove
{
if (_subscriber != null && _delegates.Remove(value, out var action))
_subscriber.Unsubscribe(action);
}
}
public void Dispose()
{
Disable();
_subscriber = null;
_delegates.Clear();
}
~EventSubscriber()
=> Dispose();
}
/// <summary><inheritdoc cref="EventSubscriber"/> </summary>
public sealed class EventSubscriber<T1> : IDisposable
{
private readonly string _label;
private readonly IPluginLog _log;
private readonly Dictionary<Action<T1>, Action<T1>> _delegates = new();
private ICallGateSubscriber<T1, object?>? _subscriber;
private bool _disabled;
public EventSubscriber(IDalamudPluginInterface pi, string label, params Action<T1>[] actions)
{
_label = label;
_log = PluginLogHelper.GetLog(pi);
try
{
_subscriber = pi.GetIpcSubscriber<T1, object?>(label);
foreach (var action in actions)
Event += action;
_disabled = false;
}
catch (Exception e)
{
_log.Error($"Error registering IPC Subscriber for {label}\n{e}");
_subscriber = null;
}
}
/// <summary><inheritdoc cref="EventSubscriber.Enable"/> </summary>
public void Enable()
{
if (_disabled && _subscriber != null)
{
foreach (var action in _delegates.Values)
_subscriber.Subscribe(action);
_disabled = false;
}
}
/// <summary><inheritdoc cref="EventSubscriber.Disable"/> </summary>
public void Disable()
{
if (!_disabled)
{
if (_subscriber != null)
foreach (var action in _delegates.Values)
_subscriber.Unsubscribe(action);
_disabled = true;
}
}
/// <summary><inheritdoc cref="EventSubscriber.Event"/> </summary>
public event Action<T1> Event
{
add
{
if (_subscriber != null && !_delegates.ContainsKey(value))
{
void Action(T1 a)
{
try
{
value(a);
}
catch (Exception e)
{
_log.Error($"Exception invoking IPC event {_label}:\n{e}");
}
}
if (_delegates.TryAdd(value, Action) && !_disabled)
_subscriber.Subscribe(Action);
}
}
remove
{
if (_subscriber != null && _delegates.Remove(value, out var action))
_subscriber.Unsubscribe(action);
}
}
public void Dispose()
{
Disable();
_subscriber = null;
_delegates.Clear();
}
~EventSubscriber()
=> Dispose();
}
/// <summary><inheritdoc cref="EventSubscriber"/> </summary>
public sealed class EventSubscriber<T1, T2> : IDisposable
{
private readonly string _label;
private readonly IPluginLog _log;
private readonly Dictionary<Action<T1, T2>, Action<T1, T2>> _delegates = new();
private ICallGateSubscriber<T1, T2, object?>? _subscriber;
private bool _disabled;
public EventSubscriber(IDalamudPluginInterface pi, string label, params Action<T1, T2>[] actions)
{
_label = label;
_log = PluginLogHelper.GetLog(pi);
try
{
_subscriber = pi.GetIpcSubscriber<T1, T2, object?>(label);
foreach (var action in actions)
Event += action;
_disabled = false;
}
catch (Exception e)
{
_log.Error($"Error registering IPC Subscriber for {label}\n{e}");
_subscriber = null;
}
}
/// <summary><inheritdoc cref="EventSubscriber.Enable"/> </summary>
public void Enable()
{
if (_disabled && _subscriber != null)
{
foreach (var action in _delegates.Values)
_subscriber.Subscribe(action);
_disabled = false;
}
}
/// <summary><inheritdoc cref="EventSubscriber.Disable"/> </summary>
public void Disable()
{
if (!_disabled)
{
if (_subscriber != null)
foreach (var action in _delegates.Values)
_subscriber.Unsubscribe(action);
_disabled = true;
}
}
/// <summary><inheritdoc cref="EventSubscriber.Event"/> </summary>
public event Action<T1, T2> Event
{
add
{
if (_subscriber != null && !_delegates.ContainsKey(value))
{
void Action(T1 a, T2 b)
{
try
{
value(a, b);
}
catch (Exception e)
{
_log.Error($"Exception invoking IPC event {_label}:\n{e}");
}
}
if (_delegates.TryAdd(value, Action) && !_disabled)
_subscriber.Subscribe(Action);
}
}
remove
{
if (_subscriber != null && _delegates.Remove(value, out var action))
_subscriber.Unsubscribe(action);
}
}
public void Dispose()
{
Disable();
_subscriber = null;
_delegates.Clear();
}
~EventSubscriber()
=> Dispose();
}
/// <summary><inheritdoc cref="EventSubscriber"/> </summary>
public sealed class EventSubscriber<T1, T2, T3> : IDisposable
{
private readonly string _label;
private readonly IPluginLog _log;
private readonly Dictionary<Action<T1, T2, T3>, Action<T1, T2, T3>> _delegates = new();
private ICallGateSubscriber<T1, T2, T3, object?>? _subscriber;
private bool _disabled;
public EventSubscriber(IDalamudPluginInterface pi, string label, params Action<T1, T2, T3>[] actions)
{
_label = label;
_log = PluginLogHelper.GetLog(pi);
try
{
_subscriber = pi.GetIpcSubscriber<T1, T2, T3, object?>(label);
foreach (var action in actions)
Event += action;
_disabled = false;
}
catch (Exception e)
{
_log.Error($"Error registering IPC Subscriber for {label}\n{e}");
_subscriber = null;
}
}
/// <summary><inheritdoc cref="EventSubscriber.Enable"/> </summary>
public void Enable()
{
if (_disabled && _subscriber != null)
{
foreach (var action in _delegates.Values)
_subscriber.Subscribe(action);
_disabled = false;
}
}
/// <summary><inheritdoc cref="EventSubscriber.Disable"/> </summary>
public void Disable()
{
if (!_disabled)
{
if (_subscriber != null)
foreach (var action in _delegates.Values)
_subscriber.Unsubscribe(action);
_disabled = true;
}
}
/// <summary><inheritdoc cref="EventSubscriber.Event"/> </summary>
public event Action<T1, T2, T3> Event
{
add
{
if (_subscriber != null && !_delegates.ContainsKey(value))
{
void Action(T1 a, T2 b, T3 c)
{
try
{
value(a, b, c);
}
catch (Exception e)
{
_log.Error($"Exception invoking IPC event {_label}:\n{e}");
}
}
if (_delegates.TryAdd(value, Action) && !_disabled)
_subscriber.Subscribe(Action);
}
}
remove
{
if (_subscriber != null && _delegates.Remove(value, out var action))
_subscriber.Unsubscribe(action);
}
}
public void Dispose()
{
Disable();
_subscriber = null;
_delegates.Clear();
}
~EventSubscriber()
=> Dispose();
}

View File

@@ -0,0 +1,224 @@
using Dalamud.Plugin;
using Dalamud.Plugin.Ipc;
namespace Glamourer.Api.Helpers;
/// <summary>
/// Specialized disposable Provider for Funcs.
/// </summary>
public sealed class FuncProvider<TRet> : IDisposable
{
private ICallGateProvider<TRet>? _provider;
public FuncProvider(IDalamudPluginInterface pi, string label, Func<TRet> func)
{
try
{
_provider = pi.GetIpcProvider<TRet>(label);
}
catch (Exception e)
{
PluginLogHelper.WriteError(pi, $"Error registering IPC Provider for {label}\n{e}");
_provider = null;
}
_provider?.RegisterFunc(func);
}
public void Dispose()
{
_provider?.UnregisterFunc();
_provider = null;
GC.SuppressFinalize(this);
}
~FuncProvider()
=> Dispose();
}
/// <inheritdoc cref="FuncProvider{TRet}"/>
public sealed class FuncProvider<T1, TRet> : IDisposable
{
private ICallGateProvider<T1, TRet>? _provider;
public FuncProvider(IDalamudPluginInterface pi, string label, Func<T1, TRet> func)
{
try
{
_provider = pi.GetIpcProvider<T1, TRet>(label);
}
catch (Exception e)
{
PluginLogHelper.WriteError(pi, $"Error registering IPC Provider for {label}\n{e}");
_provider = null;
}
_provider?.RegisterFunc(func);
}
public void Dispose()
{
_provider?.UnregisterFunc();
_provider = null;
GC.SuppressFinalize(this);
}
~FuncProvider()
=> Dispose();
}
/// <inheritdoc cref="FuncProvider{TRet}"/>
public sealed class FuncProvider<T1, T2, TRet> : IDisposable
{
private ICallGateProvider<T1, T2, TRet>? _provider;
public FuncProvider(IDalamudPluginInterface pi, string label, Func<T1, T2, TRet> func)
{
try
{
_provider = pi.GetIpcProvider<T1, T2, TRet>(label);
}
catch (Exception e)
{
PluginLogHelper.WriteError(pi, $"Error registering IPC Provider for {label}\n{e}");
_provider = null;
}
_provider?.RegisterFunc(func);
}
public void Dispose()
{
_provider?.UnregisterFunc();
_provider = null;
GC.SuppressFinalize(this);
}
~FuncProvider()
=> Dispose();
}
/// <inheritdoc cref="FuncProvider{TRet}"/>
public sealed class FuncProvider<T1, T2, T3, TRet> : IDisposable
{
private ICallGateProvider<T1, T2, T3, TRet>? _provider;
public FuncProvider(IDalamudPluginInterface pi, string label, Func<T1, T2, T3, TRet> func)
{
try
{
_provider = pi.GetIpcProvider<T1, T2, T3, TRet>(label);
}
catch (Exception e)
{
PluginLogHelper.WriteError(pi, $"Error registering IPC Provider for {label}\n{e}");
_provider = null;
}
_provider?.RegisterFunc(func);
}
public void Dispose()
{
_provider?.UnregisterFunc();
_provider = null;
GC.SuppressFinalize(this);
}
~FuncProvider()
=> Dispose();
}
/// <inheritdoc cref="FuncProvider{TRet}"/>
public sealed class FuncProvider<T1, T2, T3, T4, TRet> : IDisposable
{
private ICallGateProvider<T1, T2, T3, T4, TRet>? _provider;
public FuncProvider(IDalamudPluginInterface pi, string label, Func<T1, T2, T3, T4, TRet> func)
{
try
{
_provider = pi.GetIpcProvider<T1, T2, T3, T4, TRet>(label);
}
catch (Exception e)
{
PluginLogHelper.WriteError(pi, $"Error registering IPC Provider for {label}\n{e}");
_provider = null;
}
_provider?.RegisterFunc(func);
}
public void Dispose()
{
_provider?.UnregisterFunc();
_provider = null;
GC.SuppressFinalize(this);
}
~FuncProvider()
=> Dispose();
}
/// <inheritdoc cref="FuncProvider{TRet}"/>
public sealed class FuncProvider<T1, T2, T3, T4, T5, TRet> : IDisposable
{
private ICallGateProvider<T1, T2, T3, T4, T5, TRet>? _provider;
public FuncProvider(IDalamudPluginInterface pi, string label, Func<T1, T2, T3, T4, T5, TRet> func)
{
try
{
_provider = pi.GetIpcProvider<T1, T2, T3, T4, T5, TRet>(label);
}
catch (Exception e)
{
PluginLogHelper.WriteError(pi, $"Error registering IPC Provider for {label}\n{e}");
_provider = null;
}
_provider?.RegisterFunc(func);
}
public void Dispose()
{
_provider?.UnregisterFunc();
_provider = null;
GC.SuppressFinalize(this);
}
~FuncProvider()
=> Dispose();
}
/// <inheritdoc cref="FuncProvider{TRet}"/>
public sealed class FuncProvider<T1, T2, T3, T4, T5, T6, TRet> : IDisposable
{
private ICallGateProvider<T1, T2, T3, T4, T5, T6, TRet>? _provider;
public FuncProvider(IDalamudPluginInterface pi, string label, Func<T1, T2, T3, T4, T5, T6, TRet> func)
{
try
{
_provider = pi.GetIpcProvider<T1, T2, T3, T4, T5, T6, TRet>(label);
}
catch (Exception e)
{
PluginLogHelper.WriteError(pi, $"Error registering IPC Provider for {label}\n{e}");
_provider = null;
}
_provider?.RegisterFunc(func);
}
public void Dispose()
{
_provider?.UnregisterFunc();
_provider = null;
GC.SuppressFinalize(this);
}
~FuncProvider()
=> Dispose();
}

View File

@@ -0,0 +1,217 @@
using Dalamud.Plugin;
using Dalamud.Plugin.Ipc;
using Dalamud.Plugin.Ipc.Exceptions;
namespace Glamourer.Api.Helpers;
/// <summary>
/// Specialized subscriber only allowing to invoke functions with a return.
/// </summary>
public class FuncSubscriber<TRet>
{
private readonly string _label;
private readonly ICallGateSubscriber<TRet>? _subscriber;
/// <summary> Whether the subscriber could successfully be created. </summary>
public bool Valid
=> _subscriber != null;
/// <inheritdoc cref="FuncSubscriber{TRet}"/>
protected FuncSubscriber(IDalamudPluginInterface pi, string label)
{
_label = label;
try
{
_subscriber = pi.GetIpcSubscriber<TRet>(label);
}
catch (Exception e)
{
PluginLogHelper.WriteError(pi, $"Error registering IPC Subscriber for {label}\n{e}");
_subscriber = null;
}
}
/// <summary> Invoke the function. See the source of the subscriber for details.</summary>
protected TRet Invoke()
=> _subscriber != null ? _subscriber.InvokeFunc() : throw new IpcNotReadyError(_label);
}
/// <inheritdoc cref="FuncSubscriber{TRet}"/>
public class FuncSubscriber<T1, TRet>
{
private readonly string _label;
private readonly ICallGateSubscriber<T1, TRet>? _subscriber;
/// <inheritdoc cref="FuncSubscriber{TRet}.Valid"/>
public bool Valid
=> _subscriber != null;
/// <inheritdoc cref="FuncSubscriber{TRet}"/>
protected FuncSubscriber(IDalamudPluginInterface pi, string label)
{
_label = label;
try
{
_subscriber = pi.GetIpcSubscriber<T1, TRet>(label);
}
catch (Exception e)
{
PluginLogHelper.WriteError(pi, $"Error registering IPC Subscriber for {label}\n{e}");
_subscriber = null;
}
}
/// <inheritdoc cref="FuncSubscriber{TRet}.Invoke"/>
protected TRet Invoke(T1 a)
=> _subscriber != null ? _subscriber.InvokeFunc(a) : throw new IpcNotReadyError(_label);
}
/// <inheritdoc cref="FuncSubscriber{TRet}"/>
public class FuncSubscriber<T1, T2, TRet>
{
private readonly string _label;
private readonly ICallGateSubscriber<T1, T2, TRet>? _subscriber;
/// <inheritdoc cref="FuncSubscriber{TRet}.Valid"/>
public bool Valid
=> _subscriber != null;
/// <inheritdoc cref="FuncSubscriber{TRet}"/>
protected FuncSubscriber(IDalamudPluginInterface pi, string label)
{
_label = label;
try
{
_subscriber = pi.GetIpcSubscriber<T1, T2, TRet>(label);
}
catch (Exception e)
{
PluginLogHelper.WriteError(pi, $"Error registering IPC Subscriber for {label}\n{e}");
_subscriber = null;
}
}
/// <inheritdoc cref="FuncSubscriber{TRet}.Invoke"/>
protected TRet Invoke(T1 a, T2 b)
=> _subscriber != null ? _subscriber.InvokeFunc(a, b) : throw new IpcNotReadyError(_label);
}
/// <inheritdoc cref="FuncSubscriber{TRet}"/>
public class FuncSubscriber<T1, T2, T3, TRet>
{
private readonly string _label;
private readonly ICallGateSubscriber<T1, T2, T3, TRet>? _subscriber;
/// <inheritdoc cref="FuncSubscriber{TRet}.Valid"/>
public bool Valid
=> _subscriber != null;
/// <inheritdoc cref="FuncSubscriber{TRet}"/>
protected FuncSubscriber(IDalamudPluginInterface pi, string label)
{
_label = label;
try
{
_subscriber = pi.GetIpcSubscriber<T1, T2, T3, TRet>(label);
}
catch (Exception e)
{
PluginLogHelper.WriteError(pi, $"Error registering IPC Subscriber for {label}\n{e}");
_subscriber = null;
}
}
/// <inheritdoc cref="FuncSubscriber{TRet}.Invoke"/>
protected TRet Invoke(T1 a, T2 b, T3 c)
=> _subscriber != null ? _subscriber.InvokeFunc(a, b, c) : throw new IpcNotReadyError(_label);
}
/// <inheritdoc cref="FuncSubscriber{TRet}"/>
public class FuncSubscriber<T1, T2, T3, T4, TRet>
{
private readonly string _label;
private readonly ICallGateSubscriber<T1, T2, T3, T4, TRet>? _subscriber;
/// <inheritdoc cref="FuncSubscriber{TRet}.Valid"/>
public bool Valid
=> _subscriber != null;
/// <inheritdoc cref="FuncSubscriber{TRet}"/>
protected FuncSubscriber(IDalamudPluginInterface pi, string label)
{
_label = label;
try
{
_subscriber = pi.GetIpcSubscriber<T1, T2, T3, T4, TRet>(label);
}
catch (Exception e)
{
PluginLogHelper.WriteError(pi, $"Error registering IPC Subscriber for {label}\n{e}");
_subscriber = null;
}
}
/// <inheritdoc cref="FuncSubscriber{TRet}.Invoke"/>
protected TRet Invoke(T1 a, T2 b, T3 c, T4 d)
=> _subscriber != null ? _subscriber.InvokeFunc(a, b, c, d) : throw new IpcNotReadyError(_label);
}
/// <inheritdoc cref="FuncSubscriber{TRet}"/>
public class FuncSubscriber<T1, T2, T3, T4, T5, TRet>
{
private readonly string _label;
private readonly ICallGateSubscriber<T1, T2, T3, T4, T5, TRet>? _subscriber;
/// <inheritdoc cref="FuncSubscriber{TRet}.Valid"/>
public bool Valid
=> _subscriber != null;
/// <inheritdoc cref="FuncSubscriber{TRet}"/>
protected FuncSubscriber(IDalamudPluginInterface pi, string label)
{
_label = label;
try
{
_subscriber = pi.GetIpcSubscriber<T1, T2, T3, T4, T5, TRet>(label);
}
catch (Exception e)
{
PluginLogHelper.WriteError(pi, $"Error registering IPC Subscriber for {label}\n{e}");
_subscriber = null;
}
}
/// <inheritdoc cref="FuncSubscriber{TRet}.Invoke"/>
protected TRet Invoke(T1 a, T2 b, T3 c, T4 d, T5 e)
=> _subscriber != null ? _subscriber.InvokeFunc(a, b, c, d, e) : throw new IpcNotReadyError(_label);
}
/// <inheritdoc cref="FuncSubscriber{TRet}"/>
public class FuncSubscriber<T1, T2, T3, T4, T5, T6, TRet>
{
private readonly string _label;
private readonly ICallGateSubscriber<T1, T2, T3, T4, T5, T6, TRet>? _subscriber;
/// <inheritdoc cref="FuncSubscriber{TRet}.Valid"/>
public bool Valid
=> _subscriber != null;
/// <inheritdoc cref="FuncSubscriber{TRet}"/>
protected FuncSubscriber(IDalamudPluginInterface pi, string label)
{
_label = label;
try
{
_subscriber = pi.GetIpcSubscriber<T1, T2, T3, T4, T5, T6, TRet>(label);
}
catch (Exception e)
{
PluginLogHelper.WriteError(pi, $"Error registering IPC Subscriber for {label}\n{e}");
_subscriber = null;
}
}
/// <inheritdoc cref="FuncSubscriber{TRet}.Invoke"/>
protected TRet Invoke(T1 a, T2 b, T3 c, T4 d, T5 e, T6 f)
=> _subscriber != null ? _subscriber.InvokeFunc(a, b, c, d, e, f) : throw new IpcNotReadyError(_label);
}

View File

@@ -0,0 +1,26 @@
using Dalamud.IoC;
using Dalamud.Plugin;
using Dalamud.Plugin.Services;
namespace Glamourer.Api.Helpers;
internal class PluginLogHelper
{
[PluginService]
private static IPluginLog? _log { get; set; }
private PluginLogHelper(IDalamudPluginInterface pi)
=> pi.Inject(this);
public static void WriteError(IDalamudPluginInterface pi, string errorMessage)
=> GetLog(pi).Error(errorMessage);
public static IPluginLog GetLog(IDalamudPluginInterface pi)
{
if (_log != null)
return _log;
_ = new PluginLogHelper(pi);
return _log!;
}
}