вы объявляете
let connection = message.member.voice.channel.join()
вверху в одной области видимости, а при вызове
if(song === 1){ play(connection, song)}
передаете туда эту же переменную из другой области видимости. Конечно же она будет undefined
можно поступить так:
let connection;
client.on('message', async message => {
if (!message.guild) return;
if (message.content === '/join') {
if (message.member.voice.channel) {
connection = message.member.voice.channel.join();
return message.channel.send('Подключено');
} else {
return message.channel.send('Вы должны сначала подключится к голосовому чату')
}
}
});
client.on('message', async message =>{
if(message.content === "/help"){
return message.channel.send(' ``` /help - помощь по командам\n /join - присоединится к голосовому чату(Вы должны быть подключены к голосовому чату)\n /play - воспроизведение музыки ``` ');
}
});
async function play(song) {
let music = await ytdl(song, {filter: 'audioonly'})
connection.playStream(music, {valume: 0.5})
.on('end', () =>{
songs.shift()
if(songs.length > 0) play(song)
else connection.disconnect()
})
}
client.on('message', async message =>{
if(message.content === "/play"){
var song = "https://www.youtube.com/watch?v=2ncEBRUmc_w&list=RDw1IYWHHI2-E&index=2";
if(song === 1){ play(song)}
else{connection.disconnect()}
}
});
правда, это очень грубо и не будет работать правильно, если у вас будет много подключений. сделайте объект, в котором они будут храниться по отдельности.