几天前,我开始对不和谐的机器人编程感兴趣。在这些程序的语法中,我注意到许多无法解决的难以理解的问题。 这就是为什么我要您帮助您了解它们。
所有问题均基于以下代码:
import discord
import asyncio
from discord.ext import commands
botToken = '***'
client = commands.Bot(command_prefix = '.')
@client.event
async def on_ready():
print('Bot is ready!')
@client.event
async def on_message(message):
author = message.author
if message.content =='Hello':
await client.send_message(message.channel, 'Welcome again {}!'.format(author))
client.run(botToken)
什么是@ client.event?我发现这是一个事件处理程序,但是它如何工作?为什么需要运行程序?它以某种方式连接到异步吗?
答案 0 :(得分:4)
当Client
接收到来自Discord的事件时,它将计算出该事件是什么并生成或定位该事件发送的对象,例如任何MESSAGE_RECEIVE事件的discord.Message
,或discord.Reaction
代表REACTION_ADD等。
然后,客户端将对象发送到处理这些事件的方法中,但是您首先需要告诉客户端这些方法是什么。这是事件装饰器出现的地方。
从本质上讲,装饰器是将其他功能作为参数的功能。您会看到的最常见的是@property
。这表示您定义的函数应该传递到property()
函数
@property
def name(self):
return self._name
与
相同def name(self):
return self._name
name = property(name)
这可能会使您困惑不解,但这就是discord.py处理事件的方式。
在@client.event
上使用on_message
装饰器时,实际上是在说on_message = client.event(on_message)
on_event的discord.py内部代码为this
def event(self, coro):
# Validation we don't need to worry about
setattr(self, coro.__name__, coro)
return coro
这意味着它将功能作为参数,并在客户端本身上设置新属性。对于我们的on_message
示例,我们将on_message
函数传递到client.event()
中,这使客户端定义了一个新的client.on_message
方法,该方法与我们的on_message
相同
注意:func.__name__
返回该函数的名称。 on_message.__name__
将返回"on_message"
。
setattr(obj, name, value)
在对象上设置属性,因此setattr(self, "foo", 100)
表示self.foo
将为100。
现在,客户端知道我们的on_message
,当它接收到一个说已发送消息的事件时,它将创建discord.Message
对象并将其传递给client.on_message
已建立,与我们自己的on_message
如果您愿意,甚至可以跳过装饰器并在功能执行后执行此操作,但是它不如装饰器那么优雅:
on_message = client.event(on_message)