From 24cb7f014e3295c4c5f4036231aee077ee64b4c3 Mon Sep 17 00:00:00 2001 From: goat Date: Wed, 12 Feb 2020 01:20:17 +0900 Subject: [PATCH] refactor: change chat message API to pass parsed SeString --- Dalamud/Dalamud.csproj | 3 +- .../SeStringHandling/Payloads/ItemPayload.cs | 2 ++ .../SeStringHandling/Payloads/TextPayload.cs | 2 +- .../Game/Chat/SeStringHandling/SeString.cs | 27 ++---------------- Dalamud/Game/ChatHandlers.cs | 4 +-- Dalamud/Game/Command/CommandManager.cs | 2 +- Dalamud/Game/Internal/Gui/ChatGui.cs | 28 +++++++++++++++---- 7 files changed, 32 insertions(+), 36 deletions(-) diff --git a/Dalamud/Dalamud.csproj b/Dalamud/Dalamud.csproj index 7d0aa2386..5a88f59f9 100644 --- a/Dalamud/Dalamud.csproj +++ b/Dalamud/Dalamud.csproj @@ -1,4 +1,4 @@ - + AnyCPU net472 @@ -41,7 +41,6 @@ - diff --git a/Dalamud/Game/Chat/SeStringHandling/Payloads/ItemPayload.cs b/Dalamud/Game/Chat/SeStringHandling/Payloads/ItemPayload.cs index d8bad2c0b..78e82291a 100644 --- a/Dalamud/Game/Chat/SeStringHandling/Payloads/ItemPayload.cs +++ b/Dalamud/Game/Chat/SeStringHandling/Payloads/ItemPayload.cs @@ -50,6 +50,8 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads // unk bytes.AddRange(new byte[] { 0x02, 0x01, END_BYTE }); + + return bytes.ToArray(); } diff --git a/Dalamud/Game/Chat/SeStringHandling/Payloads/TextPayload.cs b/Dalamud/Game/Chat/SeStringHandling/Payloads/TextPayload.cs index c2fad1ea9..62ab70a40 100644 --- a/Dalamud/Game/Chat/SeStringHandling/Payloads/TextPayload.cs +++ b/Dalamud/Game/Chat/SeStringHandling/Payloads/TextPayload.cs @@ -11,7 +11,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads { public override PayloadType Type => PayloadType.RawText; - public string Text { get; private set; } + public string Text { get; set; } public TextPayload() { } diff --git a/Dalamud/Game/Chat/SeStringHandling/SeString.cs b/Dalamud/Game/Chat/SeStringHandling/SeString.cs index f0ab270b7..156612214 100644 --- a/Dalamud/Game/Chat/SeStringHandling/SeString.cs +++ b/Dalamud/Game/Chat/SeStringHandling/SeString.cs @@ -13,31 +13,8 @@ namespace Dalamud.Game.Chat.SeStringHandling /// public class SeString { - private Dictionary> mappedPayloads_ = null; - public List Payloads { get; } - public Dictionary> MappedPayloads - { - get - { - if (mappedPayloads_ == null) - { - mappedPayloads_ = new Dictionary>(); - foreach (var p in Payloads) - { - if (!mappedPayloads_.ContainsKey(p.Type)) - { - mappedPayloads_[p.Type] = new List(); - } - mappedPayloads_[p.Type].Add(p); - } - } - - return mappedPayloads_; - } - } - public SeString(List payloads) { Payloads = payloads; @@ -93,10 +70,10 @@ namespace Dalamud.Game.Chat.SeStringHandling /// /// /// The bytes of the message. - public static byte[] Encode(List payloads) + public byte[] Encode() { var messageBytes = new List(); - foreach (var p in payloads) + foreach (var p in Payloads) { messageBytes.AddRange(p.Encode()); } diff --git a/Dalamud/Game/ChatHandlers.cs b/Dalamud/Game/ChatHandlers.cs index 5420bfebc..d99c02b3f 100644 --- a/Dalamud/Game/ChatHandlers.cs +++ b/Dalamud/Game/ChatHandlers.cs @@ -90,13 +90,13 @@ namespace Dalamud.Game { public ChatHandlers(Dalamud dalamud) { this.dalamud = dalamud; - dalamud.Framework.Gui.Chat.OnChatMessage += ChatOnOnChatMessage; + dalamud.Framework.Gui.Chat.OnChatMessageRaw += OnChatMessage; } public string LastLink { get; private set; } - private void ChatOnOnChatMessage(XivChatType type, uint senderId, ref StdString sender, + private void OnChatMessage(XivChatType type, uint senderId, ref StdString sender, ref StdString message, ref bool isHandled) { if (type == XivChatType.Notice && !this.hasSeenLoadingMsg) { diff --git a/Dalamud/Game/Command/CommandManager.cs b/Dalamud/Game/Command/CommandManager.cs index 5f883a0d6..3588572c6 100644 --- a/Dalamud/Game/Command/CommandManager.cs +++ b/Dalamud/Game/Command/CommandManager.cs @@ -48,7 +48,7 @@ namespace Dalamud.Game.Command { break; } - dalamud.Framework.Gui.Chat.OnChatMessage += OnChatMessage; + dalamud.Framework.Gui.Chat.OnChatMessageRaw += OnChatMessage; } private void OnChatMessage(XivChatType type, uint senderId, ref StdString sender, diff --git a/Dalamud/Game/Internal/Gui/ChatGui.cs b/Dalamud/Game/Internal/Gui/ChatGui.cs index 03705db5b..6ef458cb9 100644 --- a/Dalamud/Game/Internal/Gui/ChatGui.cs +++ b/Dalamud/Game/Internal/Gui/ChatGui.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; using Dalamud.Game.Chat; +using Dalamud.Game.Chat.SeStringHandling; using Dalamud.Game.Internal.Libc; using Dalamud.Hooking; using Discord.Rest; @@ -15,7 +16,10 @@ namespace Dalamud.Game.Internal.Gui { IntPtr message, uint senderId, IntPtr parameter); - public delegate void OnMessageDelegate(XivChatType type, uint senderId, ref StdString sender, ref StdString message, + public delegate void OnMessageDelegate(XivChatType type, uint senderId, ref SeString sender, ref SeString message, + ref bool isHandled); + + public delegate void OnMessageRawDelegate(XivChatType type, uint senderId, ref StdString sender, ref StdString message, ref bool isHandled); @@ -27,6 +31,8 @@ namespace Dalamud.Game.Internal.Gui { private readonly Hook printMessageHook; public event OnMessageDelegate OnChatMessage; + [Obsolete("Please use OnChatMessage instead. For modifications, it will take precedence.")] + public event OnMessageRawDelegate OnChatMessageRaw; private readonly Hook populateItemLinkHook; @@ -82,22 +88,34 @@ namespace Dalamud.Game.Internal.Gui { private IntPtr HandlePrintMessageDetour(IntPtr manager, XivChatType chattype, IntPtr pSenderName, IntPtr pMessage, uint senderid, IntPtr parameter) { - IntPtr retVal = IntPtr.Zero; + var retVal = IntPtr.Zero; try { - var senderName = StdString.ReadFromPointer(pSenderName); + var sender = StdString.ReadFromPointer(pSenderName); var message = StdString.ReadFromPointer(pMessage); + var parsedSender = SeString.Parse(sender.RawData); + var parsedMessage = SeString.Parse(message.RawData); + //Log.Debug($"HandlePrintMessageDetour {manager} - [{chattype}] [{BitConverter.ToString(message.RawData).Replace("-", " ")}] {message.Value} from {senderName.Value}"); var originalMessageData = (byte[]) message.RawData.Clone(); + var oldEdited = parsedMessage.Encode(); // Call events var isHandled = false; - OnChatMessage?.Invoke(chattype, senderid, ref senderName, ref message, ref isHandled); + OnChatMessage?.Invoke(chattype, senderid, ref parsedSender, ref parsedMessage, ref isHandled); + OnChatMessageRaw?.Invoke(chattype, senderid, ref sender, ref message, ref isHandled); + + var newEdited = parsedMessage.Encode(); + + if (!FastByteArrayCompare(oldEdited, newEdited)) { + Log.Verbose("SeString was edited, taking precedence over StdString edit."); + message.RawData = newEdited; + } var messagePtr = pMessage; - OwnedStdString allocatedString = null; + OwnedStdString allocatedString = null; if (!FastByteArrayCompare(originalMessageData, message.RawData)) { allocatedString = this.dalamud.Framework.Libc.NewString(message.RawData);