Discord Player 是一個強大的框架,用於使用 JavaScript 和 TypeScript 開發 Discord 音樂機器人。它建立在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 是推薦的庫,因為它為不和諧播放器添加了更多功能,而不僅僅是 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 取得它。
我們不建議透過 npm 安裝 ffmpeg,因為從 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 的支援有限。您可以使用以下程式碼透過 Eris 設定 Discord Player:
const { Player , createErisCompat } = require ( 'discord-player' ) ;
const player = new Player ( createErisCompat ( client ) ) ;
在新增指令之前,如果您希望使用不和諧播放器的掛鉤(例如useMainPlayer
),請確保提供指令的上下文。
// execute the command
await command . execute ( interaction ) ;
// execute the command
await player . context . provide ( { guild : interaction . guild } , ( ) => command . execute ( interaction ) ) ;
這使得不和諧玩家能夠自動了解當前的公會和隊列,從而實現更清晰的程式碼和無縫整合。這消除了將玩家實例傳遞給命令或使用諸如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 以了解更多資訊。