国产的话是不可能的Client
你只能有one 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
实例
或者,如果您使用的是ext.commands
Discord.py 的扩展,有一种本机方法可以拥有多个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
都会被打印出来。