为什么多个on_message事件不起作用?

Nat*_*rry 3 python discord discord.py

为什么不能有多个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")

@client.event
async def on_message(message):
    print("in on_message #2")

@client.event
async def on_message(message):
    print("in on_message #3")

client.run("TOKEN")
Run Code Online (Sandbox Code Playgroud)

例如,如果我输入不一致的内容,则总是只有最后on_message一个被触发。我怎样才能使这三个都正常工作?

abc*_*ccd 5

用本地人不可能 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")
Run Code Online (Sandbox Code Playgroud)

像任何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"
Run Code Online (Sandbox Code Playgroud)

如您所见,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")
Run Code Online (Sandbox Code Playgroud)

收到消息后,on_message #1-3将全部打印。