Discord — одно из самых популярных приложений для чата в мире; с более чем 140 миллионами активных пользователей, вполне вероятно, что вы и все, кого вы знаете, уже используете его! Создание собственного бота Discord может быть интересным способом добавления пользовательских функций на ваш сервер Discord и хорошим способом немного узнать об использовании API Discord. В этом руководстве мы будем использовать Discord.js, библиотеку Node.js, которая позволяет легко взаимодействовать с Discord API, чтобы создать бота Magic 8-Ball. Мы также разместим бота в облаке с помощью AWS. Добьемся ли мы успеха? 🎱 Знаки указывают на то, что да. 🎱

Примечание

В этом руководстве предполагается, что у вас есть некоторый опыт работы со следующим:

  • Discord (как пользователь, а не разработчик)
  • Node.js и нпм
  • AWS и интерфейс командной строки AWS (если вы хотите разместить своего бота)
  • Волшебная восьмерка

Что такое бот Discord и как с ним работать?

На высоком уровне боты Discord подключаются к серверам Discord способом, очень похожим на то, как это делает пользователь. Бот получает события с сервера, как и обычный клиент Discord, и может быть запрограммирован на выполнение действий при возникновении определенных событий. Вы можете быть удивлены, обнаружив, что бот Discord получает каждое сообщение и каждое событие на каждом канале, к которому у него есть доступ. Конфиденциальность в эпоху цифровых технологий? 🎱 Не рассчитывайте на это. 🎱

Начиная

Чтобы начать создавать своего первого бота Discord, вам понадобится несколько вещей:

Зарегистрируйте бота

Первое, что нам нужно сделать, это создать бота с помощью портала для разработчиков Discord. Нажмите Новое приложение и введите имя бота. На этой странице мы также можем добавить иконку и описание.

Затем перейдите к настройкам Bot с помощью меню слева. Нажмите Добавить бота.

Эта страница используется для получения токена бота. Нам понадобится этот токен, как только мы начнем программировать. Этот токен по сути является паролем бота и должен храниться в секрете! Должны ли вы зафиксировать этот токен в общедоступном репозитории github? 🎱 Мои источники утверждают, что нет. 🎱

Последнее, что нужно сделать на портале разработчиков, — это создать ссылку для приглашения, чтобы мы могли добавить бота на сервер для тестирования. Щелкните параметр OAuth2 в левой части страницы. Это меню используется для создания ссылки-приглашения только с теми разрешениями, которые нужны вашему боту. В разделе Области выберите bot. В появившемся ниже новом меню разрешения для ботов выберите Просмотреть каналы и Отправить сообщения.

Примечание

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

Откройте ссылку в браузере и следуйте подсказкам.

Теперь на вашем сервере Discord вы должны увидеть бота в списке участников. Бот будет отключен, пока мы не оживим его на следующем шаге. Наконец-то пора заняться программированием? 🎱 Да — определенно. 🎱

Приступаем к кодированию

На этом этапе мы настроим простой проект Node.js и подключим бота к сети. Сначала создайте новый каталог проекта и cd в него:
mkdir magic-8-ball && cd magic-8-ball

Инициализируйте npm с настройками по умолчанию:
npm init -y

Установите Discord.js и dotenv:
npm i discord.js dotenv

Затем создайте файл .env и добавьте в него токен вашего бота:

DISCORD_BOT_TOKEN=your_token_here

Создайте файл index.js и вставьте в него код этого примера:

Этого кода достаточно, чтобы подключить вашего бота к сети и заставить его реагировать, когда пользователь вводит ping в любом из каналов чата на вашем сервере Discord. Вернитесь в командную строку и запустите приложение:
node index.js

Теперь ваш бот должен быть в сети! Должны ли мы отпраздновать эту маленькую победу, прежде чем двигаться дальше? 🎱 Без сомнения. 🎱

Да начнутся гадания

Теперь, когда бот жив, мы можем добавить код, необходимый для придания этой цифровой Magic 8-Ball невероятных способностей предвидения! Добавьте этот код в начало index.js, где определены другие константы.

Этот код определяет префикс команды (строка, которая должна быть включена в начало сообщения, чтобы вызвать бота) и функцию для возврата определенного сообщения. Затем замените существующий обработчик событий message на приведенный ниже. Этот код указывает боту игнорировать сообщения от ботов и отвечать только на сообщения, начинающиеся с префикса, определенного выше.

Сохраните файл и перезапустите процесс. Теперь вы сможете протестировать своего бота следующим образом:

Это работает! Это еще один шанс отпраздновать? 🎱 Определенно так.🎱

Размещение вашего бота на AWS

Вы можете остановиться на этом, но ваш бот будет работать только тогда, когда на вашем компьютере запущен код. Чтобы действительно завершить этот проект, нам нужно предоставить боту место, где все боты хотят жить: в облаке!
Мы будем запускать бота на экземпляре AWS EC2. которые мы запускаем с помощью интерфейса командной строки AWS. Если у вас еще не настроен AWS CLI, вы можете прочитать о том, как это сделать здесь.

Примечание

В этой части руководства предполагается, что у вас есть некоторый опыт работы с AWS EC2. Если вы новичок в AWS EC2, этот ресурс — отличное место для начала.

Во-первых, нам нужно запустить экземпляр EC2, который является виртуальным компьютером AWS. Выполнение приведенной ниже команды создаст экземпляр EC2 в вашем облаке VPC по умолчанию с использованием вашей группы безопасности по умолчанию. Вам нужно будет заменить <your_key_name> на имя вашего ключа ssh. Если в вашей учетной записи AWS еще нет пары ключей ssh, вы можете узнать, как это сделать здесь.

aws ec2 run-instances --image-id $(aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 --query 'Parameters[0].[Value]' --output text) --count 1 --instance-type t2.nano --key-name <your_key_name> --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=my-discord-bot}]'

Серверу потребуется минута или две, прежде чем вы сможете к нему подключиться. Вы можете запустить следующую команду, чтобы получить информацию о вашем новом экземпляре, включая статус:
aws ec2 describe-instances --filters "Name=tag:Name,Values=my-discord-bot" --query 'Reservations[*].Instances[*].{Instance:InstanceId,Subnet:SubnetId,Name:Tags[?Key==Name]|[0].Value,State:State.Name,IP:PublicIpAddress}'

Как только состояние станет running, вы сможете подключиться к серверу с помощью команды, подобной:

ssh -i /path/to/your/key [email protected]

Если вы не можете подключиться к своему экземпляру, вам может потребоваться отредактировать группу безопасности AWS по умолчанию, чтобы разрешить входящий трафик с вашего IP-адреса.

После подключения установите nvm и узел:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
. ~/.nvm/nvm.sh
nvm install node 12

Вернувшись на локальный компьютер, запустите эту команду из каталога вашего проекта, чтобы загрузить код вашего бота в экземпляр:
scp -v -i /path/to/your/key -r "$(PWD)/" [email protected]:magic-8-ball/

Теперь, когда ваш код находится на сервере, переподключитесь по ssh и запустите бота как фоновый процесс:
ssh -i /path/to/your/key [email protected]
cd magic-8-ball
nohup node index.js &

Вот и все! Теперь ваш бот успешно работает в облаке! Спасибо за прочтение 👀

Ресурсы

Ответы Magic 8-Ball
Документация для разработчиков Discord
Как создать бота Discord с помощью Node.js
discord.js
dotenv
настройка Node.js на AWS EC2
запрос последнего идентификатора Amazon Linux AMI