discord.js v12如何实现带输入校验的问答式清除消息指令
discord.js v12 问答式clear指令校验修复方案
你现有代码的核心问题除了缺少输入校验外,还存在直接将用户消息对象传入bulkDelete的逻辑错误,修正后的完整代码如下:
module.exports = { name: 'clearr', description: "Clear messages!", async execute(client, message, args) { if(!args[0]) { // 过滤器仅匹配触发指令的用户,如需限制特定用户可改回你原有的固定ID const filter = m => m.author.id === message.author.id message.channel.send(`How many messages do you want to delete?`).then(() => { message.channel.awaitMessages(filter, { max: 1, time: 10000, errors: ['time'] }) .then(collected => { const userReply = collected.first() const deleteCount = parseInt(userReply.content) // 新增输入校验逻辑 if(isNaN(deleteCount) || deleteCount < 1 || deleteCount > 100) { return message.channel.send("Not a valid value").then(msg => msg.delete({timeout: 5000})) } // 执行批量删除,第二个参数true自动过滤14天以上无法删除的消息,避免API报错 message.channel.bulkDelete(deleteCount, true) .then(() => { message.channel.send (`\`${deleteCount} message\` successfully deleted!`) .then(msg => { msg.delete({ timeout: 5000 }) }) .catch(console.error); }) }) // 新增超时提示,可选配置 .catch(() => { message.channel.send("Request timed out, please try again").then(msg => msg.delete({timeout:5000})) }) }) } } }
核心修改说明
- 用
parseInt()转换用户输入内容,非数字内容转换结果为NaN - 校验逻辑同时覆盖三种非法场景:非数字输入、删除数量小于1、删除数量大于100(Discord API限制
bulkDelete最多一次性删除100条消息) - 修复原代码直接传消息对象给
bulkDelete的错误,改为传入转换后的合法数字 - 额外增加超时场景的友好提示,可根据需求自行删除
内容的提问来源于stack exchange,提问作者user17263435
相关产品推荐
相关产品推荐

