Что это на самом деле @ client.event?discord.py - PullRequest
0 голосов
/ 07 октября 2018

Несколько дней назад я немного заинтересовался программированием диссонанс-ботов.В синтаксисе этих программ я заметил много неразборчивых проблем, на которые не могу найти ответ.Вот почему я прошу вас помочь в их понимании.

Все вопросы основаны на этом коде:

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?Я обнаружил, что это обработчик событий, но как он работает?Зачем нужно запускать программу?Это как-то связано с asyncio?

1 Ответ

0 голосов
/ 07 октября 2018

Когда Client получает событие от Discord, он определяет, что это за событие, и генерирует или находит объекты, которые были отправлены этим событием, например, discord.Message для любых событий MESSAGE_RECEIVE или 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)

Внутренний код discord.py для on_event: 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)
...