From 1b43b5bc65c217d97ab4f6afc538030f4c547b51 Mon Sep 17 00:00:00 2001 From: Ryan Barlow <7389646+ryanbarlow97@users.noreply.github.com> Date: Fri, 25 Sep 2026 19:44:06 +0000 Subject: [PATCH] fix: exclude OOC chat from roleplay activity progress --- .../listeners/CharacterChatListener.java | 11 +++ .../listeners/CharacterChatChannelTest.java | 72 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 src/test/java/net/tfminecraft/activitytf/listeners/CharacterChatChannelTest.java diff --git a/src/main/java/net/tfminecraft/activitytf/listeners/CharacterChatListener.java b/src/main/java/net/tfminecraft/activitytf/listeners/CharacterChatListener.java index 31b7d5f..c49fd89 100644 --- a/src/main/java/net/tfminecraft/activitytf/listeners/CharacterChatListener.java +++ b/src/main/java/net/tfminecraft/activitytf/listeners/CharacterChatListener.java @@ -10,7 +10,9 @@ import java.util.Collection; import java.util.Deque; import java.util.HashMap; +import java.util.Locale; import java.util.Map; +import java.util.Set; import java.util.UUID; import java.util.regex.Pattern; @@ -24,6 +26,11 @@ public class CharacterChatListener implements Listener { private static final Pattern COLOUR = Pattern.compile("[&ยง](#[0-9a-fA-F]{6}|[0-9a-fk-orxA-FK-ORX])"); + // CharacterChatEvent also carries OOC and staff chat. Use RPCharacters channel IDs, + // not command aliases, and leave unknown channels out of roleplay activity credit. + private static final Set ROLEPLAY_CHANNELS = Set.of( + "rp", "whisper", "shout", "yell", "action", "scene", "dm"); + private final ActivityManager manager; private final Map> history = new HashMap<>(); @@ -36,6 +43,10 @@ public void onCharacterChat(CharacterChatEvent event) { if (event.getSender() == null || event.getMessage() == null) { return; } + String channel = event.getChannel(); + if (channel == null || !ROLEPLAY_CHANNELS.contains(channel.toLowerCase(Locale.ROOT))) { + return; + } UUID uuid = event.getSender().getUniqueId(); if (process(uuid, strip(event.getMessage()))) { diff --git a/src/test/java/net/tfminecraft/activitytf/listeners/CharacterChatChannelTest.java b/src/test/java/net/tfminecraft/activitytf/listeners/CharacterChatChannelTest.java new file mode 100644 index 0000000..a9990b8 --- /dev/null +++ b/src/test/java/net/tfminecraft/activitytf/listeners/CharacterChatChannelTest.java @@ -0,0 +1,72 @@ +package net.tfminecraft.activitytf.listeners; + +import net.tfminecraft.activitytf.managers.ActivityManager; +import net.tfminecraft.activitytf.managers.TestManagers; +import net.tfminecraft.activitytf.models.ActivityDef; +import net.tfminecraft.rpcharacters.chat.CharacterChatEvent; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; +import org.junit.jupiter.params.provider.ValueSource; + +import java.util.ArrayList; +import java.util.Set; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class CharacterChatChannelTest { + + private static final String MESSAGE = "all the ingredients were good"; + private final UUID uuid = UUID.randomUUID(); + private ActivityManager manager; + private CharacterChatListener listener; + private Player sender; + + @BeforeEach + void setUp() { + TestManagers.bukkit(); + manager = TestManagers.manager(new ActivityDef("ic_chat", "Roleplay Chat", Material.PAPER, + null, 50, 1, 0)); + manager.tasks(uuid).reveal(0); + listener = new CharacterChatListener(manager); + sender = TestManagers.player(uuid, Set.of(), new ArrayList<>()); + } + + @ParameterizedTest + @NullAndEmptySource + @ValueSource(strings = {"ooc", "OOC", "looc", "gooc", "fooc", "pooc", "admin", "helper", "unknown"}) + void nonRoleplayChatDoesNotCountOrPolluteRoleplayHistory(String channel) { + for (boolean command : new boolean[] {false, true}) { + listener.onCharacterChat(event(channel, command)); + } + assertEquals(0, manager.tasks(uuid).count("ic_chat")); + assertEquals(0, listener.historySize(uuid)); + + listener.onCharacterChat(event("rp", false)); + assertEquals(1, manager.tasks(uuid).count("ic_chat")); + } + + @ParameterizedTest + @ValueSource(strings = {"rp", "RP", "whisper", "shout", "yell", "action", "scene", "dm"}) + void roleplayChatStillCountsAndRejectsRepeats(String channel) { + listener.onCharacterChat(event(channel, false)); + assertEquals(1, manager.tasks(uuid).count("ic_chat")); + + listener.onCharacterChat(event(channel, true)); + assertEquals(1, manager.tasks(uuid).count("ic_chat")); + } + + @ParameterizedTest + @ValueSource(strings = {"rp", "whisper", "shout", "yell", "action", "scene", "dm"}) + void roleplayCommandsStillCount(String channel) { + listener.onCharacterChat(event(channel, true)); + assertEquals(1, manager.tasks(uuid).count("ic_chat")); + } + + private CharacterChatEvent event(String channel, boolean command) { + return new CharacterChatEvent(sender, null, channel, MESSAGE, "Test", Set.of(sender), false, command); + } +}