From 09295d4e613464eabf6c54d859ae9ded0b976354 Mon Sep 17 00:00:00 2001
From: goat <16760685+goaaats@users.noreply.github.com>
Date: Thu, 14 May 2020 21:50:04 +0200
Subject: [PATCH] feat: add plugin ipc
---
Dalamud/Interface/DalamudDataWindow.cs | 31 ++++++++++++++++--
Dalamud/Plugin/DalamudPluginInterface.cs | 40 ++++++++++++++++++++++++
Dalamud/Plugin/PluginManager.cs | 4 +++
3 files changed, 73 insertions(+), 2 deletions(-)
diff --git a/Dalamud/Interface/DalamudDataWindow.cs b/Dalamud/Interface/DalamudDataWindow.cs
index aefbe4e0b..3a1001418 100644
--- a/Dalamud/Interface/DalamudDataWindow.cs
+++ b/Dalamud/Interface/DalamudDataWindow.cs
@@ -1,11 +1,17 @@
using System;
+using System.Dynamic;
using System.Linq;
+using System.Net.Mime;
using System.Numerics;
using Dalamud.Game.Chat;
using Dalamud.Game.ClientState.Actors.Types;
using Dalamud.Game.ClientState.Actors.Types.NonPlayer;
+using Dalamud.Plugin;
using ImGuiNET;
+using JetBrains.Annotations;
using Newtonsoft.Json;
+using Serilog;
+using SharpDX.Direct3D11;
namespace Dalamud.Interface
{
@@ -51,8 +57,8 @@ namespace Dalamud.Interface
ImGui.SameLine();
var copy = ImGui.Button("Copy all");
ImGui.SameLine();
- ImGui.Combo("Data kind", ref this.currentKind, new[] {"ServerOpCode", "ContentFinderCondition", "Actor Table", "Font Test", "Party List"},
- 5);
+ ImGui.Combo("Data kind", ref this.currentKind, new[] {"ServerOpCode", "ContentFinderCondition", "Actor Table", "Font Test", "Party List", "Plugin IPC"},
+ 6);
ImGui.BeginChild("scrolling", new Vector2(0, 0), false, ImGuiWindowFlags.HorizontalScrollbar);
@@ -165,6 +171,27 @@ namespace Dalamud.Interface
ImGui.TextUnformatted(partyString);
}
+ break;
+ case 5:
+ var i1 = new DalamudPluginInterface(this.dalamud, "DalamudTestSub", null);
+ var i2 = new DalamudPluginInterface(this.dalamud, "DalamudTestPub", null);
+
+ if (ImGui.Button("Add test sub")) i1.Subscribe("DalamudTestPub", o => {
+ dynamic msg = o;
+ Log.Debug(msg.Expand);
+ });
+
+ if (ImGui.Button("Remove test sub")) i1.Unsubscribe("DalamudTestPub");
+
+ if (ImGui.Button("Send test message")) {
+ dynamic testMsg = new ExpandoObject();
+ testMsg.Expand = "dong";
+ i2.SendMessage(testMsg);
+ }
+
+ foreach (var sub in this.dalamud.PluginManager.IpcSubscriptions) {
+ ImGui.Text($"Source:{sub.SourcePluginName} Sub:{sub.SubPluginName}");
+ }
break;
}
else
diff --git a/Dalamud/Plugin/DalamudPluginInterface.cs b/Dalamud/Plugin/DalamudPluginInterface.cs
index c86989d1b..63b174f85 100644
--- a/Dalamud/Plugin/DalamudPluginInterface.cs
+++ b/Dalamud/Plugin/DalamudPluginInterface.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Dynamic;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
@@ -115,6 +116,45 @@ namespace Dalamud.Plugin
return this.configs.Load(this.pluginName);
}
+ #region IPC
+
+ ///
+ /// Subscribe to an IPC message by a plugin.
+ ///
+ /// The InternalName of the plugin to subscribe to.
+ /// The action to take when a message was received.
+ public void Subscribe(string pluginName, Action action) {
+ if (this.dalamud.PluginManager.IpcSubscriptions.Any(x => x.SourcePluginName == this.pluginName && x.SubPluginName == pluginName))
+ throw new InvalidOperationException("Can't add multiple subscriptions for the same plugin.");
+
+ this.dalamud.PluginManager.IpcSubscriptions.Add((this.pluginName, pluginName, action));
+ }
+
+ ///
+ /// Unsubscribe from messages from a plugin.
+ ///
+ /// The InternalName of the plugin to unsubscribe from.
+ public void Unsubscribe(string pluginName) {
+ var sub = this.dalamud.PluginManager.IpcSubscriptions.FirstOrDefault(x => x.SourcePluginName == this.pluginName && x.SubPluginName == pluginName);
+ if (sub.SubAction == null)
+ throw new InvalidOperationException("Wasn't subscribed to this plugin.");
+
+ this.dalamud.PluginManager.IpcSubscriptions.Remove(sub);
+ }
+
+ ///
+ /// Send a message to all subscribed plugins.
+ ///
+ /// The message to send.
+ public void SendMessage(ExpandoObject message) {
+ var subs = this.dalamud.PluginManager.IpcSubscriptions.Where(x => x.SubPluginName == this.pluginName);
+ foreach (var sub in subs.Select(x => x.SubAction)) {
+ sub.Invoke(message);
+ }
+ }
+
+ #endregion
+
#region Logging
///
diff --git a/Dalamud/Plugin/PluginManager.cs b/Dalamud/Plugin/PluginManager.cs
index 2bf42e4f0..2b5de87b2 100644
--- a/Dalamud/Plugin/PluginManager.cs
+++ b/Dalamud/Plugin/PluginManager.cs
@@ -1,5 +1,7 @@
using System;
+using System.Collections.Concurrent;
using System.Collections.Generic;
+using System.Dynamic;
using System.IO;
using System.Linq;
using System.Reflection;
@@ -20,6 +22,8 @@ namespace Dalamud.Plugin
public readonly List<(IDalamudPlugin Plugin, PluginDefinition Definition, DalamudPluginInterface PluginInterface)> Plugins = new List<(IDalamudPlugin plugin, PluginDefinition def, DalamudPluginInterface PluginInterface)>();
+ public List<(string SourcePluginName, string SubPluginName, Action SubAction)> IpcSubscriptions = new List<(string SourcePluginName, string SubPluginName, Action SubAction)>();
+
public PluginManager(Dalamud dalamud, string pluginDirectory, string devPluginDirectory) {
this.dalamud = dalamud;
this.pluginDirectory = pluginDirectory;