diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e5a3f2..ae588a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,25 @@ Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.0.0/), и этот проект придерживается [Семантического Версионирования](https://semver.org/lang/ru/). +## [0.1.3] - 2023-10-25 + +### Добавлено + +- **Конфигурируемый порог мата**: + - Значение порога для определения мата (`0.5`) теперь берётся из конфигурации (`profanity_threshold`), с дефолтным значением `0.5`. + - Позволяет настроить чувствительность фильтра мата. + +- **Конфигурируемое регулярное выражение для проверки мата**: + - Регулярное выражение `PROFANITY_REGEX` теперь берётся из конфигурации (`profanity_regex`). + - Дефолтное значение установлено в предоставленное регулярное выражение. + - Позволяет настраивать или расширять правила фильтрации мата. + +### Изменено + +- **Обновление `ProfanityChecker` и `ChatEventHandler`**: + - Модифицированы для использования новых настроек из конфигурации. + - Улучшена гибкость и настраиваемость мода. + ## [0.1.2] - 2024-10-21 ### Изменено diff --git a/gradle.properties b/gradle.properties index 85f28c2..5debbd5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -38,7 +38,7 @@ mod_name=ChatIT # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=All Rights Reserved # The mod version. See https://semver.org/ -mod_version=0.1.2-BETA +mod_version=0.1.3-BETA # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html diff --git a/src/main/java/org/itqop/chatit/handlers/ChatEventHandler.java b/src/main/java/org/itqop/chatit/handlers/ChatEventHandler.java index 04230ca..a10fb15 100644 --- a/src/main/java/org/itqop/chatit/handlers/ChatEventHandler.java +++ b/src/main/java/org/itqop/chatit/handlers/ChatEventHandler.java @@ -8,6 +8,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.MinecraftServer; import net.minecraft.ChatFormatting; +import org.itqop.chatit.utils.Config; import org.itqop.chatit.utils.PlayerConfigManager; import org.itqop.chatit.utils.ProfanityChecker; @@ -36,14 +37,16 @@ public class ChatEventHandler { future.thenAccept(profanityScore -> { if (server != null) { server.execute(() -> { - if (profanityScore > 0.5 && !PlayerConfigManager.hasAdultContentEnabled(sender)) { + double threshold = Config.profanityThreshold; // Получаем порог из конфигурации + + if (profanityScore > threshold && !PlayerConfigManager.hasAdultContentEnabled(sender)) { MutableComponent errorComponent = createErrorMessage(sender, message); sender.sendSystemMessage(errorComponent); } else { for (ServerPlayer receiver : server.getPlayerList().getPlayers()) { PlayerConfigManager.ensurePlayerExists(receiver); - if (profanityScore > 0.5 && !PlayerConfigManager.hasAdultContentEnabled(receiver)) { + if (profanityScore > threshold && !PlayerConfigManager.hasAdultContentEnabled(receiver)) { continue; } diff --git a/src/main/java/org/itqop/chatit/utils/Config.java b/src/main/java/org/itqop/chatit/utils/Config.java index 9b20ef0..d18c13e 100644 --- a/src/main/java/org/itqop/chatit/utils/Config.java +++ b/src/main/java/org/itqop/chatit/utils/Config.java @@ -15,7 +15,9 @@ public class Config { public static ForgeConfigSpec.ConfigValue HOST_API; public static ForgeConfigSpec.BooleanValue DEFAULT_ADULT; - public static ForgeConfigSpec.BooleanValue USE_REGEX; // Добавили настройку regex + public static ForgeConfigSpec.BooleanValue USE_REGEX; + public static ForgeConfigSpec.DoubleValue PROFANITY_THRESHOLD; // Новое + public static ForgeConfigSpec.ConfigValue PROFANITY_REGEX; // Новое static { BUILDER.comment("Настройки ChatIT"); @@ -30,7 +32,15 @@ public class Config { USE_REGEX = BUILDER .comment("Использовать регулярное выражение при недоступности API") - .define("regex", true); // Значение по умолчанию false + .define("regex", false); + + PROFANITY_THRESHOLD = BUILDER + .comment("Порог для определения мата (0.0 - 1.0)") + .defineInRange("profanity_threshold", 0.5, 0.0, 1.0); // Дефолтное значение 0.5 + + PROFANITY_REGEX = BUILDER + .comment("Регулярное выражение для проверки мата") + .define("profanity_regex", "(?iu)\\b(?:(?:(?:у|[нз]а|(?:хитро|не)?вз?[ыьъ]|с[ьъ]|(?:и|ра)[зс]ъ?|(?:.\\B)+?[оаеи-])-?)?(?:[её](?:б(?!о[рй]|рач)|п[уа](?:ц|тс))|и[пб][ае][тцд][ьъ]).*?|(?:(?:н[иеа]|(?:ра|и)[зс]|[зд]?[ао](?:т|дн[оа])?|с(?:м[еи])?|а[пб]ч|в[ъы]?|пр[еи])-?)?ху(?:[яйиеёю]|л+и(?!ган)).*?|бл(?:[эя]|еа?)(?:[дт][ьъ]?)?|\\S*?(?:п(?:[иеё]зд|ид[аое]?р|ед(?:р(?!о)|[аое]р|ик)|охую)|бля(?:[дбц]|тс)|[ое]ху[яйиеё]|хуйн).*?|(?:о[тб]?|про|на|вы)?м(?:анд(?:[ауеыи](?:л(?:и[сзщ])?[ауеиы])?|ой|[ао]в.*?|юк(?:ов|[ауи])?|е[нт]ь|ища)|уд(?:[яаиое].+?|е?н(?:[ьюия]|ей))|[ао]л[ао]ф[ьъ](?:[яиюе]|[еёо]й))|елд[ауые].*?|ля[тд]ь|(?:[нз]а|по)х)\\b"); // Дефолтное регулярное выражение COMMON_CONFIG = BUILDER.build(); } @@ -38,11 +48,15 @@ public class Config { public static String hostApi; public static boolean defaultAdult; public static boolean useRegex; + public static double profanityThreshold; + public static String profanityRegex; @SubscribeEvent public static void onLoad(final ModConfigEvent event) { hostApi = HOST_API.get(); defaultAdult = DEFAULT_ADULT.get(); useRegex = USE_REGEX.get(); + profanityThreshold = PROFANITY_THRESHOLD.get(); + profanityRegex = PROFANITY_REGEX.get(); } } diff --git a/src/main/java/org/itqop/chatit/utils/ProfanityChecker.java b/src/main/java/org/itqop/chatit/utils/ProfanityChecker.java index 6588798..bf1a8de 100644 --- a/src/main/java/org/itqop/chatit/utils/ProfanityChecker.java +++ b/src/main/java/org/itqop/chatit/utils/ProfanityChecker.java @@ -10,15 +10,12 @@ import java.util.regex.Pattern; import com.google.gson.Gson; - public class ProfanityChecker { private static final Gson GSON = new Gson(); private static final HttpClient CLIENT = HttpClient.newHttpClient(); - // Ваше регулярное выражение для проверки мата - private static final String PROFANITY_REGEX = "(?iu)\\b(?:(?:(?:у|[нз]а|(?:хитро|не)?вз?[ыьъ]|с[ьъ]|(?:и|ра)[зс]ъ?|(?:.\\B)+?[оаеи-])-?)?(?:[её](?:б(?!о[рй]|рач)|п[уа](?:ц|тс))|и[пб][ае][тцд][ьъ]).*?|(?:(?:н[иеа]|(?:ра|и)[зс]|[зд]?[ао](?:т|дн[оа])?|с(?:м[еи])?|а[пб]ч|в[ъы]?|пр[еи])-?)?ху(?:[яйиеёю]|л+и(?!ган)).*?|бл(?:[эя]|еа?)(?:[дт][ьъ]?)?|\\S*?(?:п(?:[иеё]зд|ид[аое]?р|ед(?:р(?!о)|[аое]р|ик)|охую)|бля(?:[дбц]|тс)|[ое]ху[яйиеё]|хуйн).*?|(?:о[тб]?|про|на|вы)?м(?:анд(?:[ауеыи](?:л(?:и[сзщ])?[ауеиы])?|ой|[ао]в.*?|юк(?:ов|[ауи])?|е[нт]ь|ища)|уд(?:[яаиое].+?|е?н(?:[ьюия]|ей))|[ао]л[ао]ф[ьъ](?:[яиюе]|[еёо]й))|елд[ауые].*?|ля[тд]ь|(?:[нз]а|по)х)\\b"; - private static final Pattern PROFANITY_PATTERN = Pattern.compile(PROFANITY_REGEX); + private static Pattern profanityPattern = null; public static CompletableFuture checkMessageAsync(String message) { return CompletableFuture.supplyAsync(() -> { @@ -64,7 +61,10 @@ public class ProfanityChecker { } private static boolean containsProfanity(String message) { - return PROFANITY_PATTERN.matcher(message).find(); + if (profanityPattern == null || !profanityPattern.pattern().equals(Config.profanityRegex)) { + profanityPattern = Pattern.compile(Config.profanityRegex); + } + return profanityPattern.matcher(message).find(); } private static class MessageRequest {