Discord.js如何实现指定频道用户消息5秒后删除且不删机器人消息
Discord.js 定时删除指定频道用户消息代码修复
现存问题
- 逻辑执行顺序错误:代码中
if (!message.content.startsWith(prefix)) return;一行会拦截所有非指令类普通消息,导致后续指定频道的删除逻辑永远不会被触发 - 指定频道的删除逻辑代码无效:
if (channel) (msg => msg.delete({ timeout: 5000 }));仅定义了匿名函数但未执行,也没有传入要删除的消息对象,同时你提前定义的msg是消息小写字符串,不是消息实例 - 版本兼容问题:discord.js v13及以上版本已经移除了
delete()方法的timeout参数,直接使用会失效
修正后代码
client.on("message", async message => { // 过滤机器人消息和私信 if (message.author.bot) return; if (message.channel.type === "dm") return; // 脏话检测逻辑 const swearWords = JSON.parse(fs.readFileSync("./data/swearWords.json")); const msgContent = message.content.toLowerCase(); const embed1 = new discord.MessageEmbed() .setColor('#0d0041') .setDescription(`${message.author} Dat woord hoort hier niet thuis`) for (let i = 0; i < swearWords["vloekwoorden"].length; i++) { if (msgContent.includes(swearWords["vloekwoorden"][i])) { try { await message.delete(); const warnMsg = await message.channel.send(embed1); // 5秒后删除警告消息 setTimeout(() => warnMsg.delete().catch(err => console.log("删除警告消息失败", err)), 5000); } catch (err) { console.log("删除脏话消息失败", err); } return; } } // 指定频道定时删除逻辑,提前到指令判断前执行 const targetChannelId = "841337468585377882"; if (message.channel.id === targetChannelId) { // 5秒后删除用户发送的消息 setTimeout(() => message.delete().catch(err => console.log("删除频道消息失败", err)), 5000); } // 指令处理逻辑 const prefix = botConfig.prefix; if (!message.content.startsWith(prefix)) return; const messageArray = message.content.split(" "); const command = messageArray[0]; const arguments = messageArray.slice(1); const commands = client.commands.get(command.slice(prefix.length)); if (commands) commands.run(client, message, arguments); });
额外注意事项
- 确保机器人拥有对应频道的「管理消息」权限,否则无法正常删除消息
- 若使用discord.js v14及以上版本,
MessageEmbed需要单独从discord.js中导入,且频道类型判断的枚举值有调整,对应修改即可 - 代码中添加了
catch捕获错误,避免消息已被提前删除、权限不足等异常情况导致程序崩溃
内容的提问来源于stack exchange,提问作者stybo
相关产品推荐
相关产品推荐

