Discord Player — это надежная платформа для разработки ботов Discord Music с использованием JavaScript и TypeScript. Он построен на основе библиотеки discord-voip и предлагает полный набор настраиваемых инструментов, что делает его одним из наиболее многофункциональных фреймворков в городе.
Режим совместимости Eris не поддерживает обработчик
VoiceStateUpdate
. Вам нужно справиться с этим вручную.
Для Discord Player требуется Discord.js 14.0 или выше. Убедитесь, что у вас совместимая версия, запустив npm list discord.js
в своем терминале. Если вы используете более раннюю версию, обновите ее. Руководство discord.js предоставляет ресурсы, которые помогут вам в процессе обновления.
$ npm install --save discord-player # main library
$ npm install --save @discord-player/extractor # extractors provider
Discord Player распознает
@discord-player/extractor
и загружает его автоматически по умолчанию. Просто вызовитеawait player.extractors.loadDefault()
.
Поскольку Discord принимает только пакеты opus, вам необходимо установить библиотеку opus. Discord Player поддерживает несколько библиотек опусов, таких как:
Среди них рекомендуемой библиотекой является mediaplex, поскольку она добавляет в discord-player больше функций, чем просто интерфейс libopus. Вы можете установить библиотеки opus, запустив:
$ npm install --save mediaplex
# or
$ npm install --save @discordjs/opus
# or
$ npm install --save opusscript
# or
$ npm install --save @evan/opus
# or
$ npm install --save node-opus
Для перекодирования мультимедиа требуется FFmpeg или Avconv. Вы можете получить его с https://ffmpeg.org или через npm.
Мы не рекомендуем устанавливать ffmpeg через npm, поскольку известно, что двоичные файлы, полученные из npm, нестабильны. Рекомендуется устанавливать его из официального источника.
$ npm install --save ffmpeg-static
# or
$ npm install --save @ffmpeg-installer/ffmpeg
# or
$ npm install --save @node-ffmpeg/node-ffmpeg-installer
# or
$ npm install --save ffmpeg-binaries
Используйте переменную среды
FFMPEG_PATH
для загрузки ffmpeg по пользовательскому пути.
Давайте создадим экземпляр основного игрока. Этот экземпляр обрабатывает и отслеживает все очереди и их компоненты.
const { Player } = require ( 'discord-player' ) ;
const client = new Discord . Client ( {
// Make sure you have 'GuildVoiceStates' intent enabled
intents : [ 'GuildVoiceStates' /* Other intents */ ]
} ) ;
// this is the entrypoint for discord-player based application
const player = new Player ( client ) ;
// Now, lets load all the default extractors, except 'YouTubeExtractor'. You can remove the filter if you want to include youtube.
await player . extractors . loadDefault ( ( ext ) => ext !== 'YouTubeExtractor' ) ;
Discord Player в основном основан на событиях. Он генерирует различные события в зависимости от контекста и действий. Давайте добавим базовый прослушиватель событий, чтобы уведомлять пользователя о начале воспроизведения трека:
// this event is emitted whenever discord-player starts to play a track
player . events . on ( 'playerStart' , ( queue , track ) => {
// we will later define queue.metadata object while creating the queue
queue . metadata . channel . send ( `Started playing ** ${ track . cleanTitle } **!` ) ;
} ) ;
Discord Player имеет ограниченную поддержку Eris. Вы можете использовать следующий код для настройки Discord Player с Eris:
const { Player , createErisCompat } = require ( 'discord-player' ) ;
const player = new Player ( createErisCompat ( client ) ) ;
Прежде чем добавлять команду, обязательно укажите контекст команд, если вы хотите использовать перехватчики discord-player (например, useMainPlayer
).
// execute the command
await command . execute ( interaction ) ;
// execute the command
await player . context . provide ( { guild : interaction . guild } , ( ) => command . execute ( interaction ) ) ;
Это позволяет игроку Discord автоматически узнавать текущую гильдию и очередь, что приводит к более чистому коду и плавной интеграции. Это устраняет необходимость передавать экземпляр игрока команде или использовать хаки, такие как client.player = player
.
Перейдем к командной части. Вы можете определить команду в соответствии с вашими требованиями. Мы сосредоточимся только на командной части:
const { useMainPlayer } = require ( 'discord-player' ) ;
export async function execute ( interaction ) {
const player = useMainPlayer ( ) ; // get player instance
const channel = interaction . member . voice . channel ;
if ( ! channel ) return interaction . reply ( 'You are not connected to a voice channel!' ) ; // make sure we have a voice channel
const query = interaction . options . getString ( 'query' , true ) ; // we need input/query to play
// let's defer the interaction as things can take time to process
await interaction . deferReply ( ) ;
try {
const { track } = await player . play ( channel , query , {
nodeOptions : {
// nodeOptions are the options for guild node (aka your queue in simple word)
metadata : interaction // we can access this metadata object using queue.metadata later on
}
} ) ;
return interaction . followUp ( `** ${ track . cleanTitle } ** enqueued!` ) ;
} catch ( e ) {
// let's return error if something failed
return interaction . followUp ( `Something went wrong: ${ e } ` ) ;
}
}
Это все, что нужно для создания собственного музыкального бота. Пожалуйста, ознакомьтесь с документацией для получения дополнительных функций/функций.
Изучите тщательно подобранный список ресурсов, созданный сообществом Discord Player, включая музыкальных ботов и экстракторы с открытым исходным кодом. Посетите https://discord-player.js.org/showcase для получения дополнительной информации.