Discord担保频道消息过滤Bot开发及代码修复求助
Discord担保频道Bot修复方案
问题核心需求
- 自动删除担保频道内不以「Vouch」/「vouch」(不区分大小写)开头的消息,保留该词之后的内容
- 拥有指定角色(如示例中的「Obese」角色)的用户,消息不受任何过滤
- 当前代码可运行,但无法监控和删除目标消息,已开启消息内容权限并赋予Bot消息管理角色
原代码问题分析
- 频道ID使用无效占位符
'vouch-channel',未替换为实际频道ID - 角色豁免逻辑位置错误:仅在消息不符合开头规则时才检查角色,导致有豁免角色的用户发非vouch开头消息才被放过,实际应优先豁免
- 未使用
await处理异步的message.delete()操作(Discord.js v14+要求) - 变量
content未声明,存在全局变量污染风险 - 逻辑顺序错误:先检查内容再检查角色,不符合豁免优先的需求
修复后的代码
const express = require("express"); const app = express(); app.listen(3000, () => { console.log("Project is running!"); }); app.get("/", (req, res) => { res.send("Dough Bot Here!"); }); const { Client, GatewayIntentBits } = require("discord.js"); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent, ], }); // 替换为你的实际担保频道ID const VOUCH_CHANNEL_ID = "你的频道ID"; // 替换为你的豁免角色名称 const EXEMPT_ROLE_NAME = "Obese"; client.on("messageCreate", async (message) => { // 跳过Bot自身消息,避免循环触发 if (message.author.bot) return; // 仅处理指定担保频道的消息 if (message.channel.id !== VOUCH_CHANNEL_ID) return; // 优先检查:用户拥有豁免角色则直接跳过所有过滤 if (message.member.roles.cache.some(role => role.name === EXEMPT_ROLE_NAME)) { return; } // 不区分大小写检查消息开头 const lowerContent = message.content.toLowerCase(); if (!lowerContent.startsWith("vouch")) { // 异步删除消息,需加await并捕获错误 await message.delete().catch(err => { console.error("删除消息失败:", err); }); return; } // 可选:如需移除开头的vouch并保留后续内容,启用以下代码 // const cleanedContent = message.content.replace(/^vouch/i, "").trim(); // if (cleanedContent !== message.content) { // await message.edit(cleanedContent); // } }); client.login(process.env.token);
关键修复点说明
- 优先角色豁免:先检查用户是否有指定角色,有则直接跳过所有过滤逻辑,符合需求
- 异步处理删除:用
await调用message.delete(),并添加错误捕获避免Bot崩溃 - 替换占位符:明确标注需要替换的频道ID和角色名称,避免使用无效占位符
- 跳过Bot消息:防止Bot处理自身消息引发异常循环
- 变量声明规范:用
const声明lowerContent,避免全局变量污染 - 可选内容清理:添加了可选的消息编辑逻辑,可移除开头的vouch并保留后续内容(按需启用)
内容的提问来源于stack exchange,提问作者Dominic Stachura
相关产品推荐
相关产品推荐

