You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

discord.py混合命令组无法注册为斜杠命令的问题求助

Discord.py Hybrid Group 斜杠命令无法注册的排查与修复

以下是针对该问题的具体排查点和修复方案:

1. 父命令与子命令的参数冲突

当前父命令character_events包含可选参数event_type,同时又注册了子命令(add/delete等)。这会导致Discord斜杠命令的结构冲突:当用户输入/event add时,Discord会将add识别为event_type的参数值,而非子命令名称,直接阻断子命令的注册逻辑。

修复方案:
将父命令的独立执行逻辑拆分为单独的list子命令,让event仅作为纯粹的命令组存在,不包含自身执行逻辑:

@commands.hybrid_group(name='event', description='Event management commands')
@commands.guild_only()
async def character_events(self, ctx):
    # 用户直接调用 /event 时发送帮助信息
    await ctx.send("Available subcommands: /event add, /event delete, /event start, /event master, /event list")

# 新增list子命令处理原父命令逻辑
@character_events.command(name='list', description='Lists events attended by character')
async def character_events_list(self, ctx, event_type: str = None):
    if event_type is None:
        character_name = str(ctx.author.nick) or str(ctx.author.name)
        await self.send_message_chunks(ctx, character_name.lower().title())
        return
    elif event_type.lower() not in ['start', 'end', 'add', 'delete', 'master']:
        await self.send_message_chunks(ctx, event_type.lower().title())
        return

2. 命令描述的语法错误

add子命令的描述末尾存在多余的>符号:

@character_events.command(name='add', description='Adds a character event from a master record event, or manually adds raid ticks>')

这个无效字符会被Discord的命令注册接口拒绝,导致命令无法上线。

修复方案:
删除描述末尾的>:

@character_events.command(name='add', description='Adds a character event from a master record event, or manually adds raid ticks')

3. 缺少斜杠命令同步逻辑

代码中没有显式同步斜杠命令到Discord服务器的步骤,即使命令定义正确,也不会在Discord客户端中显示。

修复方案:
在on_ready事件加载完所有cogs后,添加命令同步代码:

@bot.event
async def on_ready():
    loaded_cogs = []
    activity = discord.Game(name="EverQuest")
    await bot.change_presence(activity=activity)

    for filename in os.listdir("./cogs"):
        if filename.endswith(".py"):
            cog_name = "cogs.{0}".format(filename[:-3])
            if cog_name not in loaded_cogs:
                try:
                    await bot.load_extension(cog_name)
                    loaded_cogs.append(cog_name)
                    print(f'"{cog_name}" Cog loaded')
                except Exception as e:
                    print(f'Failed to load "{cog_name}" Cog: {e}')
    
    # 同步斜杠命令
    # 全局同步(生产环境用,需等待约1小时生效)
    await bot.tree.sync()
    # 测试环境推荐用特定服务器同步(即时生效,替换为你的服务器ID)
    # await bot.tree.sync(guild=discord.Object(id=1234567890))
    print("Slash commands synced successfully!")

注意:全局同步每天有次数限制,测试时优先使用服务器专属同步。

4. 参数定义与描述不匹配

start子命令的参数event_class与描述中的event_duration不对应,可能导致元数据校验失败:

@character_events.command(name='start', description='Starts an event: <event_name> <event_value> <event_duration> <event_ticks>')
async def start_timed_event(self, ctx, event_name: str = None, event_value: int = None, event_class: int = None, event_status: str = None, event_ticks: int = None):

修复方案:
修正参数名称与描述一致:

@character_events.command(name='start', description='Starts an event: <event_name> <event_value> <event_duration> <event_ticks>')
@commands.has_permissions(administrator=True)
async def start_timed_event(self, ctx, event_name: str = None, event_value: int = None, event_duration: int = None, event_status: str = None, event_ticks: int = None):
    print('start detected')
    await self.event_channel_timer(ctx, event_name, event_value, event_duration, event_status, event_ticks)

5. 权限配置验证

确保bot在Discord开发者门户中启用了applications.commands权限,并且在目标服务器中拥有Manage Server权限,否则无法完成命令同步和使用。

验证步骤

  1. 重启bot,查看控制台无报错信息
  2. 在服务器中输入/event,确认所有子命令正常显示
  3. 测试每个子命令的斜杠调用逻辑

内容的提问来源于stack exchange,提问作者madruk20

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 09:35:04