Pull to refresh

Пишем Discord бота на Python используя фреймворк discord.ext

Сегодня мы создадим Discord бота на Python, для этого не надо прикладывать каких то фантастических усилий.


Подготовка к работе


Для начала посещаем портал разработчиков и жмём кнопку "New Application" ("Создать приложение"), вводим название нашего будущего бота и жмём "Create" ("Создать").


Диалоговое окно


image


Теперь нам нужно создать аккаунт для бота — переходим в категорию "Bot" и жмём "Add Bot" ("Добавить бота"), в появляющемся диалоговом окне подтвердим это — "Yes, do it!".


Настройки бота


image


Копируем токен используя соответсвующую кнопку.


Интересный факт: Токен разделён на 3 части с помощью точек. Первая часть — зашифрованый с помощью base64 ID бота, вторая — время создания токена, третья — секретный ключ.


А сейчас нам нужно установить библиотеку discord.py. Для этого нужно использовать утилиту pip.


pip install discord.py — обратите внимание что на дистрибутивах Linux pip, python являются версией 2.х, но нам нужна конкретно 3.5.3 и выше, поэтому pip нужно будет заменить на pip3 или pip3.x.
Также если у вас появилась ошибка изза отсутсвия прав суперпользователя (администратора) вы можете использовать флаг --user для установки библиотеки только для вашего пользователя.


"Костяк" программной части бота. Эвенты, команды


После установки библиотеки можем приступать к написанию кода.


import discord                                             # Импортируем библиотеку
from discord.ext import commands               # Импортируем из фреймворка класс commands

bot = commands.Bot(command_prefix='!')   # Провозглашаем переменную для бота с префиксом !

# Тут мы размещаем наши команды

bot.run(token='TOKEN')                              # Запускаем бота с вашим токеном 

Запускаем бота используя python/python3 main.py, где main.py — имя файла. Бот запустился и аутентифицировался. Теперь мы сделаем вывод сообщения в терминал при аутентификации и комманду ping.


@bot.event
async def on_ready():
    print(f'Logged in as {bot.user.name}')

@bot.command()
async def ping(ctx: commands.Context):
    await ctx.send('Pong!')

Давайте разбираться что это такое. Для начала — в первой строке мы видим декоратор bot.event, он обозначает программе что следующая функция будет реакцией на действие. Во второй строке мы видим саму функцию — она асинхронна.


Почему она должна быть асинхронна? Потому что возьмём для примера команду которую исполняют одновременно 2 раза разные пользователи. def может заставить бота повиснуть изза того что она не может быть исполнена вместе с другими процессами, но async def занимает только один поток вместо того что бы не давать другим процессам программы исполняться.


Мы видим что название функции — on_ready, её вызывает фреймворк если бот аутентифицировался. Дальше мы печатаем "Logged in as BotName", где BotName это значение переменной bot.user.name, если простым языком "Имя пользователя бота".


Дальше идёт декоратор команды bot.command()и он уже на отличие от bot.event может принимать такие аргументы как aliases, hidden но про это позже. Имя команды может быть любое кроме занятых названий и алиасов. Наша команда принимает аргумент ctx типа commands.Context, что же это?


Этот аргумент хранит информацию про сообщение, автора сообщения, гильдию, канал и т.п. и быть он всегда должен первым аргументом.


И что же мы делаем в ответ на команду? Мы запускаем асинхронную функцию ctx.send что бы отправить сообщение в тот канал в котором была отправлена команда


Тестируем наш костяк


Для начала нам нужно пригласить бота на сервер — и мы возвращаемся на портал разработки, переходим в категорию OAuth2 и в поле "Scopes" отмечаем только галочку на bot и получаем приглашение.


Запускаем бота, и тестируем работает ли команда


image


Заключение


Полезные ссылки:


https://discord.com/developers/
https://discordpy.readthedocs.io/en/latest


Возможно в следующих туториалах:


Работа с эмбедами
Разбитие бота на коги

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.