Рубрики
Без рубрики

Как создать музыкальный бот, используя Discord.js

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

Автор оригинала: FreeCodeCamp Community Member.

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

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

Предпосылки

Прежде чем начать создание бота Убедитесь, что вы установили все необходимые инструменты.

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

Настройка бота раздора

Во-первых, нам нужно создать новое приложение на портале Development Rescord.

Мы можем сделать это, посетив Портал и нажать на новое приложение.

После этого нам нужно дать вашему приложению имя и нажмите кнопку «Создать».

После этого нам нужно выбрать вкладку BOT и нажать на Add Bot.

Теперь наш бот создан, и мы можем продолжать пригласить его на наш сервер.

Добавление бота на ваш сервер

После создания нашего бота мы можем пригласить его с помощью генератора URL-адреса OAUTT2.

Для этого нам нужно перейти к странице OAUTT2 и выберите бот в кран объема.

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

Тогда мы можем скопировать наш сгенерированный URL и вставить его в наш браузер.

После вскрытия его добавляем его на наш сервер, выбрав сервер и нажав кнопку «Авторизация».

Создание нашего проекта

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

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

mkdir musicbot && cd musicbot

После этого мы можем создавать наши проектные модули с помощью команды NPM INIT. После ввода команды вам будут заданы вопросы, просто ответьте на них и продолжайте.

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

touch index.js && touch config.json

Теперь нам просто нужно открыть наш проект в нашем текстовом редакторе. Я лично использую VS-код и может открыть его со следующей командой.

code .

Разумные основы JS

Теперь нам просто нужно установить некоторые зависимости, прежде чем мы сможем начать работу.

npm install discord.js ffmpeg fluent-ffmpeg @discordjs/opus ytdl-core --save

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

{
"prefix": "!",
"token": "your-token"
}

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

Это единственные вещи, которые нам нужно сделать в нашем файле config.json. Итак, давайте начнем написать наш код JavaScript.

Во-первых, нам нужно импортировать все наши зависимости.

const Discord = require('discord.js');
const {
	prefix,
	token,
} = require('./config.json');
const ytdl = require('ytdl-core');

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

const client = new Discord.Client();
client.login(token);

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

client.once('ready', () => {
 console.log('Ready!');
});
client.once('reconnecting', () => {
 console.log('Reconnecting!');
});
client.once('disconnect', () => {
 console.log('Disconnect!');
});

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

node index.js

Чтение сообщений

Теперь, когда наш бот находится на нашем сервере и может выйти в Интернет, мы можем начать читать сообщения чата и отвечать на них.

Читать сообщения нам нужно только написать одну простую функцию.

client.on('message', async message => {
  
}

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

Теперь нам нужно проверить, является ли сообщение из нашего собственного бота и игнорировать его, если оно есть.

if (message.author.bot) return;

В этой строке мы проверяем, является ли автор сообщения нашим ботом и вернуть, если оно есть.

После этого мы проверяем, начинается ли сообщение с префикса, который мы определили ранее и верните, если это не так.

if (!message.content.startsWith(prefix)) return;

После этого мы можем проверить, какую команду нам нужно выполнить. Мы можем сделать это, используя некоторые простые, если заявления.

const serverQueue = queue.get(message.guild.id);

if (message.content.startsWith(`${prefix}play`)) {
    execute(message, serverQueue);
    return;
} else if (message.content.startsWith(`${prefix}skip`)) {
    skip(message, serverQueue);
    return;
} else if (message.content.startsWith(`${prefix}stop`)) {
    stop(message, serverQueue);
    return;
} else {
    message.channel.send("You need to enter a valid command!");
}

В этом блоке кода мы проверяем какую команду выполнить и вызовите команду. Если команда ввода недействительна, мы пишем сообщение об ошибке в чате, используя Отправить () функция.

Теперь, когда мы знаем, какую команду нам нужно выполнить, мы можем начать реализацию этих команд.

Добавление песен

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

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

const queue = new Map();

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

async function execute(message, serverQueue) {
  const args = message.content.split(" ");

  const voiceChannel = message.member.voice.channel;
  if (!voiceChannel)
    return message.channel.send(
      "You need to be in a voice channel to play music!"
    );
  const permissions = voiceChannel.permissionsFor(message.client.user);
  if (!permissions.has("CONNECT") || !permissions.has("SPEAK")) {
    return message.channel.send(
      "I need the permissions to join and speak in your voice channel!"
    );
  }
}

Теперь мы можем продолжать получать информацию о песне и сохранять ее в объект песни. Для этого мы используем нашу библиотеку YTDL, которая получает информацию о песне от ссылки на YouTube.

const songInfo = await ytdl.getInfo(args[1]);
const song = {
 title: songInfo.title,
 url: songInfo.video_url,
};

Это получит информацию о песне, используя YTDL Библиотека, которую мы установили ранее. Затем мы сохраняем информацию, которую нам нужно в объект песни.

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

if (!serverQueue) {

}else {
 serverQueue.songs.push(song);
 console.log(serverQueue.songs);
 return message.channel.send(`${song.title} has been added to the queue!`);
}

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

// Creating the contract for our queue
const queueContruct = {
 textChannel: message.channel,
 voiceChannel: voiceChannel,
 connection: null,
 songs: [],
 volume: 5,
 playing: true,
};
// Setting the queue using our contract
queue.set(message.guild.id, queueContruct);
// Pushing the song to our songs array
queueContruct.songs.push(song);

try {
 // Here we try to join the voicechat and save our connection into our object.
 var connection = await voiceChannel.join();
 queueContruct.connection = connection;
 // Calling the play function to start a song
 play(message.guild, queueContruct.songs[0]);
} catch (err) {
 // Printing the error message if the bot fails to join the voicechat
 console.log(err);
 queue.delete(message.guild.id);
 return message.channel.send(err);
}

В этом блоке кода мы создаем контракт и добавьте нашу песню на массив песни. После этого мы пытаемся присоединиться к голосовому чату пользователя и позвонить нашему Играть () Функция мы будем реализовать после этого.

Играть песни

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

Во-первых, мы создадим функцию под названием Play, которая принимает два параметра (гильдия и песня, которую мы хотим играть), и проверяет, будет ли песня пуста. Если это так, мы просто покину голосовой канал и удалите очередь.

function play(guild, song) {
  const serverQueue = queue.get(guild.id);
  if (!song) {
    serverQueue.voiceChannel.leave();
    queue.delete(guild.id);
    return;
  }
}

После этого мы начнем играть нашу песню, используя функцию Play () соединения и передачу URL нашей песни.

const dispatcher = serverQueue.connection
    .play(ytdl(song.url))
    .on("finish", () => {
        serverQueue.songs.shift();
        play(guild, serverQueue.songs[0]);
    })
    .on("error", error => console.error(error));
dispatcher.setVolumeLogarithmic(serverQueue.volume / 5);
serverQueue.textChannel.send(`Start playing: **${song.title}**`);

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

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

Теперь мы готовы играть песню, просто набрав! Играть URL в чате.

Пропуская песни

Теперь мы можем начать реализацию функциональности пропуска. Для этого нам просто нужно закончить диспетчер, который мы создали в нашем Играть () Функция, поэтому она начинает следующую песню.

function skip(message, serverQueue) {
  if (!message.member.voice.channel)
    return message.channel.send(
      "You have to be in a voice channel to stop the music!"
    );
  if (!serverQueue)
    return message.channel.send("There is no song that I could skip!");
  serverQueue.connection.dispatcher.end();
}

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

Остановка песен

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

function stop(message, serverQueue) {
  if (!message.member.voice.channel)
    return message.channel.send(
      "You have to be in a voice channel to stop the music!"
    );
  serverQueue.songs = [];
  serverQueue.connection.dispatcher.end();
}

Полный исходный код для index.js:

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

const Discord = require("discord.js");
const { prefix, token } = require("./config.json");
const ytdl = require("ytdl-core");

const client = new Discord.Client();

const queue = new Map();

client.once("ready", () => {
  console.log("Ready!");
});

client.once("reconnecting", () => {
  console.log("Reconnecting!");
});

client.once("disconnect", () => {
  console.log("Disconnect!");
});

client.on("message", async message => {
  if (message.author.bot) return;
  if (!message.content.startsWith(prefix)) return;

  const serverQueue = queue.get(message.guild.id);

  if (message.content.startsWith(`${prefix}play`)) {
    execute(message, serverQueue);
    return;
  } else if (message.content.startsWith(`${prefix}skip`)) {
    skip(message, serverQueue);
    return;
  } else if (message.content.startsWith(`${prefix}stop`)) {
    stop(message, serverQueue);
    return;
  } else {
    message.channel.send("You need to enter a valid command!");
  }
});

async function execute(message, serverQueue) {
  const args = message.content.split(" ");

  const voiceChannel = message.member.voice.channel;
  if (!voiceChannel)
    return message.channel.send(
      "You need to be in a voice channel to play music!"
    );
  const permissions = voiceChannel.permissionsFor(message.client.user);
  if (!permissions.has("CONNECT") || !permissions.has("SPEAK")) {
    return message.channel.send(
      "I need the permissions to join and speak in your voice channel!"
    );
  }

  const songInfo = await ytdl.getInfo(args[1]);
  const song = {
    title: songInfo.title,
    url: songInfo.video_url
  };

  if (!serverQueue) {
    const queueContruct = {
      textChannel: message.channel,
      voiceChannel: voiceChannel,
      connection: null,
      songs: [],
      volume: 5,
      playing: true
    };

    queue.set(message.guild.id, queueContruct);

    queueContruct.songs.push(song);

    try {
      var connection = await voiceChannel.join();
      queueContruct.connection = connection;
      play(message.guild, queueContruct.songs[0]);
    } catch (err) {
      console.log(err);
      queue.delete(message.guild.id);
      return message.channel.send(err);
    }
  } else {
    serverQueue.songs.push(song);
    return message.channel.send(`${song.title} has been added to the queue!`);
  }
}

function skip(message, serverQueue) {
  if (!message.member.voice.channel)
    return message.channel.send(
      "You have to be in a voice channel to stop the music!"
    );
  if (!serverQueue)
    return message.channel.send("There is no song that I could skip!");
  serverQueue.connection.dispatcher.end();
}

function stop(message, serverQueue) {
  if (!message.member.voice.channel)
    return message.channel.send(
      "You have to be in a voice channel to stop the music!"
    );
  serverQueue.songs = [];
  serverQueue.connection.dispatcher.end();
}

function play(guild, song) {
  const serverQueue = queue.get(guild.id);
  if (!song) {
    serverQueue.voiceChannel.leave();
    queue.delete(guild.id);
    return;
  }

  const dispatcher = serverQueue.connection
    .play(ytdl(song.url))
    .on("finish", () => {
      serverQueue.songs.shift();
      play(guild, serverQueue.songs[0]);
    })
    .on("error", error => console.error(error));
  dispatcher.setVolumeLogarithmic(serverQueue.volume / 5);
  serverQueue.textChannel.send(`Start playing: **${song.title}**`);
}

client.login(token);

Заключение

Вы сделали все это до конца! Надеюсь, что эта статья помогла вам понять API раздора и как вы можете использовать его, чтобы создать простой бот. Если вы хотите увидеть пример более Advanced Bot RiscOd Bot, вы можете посетить мой Github Repository Отказ

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

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