From 0760fa9d5ce1699ca40260b3364221981a53e6c1 Mon Sep 17 00:00:00 2001 From: Cara Date: Thu, 17 Dec 2020 23:58:59 +1030 Subject: [PATCH] Pass clicked text in handler --- .../SeStringHandling/Payloads/RawPayload.cs | 8 +++++++ Dalamud/Game/ChatHandlers.cs | 2 +- Dalamud/Game/Internal/Gui/ChatGui.cs | 22 ++++++++++--------- Dalamud/Plugin/DalamudPluginInterface.cs | 2 +- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/Dalamud/Game/Chat/SeStringHandling/Payloads/RawPayload.cs b/Dalamud/Game/Chat/SeStringHandling/Payloads/RawPayload.cs index a2438d32a..8184dd477 100644 --- a/Dalamud/Game/Chat/SeStringHandling/Payloads/RawPayload.cs +++ b/Dalamud/Game/Chat/SeStringHandling/Payloads/RawPayload.cs @@ -64,6 +64,14 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads return $"{Type} - Data: {BitConverter.ToString(Data).Replace("-", " ")}"; } + public override bool Equals(object obj) { + if (obj is RawPayload rp) { + if (rp.Data.Length != this.Data.Length) return false; + return !Data.Where((t, i) => rp.Data[i] != t).Any(); + } + return false; + } + protected override byte[] EncodeImpl() { var chunkLen = this.data.Length + 1; diff --git a/Dalamud/Game/ChatHandlers.cs b/Dalamud/Game/ChatHandlers.cs index cbdca6271..2e4c00060 100644 --- a/Dalamud/Game/ChatHandlers.cs +++ b/Dalamud/Game/ChatHandlers.cs @@ -90,7 +90,7 @@ namespace Dalamud.Game { dalamud.Framework.Gui.Chat.OnCheckMessageHandled += OnCheckMessageHandled; dalamud.Framework.Gui.Chat.OnChatMessage += OnChatMessage; - this.openInstallerWindowLink = this.dalamud.Framework.Gui.Chat.AddChatLinkHandler("Dalamud", 1001, (i) => { + this.openInstallerWindowLink = this.dalamud.Framework.Gui.Chat.AddChatLinkHandler("Dalamud", 1001, (i, m) => { this.dalamud.OpenPluginInstaller(); }); } diff --git a/Dalamud/Game/Internal/Gui/ChatGui.cs b/Dalamud/Game/Internal/Gui/ChatGui.cs index ff23a8312..87e11d8e5 100644 --- a/Dalamud/Game/Internal/Gui/ChatGui.cs +++ b/Dalamud/Game/Internal/Gui/ChatGui.cs @@ -182,7 +182,7 @@ namespace Dalamud.Game.Internal.Gui { return retVal; } - private readonly Dictionary<(string pluginName, uint commandId), Action> dalamudLinkHandlers = new Dictionary<(string, uint), Action>(); + private readonly Dictionary<(string pluginName, uint commandId), Action> dalamudLinkHandlers = new Dictionary<(string, uint), Action>(); /// /// Create a link handler @@ -191,7 +191,7 @@ namespace Dalamud.Game.Internal.Gui { /// /// /// - internal DalamudLinkPayload AddChatLinkHandler(string pluginName, uint commandId, Action commandAction) { + internal DalamudLinkPayload AddChatLinkHandler(string pluginName, uint commandId, Action commandAction) { var payload = new DalamudLinkPayload() {Plugin = pluginName, CommandId = commandId}; this.dalamudLinkHandlers.Add((pluginName, commandId), commandAction); return payload; @@ -230,17 +230,19 @@ namespace Dalamud.Game.Internal.Gui { Log.Verbose($"InteractableLinkClicked: {Payload.EmbeddedInfoType.DalamudLink}"); var payloadPtr = Marshal.ReadIntPtr(messagePtr, 0x10); - var payloadSize = 3 + Marshal.ReadByte(payloadPtr, 2); - var payloadBytes = new byte[payloadSize]; - Marshal.Copy(payloadPtr, payloadBytes, 0, payloadSize); + var messageSize = 0; + while (Marshal.ReadByte(payloadPtr, messageSize) != 0) messageSize++; + var payloadBytes = new byte[messageSize]; + Marshal.Copy(payloadPtr, payloadBytes, 0, messageSize); var seStr = this.dalamud.SeStringManager.Parse(payloadBytes); - if (seStr.Payloads.Count == 0) return; - var payload = seStr.Payloads[0]; - - if (payload is DalamudLinkPayload link) { + var terminatorIndex = seStr.Payloads.IndexOf(RawPayload.LinkTerminator); + var payloads = terminatorIndex >= 0 ? seStr.Payloads.Take(terminatorIndex + 1).ToList() : seStr.Payloads; + if (payloads.Count == 0) return; + var linkPayload = payloads[0]; + if (linkPayload is DalamudLinkPayload link) { if (this.dalamudLinkHandlers.ContainsKey((link.Plugin, link.CommandId))) { Log.Verbose($"Sending DalamudLink to {link.Plugin}: {link.CommandId}"); - this.dalamudLinkHandlers[(link.Plugin, link.CommandId)].Invoke(link.CommandId); + this.dalamudLinkHandlers[(link.Plugin, link.CommandId)].Invoke(link.CommandId, new SeString(payloads)); } else { Log.Debug($"No DalamudLink registered for {link.Plugin} with ID of {link.CommandId}"); } diff --git a/Dalamud/Plugin/DalamudPluginInterface.cs b/Dalamud/Plugin/DalamudPluginInterface.cs index 11c1d09d1..4a2ae9f41 100644 --- a/Dalamud/Plugin/DalamudPluginInterface.cs +++ b/Dalamud/Plugin/DalamudPluginInterface.cs @@ -139,7 +139,7 @@ namespace Dalamud.Plugin /// /// /// Returns an SeString payload for the link. - public DalamudLinkPayload AddChatLinkHandler(uint commandId, Action commandAction) { + public DalamudLinkPayload AddChatLinkHandler(uint commandId, Action commandAction) { return this.Framework.Gui.Chat.AddChatLinkHandler(this.pluginName, commandId, commandAction); }