JDA开发咨询:如何删除guild中已存在的斜杠命令避免新旧冲突
JDA 公会斜杠命令同名覆盖/删除实现方案
核心实现逻辑
你需要先拉取当前公会下已注册的所有斜杠命令,匹配到同名的旧命令后先执行删除,再执行新命令的注册逻辑:
- 调用
guild.retrieveCommands()异步拉取当前公会的全量已注册命令列表 - 遍历命令列表,匹配名称与你待注册新命令一致的条目,获取该条目的命令ID
- 调用
guild.deleteCommandById(命令ID)删除旧命令,删除完成后再执行guild.upsertCommand(commandData)注册新命令
补充说明:JDA的
upsertCommand本身是幂等操作,若当前公会下已存在同名斜杠命令,默认会直接覆盖旧命令的所有配置,不会出现新旧命令混用的问题。如果你的场景只是要更新同名称命令的配置,不需要额外做删除操作,直接调用upsertCommand即可。
代码示例
// 已初始化的Guild实例 Guild targetGuild = ...; // 待注册的新命令配置 CommandData newCommand = Commands.slash("test", "测试命令"); // 拉取现有命令后处理 targetGuild.retrieveCommands().queue(existCommands -> { // 筛选同名命令 existCommands.stream() .filter(cmd -> cmd.getName().equals(newCommand.getName())) .findFirst() .ifPresentOrElse( // 存在同名命令,先删再插 oldCmd -> targetGuild.deleteCommandById(oldCmd.getIdLong()) .queue(deleteResult -> targetGuild.upsertCommand(newCommand).queue()), // 不存在同名命令,直接插入 () -> targetGuild.upsertCommand(newCommand).queue() ); });
注意事项
- 操作公会命令需要机器人拥有
applications.commands.update权限,否则会返回权限错误 - 单个公会内斜杠命令名称全局唯一,不会出现多个同名斜杠命令,不需要遍历全量列表处理多个匹配结果
- 如果要处理全局斜杠命令,将调用对象替换为JDA实例即可,对应使用
jda.retrieveCommands()、jda.deleteCommandById()方法
内容的提问来源于stack exchange,提问作者SecretAgent
相关产品推荐
相关产品推荐

