Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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<String> ROLEPLAY_CHANNELS = Set.of(
"rp", "whisper", "shout", "yell", "action", "scene", "dm");

private final ActivityManager manager;
private final Map<UUID, Deque<String>> history = new HashMap<>();

Expand All @@ -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()))) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}