Я хочу, чтобы мой бот удалил сообщение, содержащее ключевое слово или похожие символы - PullRequest
0 голосов
/ 18 декабря 2018

в моем боте я применил фильтр ключевых слов, который бот просматривает в каждом сообщении, которое пишется в чате, до сих пор оно работает, но я хочу улучшить его, из соображений уважения я не буду здесь помещать слова, поэтомуЯ приведу еще один пример:

Бот обнаружит, если вы напишите, например, «vulgar», «badword», «hello»

Но я хочу добиться, чтобы определить, пишут ли они"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);
        }
    }
}

Любая идея по улучшениюэто ?, спасибо

1 Ответ

0 голосов
/ 20 декабря 2018

Более сложный метод

Мы можем иметь два указателя на обе строки для сравнения, но пропуская смещения при дубликатах:

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
    }
}
...