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