Невозможно передать переменные через разные области в DiscordJS - PullRequest
0 голосов
/ 22 января 2020

Хорошо, моя проблема в том, что в первом наборе console.log(streamXXXX) s, где XXXX - это различные переменные, когда я читаю их значения, они все читают, как должны, в то время как во втором наборе они читают как неопределенные. Это проблема сфер? Может быть проблема с Asyn c? Я пытался добавлять awaits в каждый раз, когда я делаю веб-запрос, но ничего не работает, и одна из самых интересных частей этого факта - отсутствие ошибок?

В любом случае, мой код указан ниже, а также ссылка для проверки его в Repl с использованием созданного мной примера бота. Ниже приведен список библиотек, необходимых для запуска указанной программы. Спасибо!

if (!message.member.voiceChannel) return message.channel.send(`You do realize you have to be in a voice channel to do that, right ${message.author.username}?`)

if (!message.member.voiceConnection) message.member.voiceChannel.join().then(async connection => {

    let streamURL = args.slice(1).join(" ")
    let streamTitle = "";
    let streamThumb = "";
    let streamAuth = "";
    let streamAuthThumb = "";

    if (streamURL.includes("https://www.youtube.com") || streamURL.includes("https://youtu.be/") && !streamURL.includes(' ')) {
        youtube.getVideo(streamURL)
            .then(async results => {
                let {
                    body
                } = await snekfetch.get(`https://www.googleapis.com/youtube/v3/channels?part=snippet&id=${results.channel.id}&fields=items%2Fsnippet%2Fthumbnails&key=${ytapikey}`).query({
                    limit: 800
                })

                streamTitle = results.title
                streamThumb = results.thumbnails.medium.url
                streamAuth = results.channel.title
                streamAuthThumb = body.items[0].snippet.thumbnails.medium.url

                console.log(streamURL)
                console.log(streamTitle)
                console.log(streamThumb)
                console.log(streamAuth)
                console.log(streamAuthThumb)
            })
            .catch(console.error)
    } else if (!streamURL.includes("https://www.youtube.com") || !streamURL.includes("https://youtu.be/")) {
        youtube.searchVideos(streamURL)
            .then(async results => {
                let {
                    body
                } = await snekfetch.get(`https://www.googleapis.com/youtube/v3/channels?part=snippet&id=${results[0].channel.id}&fields=items%2Fsnippet%2Fthumbnails&key=${ytapikey}`).query({
                    limit: 800
                })

                streamURL = results[0].url
                streamTitle = results[0].title
                streamThumb = results[0].thumbnails.default.medium.url
                streamAuth = results[0].channel.title
                streamAuthThumb = body.items[0].snippet.thumbnails.medium.url
            }).catch(console.error)
    } else {
        return message.reply("I can only play videos from YouTube (#NotSponsored).")
    }

    console.log(streamURL)
    console.log(streamTitle)
    console.log(streamThumb)
    console.log(streamAuth)
    console.log(streamAuthThumb)

    const stream = ytdl(streamURL, {
        filter: 'audioonly'
    })
    const dispatcher = connection.playStream(stream)
    dispatcher.on("end", end => {
        return
    })

    let musicEmbed = new Discord.RichEmbed()
        .setAuthor(streamAuth, streamAuthThumb)
        .setTitle(`Now Playing: ${streamTitle}`)
        .setImage(streamThumb)
        .setColor(embedRed)
        .setFooter(`${streamAuth} - ${streamTitle} (${streamURL}`)

    await message.channel.send(musicEmbed)
})

Ссылка для тестирования программы на образце бота, который я сделал

Модули, которые вам нужно будет проверить:

discord.js
simple-youtube-api
node-opus
ffmpeg
ffbinaries
ffmpeg-binaries
opusscript
snekfetch
node-fetch
ytdl-core

Еще раз спасибо!

1 Ответ

1 голос
/ 22 января 2020

Причина, по которой вы выводите undefined, связана с тем, как работают обещания и как вы структурировали свой код:

let streamTitle = "";

// 1. Promise created
youtube.getVideo(streamURL)
  // 2. Promise still pending, skip for now
  .then(async results => {
    // 4. Promise fulfilled
    console.log(results.title); // 5. Logged actual title
});

console.log(streamTitle); // 3. Logged ""

У вас уже есть правильный подход для ваших snekfetch запросов, просто нужно чтобы применить его и к YT:

let streamTitle = "";

const results = await youtube.getVideo(streamURL);

streamTitle = results.title;

console.log(streamTitle); // Desired output
...