package tterrag.tppibot.reactions; import static tterrag.tppibot.reactions.CharacterSpam.SpamReasons.*; import java.io.InputStream; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; import org.pircbotx.Colors; import org.pircbotx.PircBotX; import org.pircbotx.hooks.events.DisconnectEvent; import org.pircbotx.hooks.events.MessageEvent; import tterrag.tppibot.Main; import tterrag.tppibot.config.Config; import tterrag.tppibot.interfaces.ICommand.PermLevel; import tterrag.tppibot.interfaces.IReaction; import tterrag.tppibot.registry.PermRegistry; import tterrag.tppibot.util.IRCUtils; import com.google.common.collect.ImmutableList; import com.google.common.eventbus.Subscribe; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; public class BannedWords implements IReaction { private List<String> bannedWords; private Config bannedConfig; public BannedWords() { bannedConfig = new Config("bannedWords.json"); bannedWords = new Gson().fromJson(bannedConfig.getText(), new TypeToken<List<String>>() { }.getType()); if (bannedWords == null) { loadDefaultWords(); } } @Override public void onMessage(MessageEvent<?> event) { if (Main.spamFilter.filtersEnabled(event.getChannel().getName())) { for (String s : bannedWords) { Matcher matcher = Pattern.compile("\\b(" + s + ")\\b", Pattern.CASE_INSENSITIVE).matcher(Colors.removeFormattingAndColors(event.getMessage())); while (matcher.find()) { String word = matcher.group(); if (word.equalsIgnoreCase(s)) { PermLevel level = PermRegistry.INSTANCE.getPermLevelForUser(event.getChannel(), event.getUser()); if (!IRCUtils.isPermLevelAboveOrEqualTo(level, PermLevel.TRUSTED)) { Main.spamFilter.finish(Main.spamFilter.timeout(event, CURSE) ? event.getUser() : null, CURSE, event.getMessage()); } } } } } } @SneakyThrows private void loadDefaultWords() { InputStream in = Main.class.getResourceAsStream("/curses.txt"); bannedWords = IOUtils.readLines(in); } @Subscribe public void onDisconnect(DisconnectEvent<PircBotX> event) { bannedConfig.writeJsonToFile(bannedWords); } public void addWord(String string) { if (!bannedWords.contains(string)) { bannedWords.add(string); } } public void removeWord(String string) { bannedWords.remove(string); } public List<String> getBannedWords() { return ImmutableList.copyOf(bannedWords); } }