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

如何为Discord Bot创建频道提及监听并输出频道名称?

问题解决:Discord Bot 提取频道提及的名称

问题诊断

你的代码存在几个关键问题导致功能失效:

  1. 重复创建Client实例:messageCreate.js里重新初始化了Client,这会和主文件的客户端冲突,事件无法正确绑定到运行中的Bot实例。
  2. 模板字符串语法错误:回复消息里的{mentionedChannel.name}没有使用$符号,无法解析变量,只会输出字面量字符串。
  3. 缺少必要的网关意图:主文件中客户端只启用了GatewayIntentBits.Guilds,没有启用读取消息内容和频道提及所需的GuildMessages、MessageContent意图。
  4. 重复监听MessageCreate事件:两个独立的messageCreate监听可能导致逻辑冲突,且部分变量(如globalPrefix、prefixes)未定义。
  5. 拼写错误:回复中的Chanel应为Channel。

修正步骤与代码实现

1. 更新主文件的客户端意图

修改主文件中的Client初始化代码,添加必要的意图:

const client = new Client({ 
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent // 必须启用此意图才能读取消息内容和提及
  ]
});

2. 修复messageCreate.js文件

删除重复的Client实例,合并事件监听,修正模板字符串语法:

const { Events } = require('discord.js');

// 事件文件通过主文件传入的client绑定事件,无需重新创建Client
module.exports = {
  name: Events.MessageCreate,
  async execute(message) {
    // 处理频道提及逻辑
    if (message.mentions.channels.size > 0) {
      const mentionedChannel = message.mentions.channels.first();
      // 修正模板字符串和拼写错误
      message.reply(`Channel mentioned above: ${mentionedChannel.name}`);
    }

    // 合并原有的前缀处理逻辑(需确保globalPrefix和prefixes已定义)
    let args;
    if (message.guild) {
      let prefix;
      if (typeof globalPrefix !== 'undefined' && message.content.startsWith(globalPrefix)) {
        prefix = globalPrefix;
      } else {
        const guildPrefix = typeof prefixes !== 'undefined' ? await prefixes.get(message.guild.id) : null;
        if (guildPrefix && message.content.startsWith(guildPrefix)) prefix = guildPrefix;
      }
    }
  }
};

3. 确保事件文件结构正确

discord.js的事件文件需导出包含name和execute属性的对象,主文件会自动加载并绑定这些事件,无需在事件文件内自行监听。

功能验证

启动Bot后,在Discord频道发送包含频道提及(如<#123456789>)的消息,Bot会自动回复对应频道的名称。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 12:07:37