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 ยอมรับเฉพาะแพ็กเก็ตบทประพันธ์ คุณจึงต้องติดตั้งไลบรารีบทประพันธ์ Discord Player รองรับไลบรารีบทประพันธ์หลายอัน เช่น:
ในบรรดาสิ่งเหล่านี้ mediaplex เป็นไลบรารีที่แนะนำเนื่องจากเพิ่มฟังก์ชันการทำงานให้กับเครื่องเล่นที่ไม่ลงรอยกันมากกว่าอินเทอร์เฟซ libopus คุณสามารถติดตั้งไลบรารีบทประพันธ์ได้โดยการเรียกใช้:
$ 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 ส่วนใหญ่จะอิงตามกิจกรรม มันส่งเสียงเหตุการณ์ที่แตกต่างกันตามบริบทและการกระทำ มาเพิ่ม Listener เหตุการณ์พื้นฐานเพื่อแจ้งเตือนผู้ใช้เมื่อแทร็กเริ่มเล่น:
// 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 ) ) ;
ก่อนที่คุณจะเพิ่มคำสั่ง ตรวจสอบให้แน่ใจว่าได้จัดเตรียมบริบทให้กับคำสั่งหากคุณต้องการใช้ hooks ของผู้เล่นที่ไม่ลงรอยกัน (เช่น 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 เพื่อดูข้อมูลเพิ่มเติม