Discord.JS v13如何为play斜杠命令添加歌曲名称字符串参数
Discord.JS v13 play斜杠命令适配修改方案
修改后完整代码
const Discord = require('discord.js'); module.exports = { name: "play", description: "播放指定歌曲", // 新增:定义斜杠命令入参规则 options: [ { name: "歌曲", type: Discord.Constants.ApplicationCommandOptionTypes.STRING, description: "要播放的歌曲名称、关键词或资源链接", required: true } ], async execute (interaction, client) { // 前置校验:用户必须加入语音频道 if (!interaction.member.voice.channel) { return interaction.reply({ content: "使用播放命令前请先加入一个语音频道", ephemeral: true }); } // 前置校验:用户需和机器人在同一语音频道(可选但推荐添加) if (interaction.guild.me.voice.channel && interaction.member.voice.channel.id !== interaction.guild.me.voice.channel.id) { return interaction.reply({ content: "你需要和我在同一个语音频道才能控制播放", ephemeral: true }); } // 替换原args取值:从斜杠命令参数中获取用户输入的查询内容 const musicQuery = interaction.options.getString("歌曲"); // 延迟回复避免搜索耗时过长导致交互超时 await interaction.deferReply(); try { // 替换原message对象:传入用户所在的语音频道作为播放目标 await client.distube.play(interaction.member.voice.channel, musicQuery, { member: interaction.member, textChannel: interaction.channel, interaction }); return interaction.editReply(`已将 \`${musicQuery}\` 添加到播放队列`); } catch (error) { console.error(error); return interaction.editReply(`播放失败:${error.message}`); } } }
如果你使用SlashCommandBuilder来批量注册斜杠命令,对应的命令构建代码如下:
const { SlashCommandBuilder } = require('@discordjs/builders'); const playCommand = new SlashCommandBuilder() .setName('play') .setDescription('播放指定歌曲') .addStringOption(option => option.setName('歌曲') .setDescription('要播放的歌曲名称、关键词或资源链接') .setRequired(true) );
核心修改点说明
- 参数定义适配:斜杠命令要求提前声明参数规则,新增的
options字段会告诉Discord该命令需要接收什么类型的参数,用户输入时也会显示对应提示。 - 取值逻辑替换:斜杠命令没有前缀命令的
args数组,所有用户输入的参数都通过interaction.options下的对应方法获取,字符串参数使用getString方法,传入你定义的参数名即可。 - 上下文对象替换:原前缀命令的
message对象在斜杠命令中不存在,所有上下文信息(用户身份、频道、服务器等)都通过interaction对象获取,Distube的play方法第一参数直接传入用户所在的语音频道即可。 - 交互响应适配:Discord要求斜杠命令必须在3秒内给出响应,搜索歌曲这类耗时操作前需要先调用
deferReply标记为处理中,处理完成后再用editReply更新回复内容,避免出现交互超时报错。 - 异常处理补充:新增了语音状态校验和错误捕获,避免无效调用导致机器人崩溃。
内容的提问来源于stack exchange,提问作者Carlos Montenegro
相关产品推荐
相关产品推荐

