如何将 `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 }))
}
我正在为脏话添加一个自动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 }))
}