如何基于自定义前缀的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
相关产品推荐
相关产品推荐

