如何移除Discord机器人中旧的Mee6斜杠命令?
解决Mee6遗留斜杠命令无法清除的问题
问题根源
默认的tree.sync()只会同步你新增/修改的命令,不会自动删除已存在的旧命令(比如之前Mee6注册的那些)。要彻底清除旧命令,需要主动删除所有已注册的命令后再同步自己的命令。
解决方案1:完全清理并重新同步
修改你的sync命令,先删除全局和当前服务器的所有旧命令,再同步自定义命令:
@commands.command() async def sync(self, ctx) -> None: # 清除全局所有命令 global_cmds = await ctx.bot.tree.fetch_commands() for cmd in global_cmds: await ctx.bot.tree.delete_command(cmd.name) # 清除当前服务器的所有命令 guild_cmds = await ctx.bot.tree.fetch_commands(guild=ctx.guild) for cmd in guild_cmds: await ctx.bot.tree.delete_command(cmd.name, guild=ctx.guild) # 同步自定义命令 synced = await ctx.bot.tree.sync() await ctx.send(f"已清除所有旧命令,成功同步 {len(synced)} 个自定义命令。")
解决方案2:仅清理指定服务器的命令
如果你只想清除某个特定服务器的Mee6命令(保留其他服务器的),可以修改代码只针对目标服务器操作:
@commands.command() async def sync_guild(self, ctx) -> None: target_guild = ctx.guild # 清除目标服务器的所有命令 guild_cmds = await ctx.bot.tree.fetch_commands(guild=target_guild) for cmd in guild_cmds: await ctx.bot.tree.delete_command(cmd.name, guild=target_guild) # 同步当前服务器的自定义命令 synced = await ctx.bot.tree.sync(guild=target_guild) await ctx.send(f"已清除当前服务器的旧命令,同步了 {len(synced)} 个自定义命令。")
修复命令添加时机问题
你的on_ready方法可能存在重复添加命令的风险(Discord.py的on_ready可能在重连时多次触发),建议调整命令添加的时机:
方案A:在Cog初始化时添加命令
class MyCog(commands.Cog): def __init__(self, bot): self.bot = bot # 初始化时直接添加命令组 cmdgroup = groupCommands(name="demo", description="This is just a Demo") self.bot.tree.add_command(cmdgroup) # 你的sync命令...
方案B:给on_ready加执行标记
class MyCog(commands.Cog): def __init__(self, bot): self.bot = bot self._ready_triggered = False async def on_ready(self): if not self._ready_triggered: cmdgroup = groupCommands(name="demo", description="This is just a Demo") self.bot.tree.add_command(cmdgroup) self._ready_triggered = True
注意事项
- 执行清除命令后,所有旧的Mee6斜杠命令会被删除,操作前请确认是否需要保留部分命令。
- 机器人需要拥有
applications.commands的权限(默认已具备,只要是你自己创建的机器人)。 - 全局命令的删除/同步可能需要几分钟才能在所有服务器生效,服务器级命令则即时生效。
内容的提问来源于stack exchange,提问作者EntchenEric
相关产品推荐
相关产品推荐

