Как создать Discord-бота с помощью Node.js

0 Акции
0
0
0
0

Введение

Discord — это чат-приложение, позволяющее миллионам пользователей по всему миру общаться в чатах и голосовых чатах онлайн, объединяясь в сообщества, называемые гильдиями или серверами. Discord также предлагает обширный API, который разработчики могут использовать для создания мощных ботов Discord. Боты могут выполнять различные действия, такие как отправка сообщений на серверы, личные сообщения пользователям, модерация серверов и воспроизведение аудио в голосовых чатах. Это позволяет разработчикам создавать мощных ботов с продвинутыми и сложными функциями, такими как инструменты модерации или игры. Например, бот Dyno Tool обслуживает миллионы сообществ и обладает такими полезными функциями, как защита от спама, музыкальный проигрыватель и другие. Научившись создавать ботов Discord, вы сможете реализовать широкий спектр функций, с которыми ежедневно будут взаимодействовать тысячи людей.

В этом руководстве вы создадите Discord-бота с нуля, используя Node.js и библиотеку Discord.js, которая позволяет пользователям напрямую взаимодействовать с API Discord. Вы настроите профиль для Discord-бота, получите токены аутентификации для бота и запрограммируете его на обработку команд с пользовательскими аргументами.

Предпосылки

Прежде чем начать, вам понадобится:

  • Node.js установлен на вашем компьютере для разработки.
  • Любой текстовый редактор по вашему выбору, например, Visual Studio Code, Atom, Sublime или Nano.
  • Бесплатная учетная запись Discord с подтвержденным адресом электронной почты и бесплатный сервер Discord, который вы будете использовать для тестирования своего бота Discord.

Шаг 1 — Настройка Discord-бота

На этом этапе вы используете графический пользовательский интерфейс (GUI) разработчика Discord для запуска бота Discord и получения токена бота, который вы передаете своему приложению.

Чтобы зарегистрировать бота на платформе Discord, воспользуйтесь панелью управления приложением Discord. Здесь разработчики могут создавать приложения Discord, включая ботов.

Чтобы начать, нажмите «Новое приложение». Discord попросит вас ввести название нового приложения. Затем нажмите «Создать», чтобы создать приложение.

Примечание: имя вашего приложения не зависит от имени бота, а имя бота не обязательно должно совпадать с именем приложения.

Теперь откройте панель управления приложением. Чтобы добавить бота в приложение, перейдите на вкладку «Бот» на левой панели навигации.

Нажмите кнопку «Добавить бота», чтобы добавить бота в приложение. Нажмите «Да, сделайте это!», когда появится запрос на подтверждение. Вы перейдете на панель управления с информацией об имени бота, токене аутентификации и вашей фотографии профиля.

Вы можете изменить имя или изображение профиля бота здесь, на панели управления. Вам также потребуется скопировать токен аутентификации бота, нажав «Нажмите, чтобы увидеть токен» и скопировав появившийся токен.

Предупреждение: Никогда не передавайте и не загружайте свой токен бота, так как это позволяет кому угодно войти в систему вашего бота.

Теперь вам нужно создать приглашение для добавления бота в сообщество Discord, чтобы вы могли его протестировать. Сначала перейдите на страницу «Генератор URL» на вкладке «OAuth2» панели управления приложением. Чтобы создать приглашение, прокрутите страницу вниз и выберите бота в разделе «Области действия». Вам также потребуется настроить разрешения для управления действиями, которые ваш бот может выполнять в сообществах. В этом руководстве выберите «Администратор», что позволит вашему боту выполнять практически все действия в гильдии. Скопируйте ссылку с помощью кнопки «Копировать».

Затем добавьте бота на сервер. Перейдите по созданной вами ссылке-приглашению. Вы можете добавить бота на любой сервер, которым владеете или обладаете правами администратора, в раскрывающемся меню.

Теперь нажмите «Продолжить». Убедитесь, что вы отметили галочкой пункт «Администратор» — это предоставит боту права администратора. Затем нажмите «Авторизовать». Discord попросит вас решить капчу, прежде чем бот сможет подключиться к серверу. Теперь бот Discord будет отображаться в списке участников сервера, на который вы его добавили, как офлайн.

Вы успешно создали бота Discord и добавили его на сервер. Теперь вам нужно написать программу для входа в бота.

Шаг 2 — Создайте свой проект

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

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

Создайте папку вашего проекта:

mkdir discord-bot

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

cd discord-bot

Затем воспользуйтесь текстовым редактором, чтобы создать файл с именем config.json для хранения пароля аутентификации вашего бота:

nano config.json

Затем добавьте следующий код в файл конфигурации и замените выделенный текст токеном аутентификации вашего бота:

{
"BOT_TOKEN": "YOUR BOT TOKEN"
}

Сохраните файл и выйдите.

Далее вам нужно создать файл package.json, в котором будут храниться сведения о вашем проекте и информация об используемых в нём зависимостях. Для этого выполните следующую команду npm:

npm init

npm запросит у вас различные сведения о вашем проекте.

Теперь вам нужно установить пакет discord.js, который будет использоваться для взаимодействия с API Discord. Установить discord.js можно через npm с помощью следующей команды:

npm install discord.js

Теперь, когда вы настроили файл конфигурации и установили необходимые зависимости, вы готовы приступить к сборке бота. В реальном приложении большой бот будет разнесён по множеству файлов, но в этом руководстве код бота будет находиться в одном файле.

Сначала создайте файл index.js в папке discord-bot для кода:

nano index.js

Начните кодирование бота, потребовав зависимость discord.js и файл конфигурации с токеном бота:

const Discord = require("discord.js");
const config = require("./config.json");

После этого добавьте следующие две строки кода:

...
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
client.login(config.BOT_TOKEN);

Сохраните файл и выйдите.

Первая строка кода создаёт новый клиент Discord и назначает его фиксированному клиенту. Этот клиент частично отвечает за взаимодействие с API Discord и за уведомления Discord о таких событиях, как новые сообщения. Клиент фактически представляет собой бота Discord. Объект, переданный конструктору Client, определяет намерения шлюза вашего бота. Это определяет, какие события WebSocket будет прослушивать ваш бот. Здесь вы указали GUILDS и GUILD_MESSAGES, чтобы бот мог получать сообщения на форумах.

Вторая строка кода использует клиентский метод входа в созданный вами Discord-бот, используя пароль из файла config.json. Токен сообщает Discord API, для какого бота предназначено приложение, и подтверждает вашу аутентификацию для использования бота.

Теперь запустите файл index.js с помощью Node:

node index.js

Статус вашего бота изменится на «онлайн» на сервере Discord, на который вы его добавили.

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

Шаг 3 — Обработка первой команды пользователя

На этом этапе вы создаёте бота, который может обрабатывать пользовательские команды. Вы выполняете свою первую команду ping, которая отвечает “ping” и временем, затраченным на ответ.

Во-первых, вам необходимо обнаруживать и получать сообщения, отправляемые пользователями, чтобы иметь возможность обрабатывать любые команды. Используя метод on в клиенте Discord, Discord будет отправлять вам уведомления о новых событиях. Метод on принимает два аргумента: имя события, которого нужно ожидать, и функцию, которая будет выполняться каждый раз при его возникновении. С помощью этого метода вы можете ожидать сообщения о событии — это происходит каждый раз, когда сообщение отправляется на форум, на просмотр сообщений в котором у бота есть разрешение. Поэтому вам нужно создать функцию, которая будет выполняться каждый раз при отправке сообщения для обработки команд.

Сначала откройте файл:

nano index.js

Добавьте следующий код в ваш файл:

...
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
client.on("messageCreate", function(message) { 
}); 
client.login(config.BOT_TOKEN);

Эта функция, запускаемая при событии messageCreate, принимает сообщение в качестве параметра. Сообщение будет представлять собой экземпляр Discord.js, содержащий информацию об отправляемом сообщении и методы, помогающие боту реагировать.

Теперь добавьте следующую строку кода в функцию управления командой:

...
client.on("messageCreate", function(message) {
if (message.author.bot) return;
});
...

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

Теперь вам предстоит написать команду контроллера. Для этого полезно понять типичный формат команды Discord. Как правило, структура команды Discord состоит из трёх частей в следующем порядке: префикс, имя команды и (иногда) аргументы команды.

  • Префикс: Префикс может быть чем угодно, но обычно это знак препинания или абстрактная фраза, которая обычно не находится в начале сообщения. Это означает, что когда вы вводите префикс в начале сообщения, бот понимает, что эта команда предназначена для обработки ботом.
  • Имя команды: Имя команды, которую пользователь хочет использовать. Это означает, что бот может поддерживать несколько команд с разными функциями и позволяет пользователям выбирать между ними, предоставляя разные имена команд.
  • Аргументы: Иногда, если команда требует или использует дополнительную информацию от пользователя, пользователь может указать аргументы после имени команды, разделяя каждый аргумент пробелом.

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

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

...
const prefix = "!";
client.on("messageCreate", function(message) {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
});
...

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

Вторая строка кода, которую вы добавляете, проверяет, начинается ли содержимое сообщения, обрабатываемого ботом, с заданного вами префикса, и если это не так, он прекращает обработку сообщения.

Теперь вам нужно преобразовать оставшуюся часть сообщения в имя команды и все аргументы в сообщении. Добавьте следующие выделенные строки:

...
client.on("messageCreate", function(message) {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
const commandBody = message.content.slice(prefix.length);
const args = commandBody.split(' ');
const command = args.shift().toLowerCase();
});
...

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

Вторая строка берёт сообщение без префикса и применяет к нему метод split, используя пробел в качестве разделителя. Это разбивает его на массив подстрок, причём разбиение происходит везде, где встречается пробел. В результате получается массив, содержащий имя команды, а затем, если они включены в сообщение, любые аргументы. Этот массив присваивается константе args.

Третья строка удаляет первый элемент из массива args (который будет именем предоставленной команды), преобразует его в нижний регистр и присваивает константе command. Это позволяет изолировать имя команды и оставить в массиве только аргументы. Также используется метод toLowerCase, поскольку команды в Discord-ботах обычно нечувствительны к регистру.

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

Добавьте следующий код для запуска команды ping:

...
const args = commandBody.split(' ');
const command = args.shift().toLowerCase();
if (command === "ping") {

} 
});
...

Этот оператор if проверяет, соответствует ли имя команды, которое вы проанализировали (присвоенное константе), слову “ping”. Если да, это означает, что пользователь хочет использовать команду “ping”. Код конкретной команды указывается в блоке оператора if. Вы будете повторять этот шаблон для других команд, которые хотите выполнить.

Теперь вы можете реализовать код команды “ping”:

...
if (command === "ping") {
const timeTaken = Date.now() - message.createdTimestamp;
message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
}
...

Сохраните файл и выйдите.

Вы добавляете блок команды “ping”, который вычисляет разницу в миллисекундах между текущим временем, найденным с помощью нового метода объекта Date, и временной меткой созданного сообщения. Этот расчет определяет время, необходимое для обработки сообщения и отправки “ping” боту.

Вторая строка отвечает на команду пользователя, используя метод response, указанный в константе message. Метод response отправляет ping-запрос пользователю, вызвавшему команду (что уведомляет пользователя и выделяет сообщение для указанного пользователя), а затем содержимое, предоставленное в качестве первого аргумента метода. Вы предоставляете литеральный шаблон, содержащий сообщение и вычисленное значение ping, в качестве ответа, который будет использоваться методом response.

На этом выполнение команды “ping” завершается.

Запустите своего бота с помощью следующей команды (в той же папке, что и index.js):

node index.js

Теперь вы можете использовать команду “!ping” на любом канале, который видит бот, и отправлять туда сообщения, а также получать ответ.

Вы успешно создали бота, обрабатывающего пользовательские команды, и выполнили свою первую команду. Далее вы продолжите разработку бота, выполнив команду sum.

Шаг 4 — Выполнение команды Sum

Теперь вы расширите свою программу, выполнив команду “!sum”. Эта команда принимает любое количество аргументов и складывает их, а затем возвращает пользователю сумму всех аргументов.

Если ваш Discord-бот все еще запущен, вы можете остановить его процесс сочетанием клавиш CTRL + C.

Откройте файл index.js еще раз:

nano index.js

Блок else-if используется для запуска выполнения команды “!sum”. После проверки имени команды ping программа проверяет, равно ли имя команды “sum”. Блок else-if используется, поскольку одновременно обрабатывается только одна команда, поэтому, если программа сопоставляет имя команды “ping”, ей не нужно проверять команду “sum”. Добавьте в файл следующие выделенные строки:

...
if (command === "ping") {
const timeTaken = Date.now() - message.createdTimestamp;
message.reply(`Ping! This message had a latency of ${timeTaken}ms.`);
}
else if (command === "sum") {

} 
});
...

Вы можете начать выполнять код оператора “sum”. Код оператора “sum” помещается внутрь только что созданного вами блока else-if. Теперь добавьте следующий код:

...
else if (command === "sum") {
const numArgs = args.map(x => parseFloat(x));
const sum = numArgs.reduce((counter, x) => counter += x);
message.reply(`The sum of all the arguments you provided is ${sum}!`);
}
...

Вы используете метод map для списка аргументов, чтобы создать новый список, применяя функцию parseFloat к каждому элементу массива args. Это создаёт новый массив (присваиваемый константе numArgs), где все элементы являются числами, а не строками. Это означает, что впоследствии вы сможете успешно найти сумму чисел, сложив их.

Во второй строке используется метод reduce константы numArgs, который предоставляет функцию, суммирующую все элементы списка. Сумма всех элементов numArgs присваивается константе sum.

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

На этом выполнение команды “sum” завершается. Теперь запустите бота, выполнив следующую команду (в той же папке index.js):

node index.js

Теперь вы можете использовать команду “!sum” в любом канале, который бот может просматривать и куда может отправлять сообщения.

Ниже представлена полная версия скрипта бота index.js:

const Discord = require("discord.js");
const config = require("./config.json");
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
const prefix = "!";
client.on("messageCreate", function(message) {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
const commandBody = message.content.slice(prefix.length);
const args = commandBody.split(' ');
const command = args.shift().toLowerCase();
if (command === "ping") {
const timeTaken = Date.now() - message.createdTimestamp;
message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
}
else if (command === "sum") {
const numArgs = args.map(x => parseFloat(x));
const sum = numArgs.reduce((counter, x) => counter += x);
message.reply(`The sum of all the arguments you provided is ${sum}!`);
}
});
client.login(config.BOT_TOKEN);

На этом этапе вы создали своего Discord-бота, выполнив команду sum.

Результат

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может понравиться