mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-12 10:17:22 +01:00
refactor: change chat message API to pass parsed SeString
This commit is contained in:
parent
3c4dad437e
commit
24cb7f014e
7 changed files with 32 additions and 36 deletions
|
|
@ -1,4 +1,4 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup Label="Target">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<TargetFramework>net472</TargetFramework>
|
||||
|
|
@ -41,7 +41,6 @@
|
|||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Discord.Net" Version="2.1.0" />
|
||||
<PackageReference Include="Google.Cloud.Translation.V2" Version="1.1.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
|
||||
<PackageReference Include="PropertyChanged.Fody" Version="2.6.1" />
|
||||
<PackageReference Include="Serilog" Version="2.6.0" />
|
||||
|
|
|
|||
|
|
@ -50,6 +50,8 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads
|
|||
// unk
|
||||
bytes.AddRange(new byte[] { 0x02, 0x01, END_BYTE });
|
||||
|
||||
|
||||
|
||||
return bytes.ToArray();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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() { }
|
||||
|
||||
|
|
|
|||
|
|
@ -13,31 +13,8 @@ namespace Dalamud.Game.Chat.SeStringHandling
|
|||
/// </summary>
|
||||
public class SeString
|
||||
{
|
||||
private Dictionary<PayloadType, List<Payload>> mappedPayloads_ = null;
|
||||
|
||||
public List<Payload> Payloads { get; }
|
||||
|
||||
public Dictionary<PayloadType, List<Payload>> MappedPayloads
|
||||
{
|
||||
get
|
||||
{
|
||||
if (mappedPayloads_ == null)
|
||||
{
|
||||
mappedPayloads_ = new Dictionary<PayloadType, List<Payload>>();
|
||||
foreach (var p in Payloads)
|
||||
{
|
||||
if (!mappedPayloads_.ContainsKey(p.Type))
|
||||
{
|
||||
mappedPayloads_[p.Type] = new List<Payload>();
|
||||
}
|
||||
mappedPayloads_[p.Type].Add(p);
|
||||
}
|
||||
}
|
||||
|
||||
return mappedPayloads_;
|
||||
}
|
||||
}
|
||||
|
||||
public SeString(List<Payload> payloads)
|
||||
{
|
||||
Payloads = payloads;
|
||||
|
|
@ -93,10 +70,10 @@ namespace Dalamud.Game.Chat.SeStringHandling
|
|||
/// </summary>
|
||||
/// <param name="payloads"></param>
|
||||
/// <returns>The bytes of the message.</returns>
|
||||
public static byte[] Encode(List<Payload> payloads)
|
||||
public byte[] Encode()
|
||||
{
|
||||
var messageBytes = new List<byte>();
|
||||
foreach (var p in payloads)
|
||||
foreach (var p in Payloads)
|
||||
{
|
||||
messageBytes.AddRange(p.Encode());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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<PrintMessageDelegate> printMessageHook;
|
||||
|
||||
public event OnMessageDelegate OnChatMessage;
|
||||
[Obsolete("Please use OnChatMessage instead. For modifications, it will take precedence.")]
|
||||
public event OnMessageRawDelegate OnChatMessageRaw;
|
||||
|
||||
private readonly Hook<PopulateItemLinkDelegate> 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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue