feat: Make profanity threshold and regex configurable
- Added `profanity_threshold` to `config/chatit.toml` with a default value of `0.5`. - Added `profanity_regex` to `config/chatit.toml` with the provided regular expression for profanity filtering. - Updated `ProfanityChecker` and `ChatEventHandler` to utilize the new configuration settings. - Enhanced the flexibility and configurability of the mod.
This commit is contained in:
		
							parent
							
								
									afab8962f8
								
							
						
					
					
						commit
						280eb64159
					
				
							
								
								
									
										19
									
								
								CHANGELOG.md
								
								
								
								
							
							
						
						
									
										19
									
								
								CHANGELOG.md
								
								
								
								
							| 
						 | 
					@ -4,6 +4,25 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.0.0/), и этот проект придерживается [Семантического Версионирования](https://semver.org/lang/ru/).
 | 
					Формат основан на [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
 | 
					## [0.1.2] - 2024-10-21
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Изменено
 | 
					### Изменено
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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.
 | 
					# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
 | 
				
			||||||
mod_license=All Rights Reserved
 | 
					mod_license=All Rights Reserved
 | 
				
			||||||
# The mod version. See https://semver.org/
 | 
					# 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.
 | 
					# 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.
 | 
					# This should match the base package used for the mod sources.
 | 
				
			||||||
# See https://maven.apache.org/guides/mini/guide-naming-conventions.html
 | 
					# See https://maven.apache.org/guides/mini/guide-naming-conventions.html
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,6 +8,7 @@ import net.minecraft.network.chat.Component;
 | 
				
			||||||
import net.minecraft.network.chat.MutableComponent;
 | 
					import net.minecraft.network.chat.MutableComponent;
 | 
				
			||||||
import net.minecraft.server.MinecraftServer;
 | 
					import net.minecraft.server.MinecraftServer;
 | 
				
			||||||
import net.minecraft.ChatFormatting;
 | 
					import net.minecraft.ChatFormatting;
 | 
				
			||||||
 | 
					import org.itqop.chatit.utils.Config;
 | 
				
			||||||
import org.itqop.chatit.utils.PlayerConfigManager;
 | 
					import org.itqop.chatit.utils.PlayerConfigManager;
 | 
				
			||||||
import org.itqop.chatit.utils.ProfanityChecker;
 | 
					import org.itqop.chatit.utils.ProfanityChecker;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,14 +37,16 @@ public class ChatEventHandler {
 | 
				
			||||||
        future.thenAccept(profanityScore -> {
 | 
					        future.thenAccept(profanityScore -> {
 | 
				
			||||||
            if (server != null) {
 | 
					            if (server != null) {
 | 
				
			||||||
                server.execute(() -> {
 | 
					                server.execute(() -> {
 | 
				
			||||||
                    if (profanityScore > 0.5 && !PlayerConfigManager.hasAdultContentEnabled(sender)) {
 | 
					                    double threshold = Config.profanityThreshold; // Получаем порог из конфигурации
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (profanityScore > threshold && !PlayerConfigManager.hasAdultContentEnabled(sender)) {
 | 
				
			||||||
                        MutableComponent errorComponent = createErrorMessage(sender, message);
 | 
					                        MutableComponent errorComponent = createErrorMessage(sender, message);
 | 
				
			||||||
                        sender.sendSystemMessage(errorComponent);
 | 
					                        sender.sendSystemMessage(errorComponent);
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        for (ServerPlayer receiver : server.getPlayerList().getPlayers()) {
 | 
					                        for (ServerPlayer receiver : server.getPlayerList().getPlayers()) {
 | 
				
			||||||
                            PlayerConfigManager.ensurePlayerExists(receiver);
 | 
					                            PlayerConfigManager.ensurePlayerExists(receiver);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            if (profanityScore > 0.5 && !PlayerConfigManager.hasAdultContentEnabled(receiver)) {
 | 
					                            if (profanityScore > threshold && !PlayerConfigManager.hasAdultContentEnabled(receiver)) {
 | 
				
			||||||
                                continue;
 | 
					                                continue;
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,7 +15,9 @@ public class Config {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static ForgeConfigSpec.ConfigValue<String> HOST_API;
 | 
					    public static ForgeConfigSpec.ConfigValue<String> HOST_API;
 | 
				
			||||||
    public static ForgeConfigSpec.BooleanValue DEFAULT_ADULT;
 | 
					    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<String> PROFANITY_REGEX; // Новое
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static {
 | 
					    static {
 | 
				
			||||||
        BUILDER.comment("Настройки ChatIT");
 | 
					        BUILDER.comment("Настройки ChatIT");
 | 
				
			||||||
| 
						 | 
					@ -30,7 +32,15 @@ public class Config {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        USE_REGEX = BUILDER
 | 
					        USE_REGEX = BUILDER
 | 
				
			||||||
                .comment("Использовать регулярное выражение при недоступности API")
 | 
					                .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();
 | 
					        COMMON_CONFIG = BUILDER.build();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -38,11 +48,15 @@ public class Config {
 | 
				
			||||||
    public static String hostApi;
 | 
					    public static String hostApi;
 | 
				
			||||||
    public static boolean defaultAdult;
 | 
					    public static boolean defaultAdult;
 | 
				
			||||||
    public static boolean useRegex;
 | 
					    public static boolean useRegex;
 | 
				
			||||||
 | 
					    public static double profanityThreshold;
 | 
				
			||||||
 | 
					    public static String profanityRegex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @SubscribeEvent
 | 
					    @SubscribeEvent
 | 
				
			||||||
    public static void onLoad(final ModConfigEvent event) {
 | 
					    public static void onLoad(final ModConfigEvent event) {
 | 
				
			||||||
        hostApi = HOST_API.get();
 | 
					        hostApi = HOST_API.get();
 | 
				
			||||||
        defaultAdult = DEFAULT_ADULT.get();
 | 
					        defaultAdult = DEFAULT_ADULT.get();
 | 
				
			||||||
        useRegex = USE_REGEX.get();
 | 
					        useRegex = USE_REGEX.get();
 | 
				
			||||||
 | 
					        profanityThreshold = PROFANITY_THRESHOLD.get();
 | 
				
			||||||
 | 
					        profanityRegex = PROFANITY_REGEX.get();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,15 +10,12 @@ import java.util.regex.Pattern;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.google.gson.Gson;
 | 
					import com.google.gson.Gson;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ProfanityChecker {
 | 
					public class ProfanityChecker {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static final Gson GSON = new Gson();
 | 
					    private static final Gson GSON = new Gson();
 | 
				
			||||||
    private static final HttpClient CLIENT = HttpClient.newHttpClient();
 | 
					    private static final HttpClient CLIENT = HttpClient.newHttpClient();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Ваше регулярное выражение для проверки мата
 | 
					    private static Pattern profanityPattern = null;
 | 
				
			||||||
    private static final String PROFANITY_REGEX = "(?iu)\\b(?:(?:(?:у|[нз]а|(?:хитро|не)?вз?[ыьъ]|с[ьъ]|(?:и|ра)[зс]ъ?|(?:.\\B)+?[оаеи-])-?)?(?:[её](?:б(?!о[рй]|рач)|п[уа](?:ц|тс))|и[пб][ае][тцд][ьъ]).*?|(?:(?:н[иеа]|(?:ра|и)[зс]|[зд]?[ао](?:т|дн[оа])?|с(?:м[еи])?|а[пб]ч|в[ъы]?|пр[еи])-?)?ху(?:[яйиеёю]|л+и(?!ган)).*?|бл(?:[эя]|еа?)(?:[дт][ьъ]?)?|\\S*?(?:п(?:[иеё]зд|ид[аое]?р|ед(?:р(?!о)|[аое]р|ик)|охую)|бля(?:[дбц]|тс)|[ое]ху[яйиеё]|хуйн).*?|(?:о[тб]?|про|на|вы)?м(?:анд(?:[ауеыи](?:л(?:и[сзщ])?[ауеиы])?|ой|[ао]в.*?|юк(?:ов|[ауи])?|е[нт]ь|ища)|уд(?:[яаиое].+?|е?н(?:[ьюия]|ей))|[ао]л[ао]ф[ьъ](?:[яиюе]|[еёо]й))|елд[ауые].*?|ля[тд]ь|(?:[нз]а|по)х)\\b";
 | 
					 | 
				
			||||||
    private static final Pattern PROFANITY_PATTERN = Pattern.compile(PROFANITY_REGEX);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static CompletableFuture<Double> checkMessageAsync(String message) {
 | 
					    public static CompletableFuture<Double> checkMessageAsync(String message) {
 | 
				
			||||||
        return CompletableFuture.supplyAsync(() -> {
 | 
					        return CompletableFuture.supplyAsync(() -> {
 | 
				
			||||||
| 
						 | 
					@ -64,7 +61,10 @@ public class ProfanityChecker {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static boolean containsProfanity(String message) {
 | 
					    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 {
 | 
					    private static class MessageRequest {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue