в моем боте я реализовал фильтр ключевых слов, который бот просматривает в каждом сообщении, написанном в чате, до сих пор он работает, но я хочу его улучшить, из соображений уважения я не буду здесь помещать слова, поэтому я поставлю некоторые другие примеры,
Бот определяет, если вы напишете, например, «пошлый», «плохое слово», «привет».
Но я хочу определить, пишут ли они "hellooo", "vuulgarr", vulg4rr "
Это моя база, где хранятся слова:
badwords.js
var words = ["vulgar", "vulg4r", "hello", "badword4", "badword5"]
module.exports = words;
Это моя функция, которая проверяет, появляется ли плохое слово, разбивает любые слова, а затем удаляет сообщение, если находит результат, с помощью indexOf ()
index.js
const _ = require('lodash');
const badwords = require('./badwords');
/**
* Functions
*/
// compares every word to badWords array from badWords.js
function checkWord(word) {
return badwords.indexOf(word) > -1;
}
/**
* Main Module
*/
module.exports = function (self, nick, channel, message) {
'use strict';
message = message.toLowerCase();
message = message.split(' ');
nick = nick;
channel = channel.toLowerCase();
for (var i = 0, len = message.length; i < len; i++) {
if (checkWord(message[i])) {
self.send('.ban', channel, nick);
}
}
}
Есть идеи по его улучшению? Спасибо
Привет, спасибо, я подключаю бота к twitch.tv, поэтому, если бот является оператором и банит пользователя, сообщение удаляется (в окнах веб-чата), по этой причине я сказал, что бот удаляет сообщение
У нас может быть два указателя на обе строки для сравнения, но без смещения дубликатов:
function checkString(message, keyword) {
while(message.length > 0) {
if (checkPrefix(message, keyword)) return true
message = message.substr(1)
}
}
function checkPrefix(message, keyword) { // keyword is one of the keywords
let om = 0, ok = 0
while (true) {
if (ok >= keyword.length)
return true // we have finished reading keyword, and everything matched
if (om >= message.length)
return false // message is shorter than keyword
while (om + 1 < message.length && message.charAt(om) === message.charAt(om + 1))
om++ // skip consecutive repetitions in message
while (ok + 1 < keyword.length && keyword.charAt(ok) === keyword.charAt(ok + 1))
ok++ // skip consecutive repetitions in keyword
if (message.charAt(om) !== message.charAt(ok)) return false // encountered an inconsistent character
}
}
Просто просканируйте повторы в строке и сначала удалите их.
function removeDuplicates(string) {
for (let i = 0; i < string.length - 1; ) {
if (string.charAt(i) === string.charAt(i + 1)) {
string = string.substr(0, i) + string.substr(i + 1) // skip string[i]
} else {
i++ // not duplicate, proceed to next pair
}
}
}
Тогда вы можете сравнить напрямую:
removeDuplicates(message).indexOf(removeDuplicates(keyword)) !== -1
Вы можете применить это так:
for (const part in message.split(" ")) {
for (word in words) {
if (removeDuplicates(part).indexOf(removeDuplicates(word)) !== -1)
self.send(".ban", ...)
break
}
}
привет, я смотрел на код, и он кажется отличным, но я не уверен, куда его поместить
Добавил это в конец своего ответа. Не забудьте пометить ответ как "принятый", если это поможет :)
Отметьте ответ как Принято, если он решит вашу проблему.
Если быть точным, вы просто баните пользователя. Вы не можете действительно удалить сообщение в IRC.