如果你有一个包含子命令的命令,你可以以使用与解析 Options 和 Choices 的值那样相似的方式解析它们。 以下代码片段详细说明了解析子命令并使用 CommandInteractionOptionResolver#getSubcommand()
方法做出相应响应所需的逻辑:
代码 commands/subCmd.js
:
const { SlashCommandBuilder } = require('@discordjs/builders'); module.exports = { data: new SlashCommandBuilder() .setName('subcmd') .setDescription('Subcommand! Reply with user\'s or server \'s info.') .addSubcommand(subcommand => subcommand.setName('user') .setDescription('Info about a user') .addUserOption(option => option.setName('target').setDescription('The user'))) .addSubcommand(subcommand => subcommand.setName('server') .setDescription('Info about the server')), async execute(interaction) { if (interaction.options.getSubcommand() === 'user') { const theUser = interaction.options.getUser('target'); if (theUser) { await interaction.reply(`Username: ${theUser.username}\nID: ${theUser.id}`); } else { // 用户没有指定 target user,我们输出命令发起者自己就好 await interaction.reply(`Your username: ${interaction.user.username}\nYour ID: ${interaction.user.id}`); } } else if (interaction.options.getSubcommand() === 'server') { await interaction.reply(`Server name: ${interaction.guild.name}\nTotal members: ${interaction.guild.memberCount}`); } }, };
注意,只有子命令才是真正可以执行的命令,比如上面的代码中 /subcmd
没有真正的函数逻辑实现来支撑这个命令,只有子命令 /subcmd server
和 /subcmd user
才是真正有函数实现的命令。直接执行 /subcmd
指望它能干事是不可能的。
还是先上效果图,再分析代码:
输入命令 /subcmd
时,提示了两个子命令:
执行 /subcmd server
:
执行 /subcmd user @BlogTest
:(注意你需要从提示栏中回车选定 target 用户,可不能直接输入 "@ + 用户名" 就完活了,因为可能存在重名用户)
执行 /subcmd user
:
分析代码:
下面的节选代码,它声明了一个叫 user 的子命令,它的输入参数是一个 Option,一个 User 类型的 Option。这个 Option 叫 target。
... .addSubcommand(subcommand => subcommand.setName('user') .setDescription('Info about a user') .addUserOption(option => option.setName('target').setDescription('The user'))) ...
下面的节选代码,它声明了一个叫 server 的子命令,没有参数。
... .addSubcommand(subcommand => subcommand.setName('server') .setDescription('Info about the server')), ...
下面的代码,首先上来,判断子命令是 user 还是 server。
interaction.options.getUser(target)
获取 target 字段的值,并赋值给 theUser 变量。
... async execute(interaction) { if (interaction.options.getSubcommand() === 'user') { const theUser = interaction.options.getUser('target'); if (theUser) { await interaction.reply(`Username: ${theUser.username}\nID: ${theUser.id}`); } else { // 用户没有指定 target user,我们输出命令发起者自己就好 await interaction.reply(`Your username: ${interaction.user.username}\nYour ID: ${interaction.user.id}`); } } else if (interaction.options.getSubcommand() === 'server') { await interaction.reply(`Server name: ${interaction.guild.name}\nTotal members: ${interaction.guild.memberCount}`); } }, ...
命令交互选项的解析器。
方法(Methods):
方法名 | 第一个参数 | 第二个参数 | 返回值类型 | 说明 |
---|---|---|---|---|
.get() | name | [required] | CommandInteractionOption | 按名称获取选项 |
.getAttachment() | name | [required] | Attachment | 获取附件选项 |
.getBoolean() | name | [required] | boolean | 获取一个布尔选项 |
.getChannel() | name | [required] | GuildChannelThreadChannelAPIChannel | 获取频道选项 |
.getFocused() | [getFull] | 无 | string 或 AutocompleteFocusedOption | 获取关注点选项 |
.getInteger() | name | [required] | number | 获取整数选项 |
.getMember() | name | 无 | GuildMemberAPIGuildMember | 获取服务器成员选项 |
.getMentionable() | name | [required] | UserGuildMemberAPIGuildMember 或 RoleAPIRole | 获得一个服务器成员或身份组的选项 |
.getMessage() | name | [required] | Message | 获取消息选项 |
.getNumber() | name | [required] | number | 获取数字选项 |
.getRole() | name | [required] | RoleAPIRole | 获取身份组选项 |
.getString() | name | [required] | string | 获取字符串选项 |
.getSubcommand() | [required] | 无 | string | 获取选定的子命令 |
.getSubcommandGroup() | [required] | 无 | string | 获取选定的子命令组 |
.getUser() | name | [required] | User | 获取用户选项 |
属性(Properties):
属性名 | 类型 | 描述 |
---|---|---|
.client | Client | 实例化这个的 client |
.data | Array< CommandInteractionOption > | 交互的 options 数组 |
.resolved | < CommandInteractionResolvedData > | 交互解析数据 |
原文链接:https://www.cnblogs.com/hhzm/p/16472398.html
转载需注明出处。