Pass clicked text in handler

This commit is contained in:
Cara 2020-12-17 23:58:59 +10:30
parent cd5cc6aac2
commit 0760fa9d5c
4 changed files with 22 additions and 12 deletions

View file

@ -64,6 +64,14 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads
return $"{Type} - Data: {BitConverter.ToString(Data).Replace("-", " ")}"; 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() protected override byte[] EncodeImpl()
{ {
var chunkLen = this.data.Length + 1; var chunkLen = this.data.Length + 1;

View file

@ -90,7 +90,7 @@ namespace Dalamud.Game {
dalamud.Framework.Gui.Chat.OnCheckMessageHandled += OnCheckMessageHandled; dalamud.Framework.Gui.Chat.OnCheckMessageHandled += OnCheckMessageHandled;
dalamud.Framework.Gui.Chat.OnChatMessage += OnChatMessage; 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(); this.dalamud.OpenPluginInstaller();
}); });
} }

View file

@ -182,7 +182,7 @@ namespace Dalamud.Game.Internal.Gui {
return retVal; return retVal;
} }
private readonly Dictionary<(string pluginName, uint commandId), Action<uint>> dalamudLinkHandlers = new Dictionary<(string, uint), Action<uint>>(); private readonly Dictionary<(string pluginName, uint commandId), Action<uint, SeString>> dalamudLinkHandlers = new Dictionary<(string, uint), Action<uint, SeString>>();
/// <summary> /// <summary>
/// Create a link handler /// Create a link handler
@ -191,7 +191,7 @@ namespace Dalamud.Game.Internal.Gui {
/// <param name="commandId"></param> /// <param name="commandId"></param>
/// <param name="commandAction"></param> /// <param name="commandAction"></param>
/// <returns></returns> /// <returns></returns>
internal DalamudLinkPayload AddChatLinkHandler(string pluginName, uint commandId, Action<uint> commandAction) { internal DalamudLinkPayload AddChatLinkHandler(string pluginName, uint commandId, Action<uint, SeString> commandAction) {
var payload = new DalamudLinkPayload() {Plugin = pluginName, CommandId = commandId}; var payload = new DalamudLinkPayload() {Plugin = pluginName, CommandId = commandId};
this.dalamudLinkHandlers.Add((pluginName, commandId), commandAction); this.dalamudLinkHandlers.Add((pluginName, commandId), commandAction);
return payload; return payload;
@ -230,17 +230,19 @@ namespace Dalamud.Game.Internal.Gui {
Log.Verbose($"InteractableLinkClicked: {Payload.EmbeddedInfoType.DalamudLink}"); Log.Verbose($"InteractableLinkClicked: {Payload.EmbeddedInfoType.DalamudLink}");
var payloadPtr = Marshal.ReadIntPtr(messagePtr, 0x10); var payloadPtr = Marshal.ReadIntPtr(messagePtr, 0x10);
var payloadSize = 3 + Marshal.ReadByte(payloadPtr, 2); var messageSize = 0;
var payloadBytes = new byte[payloadSize]; while (Marshal.ReadByte(payloadPtr, messageSize) != 0) messageSize++;
Marshal.Copy(payloadPtr, payloadBytes, 0, payloadSize); var payloadBytes = new byte[messageSize];
Marshal.Copy(payloadPtr, payloadBytes, 0, messageSize);
var seStr = this.dalamud.SeStringManager.Parse(payloadBytes); var seStr = this.dalamud.SeStringManager.Parse(payloadBytes);
if (seStr.Payloads.Count == 0) return; var terminatorIndex = seStr.Payloads.IndexOf(RawPayload.LinkTerminator);
var payload = seStr.Payloads[0]; var payloads = terminatorIndex >= 0 ? seStr.Payloads.Take(terminatorIndex + 1).ToList() : seStr.Payloads;
if (payloads.Count == 0) return;
if (payload is DalamudLinkPayload link) { var linkPayload = payloads[0];
if (linkPayload is DalamudLinkPayload link) {
if (this.dalamudLinkHandlers.ContainsKey((link.Plugin, link.CommandId))) { if (this.dalamudLinkHandlers.ContainsKey((link.Plugin, link.CommandId))) {
Log.Verbose($"Sending DalamudLink to {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 { } else {
Log.Debug($"No DalamudLink registered for {link.Plugin} with ID of {link.CommandId}"); Log.Debug($"No DalamudLink registered for {link.Plugin} with ID of {link.CommandId}");
} }

View file

@ -139,7 +139,7 @@ namespace Dalamud.Plugin
/// <param name="commandId"></param> /// <param name="commandId"></param>
/// <param name="commandAction"></param> /// <param name="commandAction"></param>
/// <returns>Returns an SeString payload for the link.</returns> /// <returns>Returns an SeString payload for the link.</returns>
public DalamudLinkPayload AddChatLinkHandler(uint commandId, Action<uint> commandAction) { public DalamudLinkPayload AddChatLinkHandler(uint commandId, Action<uint, SeString> commandAction) {
return this.Framework.Gui.Chat.AddChatLinkHandler(this.pluginName, commandId, commandAction); return this.Framework.Gui.Chat.AddChatLinkHandler(this.pluginName, commandId, commandAction);
} }