Шаги по созданию и развертыванию бота Discord

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

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

Настройка среды разработки

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

Чтобы следовать этому руководству, вам необходимо следующее:

Создайте каталог проекта, выполнив следующую команду:

mkdir discord-bot && cd discord-bot && npm init -y

Приведенная выше команда создает директорию discord-bot и инициализирует в ней npm.

Затем перейдите к файлу package.json и добавьте в него приведенный ниже сценарий запуска:

"start": "node server.js"

Затем установите необходимые зависимости для вашего проекта, выполнив приведенную ниже команду:

npm install discord.js axios dotenv 

Ниже приведены зависимости, которые вы установили:

  • discord.js: Эта библиотека позволит вам взаимодействовать с API Discord из вашего приложения Node.js.
  • dotenv: Этот пакет поможет вам управлять конфиденциальными данными, такими как токен вашего бота.
  • axios: Этот пакет позволит вам запрашивать API Trivia.

Итак, вы настроили среду разработки и установили необходимые зависимости. Далее вам предстоит создать аккаунт бота Discord.

Создание учетной записи бота Discord

Учетная запись Discord Bot – это учетная запись Discord, созданная для управления ботом. В отличие от обычных пользовательских аккаунтов, которые контролируются людьми, аккаунты ботов контролируются программным обеспечением.

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

Чтобы создать аккаунт бота Discord, необходимо сначала создать приложение Discord. Чтобы создать приложение, перейдите на портал разработчиков Discord и нажмите кнопку “Создать приложение”, как показано на рисунке ниже.

Создание приложения Discord Bot

При нажатии на кнопку вам будет предложено войти в свою учетную запись Discord. После входа в систему дайте своему приложению имя и нажмите кнопку “Создать”, как показано на рисунке ниже.

Название Discord App

Затем отключите переключатель “Публичный бот”, чтобы только вы могли добавлять своего бота на серверы.

Затем настройте права бота, переключив все “Privileged Gateway Intents”, чтобы обеспечить ему доступ к обновлениям активности сервера в реальном времени, например, к присутствию участников.

Настройка намерений шлюза

Далее перейдите на вкладку “OAuth2” на левой боковой панели. В разделе “SCOPES” отметьте флажками бота и application.commands, как показано на изображении ниже.

Прицелы для ботов

Выбор области действия bot позволит Discord распознать ваше приложение как бота, а область действия application.commands позволит вам создавать слэш-команды, которые будет слушать ваш бот.

При установке флажка “BOT PERMISSIONS” откроется раздел “BOT”. В разделе “BOT PERMISSIONS” отметьте флажком администратора, как показано на рисунке ниже.

Разрешения для ботов

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

Ниже раздела “BOT PERMISSIONS” Discord сгенерирует URL-адрес, по которому вы сможете добавить бота на сервер. Вставьте URL в веб-браузер и выберите сервер для добавления бота.

URL-адрес, сгенерированный ботом Discord

Затем получите токен бота на вкладке “Бот”, нажав кнопку“Сбросить токен“, как показано на изображении ниже.

При первом нажатии на кнопку стандартный токен вашего бота будет сброшен, а вам будет предоставлен новый токен. Скопируйте и надежно храните токен. Если вы потеряете токен, вам придется сбросить его снова, так как он показывается только один раз.

Создайте файл .env, чтобы добавить в него переменные окружения, например токен бота, а также другие данные, такие как ID гильдии, в которую вы добавили бота, и ID клиента бота:

TOKEN = "<BOT TOKEN>"
GUILD_ID = "<GUILD ID>"
CLIENT_ID = "<BOT'S CLIENT ID>"

Теперь вы настроили свой аккаунт Discord Bot. Далее вы создадите своего Discord-бота.

Создание проекта Discord Bot с помощью Node.js

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

Чтобы следовать этому руководству, структурируйте каталог вашего проекта так же, как показано ниже.

quiz-bot/
│
├── src/
│   ├── register-commands.js   # Script to register slash commands with Discord
│   └── quiz-bot.js                # Script for message handling and fetching questions
│
├── server.js                  # Entry point for your bot and script for running a server
├── node_modules/              # Node.js modules
│
├── .env                       
├── .gitignore                   
├── package.json                         
└── package-lock.json

Регистрация команд бота

Боты требуют от пользователей ввода команды. В ботах Discord вы определяете команды, которые должен прослушивать ваш бот, с помощью префикса слэш (/).

Чтобы зарегистрировать команду /quiz вашего бота на сервере Discord, сначала добавьте следующие импорты из discord.js в файл register-commands.js:

// register-commands.js
const { REST, Routes, ApplicationCommandOptionType } = require('discord.js');

В число импортированных классов входят следующие:

  • REST: Этот класс позволяет выполнять вызовы REST API к API Discord.
  • Маршруты: Этот класс предоставляет служебные функции, которые генерируют конечные точки Discord API.
  • ApplicationCommandOptionType: Этот класс позволяет определить типы данных для опций, которые будет принимать команда.

Далее вам нужно определить массив объектов команд, которые содержат все команды вашего бота. Объект команды содержит имя, описание и массив опций.

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

Добавьте приведенный ниже блок кода в файл register-commands.js, чтобы создать массив команд:

// register-commands.js
const commands = [
  {
    name: 'quiz',
    description:
      'Select difficulty and question type to tailor the quiz experience.',
    options: [
      {
        type: ApplicationCommandOptionType.String,
        name: 'difficulty',
        description: "Options include 'easy', 'medium', or 'hard'.",
        required: true,
      },
      {
        type: ApplicationCommandOptionType.String,
        name: 'type',
        description:
          " Choose 'multiple' for multiple choice or 'boolean' for true/false",
        required: true,
      },
    ],
  },
];

В приведенном выше блоке кода команда quiz определяется в массиве commands. Объект quiz содержит два параметра, которые пользователь должен ввести вместе с командой /quiz, такие как уровень сложности и тип вопроса, который будет задавать бот.

Далее вам нужно зарегистрировать команду /quiz, чтобы сделать ее доступной через вашего бота. Чтобы зарегистрировать команду, сначала нужно создать экземпляр класса REST с вашим токеном бота discord и предпочтительной версией REST.

Чтобы зарегистрировать команду /quiz и сделать ее доступной через вашего бота, начните с создания экземпляра класса REST, используя токен бота Discord и указав предпочтительную версию REST.

Например, так:

// register-commands.js
const rest = new REST({ version: '10' }).setToken(process.env.TOKEN);

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

Определение конкретной версии REST для вашего проекта Discord позволяет эффективно управлять возможностями, доступными вашему проекту. В приведенном выше блоке кода используется версия 10 API Discord.

Далее необходимо определить асинхронную функцию для регистрации команд бота на сервере гильдии с помощью метода applicationGuildCommands из класса Routes.

Например, так:

// register-commands.js
(async () => {
  try {
    console.log('Started refreshing SLASH (/) commands.');
    await rest.put(
      Routes.applicationGuildCommands(
        process.env.CLIENT_ID,
        process.env.GUILD_ID
      ),
      { body: commands }
    );
    console.log('Successfully reloaded SLASH (/) commands.');
  } catch (error) {
    console.error(error);
  }
})();

Приведенный выше блок кода выполняет PUT-запрос к конечной точке Discord API с массивом команд в качестве тела запроса.

Он создает конечную точку API с помощью метода applicationGuildCommands, принимая ID клиента бота и ID целевой гильдии.

После регистрации команд вам нужно будет управлять потоком взаимодействия между вашим ботом и членом гильдии.

Обработка взаимодействия пользователей с ботом Discord

Чтобы управлять потоком взаимодействия между вашим ботом и членом гильдии, сначала добавьте следующие импорты в файл quiz-bot.js:

// quiz-bot.js
const { Client, IntentsBitField } = require('discord.js');
const axios = require('axios');

Вам нужно использовать класс Client для создания нового экземпляра бота Discord, а класс IntentsBitField – для указания интентов (событий), которые ваш бот будет получать от Discord API.

Далее добавьте приведенный ниже блок кода в файл quiz-bot.js, чтобы создать новый экземпляр клиента для вашего бота и указать конкретные намерения для вашего бот-приложения:

// quiz-bot.js
const client = new Client({
  intents: [
    IntentsBitField.Flags.Guilds,
    IntentsBitField.Flags.GuildMembers,
    IntentsBitField.Flags.GuildMessages,
    IntentsBitField.Flags.MessageContent,
  ],
});

Блок кода выше определяет конкретные намерения, необходимые боту для работы, которые включают в себя:

  • IntentsBitField.Flags.Guilds: Это намерение позволяет боту получать информацию о гильдиях (серверах), в которых он состоит, включая их названия, иконки и роли.
  • IntentsBitField.Flags.GuildMembers: Это намерение позволяет боту получать информацию о членах гильдии, такую как их имена пользователей, статусы и роли.
  • IntentsBitField.Flags.GuildMessages: Это намерение предоставляет боту доступ к сообщениям, отправленным в гильдиях, в которых он состоит, позволяя ему реагировать на команды или события, вызванные сообщениями.
  • IntentsBitField.Flags.MessageContent: Это намерение позволяет вашему боту получить доступ к фактическому содержанию сообщений, отправленных в гильдиях. Без этого намерения содержимое сообщений будет пустым.

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

Добавьте приведенный ниже блок кода в файл quiz-bot.js, чтобы создать слушатель события готовности:

// quiz-bot.js
client.on('ready', () => {
  console.log(`✅ Bot is online and ready`);
});

Далее вам нужно создать слушателя события interactionCreate. Это событие происходит, когда пользователь выполняет взаимодействие, которое ваш бот может обработать, например, использует команду slash.

Когда это произойдет, ваш слушатель событий получит событие interactionCreate вместе с объектом взаимодействия.

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

Добавьте приведенный ниже блок кода в файл quiz-bot.js для создания слушателя события interactionCreate:

// quiz-bot.js
client.on('interactionCreate', async (interaction) => {
 if (!interaction.isChatInputCommand()) return;
 
 if (interaction.commandName === 'quiz') {
  // Rest of the code goes here...
 }
});

Блок кода выше устанавливает слушателя события interactionCreate.

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

Затем он проверяет, является ли commandName викториной, и приступает к обработке сессии викторины между ботом и пользователем.

Если commandName – это викторина, сделайте GET-запрос с помощью Axios к URL Trivia API, чтобы получить вопрос и ответы на него (правильные и неправильные).

Перемешайте ответы, чтобы рандомизировать варианты, а затем отобразите их пользователю.

Например, так:

// quiz-bot.js

await interaction.deferReply();

const difficulty = interaction.options.getString("difficulty");
const type = interaction.options.getString("type");

try {
  const url = `https://opentdb.com/api.php?amount=1&difficulty=${difficulty}&type=${type}`;
  const response = await axios.get(url);
  const data = response.data.results[0];
  const question = data.question;
  const correctAnswer = data.correct_answer;
  const options = [...data.incorrect_answers, correctAnswer];

  // Shuffle the options
  for (let i = options.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [options[i], options[j]] = [options[j], options[i]];
  }

  await interaction.editReply({
    content: `Question: ${question}\\nOptions: ${options.join(", ")}`,
  });
} catch (error) {
  console.error(error);
  // Notify the user in case of an error after deferring
  await interaction.followUp("Failed to fetch the question. Please try again.");
}

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

Затем блок кода извлекает выбранную пользователем сложность и тип вопроса из объекта взаимодействия, используя interaction.options.getString().

Затем бот извлекает из полученных данных вопрос, правильный и неправильный ответы.

Перемешав правильные и неправильные ответы в случайном порядке, он редактирует первоначальный отложенный ответ с вопросом викторины и вариантами ответов.

Далее необходимо обработать ответ пользователя на вопрос, сверив его с правильным ответом и сообщив пользователю о том, правильно он ответил или нет.

Сбор ответов пользователей

Чтобы собрать ответ пользователя на вопрос, вы используете метод createMessageCollector на канале взаимодействия(interaction.channel).

Этот метод позволяет отфильтровать сообщения, отправленные не пользователем, инициировавшим команду /quiz, установить ограничение по времени для ответа пользователя и указать максимальное количество сообщений для сбора.

Когда пользователь отправляет ответ, метод createMessageCollector запускает событие collect.

Вам нужно добавить слушателя этого события; слушатель будет проверять ответ пользователя на соответствие правильному ответу на вопрос и отправлять соответствующее сообщение.

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

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

Например, так:

// quiz-bot.js
const filter = (m) => m.author.id === interaction.user.id;

const collector = interaction.channel.createMessageCollector({
  filter,
  time: 15000,
  max: 1,
});

collector.on("collect", async (m) => {
  if (m.content.toLowerCase() === correctAnswer.toLowerCase()) {
    await m.reply("Correct answer! 🎉");
  } else {
    await m.reply(`Wrong answer! The correct answer was: ${correctAnswer}`);
  }
});

collector.on("end", (collected) => {
  if (collected.size === 0) {
    interaction.followUp("Time is up! No answer was provided.");
  }
});

Блок кода выше создает коллектор сообщений для канала, на котором происходило взаимодействие(коллектор). Коллектор будет фильтровать сообщения на основе идентификатора автора, гарантируя, что только пользователь, инициировавший викторину, сможет дать ответ в течение 15-секундного лимита времени.

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

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

Затем установите соединение между вашим ботом и Discord, добавив строку кода в конец файла quiz-bot.js:

// quiz-bot.js
client.login(process.env.TOKEN);

Создание файла записи

Вы создадите входной файл, который будет инициализировать все приложение бота. Он будет выполнять две функции:

  • Импорт логики бота: Входной файл запускает логику бота, требуя файлы JavaScript, которые регистрируют команду бота на сервере Discord и отвечают на сообщения пользователей.
  • Запуск сервера: Файл записи настроит сервер, который позволит вашему боту работать в контейнере Back4app. Контейнеры Back4app требуют открытых портов для успешного развертывания вашего приложения.

Добавьте приведенный ниже блок кода в файл server.js, чтобы создать сервер:

// server.js
require('dotenv').config();
const http = require('http');
require('./src/register-commands.js');
require('./src/quiz-bot.js');

http
  .createServer((req, res) => {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Bot is running!');
  })
  .listen(3000, () => {
    console.log('Server is ready.');
  });

Приведенный выше блок кода настраивает вашего бота Discord на работу, создавая простой HTTP-сервер. Этот сервер выступает в качестве точки входа, позволяя боту функционировать в среде контейнера.

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

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

Тестирование вашего Discord-бота

Запустите своего бота Discord, выполнив приведенный ниже блок кода в терминале вашего приложения:

node server.js

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

Начните ботать локально

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

Тестирование викторина приложение

Чтобы взаимодействовать с ботом, отправьте команду /quiz. В ответ бот предложит вам варианты того, как вы хотите, чтобы выглядел вопрос викторины.

Выберите сложность и тип вопроса

Выберите нужные параметры (например, категорию теста или уровень сложности) и нажмите Enter. В ответ бот задаст вопрос и установит 15-секундный лимит времени для ответа.

Если вы отправите свой ответ в течение установленного времени, бот сравнит его с правильным и сообщит вам о правильности или неправильности вашего ответа.

Ответ бота на Discord

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

Развертывание бота Discord на контейнерах Back4app с помощью AI Agent

В этом разделе вы развернете своего бота Discord на контейнерах Back4app с агентом искусственного интеллекта Back4app.

Чтобы развернуть приложение в контейнерах Back4app, вам понадобится следующее:

  • Dockerfile в вашем проекте
  • Репозиторий GitHub: Ваш проект должен быть загружен в репозиторий GitHub.
  • Приложение Back4app GitHub: Установите и предоставьте необходимые разрешения приложению Back4app GitHub для вашего репозитория

Сначала создайте Dockerfile в корневом каталоге вашего проекта и добавьте в него блок кода, приведенный ниже:

# Dockerfile
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

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

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

Перейдите на домашнюю страницу Back4app и нажмите кнопку “Новое приложение” в правом верхнем углу экрана.

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

Выберите опцию Back4app Agent, как показано на изображении ниже.

Когда вы выберете опцию Back4app Agent, вы будете перенаправлены на страницу агента Back4app AI.

Дайте агенту искусственного интеллекта следующую подсказку для развертывания вашего приложения:

Deploy my "YOUR_REPOSITORY_URL" repository on GitHub to a Back4App Container.
Here are the required environmental variables:
TOKEN = "YOUR_DISCORD_BOT_TOKEN"
GUILD_ID = "YOUR_GUILD_ID"
CLIENT_ID = "YOUR_CLIENT_ID"

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

Вы должны получить ответ, аналогичный приведенному ниже:

Ответ агента ИИ

Приведенный выше ответ показывает, что процесс развертывания продолжается и что ваше приложение будет доступно в режиме онлайн по указанному URL-адресу.

Вы можете следить за процессом развертывания на панели управления контейнерами Back4app, а можете через некоторое время дать агенту ИИ запрос, приведенный ниже, чтобы подтвердить текущий статус развертывания.

What is the current deployment status of my web app?

Вы должны получить ответ, аналогичный приведенному ниже:

Ответ агента ИИ

Кроме того, вы можете развернуть свое приложение на Back4App вручную.

Заключение

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

Кроме того, вы протестировали своего бота Discord и развернули его в контейнере Back4app с помощью агента ИИ.

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

Полный код, использованный в этом руководстве, доступен в этом репозитории GitHub.


Leave a reply

Your email address will not be published.