chatfilter: add option to block repeated public messages

Co-authored-by: Adam <Adam@sigterm.info>
This commit is contained in:
Corey Forsyth
2020-05-22 14:44:36 -04:00
committed by Adam
parent 0715e3c9fc
commit f85f6be5cf
3 changed files with 28 additions and 1 deletions

View File

@@ -130,4 +130,15 @@ public interface ChatFilterConfig extends Config
{ {
return false; 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;
}
} }

View File

@@ -195,7 +195,9 @@ public class ChatFilterPlugin extends Plugin
Duplicate duplicateCacheEntry = duplicateChatCache.get(name + ":" + message); Duplicate duplicateCacheEntry = duplicateChatCache.get(name + ":" + message);
if (duplicateCacheEntry != null) 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; duplicateCount = duplicateCacheEntry.count;
} }
} }

View File

@@ -368,4 +368,18 @@ public class ChatFilterPluginTest
assertEquals(1, client.getIntStack()[client.getIntStackSize() - 3]); assertEquals(1, client.getIntStack()[client.getIntStackSize() - 3]);
assertEquals("testMessage (4)", client.getStringStack()[client.getStringStackSize() - 1]); 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]);
}
} }