discord.js中如何通过命令参数自定义Embed嵌入消息
实现自定义Embed字段的命令方案
你现有代码仅配置了频道、描述2个入参,且参数获取逻辑没有兼容前缀命令场景,按以下步骤修改即可支持自定义标题、描述、颜色、页脚等任意Embed字段:
核心修改点
- 扩展命令的参数定义,将需要自定义的Embed字段加入参数列表,非必填字段放在必填字段后
- 统一前缀命令、slash命令的参数获取逻辑,避免某一种命令模式下拿不到参数
- 动态判断入参是否存在,存在才调用Embed对应的设置方法,避免空值报错
修改后完整代码
const { MessageEmbed } = require("discord.js") module.exports = { category: 'Role Select Msg', description: 'Sends a embeded message for roles or for announcemnts', permissions: ['ADMINISTRATOR'], slash: 'both', guildOnly: true, // 调整参数数量要求:必填2个(频道、描述),可选3个(标题、颜色、页脚) minArgs: 2, expectedArgs: '<channel> <description> [title] [color] [footer]', expectedArgsTypes: ['CHANNEL', 'STRING', 'STRING', 'STRING', 'STRING'], callback: ({ message, interaction, args }) => { // 统一获取目标频道 const channel = message ? message.mentions.channels.first() : interaction.options.getChannel('channel') if (!channel || channel.type !== 'GUILD_TEXT'){ return '请标记一个文本频道。' } // 统一获取各字段参数:前缀命令从args数组按索引取,slash命令从options取 let description, title, color, footer if (message) { description = args[1] title = args[2] color = args[3] footer = args[4] } else { description = interaction.options.getString('description') title = interaction.options.getString('title') color = interaction.options.getString('color') footer = interaction.options.getString('footer') } // 动态组装Embed const embed = new MessageEmbed() .setDescription(description) // 非必填字段判断存在才设置 if (title) embed.setTitle(title) if (color) embed.setColor(color) if (footer) embed.setFooter({ text: footer }) // 需要新增作者、缩略图、时间戳、自定义字段等内容,参照上述逻辑扩展即可 channel.send({ embeds: [embed] }) if(interaction){ interaction.reply({ content: '消息发送成功!', ephemeral: true }) } } }
使用说明
- Slash命令用法:
/sendembed #公告 这是公告描述 这是公告标题 #FF0000 公告页脚内容 - 前缀命令用法(假设命令前缀为!):
!sendembed #公告 这是公告描述 这是公告标题 #FF0000 公告页脚内容 - 不需要的可选参数可以直接省略不传,比如只需要自定义标题的话,后面的颜色、页脚参数留空即可。
注意:如果使用discord.js v14版本,需要把
MessageEmbed替换为EmbedBuilder,引入路径从discord.js改为@discordjs/builders即可,核心逻辑完全一致。
内容的提问来源于stack exchange,提问作者user17646297
相关产品推荐
相关产品推荐

