Discord.py中多个on_message事件无法触发的原因及解决方法
解决Discord.py多个on_message事件仅触发最后一个的问题
嘿,这个问题我之前折腾Discord机器人的时候也碰到过!原因其实很简单——Discord.py里用@client.event注册同一个事件(比如on_message)的时候,后面的注册会直接覆盖掉前面的,所以最后只有最后一个on_message会被触发。下面给你几种可行的解决办法:
方法1:合并所有逻辑到同一个on_message函数里
这是最直接的方式,把三个事件里的代码整合到一个函数中:
import discord client = discord.Client() @client.event async def on_ready(): print('in on_ready') @client.event async def on_message(message): print("in on_message #1") print("in on_message #2") print("in on_message #3") client.run("TOKEN")
如果你的逻辑比较复杂,也可以拆成单独的函数,然后在on_message里依次调用:
import discord client = discord.Client() async def handle_msg_1(message): print("in on_message #1") async def handle_msg_2(message): print("in on_message #2") async def handle_msg_3(message): print("in on_message #3") @client.event async def on_ready(): print('in on_ready') @client.event async def on_message(message): await handle_msg_1(message) await handle_msg_2(message) await handle_msg_3(message) client.run("TOKEN")
方法2:使用@client.listen()装饰器
Discord.py提供了@client.listen()装饰器,它和@client.event不同——多次注册同一个事件时,不会覆盖,而是会按注册顺序依次触发所有监听器。修改后的代码如下:
import discord client = discord.Client() @client.event async def on_ready(): print('in on_ready') @client.listen() async def on_message(message): print("in on_message #1") @client.listen() async def on_message(message): print("in on_message #2") @client.listen() async def on_message(message): print("in on_message #3") client.run("TOKEN")
这样当你发送消息时,三个print都会依次输出。
方法3:手动调用client.add_listener()注册事件
你也可以不用装饰器,手动调用add_listener方法来注册每个事件处理函数,效果和@client.listen()一样:
import discord client = discord.Client() async def on_message_1(message): print("in on_message #1") async def on_message_2(message): print("in on_message #2") async def on_message_3(message): print("in on_message #3") @client.event async def on_ready(): print('in on_ready') # 注册监听器 client.add_listener(on_message_1, 'on_message') client.add_listener(on_message_2, 'on_message') client.add_listener(on_message_3, 'on_message') client.run("TOKEN")
小提示
如果你使用的是commands.Bot(而不是discord.Client),在处理on_message时别忘了加上await bot.process_commands(message),否则你的命令可能无法正常触发哦~
内容的提问来源于stack exchange,提问作者Nathan Barry
相关产品推荐
相关产品推荐

