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

Discord机器人:非斜杠自定义命令的选项需求及相关疑问

Discord 自定义非斜杠命令配置与选项附加方案

一、配置无需斜杠的自定义命令

要实现?help这类不带斜杠的自定义命令,核心是监听消息事件并手动解析内容判断命令:

  1. 监听messageCreate事件,过滤机器人自身消息和非目标前缀开头的消息
  2. 拆分消息内容,提取命令名和参数
  3. 匹配命令并执行对应逻辑

代码示例(discord.js v14+)

client.on('messageCreate', (message) => {
  // 跳过机器人消息和非?前缀的消息
  if (message.author.bot || !message.content.startsWith('?')) return;

  // 拆分命令与参数
  const args = message.content.slice(1).trim().split(/ +/);
  const commandName = args.shift().toLowerCase();

  // 处理?help命令
  if (commandName === 'help') {
    const targetCmd = args[0];
    if (targetCmd) {
      message.reply(`「${targetCmd}」命令的使用说明:...`);
    } else {
      message.reply('全局命令帮助列表:\n?help [命令名] - 查看指定命令详情\n?ping - 测试机器人延迟...');
    }
  }

  // 可添加更多自定义命令
  if (commandName === 'ping') {
    message.reply(`延迟:${client.ws.ping}ms`);
  }
});

注意:这类自定义命令需要自己处理参数校验、权限判断等逻辑,没有Discord斜杠命令的原生校验支持。

二、将斜杠命令的选项附加到非斜杠命令

Discord原生不支持直接把斜杠命令的选项绑定到?help这类非斜杠命令,但可以手动实现类似的交互效果:

1. 手动解析参数模拟选项

比如给?help添加可选的分类参数,模拟斜杠命令的选项逻辑:

client.on('messageCreate', (message) => {
  if (message.author.bot || !message.content.startsWith('?')) return;
  const args = message.content.slice(1).trim().split(/ +/);
  const commandName = args.shift().toLowerCase();

  if (commandName === 'help') {
    // 模拟可选选项:分类参数
    const category = args[0];
    let helpText = '';
    switch(category) {
      case 'fun':
        helpText = '娱乐命令:?joke 讲笑话,?meme 发梗图';
        break;
      case 'admin':
        helpText = '管理命令:?kick 踢出成员,?ban 封禁成员';
        break;
      default:
        helpText = '请指定分类:?help fun / ?help admin';
    }
    message.reply(helpText);
  }
});

2. 用消息组件实现类斜杠交互

如果想要接近斜杠命令的选项选择体验,可以用按钮、选择菜单等消息组件:

const { ActionRowBuilder, StringSelectMenuBuilder } = require('discord.js');

client.on('messageCreate', (message) => {
  if (message.author.bot || !message.content.startsWith('?')) return;
  const args = message.content.slice(1).trim().split(/ +/);
  const commandName = args.shift().toLowerCase();

  if (commandName === 'help') {
    // 创建选择菜单模拟选项
    const selectMenu = new StringSelectMenuBuilder()
      .setCustomId('help_category')
      .setPlaceholder('选择命令分类')
      .addOptions(
        { label: '娱乐命令', value: 'fun' },
        { label: '管理命令', value: 'admin' },
        { label: '工具命令', value: 'utility' }
      );

    const row = new ActionRowBuilder().addComponents(selectMenu);
    message.reply({ content: '选择要查看的命令分类:', components: [row] });

    // 监听用户选择
    const filter = i => i.customId === 'help_category' && i.user.id === message.author.id;
    const collector = message.channel.createMessageComponentCollector({ filter, time: 15000 });

    collector.on('collect', async i => {
      let content = '';
      switch(i.values[0]) {
        case 'fun':
          content = '🎮 娱乐命令:\n?joke - 随机讲笑话\n?meme - 随机发送梗图';
          break;
        case 'admin':
          content = '🔧 管理命令:\n?kick @成员 - 踢出指定成员\n?ban @成员 - 封禁指定成员';
          break;
        case 'utility':
          content = '🛠️ 工具命令:\n?ping - 测试机器人延迟\n?avatar @成员 - 获取成员头像';
          break;
      }
      await i.reply(content);
    });

    collector.on('end', () => {
      message.reply('帮助选择已超时,可重新发送?help发起请求');
    });
  }
});

总结:虽然无法直接复用斜杠命令的选项系统,但通过手动参数解析或消息组件,完全可以实现类似的功能,只是需要自己编写额外逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:15:09