refactor: change chat message API to pass parsed SeString

This commit is contained in:
goat 2020-02-12 01:20:17 +09:00
parent 3c4dad437e
commit 24cb7f014e
7 changed files with 32 additions and 36 deletions

View file

@ -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" />

View file

@ -50,6 +50,8 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads
// unk
bytes.AddRange(new byte[] { 0x02, 0x01, END_BYTE });
return bytes.ToArray();
}

View file

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

View file

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

View file

@ -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) {

View file

@ -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,

View file

@ -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,19 +88,31 @@ 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;