يعد 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 أكثر من مجرد واجهة 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 (مثل 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 لمزيد من المعلومات.