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

Discord.py事件与命令冲突:非!nick消息提示无法触发

解决Discord机器人on_message与命令冲突及引导提示无效问题

问题根源

你写的on_message事件会拦截所有消息,包括本应由@client.command处理的!nick命令,导致命令无法正常执行;同时当前逻辑会对所有非!nick的消息发送提示,既干扰正常聊天,也没实现仅在注册频道引导用户的需求。

修正方案

  1. 在on_message事件末尾调用await client.process_commands(message),让命令框架能正常处理命令类消息
  2. 限定提示仅在目标注册频道内触发,避免影响其他频道
  3. 移除nick命令内冗余的判断逻辑

修正后的完整代码

@client.event
async def on_message(message):
    # 指定注册频道ID,替换成你的实际频道ID
    register_channel_id = 123456789012345678
    # 仅在注册频道内处理引导提示
    if message.channel.id == register_channel_id:
        # 排除机器人自己的消息,避免循环发送
        if message.author.bot:
            await client.process_commands(message)
            return
        # 消息不以!nick开头时发送引导
        if not message.content.startswith('!nick'):
            await message.channel.send("Algo deu errado aqui. Não esqueça de escrever !nick antes de digitar seu nome e ID do servidor.")
    # 必须调用这行,否则@client.command定义的命令不会执行
    await client.process_commands(message)

@client.command(pass_context=True)
async def nick(ctx, nickname, sobrenick, ident=''):
    autor = ctx.message.author
    # 替换成你的注册频道ID
    register_channel_id = 123456789012345678
    # 仅允许在注册频道执行该命令
    if ctx.channel.id != register_channel_id:
        await ctx.send("Este comando só pode ser usado no canal de registro!")
        return
    
    if ident == '':
        new_nick = f"{nickname}  |  {sobrenick}"
    else:
        new_nick = f"{nickname} {sobrenick}  |  {ident}"
    
    await autor.edit(nick=new_nick)
    await ctx.send(f'Seu nick foi alterado para: {new_nick}, se confirma digite !entrar pra continuar, se não redigite o nick')

关键修改说明

  • 添加client.process_commands(message):让命令框架能接管!nick命令的处理,不再被on_message拦截
  • 限定提示范围:只在指定注册频道内发送引导,同时排除机器人自身消息,防止循环发送
  • 优化nick命令:增加频道校验,避免命令在其他频道被误用,同时简化昵称拼接逻辑,让代码更简洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:20:20