如何基于JDA实现支持无限角色选项的Discord斜杠命令?
嘿,我之前做JDA开发时也碰到过这个需求!其实Discord的斜杠命令本身没有原生的“角色数组”选项类型,但我们可以通过调整单个角色选项的配置,来实现支持用户传入多个角色的效果,具体做法如下:
1. 修改命令选项的配置
默认情况下,每个斜杠命令选项只能被用户提交一次,我们需要把角色选项设置为可重复使用,只需要给OptionData添加setMaxValue配置,把上限设成一个足够大的数值(比如Integer.MAX_VALUE,或者根据服务器角色数量上限设置一个合理值)。如果要求用户至少传入一个角色,记得把setRequired(true)加上,否则设为false。
修改后的代码如下:
commands.addCommands( new CommandData("command", "list of possible roles") .addOptions(new OptionData(OptionType.ROLE, "role", "the role to include") // 设置该选项可重复提交,上限设为Integer.MAX_VALUE(适配大多数场景) .setMaxValue(Integer.MAX_VALUE) // 若要求必须传入至少一个角色,设置为true;否则设为false .setRequired(true)) );
2. 在命令处理中获取所有传入的角色
当用户使用/command @role1 @role2 @role3...这样的格式调用命令时,我们可以通过getOptionsByName("role")方法获取所有该选项的实例,然后遍历提取出每个Role对象:
@Override public void onSlashCommandInteraction(SlashCommandInteractionEvent event) { if (event.getName().equals("command")) { // 获取所有传入的role选项集合 List<OptionMapping> roleOptionList = event.getOptionsByName("role"); List<Role> selectedRoles = new ArrayList<>(); // 遍历提取每个Role对象 for (OptionMapping option : roleOptionList) { selectedRoles.add(option.getAsRole()); } // 这里可以添加你的业务逻辑,比如打印选中的角色名称 String roleNames = selectedRoles.stream() .map(Role::getName) .collect(Collectors.joining(", ")); event.reply("你选中的角色有:" + roleNames).queue(); } }
小提示
虽然我们设置了Integer.MAX_VALUE作为上限,但Discord服务器本身的角色数量是有限制的(最多250个),所以这个配置完全够用。如果你的场景有特殊的数量限制,也可以把setMaxValue改成对应的数值。
内容的提问来源于stack exchange,提问作者MaxL
相关产品推荐
相关产品推荐

