This commit is contained in:
Professional 2025-05-25 22:47:56 +07:00
parent 340fe8993c
commit 630a415aff

View File

@ -1,5 +1,4 @@
// Утилита для фильтрации нежелательного контента
const Filter = require('bad-words');
const fs = require('fs');
const path = require('path');
@ -40,28 +39,22 @@ function loadBadWordsFromFile(filePath) {
class ProfanityFilter {
constructor() {
// Создаем экземпляр фильтра с английскими словами по умолчанию
this.filter = new Filter({ placeHolder: '*' });
// Загружаем слова из файлов
const russianFileWords = loadBadWordsFromFile(path.join(__dirname, 'words.txt'));
const englishFileWords = loadBadWordsFromFile(path.join(__dirname, 'en.txt'));
// Объединяем все источники запрещенных слов
const allBadWords = [
this.badWords = [
...russianBadWords,
...datingAppBadWords,
...russianFileWords,
...englishFileWords
];
// Добавляем все слова в фильтр
this.filter.addWords(...allBadWords);
// Создаем регулярные выражения для проверки производных слов
this.generateWordPatterns(allBadWords);
this.generateWordPatterns(this.badWords);
console.log(`Всего загружено ${allBadWords.length} запрещенных слов`);
console.log(`Всего загружено ${this.badWords.length} запрещенных слов`);
}
/**
@ -106,9 +99,11 @@ class ProfanityFilter {
const normalizedText = text.toLowerCase()
.replace(/[\s\._\-]+/g, ''); // Удаляем пробелы, точки, подчеркивания, дефисы
// Проверяем сначала стандартным методом библиотеки bad-words
if (this.filter.isProfane(normalizedText) || this.filter.isProfane(text.toLowerCase())) {
return true;
// Проверяем на простое вхождение запрещенных слов
for (const word of this.badWords) {
if (normalizedText.includes(word.toLowerCase())) {
return true;
}
}
// Дополнительная проверка на производные слова через регулярные выражения
@ -138,8 +133,13 @@ class ProfanityFilter {
clean(text) {
if (!text) return '';
// Сначала используем стандартный метод библиотеки
let cleanedText = this.filter.clean(text);
let cleanedText = text;
// Проверяем и заменяем на звездочки каждое запрещенное слово
this.badWords.forEach(word => {
const regex = new RegExp(`\\b${word}\\b`, 'gi');
cleanedText = cleanedText.replace(regex, match => '*'.repeat(match.length));
});
// Затем проверяем на производные слова и заменяем их
this.wordPatterns.forEach(pattern => {
@ -154,17 +154,25 @@ class ProfanityFilter {
* @param {string|Array<string>} words - Слово или массив слов для добавления
*/
addWords(words) {
// Добавляем слова в стандартный фильтр
this.filter.addWords(words);
// Если слова переданы как массив
// Добавляем слова в список запрещенных слов
if (Array.isArray(words)) {
this.badWords.push(...words);
this.generateWordPatterns(words);
} else {
// Если передано одно слово
this.badWords.push(words);
this.generateWordPatterns([words]);
}
}
/**
* Проверяет является ли слово запрещенным
* @param {string} word - Слово для проверки
* @return {boolean} - true, если слово запрещено, иначе false
*/
isProfane(word) {
return this.hasProfanity(word);
}
}
// Экспортируем экземпляр фильтра для использования в приложении