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

2023-12-01

为什么我不能有多个on_message events?

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")

例如,如果我输入不和谐的任何内容,它总是只有最后一个on_message被触发。我怎样才能让这三个人都工作?


国产的话是不可能的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.commandsDiscord.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都会被打印出来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么多个 on_message 事件不起作用? 的相关文章

随机推荐