Discord斜杠命令能否以模块形式复用?Node.js与Discord.js新手技术咨询
斜杠命令Embed模块化的正确实现方式
嘿,作为Discord.js新手能想到模块化复用代码,这个思路真的很棒!你的方向是对的,但有几个细节需要调整,我来帮你理清楚:
1. 先纠正你的类型参数与Embed结构错误
你代码里的type: 4其实是对的——这个类型对应Discord API的CHANNEL_MESSAGE_WITH_SOURCE,表示直接返回一条消息给触发命令的用户。但Embed的传递方式错了:
- 不能把
MessageEmbed实例直接赋值给content,Discord API要求Embed放在embeds数组里,并且需要转换成JSON格式(因为API只认JSON数据)。
2. 优化你的rules.js模块化文件
我们可以把Embed的创建和回调数据封装在单独的文件里,方便复用:
// commands/rules.js const { MessageEmbed } = require('discord.js'); // 1. 先定义你的规则Embed const rulesEmbed = new MessageEmbed() .setColor('#2ecc71') .setTitle('📜 服务器规则') .setDescription('请遵守以下规则,共同维护友好社区') .addFields( { name: '✅ 友好交流', value: '禁止人身攻击、歧视性言论' }, { name: '🚫 禁止广告', value: '未经允许不得发布任何广告内容' }, { name: '📵 敏感内容', value: '禁止传播色情、暴力等违规内容' } ) .setFooter('服务器管理团队') .setTimestamp(); // 2. 导出斜杠命令需要的回调数据 module.exports = { // 用函数返回数据,后续如果需要动态修改Embed会更灵活 getCallbackData: () => ({ type: 4, // 正确的回调类型 data: { embeds: [rulesEmbed.toJSON()] // 必须转成JSON,放到embeds数组中 } }) };
3. 在main.js中正确调用模块化的命令
接下来在主文件里引入并使用这个模块,注意路径要正确(如果rules.js在commands文件夹下,路径是./commands/rules.js):
// main.js const { Client } = require('discord.js'); const client = new Client({ intents: [] }); // 根据你的Discord.js版本设置必要的intents const rulesCommand = require('./commands/rules.js'); client.ws.on('INTERACTION_CREATE', async (interaction) => { const commandName = interaction.data.name.toLowerCase(); if (commandName === 'rules') { try { // 获取预定义的回调数据,发送给Discord API await client.api.interactions(interaction.id, interaction.token).callback.post({ data: rulesCommand.getCallbackData() }); } catch (error) { console.error('发送规则命令出错:', error); } } }); // 登录机器人 client.login('你的机器人令牌');
额外建议:用Discord.js新版本的封装功能(v13+)
如果你使用的是Discord.js v13或更高版本,官方提供了更简洁的斜杠命令处理方式,不需要直接操作client.ws,可以进一步简化模块化:
// commands/rules.js(新版本写法) const { SlashCommandBuilder, MessageEmbed } = require('discord.js'); module.exports = { // 定义斜杠命令的元数据(用于注册命令) data: new SlashCommandBuilder() .setName('rules') .setDescription('查看服务器规则'), // 命令执行逻辑 async execute(interaction) { const rulesEmbed = new MessageEmbed() // ...和之前一样的Embed配置 ; // 直接回复交互,自动处理API细节 await interaction.reply({ embeds: [rulesEmbed] }); } };
然后在主文件里用命令加载器(比如结合@discordjs/builders和discord.js的Collection)来管理所有命令,代码会更易维护。
内容的提问来源于stack exchange,提问作者Ilhan Yapici
相关产品推荐
相关产品推荐

