O que realmente é @client.evento? discord.py
todas as perguntas são baseadas neste código:
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)
O que é @client.evento? Descobri que é um manipulador de eventos, mas como é que funciona? Por que é necessário executar o programa? Está de alguma forma ligado a um asyncio?
1 answers
Quando Client
recebe um evento de Discórdia, que trabalha para fora o que esse evento e gera, ou localiza, os objetos que foram enviados pelo evento, tais como discord.Message
para qualquer MESSAGE_RECEIVE eventos, ou um discord.Reaction
para REACTION_ADD etc.
O cliente então envia os objetos para o método que lida com esses eventos, mas você primeiro precisa dizer ao cliente quais são esses métodos. É aqui que entram os decoradores de eventos.
Os decoradores são, em essência, funções que requerem outras funções como argumentos. O mais comum que você vai ver é
@property
. Isto diz que a função que você define deve ser passada para a função property()
@property
def name(self):
return self._name
É o mesmo que
def name(self):
return self._name
name = property(name)
Isto pode ser um pouco confuso, mas é assim ... discord.py trata dos seus eventos.
Quando usas o decorador no teu on_message
, o que estás a fazer é dizer on_message = client.event(on_message)
O código interno de discord.py para on_event is isto
def event(self, coro):
# Validation we don't need to worry about
setattr(self, coro.__name__, coro)
return coro
O que significa que toma a função como seu parâmetro, e define um novo atributo no próprio cliente. Para o nosso exemplo on_message
, passamos a nossa função on_message
para client.event()
e faz com que o cliente defina um novo método client.on_message
que é o mesmo método que o nosso on_message
.
Nota: func.__name__
devolve o nome dessa função. on_message.__name__
vai voltar "on_message"
.setattr(obj, name, value)
define um atributo num objecto, por isso setattr(self, "foo", 100)
significa que self.foo
será 100.
Agora que o o cliente conhece o nosso on_message
, quando recebe um evento que diz que uma mensagem foi enviada, cria o objeto discord.Message
e passa para client.on_message
, que como já estabelecemos, é o mesmo que o nosso próprio on_message
Se quisesses, podias até saltar o decorador e fazer isto depois da tua função, mas é menos elegante do que um decorador é:
on_message = client.event(on_message)