import { Message, EmbedBuilder } from 'discord.js'; import { joinVoiceChannel, createAudioResource, AudioPlayerStatus, } from '@discordjs/voice'; import { get } from 'https'; import { MusicQueue } from '../utils/MusicQueue'; import { queues } from '../index'; import type { Command } from '../types'; async function playSong(queue: MusicQueue, guildId: string) { if (queue.songs.length === 0) { queue.playing = false; return; } queue.playing = true; queue.currentSong = queue.songs.shift()!; try { const stream = await new Promise((resolve, reject) => { get(queue.currentSong.url, (res) => { if (res.statusCode !== 200) return reject(new Error('Failed to fetch MP3')); resolve(res); }).on('error', reject); }); const resource = createAudioResource(stream); queue.player.play(resource); queue.player.once(AudioPlayerStatus.Idle, () => playSong(queue, guildId)); } catch (error) { console.error('Error playing mp3:', error); queue.playing = false; } } export default { data: { name: 'play', description: 'Phát nhạc từ link .mp3', toJSON() { return { name: 'play', description: 'Phát nhạc từ link .mp3' }; }, }, ownersOnly: false, async execute(message: Message, args: string[]) { const guildId = message.guild?.id; if (!guildId) return message.reply('❌ Lệnh này chỉ hoạt động trong server.'); const voiceChannel = message.member?.voice.channel; if (!voiceChannel) { return message.reply('❌ Bạn cần tham gia voice channel để phát nhạc.'); } const query = args.join(' ').trim(); if (!query || !query.endsWith('.mp3')) { return message.reply('❌ Vui lòng cung cấp một link `.mp3` hợp lệ.'); } if (!queues.has(guildId)) { queues.set(guildId, new MusicQueue()); } const queue = queues.get(guildId)!; const song = { title: query.split('/').pop() || 'MP3 File', url: query, duration: 0, thumbnail: '', requestedBy: message.author.id, }; queue.songs.push(song); if (!queue.playing) { if (!queue.connection) { queue.connection = joinVoiceChannel({ channelId: voiceChannel.id, guildId: guildId, adapterCreator: message.guild!.voiceAdapterCreator, }); queue.connection.subscribe(queue.player); } playSong(queue, guildId); } const embed = new EmbedBuilder() .setColor('#00ff00') .setTitle('🎵 Đã thêm vào hàng đợi') .setDescription(`**${song.title}**`) .addFields( { name: 'Vị trí', value: queue.songs.length.toString(), inline: true }, { name: 'Người yêu cầu', value: `<@${song.requestedBy}>`, inline: true } ); await message.reply({ embeds: [embed] }); }, };