From 49ccd098c7d9819d7b9e035b2ee34618e8b13399 Mon Sep 17 00:00:00 2001 From: Anna Clemens Date: Sun, 10 Jul 2022 14:24:35 -0400 Subject: [PATCH] feat: add Chat 2 context menus --- client/ExtraChat/Integrations/ChatTwo.cs | 59 ++++++++++++++++++++++++ client/ExtraChat/Plugin.cs | 11 +++++ 2 files changed, 70 insertions(+) create mode 100644 client/ExtraChat/Integrations/ChatTwo.cs diff --git a/client/ExtraChat/Integrations/ChatTwo.cs b/client/ExtraChat/Integrations/ChatTwo.cs new file mode 100644 index 0000000..8ad4778 --- /dev/null +++ b/client/ExtraChat/Integrations/ChatTwo.cs @@ -0,0 +1,59 @@ +using Dalamud.Game.Text.SeStringHandling; +using Dalamud.Game.Text.SeStringHandling.Payloads; +using Dalamud.Plugin.Ipc; +using ImGuiNET; + +namespace ExtraChat.Integrations; + +internal class ChatTwo : IDisposable { + private Plugin Plugin { get; } + + private ICallGateSubscriber Register { get; } + private ICallGateSubscriber Unregister { get; } + private ICallGateSubscriber Available { get; } + private ICallGateSubscriber Invoke { get; } + + private string? _id; + + internal ChatTwo(Plugin plugin) { + this.Plugin = plugin; + + this.Register = this.Plugin.Interface.GetIpcSubscriber("ChatTwo.Register"); + this.Unregister = this.Plugin.Interface.GetIpcSubscriber("ChatTwo.Unregister"); + this.Invoke = this.Plugin.Interface.GetIpcSubscriber("ChatTwo.Invoke"); + this.Available = this.Plugin.Interface.GetIpcSubscriber("ChatTwo.Available"); + + this.Available.Subscribe(this.DoRegister); + this.DoRegister(); + this.Invoke.Subscribe(this.Integration); + } + + public void Dispose() { + if (this._id != null) { + this.Unregister.InvokeAction(this._id); + this._id = null; + } + + this.Invoke.Unsubscribe(this.Integration); + this.Available.Unsubscribe(this.DoRegister); + } + + private void DoRegister() { + this._id = this.Register.InvokeFunc(); + } + + + private void Integration(string id, PlayerPayload? sender, ulong contentId, Payload? payload, SeString? senderString, SeString? content) { + if (id != this._id) { + return; + } + + if (payload is not PlayerPayload player) { + return; + } + + if (ImGui.Selectable("Invite to ExtraChat Linkshell")) { + this.Plugin.PluginUi.InviteInfo = (player.PlayerName, (ushort) player.World.RowId); + } + } +} diff --git a/client/ExtraChat/Plugin.cs b/client/ExtraChat/Plugin.cs index d5d772c..ca4d4a8 100644 --- a/client/ExtraChat/Plugin.cs +++ b/client/ExtraChat/Plugin.cs @@ -12,6 +12,7 @@ using Dalamud.Game.Text; using Dalamud.Interface.Internal.Notifications; using Dalamud.IoC; using Dalamud.Plugin; +using ExtraChat.Integrations; using ExtraChat.Ui; using ExtraChat.Util; @@ -62,6 +63,7 @@ public class Plugin : IDalamudPlugin { internal DalamudContextMenuBase ContextMenu { get; } internal GameFunctions GameFunctions { get; } internal Ipc Ipc { get; } + private IDisposable[] Integrations { get; } private PlayerCharacter? _localPlayer; private readonly Mutex _localPlayerLock = new(); @@ -91,6 +93,10 @@ public class Plugin : IDalamudPlugin { this.GameFunctions = new GameFunctions(this); this.Ipc = new Ipc(this); + this.Integrations = new IDisposable[] { + new ChatTwo(this), + }; + this.Framework!.Update += this.FrameworkUpdate; this.ContextMenu.Functions.ContextMenu.OnOpenGameObjectContextMenu += this.OnOpenGameObjectContextMenu; } @@ -101,6 +107,11 @@ public class Plugin : IDalamudPlugin { this.ContextMenu.Functions.ContextMenu.OnOpenGameObjectContextMenu -= this.OnOpenGameObjectContextMenu; this.Framework.Update -= this.FrameworkUpdate; this._localPlayerLock.Dispose(); + + foreach (var integration in this.Integrations) { + integration.Dispose(); + } + this.Ipc.Dispose(); this.GameFunctions.Dispose(); this.PluginUi.Dispose();