Skip to content
This repository has been archived by the owner on Jan 20, 2024. It is now read-only.

Commit

Permalink
SwearProtection: add regex mode support
Browse files Browse the repository at this point in the history
  • Loading branch information
TheFaser committed Dec 15, 2023
1 parent 8310b68 commit a425d05
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,17 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class SwearProtectionModule extends FModule {

private static final List<String> regexList = new ArrayList<>();

public SwearProtectionModule(FModule module, String name) {
super(module, name);
init();
Expand All @@ -26,8 +32,14 @@ public String replace(@Nullable Player player, @NotNull String string) {
if (hasNoPermission(player)) return string;
if (!hasNoPermission(player, "bypass")) return string;

String swearHideSymbol = config.getVaultString(player, this + ".symbol").repeat(3);
String swearMode = config.getVaultString(player, this + ".mode");

if (swearMode.equals("regex")) {
return SwearUtil.replaceRegex(string, swearHideSymbol);
}

String[] words = string.split(" ");
String swearHideSymbol = config.getVaultString(player, this + ".symbol");

StringBuilder stringBuilder = new StringBuilder();

Expand All @@ -37,7 +49,7 @@ public String replace(@Nullable Player player, @NotNull String string) {
String word = words[x];

stringBuilder.append(word);
if (SwearUtil.contains(stringBuilder.toString())) {
if (SwearUtil.containsInList(stringBuilder.toString())) {
String textWithSwear = stringBuilder.toString();

boolean remove = false;
Expand All @@ -48,7 +60,7 @@ public String replace(@Nullable Player player, @NotNull String string) {
}

textWithSwear = textWithSwear.substring(words[y].length());
if (!SwearUtil.contains(textWithSwear)) {
if (!SwearUtil.containsInList(textWithSwear)) {
words[y] = "";
remove = true;
}
Expand Down
33 changes: 26 additions & 7 deletions src/main/java/net/flectone/chat/util/SwearUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import net.flectone.chat.FlectoneChat;
import net.flectone.chat.model.file.FConfiguration;
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.Arrays;
Expand Down Expand Up @@ -35,11 +36,13 @@

public class SwearUtil {

private static final List<String> swears = new ArrayList<>();
private static final List<String> swearsList = new ArrayList<>();
private static final List<Pattern> swearsRegex = new ArrayList<>();
private static final HashMap<Character, List<Character>> synonymousChars = new HashMap<>();

static {
loadSwears();
loadSwearsList();
loadSwearsRegex();

synonymousChars.put('h', (Arrays.asList('x', 'х', 'н', 'n')));
synonymousChars.put('n', (Arrays.asList('н', 'й', 'и')));
Expand Down Expand Up @@ -81,16 +84,32 @@ public class SwearUtil {
synonymousChars.put('9', (Arrays.asList('r', 'я')));
}

public static void loadSwears() {
public static void loadSwearsList() {
FConfiguration swearsFile = FlectoneChat.getPlugin().getFileManager().getSwears();

if (swearsFile == null) return;

swears.clear();
swears.addAll(swearsFile.getStringList("list"));
swearsList.clear();
swearsList.addAll(swearsFile.getStringList("list"));
}

public static Boolean contains(String text) {
public static void loadSwearsRegex() {
FConfiguration swearsFile = FlectoneChat.getPlugin().getFileManager().getSwears();

if (swearsFile == null) return;

swearsRegex.clear();
swearsRegex.addAll(swearsFile.getStringList("regex").stream().map(Pattern::compile).toList());
}

public static String replaceRegex(@NotNull String text, @NotNull String replacement) {
for (Pattern pattern : swearsRegex) {
text = pattern.matcher(text).replaceAll(replacement);
}
return text;
}

public static Boolean containsInList(@NotNull String text) {

String validationText = text.toLowerCase();

Expand Down Expand Up @@ -118,7 +137,7 @@ public static Boolean contains(String text) {
return true;
}

for (String ss : swears) {
for (String ss : swearsList) {
for (int i = 0; i <= validationText.length() - ss.length(); i++) {
int tempi = i;
for (int j = 0; j <= ss.length(); j++) {
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ default:

swear-protection:
enable: false
mode: list
symbol: ""

patterns:
Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/settings/swears.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
# You are advised to check out our plugin documentation
# https://chat.flectone.net/docs

regex:
- (?iu)(?<=[\s,.:;"']|^)((у|[нз]а|(хитро|не)?вз?[ыьъ]|с[ьъ]|(и|ра)[зс]ъ?|(о[тб]|под)[ьъ]?|(.\B)+?[оаеи])?-?([её]б(?!о[рй])|и[пб][ае][тц]).*?|(н[иеа]|([дп]|верт)о|ра[зс]|з?а|с(ме)?|о(т|дно)?|апч)?-?ху([яйиеёю]|ли(?!ган)).*?|(в[зы]|(три|два|четыре)жды|(н|сук)а)?-?бл(я(?!(х|ш[кн]|мб)[ауеыио]).*?|[еэ][дт]ь?)|(ра[сз]|[зн]а|[со]|вы?|п(ере|р[оие]|од)|и[зс]ъ?|[ао]т)?п[иеё]зд.*?|(за)?п[ие]д[аое]?р([оа]м|(ас)?(ну.*?|и(ли)?[нщктл]ь?)?|(о(ч[еи])?|ас)?к(ой)|юг)[ауеы]?|манд([ауеыи](л(и[сзщ])?[ауеиы])?|ой|[ао]вошь?(е?к[ауе])?|юк(ов|[ауи])?)|муд([яаио].*?|е?н([ьюия]|ей))|мля([тд]ь)?|лять|([нз]а|по|пи)х|м[ао]л[ао]фь([яию]|[еёо]й))(?=[\s,.:;"']|$)
- (?iu)(?<=[\s,.:;"']|^)(([уyu]|[нзnz3][аa]|(хитро|не)?[вvwb][зz3]?[ыьъi]|[сsc][ьъ']|(и|[рpr][аa4])[зсzs]ъ?|([оo0][тбtb6]|[пp][оo0][дd9])[ьъ']?|(.\B)+?[оаеиeo])?-?([еёe][бb6](?!о[рй])|и[пб][ае][тц]).*?|([нn][иеаaie]|([дпdp]|[вv][еe3][рpr][тt])[оo0]|[рpr][аa][зсzc3]|[з3z]?[аa]|с(ме)?|[оo0]([тt]|дно)?|апч)?-?[хxh][уuy]([яйиеёюuie]|ли(?!ган)).*?|([вvw][зы3z]|(три|два|четыре)жды|(н|[сc][уuy][кk])[аa])?-?[бb6][лl]([яy](?!(х|ш[кн]|мб)[ауеыио]).*?|[еэe][дтdt][ь']?)|([рp][аa][сзc3z]|[знzn][аa]|[соsc]|[вv][ыi]?|[пp]([еe][рpr][еe]|[рrp][оиioеe]|[оo0][дd])|и[зс]ъ?|[аоao][тt])?[пpn][иеёieu][зz3][дd9].*?|([зz3][аa])?[пp][иеieu][дd][аоеaoe]?[рrp](ну.*?|[оаoa][мm]|([аa][сcs])?([иiu]([лl][иiu])?[нщктлtlsn]ь?)?|([оo](ч[еиei])?|[аa][сcs])?[кk]([оo]й)?|[юu][гg])[ауеыauyei]?|[мm][аa][нnh][дd]([ауеыayueiи]([лl]([иi][сзc3щ])?[ауеыauyei])?|[оo][йi]|[аоao][вvwb][оo](ш|sh)[ь']?([e]?[кk][ауеayue])?|юк(ов|[ауи])?)|[мm][уuy][дd6]([яyаиоaiuo0].*?|[еe]?[нhn]([ьюия'uiya]|ей))|мля([тд]ь)?|лять|([нз]а|по|пи)х|м[ао]л[ао]фь([яию]|[её]й))(?=[\s,.:;"']|$)

list:
- anal
- anus
Expand Down

0 comments on commit a425d05

Please sign in to comment.