В настоящее время боты используются для автоматизации различных задач. С момента выпуска устройств Alexa от Amazon ажиотаж вокруг автоматических ботов только начал расти. Помимо Alexa, другие средства связи, такие как Discord и Telegram, предлагают API для разработки пользовательских ботов.
Эта статья будет посвящена исключительно созданию вашего первого бота с открытым API Discord. Пожалуй, самым известным ботом Discord является Music Bot. Музыкальный бот позволяет вам ввести название песни, и бот прикрепит к вашему каналу нового пользователя, который будет проигрывать запрошенную песню. Это широко используемый бот среди молодежи на игровых или потоковых серверах.
Давайте начнем с создания собственного бота Discord.
Шаг 1. Настройте тестовый сервер
В первую очередь нам нужен тестовый сервер, на котором мы потом сможем протестировать нашего Discord бота. Мы можем создать новый сервер, щелкнув значок плюса в левой части экрана.
нажмите создать сервер
Появится всплывающее окно с вопросом, хотите ли вы присоединиться к серверу или создать новый. Конечно, мы хотим создать новый сервер.
выберите создать сервер
Далее нам нужно ввести имя нашего сервера. Для простоты я назвал сервер discord_playground. Если вы хотите, вы можете изменить местоположение сервера в зависимости от того, где вы находитесь, чтобы получить лучший пинг.
имя сервера
Если все прошло хорошо, вы должны увидеть только что созданный сервер.
новый сервер
Шаг 2: Генерация токена аутентификации
Когда мы хотим управлять нашим ботом с помощью кода, нам нужно сначала зарегистрировать бота под нашей учетной записью Discord.
Чтобы зарегистрировать бота, перейдите на портал разработчиков Discord и войдите под своей учетной записью.
После входа в систему вы должны увидеть панель инструментов. Давайте создадим новое приложение, нажав кнопку New Application.
панель разработчика
Затем вы увидите всплывающее окно, в котором вас попросят ввести имя для вашего приложения. Назовем нашего бота
создать приложение
Когда приложение будет создано, вы увидите обзор только что созданного
обзор приветствующего бота
Теперь нажмите на пункт меню «Бот «в меню «Настройки «. Discord создаст наше
добавить бота
Когда бот будет создан, вы получите обзор вашего собственного бота. Загляните в раздел Токен. Скопируйте этот токен авторизации и запишите его
обзор вкладки бота
Шаг 3: Определите разрешения и добавьте бота на сервер
Перейдите в раздел OAuth2 в меню «Настройки «. Здесь мы можем определить область действия нашего бота. Поскольку мы просто хотим включить простого бота, мы выбираем вариант бота.
Вы могли заметить, что приведенный ниже
Область действия OAuth2
Если мы прокрутим дальше вниз, вы найдете раздел разрешений для ботов. Мы хотим, чтобы бот мог Send Messagesи Read Message History. Нам нужно разрешение на чтение истории сообщений, чтобы мы могли обнаруживать запросы пользователей.
При выборе обоих вариантов обратите внимание на то, что номер параметра разрешений в
Добавить разрешения
Наконец, скопируйте этот
Нажмите кнопку Авторизовать, чтобы добавить бота на наш сервер.
Добавить бота на сервер
Если вам удалось успешно добавить бота на свой сервер, вы должны увидеть следующий экран успеха.
Успешно добавить бота
Если вы хотите перепроверить, добавлен ли ваш бот, перейдите на канал General. Вы должны увидеть похожее сообщение, указывающее, что бот присоединился к каналу.
успешное добавление канала бота
Успех!
Шаг 4: Настройка проекта
Наконец, давайте настроим проект. Вы можете найти базовый проект на GitHub. Пожалуйста, клонируйте репозиторий локально на свой компьютер, используя git clone https://github.com/sitepoint-editors/discord-bot-sitepoint.
Проект зависит от двух зависимостей, dotenvи discord.js. Первая зависимость позволяет нам использовать.envфайл, содержащий записанный нами токен бота. Очевидно, что нам нужна вторая зависимость discord.jsдля разработки бота Discord.
Чтобы установить обе зависимости, выполните npm installих в папке проекта.
Наконец, чтобы завершить установку, создайте.envфайл в корне проекта. Добавьте одну переменную среды, вызываемую TOKENв файл, следующим образом:
TOKEN=
Шаг 5: Изучение Discord.js
Давайте посмотрим на index.jsфайл, расположенный в корне проекта:
require ('dotenv’).config () ;
const Discord = require ('discord.js’) ;
const bot = new Discord.Client () ;
const TOKEN = process.env.TOKEN;
bot.login (TOKEN) ;
Сначала мы загружаем переменные среды, которые мы определили, запрашивая конфигурацию из.envфайла среды. Это позволяет нам использовать TOKENпеременную, которую мы определили с помощью process.env.ToKEN. Последняя строка приведенного выше фрагмента показывает, как мы передаем токен в функцию входа, чтобы получить доступ к созданному нами боту.
Переменная botна самом деле является нашим клиентом Discord, через который мы будем взаимодействовать.
Слушайте «готовое» событие
Далее мы можем прослушивать события. Прежде всего, мы слушаем readyсобытие. Событие ready запускается, как только мы подключаемся к боту:
bot.on ('ready’, () => {
console.info (`Logged in as ${bot.user.tag}! `) ;
}) ;
Если вы использовали право TOKENвхода в бота, ваш терминал должен напечатать имя вашего бота bot.user.tag.
Вы можете запустить бота, просто выполнив node index.jsего в своем терминале. Убедитесь, что вы выполняете эту команду в корне вашего проекта.
Если бот успешно подключен, вы должны увидеть имя вашего бота, напечатанное в терминале.
Бот подключен
Прослушать событие «сообщение»
Помимо события готовности, клиент Discord позволяет прослушивать событие сообщения. Это означает, что бот может прочитать любое сообщение, отправленное на канал. Чтобы привязаться к разделу разрешений, это точная причина, по которой нам нужно дать боту разрешение на чтение истории сообщений.
bot.on ('message’, msg => {
if (msg.content === 'ping’) {
msg.reply ('pong’) ;
msg.channel.send ('pong’) ;
}
}) ;
Если мы изучим код немного дальше, вы увидите, что мы ищем сообщение с содержимым ping. Если мы получим сообщение, содержащее только ping, бот ответит pong. После этого msg.channel.sendснова используем для отправки pongв канал.
Обратите внимание на разницу между обеими командами:
msg.reply: помечает первого пользователя, отправившего сообщение
msg.channel.send: отправляет сообщение на канал, никого не отмечая
Попробуйте запустить бота с помощью node index.jsи отправить сообщение pingна generalканал. Проверьте, видите ли вы тот же результат.
Ищите отмеченных пользователей
Чтобы добавить новую команду, мы должны расширить ifпредложение, которое у нас есть, с помощью else... if:
if (msg.content === 'ping’) {
msg.reply ('pong’) ;
msg.channel.send ('pong’) ;
} else if (msg.content.startsWith ('! kick’)) {
if (msg.mentions.users.size) {
const taggedUser = msg.mentions.users.first () ;
msg.channel.send (`You wanted to kick: ${taggedUser.username}`) ;
} else {
msg.reply ('Please tag a valid user!') ;
}
}
Допустим, мы хотим выгнать
Если есть отмеченные пользователи, мы можем выбрать первого упомянутого пользователя с помощью msg.mentions.users.first (). Далее мы отвечаем каналу с именем пользователя в сообщении.
Выгнать пользователя
Шаг 6: Проблема с else... ifцепочкой
Далее давайте обсудим проблему со всеми этими else... ifутверждениями. Если у вас есть только несколько команд, определенных для прослушивания в событии сообщения, код вполне читабелен.
Однако, когда мы решаем таким образом построить обширный проект, мы получаем цепочку else... ifутверждений. Вот небольшой список причин, по которым вам не следует использовать else... ifцепочки ни для чего, кроме небольших проектов:
легче стать жертвой
код плохо читается
это не легко отлаживать
трудно организовать код
это непросто поддерживать по мере роста кода
Поэтому давайте посмотрим на шаблон команды, который мы можем использовать.
Реализация обработчика команд
Обработчик команд — это подход, поддерживаемый discord.jsпакетом. Прежде чем мы продолжим, проверьте advancedветку с git checkout advanced. Эта ветвь содержит реализацию обработчика команд.
Папка команд
module.exports = {
Ping: require ('. /ping’),
};
Далее давайте посмотрим на реализацию pingкоманды, которая в основном экспортирует объект, содержащий следующее:
name: имя команды.
description: рекомендуется добавлять описание для каждой команды.
execute: функция, которая принимает msgи argsвводит. Эта функция имеет ту же логику, что и в нашей else... ifцепочке.
module.exports = {
name: 'ping’,
description: 'Ping!',
execute (msg, args) {
msg.reply ('pong’) ;
msg.channel.send ('pong’) ;
},
};
Импорт команд
Продолжая, давайте импортируем команды в index.jsфайл. Обратите внимание, что мы определяем коллекцию команд для бота Discord. Мы перебираем все команды и добавляем их одну за другой в коллекцию команд.
Функция bot.commands.setпринимает имя команды и весь объект команды:
const Discord = require ('discord.js’) ;
const bot = new Discord.Client () ;
bot.commands = new Discord.Collection () ;
const botCommands = require ('. /commands’) ;
Object.keys (botCommands).map (key => {
bot.commands.set (botCommands[key].name, botCommands[key]) ;
}) ;
После этого нам нужно удалить нашу else... ifцепочку и заменить ее динамическим кодом, чтобы найти правильную команду, которую мы хотим вызвать:
bot.on ('message’, msg => {
const args = msg.content.split (/ +/) ;
const command = args.shift ().toLowerCase () ;
console.info (`Called command: ${command}`) ;
if (! bot.commands.has (command)) return;
try {
bot.commands.get (command).execute (msg, args) ;
} catch (error) {
console.error (error) ;
msg.reply ('there was an error trying to execute that command!') ;
}
}) ;
Сначала мы пытаемся разделить содержимое сообщения пробелами, используя.split (/ +/). Мы предполагаем, что первый элемент в этом argsмассиве — это наша команда. Чтобы проверить, существует ли команда в нашей коллекции, коллекция предоставляет has () функцию, которая просто возвращает true или false. Если команда не существует, мы возвращаем пустой ответ.
Однако, если команда существует, мы используем get () функцию, чтобы получить правильную команду и выполнить ее с входными параметрами msgи args.
Это удобный для чтения динамический способ вызова команд без написания
Опять же, если вы хотите протестировать новую версию нашего кода, убедитесь, что вы проверили advancedветку с расширением git checkout advanced. Затем установите все зависимости с помощью npm installи запустите бота с расширением node index.js.
Подведение итогов
Поначалу установка и настройка нового бота Discord может показаться сложной задачей. Однако API, предлагаемый discord.jsпакетом, прост, и на сайте Discord есть отличные примеры.
Поскольку в этом руководстве рассматриваются только два разрешения, можно найти гораздо больше. Вы можете узнать больше о разрешениях на сайте Discordjs.guide.
Удачи в создании вашего первого бота Discord!