原生 Client 是不可能的
你只能有一个on_message,如果你有多个,on_message 事件只会调用最后一个。您只需要将您的三个 on_message 组合起来。
import discord
client = discord.Client()
@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")
与任何 Python 变量/函数一样(除非装饰器存储了您的函数,@client.event 仅保留最近的回调),如果多个名称相同,则保留最近的名称,而所有其他名称将得到覆盖。
这是我编写的一个简单示例,旨在让您广泛了解 discord.py 中的事件如何工作(注意:实际代码与此不完全相同,因为它已被重写并显着减少)。
class Client:
def event(self, func):
if func.__name__ == "on_message":
self.on_message_handle = func
return func
def receive_message(self, msg):
func = getattr(self, "on_message_handle", None)
if func is not None:
func(msg)
else:
self.process_commands(msg)
client = Client()
@client.event
def on_message(msg):
print("in on_message #1")
@client.event
def on_message(msg):
print("in on_message #2")
client.receive_message("hello")
# "in on_message #2"
如您所见,client.event 只保留一个 on_message 实例。
您可以使用 Bot 实例
或者,如果您使用 discord.py 的 ext.commands 扩展名,则有一种本地方式可以有多个 on_message 回调。为此,您可以将它们定义为listener。您最多可以拥有一个on_message 事件,以及无限数量的on_message 侦听器。
from discord.ext import commands
bot = commands.Bot('.')
@bot.event
async def on_message(msg):
print("in on_message #1")
await bot.process_commands(msg) # so `Command` instances will still get called
@bot.listen()
async def on_message(msg):
print("in on_message #2")
@bot.listen()
async def on_message(msg):
print("in on_message #3")
bot.run("TOKEN")
收到消息后,所有on_message #1-3都会被打印出来。