如何用Discord4J实现仅指定频道可用的Slash Command?
解决Discord4J斜杠命令仅在特定频道显示的问题
要让你的/poll命令仅在指定频道可见并可用,需要结合默认权限禁用和目标频道权限覆盖来实现,具体操作如下:
1. 调整命令的默认权限配置
首先将命令的默认权限设置为禁用,这样所有频道默认都看不到该命令:
List<SlashCommandData> commandData = new ArrayList<>(); commandData.add(Commands.slash("poll", "Erstelle eine Umfrage") .setDefaultPermissions(DefaultMemberPermissions.disabled()) // 默认全频道不可见 .setGuildOnly(true));
2. 给目标频道添加权限覆盖
完成公会命令注册后,针对你要开放命令的频道,添加权限覆盖,允许管理员在该频道使用并看到这个命令:
// 假设已获取目标公会对象 Guild guild,目标频道ID为 channelId(Snowflake类型) guild.getApplicationCommandManager() .bulkOverwrite(commandData) .flatMapMany(commands -> commands) .filter(cmd -> cmd.getName().equals("poll")) .flatMap(pollCmd -> { // 1. 创建频道权限覆盖:允许该频道显示此命令 ApplicationCommandPermission channelPerm = ApplicationCommandPermission.builder() .type(ApplicationCommandPermission.Type.CHANNEL) .id(channelId) .permission(true) .build(); // 2. 创建管理员权限覆盖:允许管理员角色在该频道使用此命令 Snowflake adminRoleId = guild.getRoles() .filter(role -> role.getPermissions().contains(Permission.ADMINISTRATOR)) .single() .block() .getId(); ApplicationCommandPermission adminPerm = ApplicationCommandPermission.builder() .type(ApplicationCommandPermission.Type.ROLE) .id(adminRoleId) .permission(true) .build(); // 应用权限覆盖到命令 return pollCmd.edit().withPermissions(Arrays.asList(channelPerm, adminPerm)); }) .subscribe();
核心逻辑说明
DefaultMemberPermissions.disabled():让命令默认在所有频道隐藏,只有被权限覆盖的频道才会显示。- 频道权限覆盖:指定目标频道并设置
permission(true),解除该频道的命令隐藏限制。 - 管理员权限限制:通过角色权限覆盖,确保仅拥有管理员权限的用户能在目标频道使用该命令。
这样配置后,只有指定频道的管理员输入/时能看到/poll命令,其他频道的所有用户都看不到该命令选项。
内容的提问来源于stack exchange,提问作者GibMirRechte
相关产品推荐
相关产品推荐

