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); }