如何将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
相关产品推荐
相关产品推荐

