如何将 `config.json` 中列表中的字母替换为使用 discord.js 的注释?

How to replace letters from a list in `config.json` to noting using discord.js?

我正在为脏话添加一个自动mod,我希望机器人从 config.json 中名为“badwords”的列表中查找任何单词并将其删除,这有效,但是如果成员添加 " "(space) 或 "_" 或类似的东西,它会绕过检查,所以我添加了 .replace(//s/g,''),它适用于 space,但适用于破折号和其他东西,我想在 config.json 中使用一个列表,但我似乎无法通过列表将机器人带到 运行,没有错误,那么我该如何解决这个问题?

这是我的代码:

const config = require('../../config');


module.exports = async (client, message) => {
    if (!message.guild) return;

    if(!message.author.bot) {
    
    var badwords = config.badwords;
    var thingstoremove = config.thingstoremove;

    for (var i = 0; i < badwords.length; i++) {
      if (message.content.toLowerCase().replace(thingstoremove[8],'').includes(badwords[i])) {
        message.delete()
        message.reply("Watch your language!").then(m => m.delete({timeout: 10000}))
        break;
      }
    }
  }
}

config.json:

{
  "badwords": ["test1", "test2", "test3", "test4", "test5"],
  "thingstoremove": ["-", "_", ".", ",", "`", "~", "@", "#"]
}

谢谢。

问题是:

  • 代码正在尝试替换消息中未定义的值,作为索引号。在数组中找不到 8(因为数组有 8 个项目;并且索引从 0 (see) 开始,所以最后一个索引将是 7),即 thingstoremove[8]
  • 此外,如果您要删除您的所有字符 数组,你需要将它们包含在正则表达式中——如果你要使用 .replace — 而不是单个元素。

因此,您应该从正则表达式的数组中创建一组字符,以捕获任何字符并替换它们:

const regex = new RegExp(`[${thingstoremove.join('')}]`, 'g')

然后在 .replace:

上使用正则表达式
if (message.content.toLowerCase().replace(regex, '').includes(badwords[i]))

结果代码:

const config = require('../../config');

module.exports = async (client, message) => {
    if (!message.guild) return;

    if (!message.author.bot) {
        var badwords = config.badwords;
        var thingstoremove = config.thingstoremove;
    
        const regex = new RegExp(`[${thingstoremove.join('')}]`, 'g')
    
        console.log(regex)

        for (var i = 0; i < badwords.length; i++) {
            if (message.content.toLowerCase().replace(regex, '').includes(badwords[i])) {
                message.delete()
                message.reply("Watch your language!").then(m => m.delete({timeout: 10000}))
                break;
            }
        }
    }
}

使用这个简单的一行代码得到完全替换的字符串

let newStr = thingstoremove.reduce((a, c) => a.replaceAll(c, ""), message.content)

然后用这个进行简单检查:

if (badwords.some(b => newStr.includes(b))) {
  message.delete()
  message.reply("Watch your language!").then(m => m.delete({ timeout: 10000 }))
}