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

如何将discord.py机器人中的3个on_message函数合并为单个on_message函数

合并后的discord.py on_message函数

没问题!我帮你把这三个on_message函数合并成一个,完全符合discord.py的要求(一个机器人里只能有一个on_message事件处理函数),同时保留所有原有功能:

@client.event
async def on_message(message):
    # 先跳过机器人自身发送的消息,避免循环触发逻辑
    if message.author.bot:
        return
    
    # 确保@client.command()装饰的命令能正常执行
    await client.process_commands(message)
    
    # 处理"Jason derulo"触发的回复
    if message.content.startswith('Jason derulo'):
        await message.channel.send('Wiggle wiggle wiggle')
    
    # 处理"fast"触发的回复
    if message.content.startswith('fast'):
        await message.channel.send('She a runner she a track star')
    
    # 处理脏话过滤逻辑
    for badword in file:
        if badword in message.content.lower():
            await message.delete()
            warnMessage = f"Hey {message.author.mention}! Don't say that!"
            await message.channel.send(warnMessage, delete_after=5.0)
            print(f"{message.author.name} tried saying: {badword}")
            channel = client.get_channel(836232733126426666)
            embed = discord.Embed(title=f"Someone tried to swear!", colour=0x2D2D2D)
            embed.add_field(name="Person who tried to swear:", value=f"{message.author.name}", inline=False)
            embed.add_field(name="What they tried to say:", value=f"{badword}", inline=False)
            await channel.send(embed=embed)
            return

几个重要细节说明:

  • 把忽略机器人消息的逻辑放在最开头,这样能直接跳过后续所有处理,避免机器人自己触发回复或过滤操作
  • await client.process_commands(message)只需要调用一次,放在开头可以确保命令优先被处理(也可以放在结尾,根据你的需求调整顺序)
  • 两个关键词回复用了独立的if,如果消息同时满足两个条件(比如"Jason derulo fast"),两个回复都会发送;如果想让它们互斥,可以改成elif
  • 脏话过滤的逻辑完全保留了你原来的逻辑,匹配到脏话后会执行删除消息、发送警告、记录日志和推送嵌入消息的操作,然后return终止后续处理

内容的提问来源于stack exchange,提问作者Ender 2K89

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:07:47