如何让基于disc-11的JS Discord音乐机器人支持其他Bot调用指令
disc-11 项目允许其他机器人触发指令的调整步骤
问题根源为项目基于Discord.js开发,框架及项目自带的两层逻辑会默认拦截所有机器人账号发送的消息,导致其他机器人发送的指令根本不会进入后续解析流程,针对性调整拦截规则即可解决。
- 调整第一层消息事件入口的拦截逻辑
找到项目中messageCreate事件的处理文件(一般在src/events/目录下),文件开头默认带有机器人消息直接返回的判断语句:if (message.author.bot) return;
将这段判断替换为带白名单的条件判断,既放行指定机器人的消息,又避免全量放行带来的风险:// 先把允许触发的其他机器人ID存在配置文件的allowedBotIDs数组里 if (message.author.bot) { // 永远跳过自己发的消息,避免循环触发 if (message.author.id === client.user.id) return; // 只放行白名单内的机器人,其他机器人消息直接拦截 if (!config.allowedBotIDs.includes(message.author.id)) return; } - 排查指令解析层的二次拦截
部分版本的disc-11项目,会在指令解析(识别!play这类前缀的逻辑)的代码段,重复叠加一次机器人消息拦截。找到前缀匹配、指令分发的核心逻辑(一般在src/structures/目录下的客户端核心文件中),删除同位置的if (message.author.bot) return;判断,替换成和上面一致的白名单判断逻辑。 - 配置防循环兜底规则
绝对不要无差别放行所有机器人发送的消息,否则极易出现两个机器人互相触发指令的死循环,耗尽机器人运行资源,必须加上两层兜底:- 白名单仅填写需要对接的目标机器人ID,不要把所有机器人都加进来
- 对每条收到的消息ID做去重缓存,同一条消息只触发一次指令,避免重复执行
- 前置权限检查
确认机器人在Discord开发者后台已经开启消息内容意图(Message Content Intent),如果没开启该权限,机器人无法读取任何消息的文本内容,哪怕代码调整正确,也识别不了其他机器人发送的!play等指令内容。
内容的提问来源于stack exchange,提问作者Andy Nguyen
相关产品推荐
相关产品推荐

