diff --git a/Dalamud/Game/ChatHandlers.cs b/Dalamud/Game/ChatHandlers.cs index 3c2d59474..5a5d99c69 100644 --- a/Dalamud/Game/ChatHandlers.cs +++ b/Dalamud/Game/ChatHandlers.cs @@ -91,15 +91,38 @@ namespace Dalamud.Game { public ChatHandlers(Dalamud dalamud) { this.dalamud = dalamud; - + + dalamud.Framework.Gui.Chat.OnCheckMessageHandled += OnCheckMessageHandled; dalamud.Framework.Gui.Chat.OnChatMessageRaw += OnChatMessage; } + private void OnCheckMessageHandled(XivChatType type, uint senderid, ref SeString sender, ref SeString message, ref bool isHandled) { + var textVal = message.TextValue; + + var matched = this.rmtRegex.IsMatch(textVal); + if (matched) + { + // This seems to be a RMT ad - let's not show it + Log.Debug("Handled RMT ad: " + message.TextValue); + isHandled = true; + return; + } + + + if (this.dalamud.Configuration.BadWords != null && + this.dalamud.Configuration.BadWords.Any(x => textVal.Contains(x))) + { + // This seems to be in the user block list - let's not show it + Log.Debug("Blocklist triggered"); + isHandled = true; + return; + } + } public string LastLink { get; private set; } private void OnChatMessage(XivChatType type, uint senderId, ref StdString sender, - ref StdString message, ref bool isHandled) { + ref StdString message, bool isHandled) { if (type == XivChatType.Notice && !this.hasSeenLoadingMsg) { var assemblyVersion = Assembly.GetAssembly(typeof(ChatHandlers)).GetName().Version.ToString(); @@ -142,25 +165,9 @@ namespace Dalamud.Game { return; #endif - var matched = this.rmtRegex.IsMatch(message.Value); - if (matched) { - // This seems to be a RMT ad - let's not show it - Log.Debug("Handled RMT ad"); - isHandled = true; - return; - } - var messageVal = message.Value; var senderVal = sender.Value; - if (this.dalamud.Configuration.BadWords != null && - this.dalamud.Configuration.BadWords.Any(x => messageVal.Contains(x))) { - // This seems to be in the user block list - let's not show it - Log.Debug("Blocklist triggered"); - isHandled = true; - return; - } - if (type == XivChatType.RetainerSale) { foreach (var regex in retainerSaleRegexes[dalamud.StartInfo.Language]) diff --git a/Dalamud/Game/Command/CommandManager.cs b/Dalamud/Game/Command/CommandManager.cs index 98ca22642..794a0f93d 100644 --- a/Dalamud/Game/Command/CommandManager.cs +++ b/Dalamud/Game/Command/CommandManager.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Text.RegularExpressions; using Dalamud.Game.Chat; +using Dalamud.Game.Chat.SeStringHandling; using Dalamud.Game.Internal.Libc; using Serilog; @@ -54,13 +55,12 @@ namespace Dalamud.Game.Command { break; } - dalamud.Framework.Gui.Chat.OnChatMessageRaw += OnChatMessage; + dalamud.Framework.Gui.Chat.OnCheckMessageHandled += OnCheckMessageHandled; } - private void OnChatMessage(XivChatType type, uint senderId, ref StdString sender, - ref StdString message, ref bool isHandled) { + private void OnCheckMessageHandled(XivChatType type, uint senderId, ref SeString sender, ref SeString message, ref bool isHandled) { if (type == XivChatType.ErrorMessage && senderId == 0) { - var cmdMatch = this.currentLangCommandRegex.Match(message.Value).Groups["command"]; + var cmdMatch = this.currentLangCommandRegex.Match(message.TextValue).Groups["command"]; if (cmdMatch.Success) { // Yes, it's a chat command. var command = cmdMatch.Value; diff --git a/Dalamud/Game/Internal/Gui/ChatGui.cs b/Dalamud/Game/Internal/Gui/ChatGui.cs index b1b94465a..14e919251 100644 --- a/Dalamud/Game/Internal/Gui/ChatGui.cs +++ b/Dalamud/Game/Internal/Gui/ChatGui.cs @@ -11,30 +11,52 @@ using Serilog; namespace Dalamud.Game.Internal.Gui { public sealed class ChatGui : IDisposable { + private readonly Queue chatQueue = new Queue(); + + #region Events + + public delegate void OnMessageDelegate(XivChatType type, uint senderId, ref SeString sender, ref SeString message, bool isHandled); + public delegate void OnMessageRawDelegate(XivChatType type, uint senderId, ref StdString sender, ref StdString message, bool isHandled); + public delegate void OnCheckMessageHandledDelegate(XivChatType type, uint senderId, ref SeString sender, ref SeString message, ref bool isHandled); + + /// + /// Event that allows you to stop messages from appearing in chat by setting the isHandled parameter to true. + /// + public event OnCheckMessageHandledDelegate OnCheckMessageHandled; + + /// + /// Event that will be fired when a chat message is sent to chat by the game. + /// + public event OnMessageDelegate OnChatMessage; + + /// + /// Event that will be fired when a chat message is sent by the game, containing raw, unparsed data. + /// + [Obsolete("Please use OnChatMessage instead. For modifications, it will take precedence.")] + public event OnMessageRawDelegate OnChatMessageRaw; + + #endregion + + #region Hooks + + private readonly Hook printMessageHook; + + private readonly Hook populateItemLinkHook; + + #endregion + + #region Delegates + [UnmanagedFunctionPointer(CallingConvention.ThisCall)] private delegate IntPtr PrintMessageDelegate(IntPtr manager, XivChatType chatType, IntPtr senderName, - IntPtr message, - uint senderId, IntPtr parameter); - - 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); + IntPtr message, + uint senderId, IntPtr parameter); [UnmanagedFunctionPointer(CallingConvention.ThisCall)] private delegate void PopulateItemLinkDelegate(IntPtr linkObjectPtr, IntPtr itemInfoPtr); - private readonly Queue chatQueue = new Queue(); - - 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; + #endregion public int LastLinkedItemId { get; private set; } public byte LastLinkedItemFlags { get; private set; } @@ -106,8 +128,10 @@ namespace Dalamud.Game.Internal.Gui { // Call events var isHandled = false; - OnChatMessage?.Invoke(chattype, senderid, ref parsedSender, ref parsedMessage, ref isHandled); - OnChatMessageRaw?.Invoke(chattype, senderid, ref sender, ref message, ref isHandled); + OnCheckMessageHandled?.Invoke(chattype, senderid, ref parsedSender, ref parsedMessage, ref isHandled); + + OnChatMessage?.Invoke(chattype, senderid, ref parsedSender, ref parsedMessage, isHandled); + OnChatMessageRaw?.Invoke(chattype, senderid, ref sender, ref message, isHandled); var newEdited = parsedMessage.Encode();