You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

关键逻辑说明

  1. 用awaitingUserResponse状态标记控制流程:初始为false,管理员发消息后设为true
  2. 管理员ID存放在数组中,用includes方法判断身份,更简洁易维护
  3. 先处理管理员消息触发状态,再处理用户消息,逻辑清晰
  4. 修复了所有语法错误和变量名错误

内容的提问来源于stack exchange,提问作者Max Raffles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 19:48:23