Use exceptions for filters, highlight words that were filtered

This commit is contained in:
2022-02-27 18:29:41 +01:00
parent b6aa5bed73
commit 23e7c57333
8 changed files with 118 additions and 54 deletions
@@ -3,15 +3,14 @@ package com.alttd.chat.managers;
import com.alttd.chat.ChatAPI;
import com.alttd.chat.config.RegexConfig;
import com.alttd.chat.objects.ChatFilter;
import com.alttd.chat.objects.ModifiableString;
import com.alttd.chat.util.ALogger;
import net.luckperms.api.LuckPerms;
import net.luckperms.api.cacheddata.CachedPermissionData;
import net.luckperms.api.model.user.User;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexManager {
@@ -29,15 +28,15 @@ public class RegexManager {
chatFilters.add(filter);
}
public static String replaceText(String playerName, UUID uuid, String text) { // TODO loop all objects in the list and check if they violate based on the MATCHER
return replaceText(playerName, uuid, text, true);
public static boolean filterText(String playerName, UUID uuid, ModifiableString modifiableString, String channel) { // TODO loop all objects in the list and check if they violate based on the MATCHER
return filterText(playerName, uuid, modifiableString, true, channel);
}
public static String replaceText(String playerName, UUID uuid, String text, boolean matcher) {
public static boolean filterText(String playerName, UUID uuid, ModifiableString modifiableString, boolean matcher, String channel) {
User user = ChatAPI.get().getLuckPerms().getUserManager().getUser(uuid);
if (user == null) {
ALogger.warn("Tried to check chat filters for a user who doesn't exist in LuckPerms");
return null;
return false;
}
CachedPermissionData permissionData = user.getCachedData().getPermissionData();
for(ChatFilter chatFilter : chatFilters) {
@@ -45,22 +44,24 @@ public class RegexManager {
case CHAT:
break;
case REPLACE:
text = chatFilter.replaceText(text);
chatFilter.replaceText(modifiableString);
break;
case BLOCK:
if(chatFilter.matches(text) && !permissionData.checkPermission("chat.bypass-filter." + chatFilter.getName()).asBoolean()) { // todo find a better way to do this?
if(!permissionData.checkPermission("chat.bypass-filter-channel." + channel).asBoolean() &&
!permissionData.checkPermission("chat.bypass-filter." + chatFilter.getName()).asBoolean() &&
chatFilter.matches(modifiableString)) { // todo find a better way to do this?
ALogger.info(playerName + " triggered the chat filter for " + chatFilter.getName() + ".");
return null;
return false;
}
break;
case REPLACEMATCHER:
if(matcher) {
text = chatFilter.replaceMatcher(text);
chatFilter.replaceMatcher(modifiableString);
}
break;
}
}
return text;
return true;
}
}
@@ -42,34 +42,57 @@ public class ChatFilter {
return this.exclusions;
}
public boolean matches(String input) {
public boolean matches(ModifiableString filterableString) {
String input = filterableString.string();
Matcher matcher = pattern.matcher(input);
return (matcher.find() || matcher.matches());
while (matcher.find())
if (!isException(input, matcher.start())) {
filterableString.string(filterableString.string().replaceFirst(matcher.group(), "<gold>" + matcher.group() + "</gold>"));
return true;
}
return matcher.matches();
}
public String replaceText(String input) {
public boolean isException(String string, int start)
{
char[] chars = string.toCharArray();
if (start != 0) { //go to start of word if not at start of string
while (chars[start] != ' ' && start > 0)
start--;
start += 1; //go past the space
}
String match = string.substring(start);
for (String s : getExclusions()) {
if (match.toLowerCase().startsWith(s.toLowerCase()))
return true;
}
return false;
}
public void replaceText(ModifiableString modifiableString) {
String input = modifiableString.string();
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
String group = matcher.group(); // todo debug
if(getExclusions().stream().noneMatch(s -> s.equalsIgnoreCase(group))) { // idk how heavy this is:/
input = input.replace(group, getReplacement());
if (getExclusions().stream().noneMatch(s -> s.equalsIgnoreCase(group))) { // idk how heavy this is:/
modifiableString.string(input.replace(group, getReplacement()));
}
}
return input;
}
public String replaceMatcher(String input) {
int lenght;
public void replaceMatcher(ModifiableString modifiableString) {
String input = modifiableString.string();
int length;
try {
lenght = Integer.parseInt(replacement);
length = Integer.parseInt(replacement);
} catch (NumberFormatException e) {
lenght = 3; // could load this from config and make it cleaner
length = 3; // could load this from config and make it cleaner
}
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
String group = matcher.group();
input = input.replace(group, group.substring(0, lenght));
modifiableString.string(input.replace(group, group.substring(0, length)));
}
return input;
}
}
@@ -0,0 +1,17 @@
package com.alttd.chat.objects;
public class ModifiableString {
private String string;
public ModifiableString(String string) {
this.string = string;
}
public void string(String string) {
this.string = string;
}
public String string() {
return string;
}
}