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

如何基于自定义前缀的Node.js Discord Bot实现Embed创建命令?

基于自定义前缀的Discord Bot自定义Embed创建命令实现

下面是用discord.js v14实现的自定义前缀触发的Embed创建命令,核心逻辑是通过交互式提问收集用户输入,最终生成Embed:

核心代码实现

const { Client, EmbedBuilder, PermissionsBitField } = require('discord.js');
const client = new Client({ intents: ['Guilds', 'GuildMessages', 'MessageContent'] });

const PREFIX = '!'; // 替换为你的自定义前缀

client.on('messageCreate', async (message) => {
  // 忽略Bot自身消息和非前缀触发的内容
  if (message.author.bot || !message.content.startsWith(PREFIX)) return;

  const args = message.content.slice(PREFIX.length).trim().split(/ +/);
  const command = args.shift().toLowerCase();

  // 触发自定义Embed创建命令,比如!createembed
  if (command === 'createembed') {
    // 可选:限制仅管理员使用
    if (!message.member.permissions.has(PermissionsBitField.Flags.Administrator)) {
      return message.reply('你没有权限执行这个命令!');
    }

    try {
      // 1. 收集Embed标题
      await message.reply('请输入Embed的标题(输入`cancel`可取消命令):');
      const titleCollector = await message.channel.awaitMessages({
        filter: m => m.author.id === message.author.id,
        max: 1,
        time: 60000, // 1分钟超时
        errors: ['time']
      });
      const titleInput = titleCollector.first().content;
      if (titleInput.toLowerCase() === 'cancel') return message.reply('命令已取消');

      // 2. 收集Embed描述
      await message.reply('请输入Embed的描述:');
      const descCollector = await message.channel.awaitMessages({
        filter: m => m.author.id === message.author.id,
        max: 1,
        time: 60000,
        errors: ['time']
      });
      const descInput = descCollector.first().content;
      if (descInput.toLowerCase() === 'cancel') return message.reply('命令已取消');

      // 3. 收集Embed颜色(十六进制格式,比如#FF0000)
      await message.reply('请输入Embed的颜色(十六进制格式,留空则用默认深色):');
      const colorCollector = await message.channel.awaitMessages({
        filter: m => m.author.id === message.author.id,
        max: 1,
        time: 60000,
        errors: ['time']
      });
      const colorInput = colorCollector.first().content.trim();
      if (colorInput.toLowerCase() === 'cancel') return message.reply('命令已取消');
      const embedColor = colorInput || '#2F3136'; // 默认深色

      // 4. 可选:添加多个字段(输入`done`结束添加)
      await message.reply('输入字段名称添加字段(输入`done`跳过,`cancel`取消命令):');
      const fields = [];
      while (true) {
        const fieldNameCollector = await message.channel.awaitMessages({
          filter: m => m.author.id === message.author.id,
          max: 1,
          time: 60000,
          errors: ['time']
        });
        const fieldName = fieldNameCollector.first().content.trim();
        if (fieldName.toLowerCase() === 'cancel') return message.reply('命令已取消');
        if (fieldName.toLowerCase() === 'done') break;

        await message.reply(`请输入字段「${fieldName}」的内容:`);
        const fieldValueCollector = await message.channel.awaitMessages({
          filter: m => m.author.id === message.author.id,
          max: 1,
          time: 60000,
          errors: ['time']
        });
        const fieldValue = fieldValueCollector.first().content.trim();
        if (fieldValue.toLowerCase() === 'cancel') return message.reply('命令已取消');

        fields.push({ name: fieldName, value: fieldValue, inline: false }); // 改为true可设置行内字段
      }

      // 5. 生成并发送最终Embed
      const customEmbed = new EmbedBuilder()
        .setTitle(titleInput)
        .setDescription(descInput)
        .setColor(embedColor)
        .setTimestamp()
        .setFooter({ text: `由${message.author.tag}创建` });

      if (fields.length > 0) customEmbed.addFields(fields);

      await message.reply({ embeds: [customEmbed] });
      await message.reply('自定义Embed已生成!');

    } catch (error) {
      if (error.message.includes('time')) {
        return message.reply('命令超时,请重新发起!');
      }
      console.error(error);
      message.reply('生成Embed时出现错误,请重试!');
    }
  }
});

client.login('你的Bot令牌');

关键逻辑说明

  • 前缀过滤:通过判断消息开头是否为自定义前缀,筛选有效命令
  • 交互式收集:用awaitMessages监听用户输入,仅响应触发命令的用户,避免无关消息干扰
  • 超时与取消:设置1分钟超时,用户输入cancel可随时终止命令
  • 字段扩展:支持添加多个Embed字段,输入done结束添加流程
  • 异常处理:捕获超时和其他错误,给出明确提示

可自定义调整项

  • 修改PREFIX变量为你的Bot实际前缀
  • 调整权限检查逻辑,开放给更多角色使用
  • 增加更多Embed属性收集(比如缩略图、图片URL、作者信息等)
  • 修改字段inline属性,实现多列字段布局
  • 调整超时时间(单位毫秒)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:33:03