diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterConfig.java index d5592318b6..86eff01756 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterConfig.java @@ -130,4 +130,15 @@ public interface ChatFilterConfig extends Config { return false; } + + @ConfigItem( + keyName = "maxRepeatedPublicChats", + name = "Max repeated public chats", + description = "Block player chat message if repeated this many times. 0 is off", + position = 11 + ) + default int maxRepeatedPublicChats() + { + return 0; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterPlugin.java index ee74245a59..607d50d3f9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterPlugin.java @@ -195,7 +195,9 @@ public class ChatFilterPlugin extends Plugin Duplicate duplicateCacheEntry = duplicateChatCache.get(name + ":" + message); if (duplicateCacheEntry != null) { - blockMessage = duplicateCacheEntry.messageId != messageId; + blockMessage = duplicateCacheEntry.messageId != messageId || + ((chatMessageType == PUBLICCHAT || chatMessageType == MODCHAT) && + config.maxRepeatedPublicChats() > 0 && duplicateCacheEntry.count > config.maxRepeatedPublicChats()); duplicateCount = duplicateCacheEntry.count; } } diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/chatfilter/ChatFilterPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/chatfilter/ChatFilterPluginTest.java index 3964273a92..de4c104e3d 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/chatfilter/ChatFilterPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/chatfilter/ChatFilterPluginTest.java @@ -368,4 +368,18 @@ public class ChatFilterPluginTest assertEquals(1, client.getIntStack()[client.getIntStackSize() - 3]); assertEquals("testMessage (4)", client.getStringStack()[client.getStringStackSize() - 1]); } + + @Test + public void publicChatFilteredOnDuplicate() + { + when(chatFilterConfig.collapsePlayerChat()).thenReturn(true); + when(chatFilterConfig.maxRepeatedPublicChats()).thenReturn(2); + chatFilterPlugin.onChatMessage(new ChatMessage(mockMessageNode(1), ChatMessageType.PUBLICCHAT, "testName", "testMessage", null, 0)); + chatFilterPlugin.onChatMessage(new ChatMessage(mockMessageNode(1), ChatMessageType.PUBLICCHAT, "testName", "testMessage", null, 0)); + chatFilterPlugin.onChatMessage(new ChatMessage(mockMessageNode(1), ChatMessageType.PUBLICCHAT, "testName", "testMessage", null, 0)); + ScriptCallbackEvent event = createCallbackEvent("testName", "testMessage", ChatMessageType.PUBLICCHAT); + chatFilterPlugin.onScriptCallbackEvent(event); + + assertEquals(0, client.getIntStack()[client.getIntStackSize() - 3]); + } } \ No newline at end of file