問題描述
為什么我不能有多個 on_message
事件?
Why can't I have multiple 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
被觸發.我怎樣才能讓這三個都工作?
For example, if I typed anything in discord, it's always only the last on_message
that gets triggered. How can I get all three to work?
推薦答案
原生Client
是不行的你只能有一個 on_message
,如果你有多個,on_message
事件只會調用最后一個.你只需要結合你的三個 on_message
.
It's not possible with the native Client
You can only have one on_message
, if you have multiple, only the last one will be called for the on_message
event. You'll just need to combine your three 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
僅保留最近的回調),如果多個名稱相同,則最近的將被保留,所有其他的都會被覆蓋.
Like any Python variable/function (unless the decorator stores your function, @client.event
does it by keeping only the most recent callback), if multiple names are the same, the most recently will be kept, and all others will get overwritten.
這是我編寫的一個簡單示例,旨在讓您廣泛了解 discord.py 中的事件如何工作(注意:實際代碼與此不完全相同,因為它已被重寫并顯著減少).
This is a simple example I wrote to give you a broad understanding of how events in discord.py work (note: the actual code isn't exactly like this, as it's rewritten and significantly reduced).
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
實例.
As you can see client.event
only keep one instance of on_message
.
或者,如果您使用 discord.py 的 ext.commands
擴展,則可以通過本機方式獲得多個 on_message
回調.您可以通過將它們定義為 listener
來實現.您最多可以有一個 on_message
事件和無限數量的 on_message
偵聽器.
Alternatively, if you're using the ext.commands
extension of discord.py, there is a native way to have multiple on_message
callbacks. You do so by using defining them as a listener
. You can have at most one on_message
event, and infinite amounts of on_message
listeners.
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
都會被打印出來.
When a message is received, all on_message #1-3
will all get printed.
這篇關于為什么多個 on_message 事件不起作用?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!