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("-", " ")}";
}
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;

View file

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

View file

@ -182,7 +182,7 @@ namespace Dalamud.Game.Internal.Gui {
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>
/// Create a link handler
@ -191,7 +191,7 @@ namespace Dalamud.Game.Internal.Gui {
/// <param name="commandId"></param>
/// <param name="commandAction"></param>
/// <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};
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}");
}

View file

@ -139,7 +139,7 @@ namespace Dalamud.Plugin
/// <param name="commandId"></param>
/// <param name="commandAction"></param>
/// <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);
}