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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 10:57:03