mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-15 13:14:17 +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">
|
<PropertyGroup Label="Target">
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
<TargetFramework>net472</TargetFramework>
|
<TargetFramework>net472</TargetFramework>
|
||||||
|
|
@ -41,7 +41,6 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Discord.Net" Version="2.1.0" />
|
<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="Newtonsoft.Json" Version="11.0.2" />
|
||||||
<PackageReference Include="PropertyChanged.Fody" Version="2.6.1" />
|
<PackageReference Include="PropertyChanged.Fody" Version="2.6.1" />
|
||||||
<PackageReference Include="Serilog" Version="2.6.0" />
|
<PackageReference Include="Serilog" Version="2.6.0" />
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,8 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads
|
||||||
// unk
|
// unk
|
||||||
bytes.AddRange(new byte[] { 0x02, 0x01, END_BYTE });
|
bytes.AddRange(new byte[] { 0x02, 0x01, END_BYTE });
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return bytes.ToArray();
|
return bytes.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads
|
||||||
{
|
{
|
||||||
public override PayloadType Type => PayloadType.RawText;
|
public override PayloadType Type => PayloadType.RawText;
|
||||||
|
|
||||||
public string Text { get; private set; }
|
public string Text { get; set; }
|
||||||
|
|
||||||
public TextPayload() { }
|
public TextPayload() { }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,31 +13,8 @@ namespace Dalamud.Game.Chat.SeStringHandling
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class SeString
|
public class SeString
|
||||||
{
|
{
|
||||||
private Dictionary<PayloadType, List<Payload>> mappedPayloads_ = null;
|
|
||||||
|
|
||||||
public List<Payload> Payloads { get; }
|
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)
|
public SeString(List<Payload> payloads)
|
||||||
{
|
{
|
||||||
Payloads = payloads;
|
Payloads = payloads;
|
||||||
|
|
@ -93,10 +70,10 @@ namespace Dalamud.Game.Chat.SeStringHandling
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="payloads"></param>
|
/// <param name="payloads"></param>
|
||||||
/// <returns>The bytes of the message.</returns>
|
/// <returns>The bytes of the message.</returns>
|
||||||
public static byte[] Encode(List<Payload> payloads)
|
public byte[] Encode()
|
||||||
{
|
{
|
||||||
var messageBytes = new List<byte>();
|
var messageBytes = new List<byte>();
|
||||||
foreach (var p in payloads)
|
foreach (var p in Payloads)
|
||||||
{
|
{
|
||||||
messageBytes.AddRange(p.Encode());
|
messageBytes.AddRange(p.Encode());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -90,13 +90,13 @@ namespace Dalamud.Game {
|
||||||
public ChatHandlers(Dalamud dalamud) {
|
public ChatHandlers(Dalamud dalamud) {
|
||||||
this.dalamud = dalamud;
|
this.dalamud = dalamud;
|
||||||
|
|
||||||
dalamud.Framework.Gui.Chat.OnChatMessage += ChatOnOnChatMessage;
|
dalamud.Framework.Gui.Chat.OnChatMessageRaw += OnChatMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public string LastLink { get; private set; }
|
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) {
|
ref StdString message, ref bool isHandled) {
|
||||||
|
|
||||||
if (type == XivChatType.Notice && !this.hasSeenLoadingMsg) {
|
if (type == XivChatType.Notice && !this.hasSeenLoadingMsg) {
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ namespace Dalamud.Game.Command {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
dalamud.Framework.Gui.Chat.OnChatMessage += OnChatMessage;
|
dalamud.Framework.Gui.Chat.OnChatMessageRaw += OnChatMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnChatMessage(XivChatType type, uint senderId, ref StdString sender,
|
private void OnChatMessage(XivChatType type, uint senderId, ref StdString sender,
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Dalamud.Game.Chat;
|
using Dalamud.Game.Chat;
|
||||||
|
using Dalamud.Game.Chat.SeStringHandling;
|
||||||
using Dalamud.Game.Internal.Libc;
|
using Dalamud.Game.Internal.Libc;
|
||||||
using Dalamud.Hooking;
|
using Dalamud.Hooking;
|
||||||
using Discord.Rest;
|
using Discord.Rest;
|
||||||
|
|
@ -15,7 +16,10 @@ namespace Dalamud.Game.Internal.Gui {
|
||||||
IntPtr message,
|
IntPtr message,
|
||||||
uint senderId, IntPtr parameter);
|
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);
|
ref bool isHandled);
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -27,6 +31,8 @@ namespace Dalamud.Game.Internal.Gui {
|
||||||
private readonly Hook<PrintMessageDelegate> printMessageHook;
|
private readonly Hook<PrintMessageDelegate> printMessageHook;
|
||||||
|
|
||||||
public event OnMessageDelegate OnChatMessage;
|
public event OnMessageDelegate OnChatMessage;
|
||||||
|
[Obsolete("Please use OnChatMessage instead. For modifications, it will take precedence.")]
|
||||||
|
public event OnMessageRawDelegate OnChatMessageRaw;
|
||||||
|
|
||||||
private readonly Hook<PopulateItemLinkDelegate> populateItemLinkHook;
|
private readonly Hook<PopulateItemLinkDelegate> populateItemLinkHook;
|
||||||
|
|
||||||
|
|
@ -82,19 +88,31 @@ namespace Dalamud.Game.Internal.Gui {
|
||||||
|
|
||||||
private IntPtr HandlePrintMessageDetour(IntPtr manager, XivChatType chattype, IntPtr pSenderName, IntPtr pMessage,
|
private IntPtr HandlePrintMessageDetour(IntPtr manager, XivChatType chattype, IntPtr pSenderName, IntPtr pMessage,
|
||||||
uint senderid, IntPtr parameter) {
|
uint senderid, IntPtr parameter) {
|
||||||
IntPtr retVal = IntPtr.Zero;
|
var retVal = IntPtr.Zero;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
var senderName = StdString.ReadFromPointer(pSenderName);
|
var sender = StdString.ReadFromPointer(pSenderName);
|
||||||
var message = StdString.ReadFromPointer(pMessage);
|
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}");
|
//Log.Debug($"HandlePrintMessageDetour {manager} - [{chattype}] [{BitConverter.ToString(message.RawData).Replace("-", " ")}] {message.Value} from {senderName.Value}");
|
||||||
|
|
||||||
var originalMessageData = (byte[]) message.RawData.Clone();
|
var originalMessageData = (byte[]) message.RawData.Clone();
|
||||||
|
var oldEdited = parsedMessage.Encode();
|
||||||
|
|
||||||
// Call events
|
// Call events
|
||||||
var isHandled = false;
|
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;
|
var messagePtr = pMessage;
|
||||||
OwnedStdString allocatedString = null;
|
OwnedStdString allocatedString = null;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue