mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-17 14:14:17 +01:00
Add handling of manipulated sender to chat detour.
This commit is contained in:
parent
b0f2486215
commit
3c100daf30
1 changed files with 28 additions and 10 deletions
|
|
@ -354,18 +354,23 @@ namespace Dalamud.Game.Gui
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var sender = StdString.ReadFromPointer(pSenderName);
|
var sender = StdString.ReadFromPointer(pSenderName);
|
||||||
var message = StdString.ReadFromPointer(pMessage);
|
|
||||||
|
|
||||||
var parsedSender = SeString.Parse(sender.RawData);
|
var parsedSender = SeString.Parse(sender.RawData);
|
||||||
|
var originalSenderData = (byte[])sender.RawData.Clone();
|
||||||
|
var oldEditedSender = parsedSender.Encode();
|
||||||
|
var senderPtr = pSenderName;
|
||||||
|
OwnedStdString allocatedString = null;
|
||||||
|
|
||||||
|
var message = StdString.ReadFromPointer(pMessage);
|
||||||
var parsedMessage = SeString.Parse(message.RawData);
|
var parsedMessage = SeString.Parse(message.RawData);
|
||||||
|
var originalMessageData = (byte[])message.RawData.Clone();
|
||||||
|
var oldEdited = parsedMessage.Encode();
|
||||||
|
var messagePtr = pMessage;
|
||||||
|
OwnedStdString allocatedStringSender = null;
|
||||||
|
|
||||||
// Log.Verbose("[CHATGUI][{0}][{1}]", parsedSender.TextValue, parsedMessage.TextValue);
|
// Log.Verbose("[CHATGUI][{0}][{1}]", parsedSender.TextValue, parsedMessage.TextValue);
|
||||||
|
|
||||||
// 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 oldEdited = parsedMessage.Encode();
|
|
||||||
|
|
||||||
// Call events
|
// Call events
|
||||||
var isHandled = false;
|
var isHandled = false;
|
||||||
this.CheckMessageHandled?.Invoke(chattype, senderid, ref parsedSender, ref parsedMessage, ref isHandled);
|
this.CheckMessageHandled?.Invoke(chattype, senderid, ref parsedSender, ref parsedMessage, ref isHandled);
|
||||||
|
|
@ -376,7 +381,6 @@ namespace Dalamud.Game.Gui
|
||||||
}
|
}
|
||||||
|
|
||||||
var newEdited = parsedMessage.Encode();
|
var newEdited = parsedMessage.Encode();
|
||||||
|
|
||||||
if (!FastByteArrayCompare(oldEdited, newEdited))
|
if (!FastByteArrayCompare(oldEdited, newEdited))
|
||||||
{
|
{
|
||||||
Log.Verbose("SeString was edited, taking precedence over StdString edit.");
|
Log.Verbose("SeString was edited, taking precedence over StdString edit.");
|
||||||
|
|
@ -384,9 +388,6 @@ namespace Dalamud.Game.Gui
|
||||||
// Log.Debug($"\nOLD: {BitConverter.ToString(originalMessageData)}\nNEW: {BitConverter.ToString(newEdited)}");
|
// Log.Debug($"\nOLD: {BitConverter.ToString(originalMessageData)}\nNEW: {BitConverter.ToString(newEdited)}");
|
||||||
}
|
}
|
||||||
|
|
||||||
var messagePtr = pMessage;
|
|
||||||
OwnedStdString allocatedString = null;
|
|
||||||
|
|
||||||
if (!FastByteArrayCompare(originalMessageData, message.RawData))
|
if (!FastByteArrayCompare(originalMessageData, message.RawData))
|
||||||
{
|
{
|
||||||
allocatedString = Service<LibcFunction>.Get().NewString(message.RawData);
|
allocatedString = Service<LibcFunction>.Get().NewString(message.RawData);
|
||||||
|
|
@ -395,6 +396,22 @@ namespace Dalamud.Game.Gui
|
||||||
messagePtr = allocatedString.Address;
|
messagePtr = allocatedString.Address;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var newEditedSender = parsedSender.Encode();
|
||||||
|
if (!FastByteArrayCompare(oldEditedSender, newEditedSender))
|
||||||
|
{
|
||||||
|
Log.Verbose("SeString was edited, taking precedence over StdString edit.");
|
||||||
|
sender.RawData = newEditedSender;
|
||||||
|
// Log.Debug($"\nOLD: {BitConverter.ToString(originalMessageData)}\nNEW: {BitConverter.ToString(newEdited)}");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!FastByteArrayCompare(originalSenderData, sender.RawData))
|
||||||
|
{
|
||||||
|
allocatedStringSender = Service<LibcFunction>.Get().NewString(sender.RawData);
|
||||||
|
Log.Debug(
|
||||||
|
$"HandlePrintMessageDetour Sender modified: {originalSenderData}({senderPtr}) -> {sender}({allocatedStringSender.Address})");
|
||||||
|
senderPtr = allocatedStringSender.Address;
|
||||||
|
}
|
||||||
|
|
||||||
// Print the original chat if it's handled.
|
// Print the original chat if it's handled.
|
||||||
if (isHandled)
|
if (isHandled)
|
||||||
{
|
{
|
||||||
|
|
@ -402,7 +419,7 @@ namespace Dalamud.Game.Gui
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
retVal = this.printMessageHook.Original(manager, chattype, pSenderName, messagePtr, senderid, parameter);
|
retVal = this.printMessageHook.Original(manager, chattype, senderPtr, messagePtr, senderid, parameter);
|
||||||
this.ChatMessageUnhandled?.Invoke(chattype, senderid, parsedSender, parsedMessage);
|
this.ChatMessageUnhandled?.Invoke(chattype, senderid, parsedSender, parsedMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -410,6 +427,7 @@ namespace Dalamud.Game.Gui
|
||||||
this.baseAddress = manager;
|
this.baseAddress = manager;
|
||||||
|
|
||||||
allocatedString?.Dispose();
|
allocatedString?.Dispose();
|
||||||
|
allocatedStringSender?.Dispose();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue