100 lines
4.9 KiB
JavaScript
100 lines
4.9 KiB
JavaScript
// Утилита для фильтрации нежелательного контента
|
||
const fs = require('fs');
|
||
const path = require('path');
|
||
|
||
let filterPromise;
|
||
|
||
// Списки пользовательских слов (из ранее прочитанной версии файла)
|
||
const russianBadWords = [
|
||
'блядь', 'хуй', 'пизда', 'ебать', 'ебал', 'ебло', 'хуесос', 'пидор', 'пидорас',
|
||
'мудак', 'говно', 'залупа', 'хер', 'манда', 'спермоед', 'шлюха', 'соска', 'шалава',
|
||
'дебил', 'дрочить', 'дрочка', 'ебанутый', 'выродок', 'шмара', 'сука', 'членосос',
|
||
'гандон', 'гондон', 'гнида', 'вагина', 'хуи', 'жопа', 'шлюхи', 'проститутка'
|
||
];
|
||
const datingAppBadWords = [
|
||
'проститутка', 'интим', 'секс за деньги', 'эскорт', 'интим услуги',
|
||
'заплачу', 'заплати', 'минет', 'массаж с интимом'
|
||
];
|
||
|
||
function loadBadWordsFromFile(filePath) {
|
||
try {
|
||
if (fs.existsSync(filePath)) {
|
||
const content = fs.readFileSync(filePath, 'utf8');
|
||
const words = content.split('\\n') // Используем \\n как разделитель строк
|
||
.map(word => word.trim())
|
||
.filter(word => word && !word.startsWith('//') && word.length >= 3);
|
||
console.log(`Загружено ${words.length} запрещенных слов из файла ${filePath}`);
|
||
return words;
|
||
}
|
||
} catch (error) {
|
||
console.error(`Ошибка при загрузке слов из файла ${filePath}:`, error.message);
|
||
}
|
||
return [];
|
||
}
|
||
|
||
function getInitializedFilter() {
|
||
if (!filterPromise) {
|
||
filterPromise = import('bad-words').then(async BadWordsModule => {
|
||
const FilterConstructor = BadWordsModule.default || BadWordsModule; // .default часто используется для ESM default export
|
||
const instance = new FilterConstructor();
|
||
console.log('Фильтр bad-words успешно инициализирован.');
|
||
|
||
// Загрузка и добавление пользовательских слов
|
||
const wordsPath = path.join(__dirname, 'words.txt');
|
||
const enWordsPath = path.join(__dirname, 'en.txt');
|
||
|
||
const russianFileWords = loadBadWordsFromFile(wordsPath);
|
||
const englishFileWords = loadBadWordsFromFile(enWordsPath);
|
||
|
||
const allCustomWords = [
|
||
...russianBadWords,
|
||
...datingAppBadWords,
|
||
...russianFileWords,
|
||
...englishFileWords
|
||
].filter(word => typeof word === 'string' && word.length > 0);
|
||
|
||
if (allCustomWords.length > 0) {
|
||
instance.addWords(...allCustomWords);
|
||
console.log(`Добавлено ${allCustomWords.length} пользовательских слов в фильтр bad-words.`);
|
||
} else {
|
||
console.log('Пользовательские слова для добавления в фильтр bad-words не найдены.');
|
||
}
|
||
|
||
return instance;
|
||
}).catch(err => {
|
||
console.error("Критическая ошибка: не удалось загрузить или инициализировать модуль bad-words:", err);
|
||
// Возвращаем "заглушку" фильтра, чтобы приложение не падало
|
||
return {
|
||
isProfane: (text) => { console.warn("Фильтр bad-words недоступен, проверка isProfane пропущена."); return false; },
|
||
clean: (text) => { console.warn("Фильтр bad-words недоступен, операция clean пропущена."); return text; }
|
||
};
|
||
});
|
||
}
|
||
return filterPromise;
|
||
}
|
||
|
||
// Экспортируем объект с асинхронными функциями, которые используют инициализированный фильтр
|
||
module.exports = {
|
||
isProfane: async (text) => {
|
||
// Добавляем проверку, что text является строкой и не пустой
|
||
if (typeof text !== 'string' || text.trim() === '') return false;
|
||
const filter = await getInitializedFilter();
|
||
return filter.isProfane(text);
|
||
},
|
||
clean: async (text) => {
|
||
if (typeof text !== 'string') return ''; // Возвращаем пустую строку, если text не строка
|
||
const filter = await getInitializedFilter();
|
||
return filter.clean(text);
|
||
},
|
||
validateObject: async (obj, fields) => {
|
||
const filter = await getInitializedFilter();
|
||
for (const field of fields) {
|
||
if (obj && typeof obj[field] === 'string') { // Проверяем, что obj существует и obj[field] является строкой
|
||
if (filter.isProfane(obj[field])) {
|
||
return { isProfane: true, field };
|
||
}
|
||
}
|
||
}
|
||
return { isProfane: false, field: null };
|
||
}
|
||
}; |