Discord JS:如何仅检测特定管理员发消息后的用户消息?
问题分析与修复方案
核心问题
你的代码在语法、逻辑上存在多处错误,导致无法实现「管理员发消息后监听后续用户消息」的需求,反而会错误转发管理员的消息:
- 错误对比用户身份:
msg.author是User对象,不能直接和字符串ID比较,必须用msg.author.id - 逻辑完全颠倒:当前代码是收到管理员消息就直接转发,而非标记状态后等待用户消息
- 拼写错误:
msg.authot应为msg.author,MESSGAE应为MESSAGE - 变量名错误:登录时用了未定义的
usertoken,实际定义的是token - 管理员判断逻辑错误:多个
&&同时判断不同ID永远为false,应该用数组包含判断
修正后的代码
const Discord = require("discord.js"); const bot = new Discord.Client(); const bot_config = require("./settings.json"); const token = bot_config.usertoken; // 管理员ID数组,把需要触发流程的管理员ID都放这里 const adminIds = ["703629528454660106", "255396012045238222", "142772377047199744", "235748962103951360"]; const targetChannelId = "940800688219369483"; // 状态标记:是否已收到管理员消息,等待用户消息 let awaitingUserResponse = false; bot.on("ready", () => { console.log(`SUCCESSFULLY LOGGED IN AS ${bot.user.tag}!`); }); bot.on("message", (msg) => { // 只监听目标频道的消息 if (msg.channel.id !== targetChannelId) return; // 如果是管理员消息,标记状态为等待用户消息 if (adminIds.includes(msg.author.id)) { if (!awaitingUserResponse) { console.log("管理员已触发,等待用户消息..."); awaitingUserResponse = true; } return; } // 如果不是管理员,且处于等待状态,处理用户消息 if (awaitingUserResponse) { console.log("收到用户消息,转发中..."); bot.channels.cache.get(targetChannelId).send(msg.content); // 重置状态,可根据需求决定是否只监听一次 awaitingUserResponse = false; console.log("SUCCESSFULLY SENT MESSAGE"); } }); bot.login(token);
关键逻辑说明
- 用
awaitingUserResponse状态标记控制流程:初始为false,管理员发消息后设为true - 管理员ID存放在数组中,用
includes方法判断身份,更简洁易维护 - 先处理管理员消息触发状态,再处理用户消息,逻辑清晰
- 修复了所有语法错误和变量名错误
内容的提问来源于stack exchange,提问作者Max Raffles
相关产品推荐
相关产品推荐

