javascript - Typescript DiscordJS-bot lyd slutter å fungere etter noen sekunder med avspilling


Jeg står for øyeblikket overfor et problem med å spille av lyd gjennom en bot jeg laget for Discord. Botten laster ned en sang fra YouTube ved bruk av ytdl-core og spiller den deretter, men sangen stopper etter noen sekunder med avspilling.

Her er min "play.ts"-fil, som inkluderer play-kommandoen: (beklager for det rotete koden, jeg prøver bare å sette sammen noe her.)

import { CommandInteraction, SlashCommandBuilder } from "discord.js";
import { getVoiceConnection, createAudioPlayer, createAudioResource, NoSubscriberBehavior } from '@discordjs/voice';
import { join } from "path";
import ytdl from 'ytdl-core';
import fs from 'fs';

export const data = new SlashCommandBuilder()
    .addStringOption(option =>
        option.setName("link")
            .setDescription("Link to the audio source to be played.")
            .setRequired(true)
    )
    .setName("play")
    .setDescription("Plays audio from given URL.");

export async function execute(interaction: CommandInteraction) {
    if (!interaction.guildId) {
        return interaction.reply("Something went really, really wrong.");
    }

    const url = interaction.options.getString("link");
    const connection = getVoiceConnection(interaction.guildId);

    if (!connection) {
        return interaction.reply("Bot is not currently in a voice channel. Join one before using this command.");
    }

    const audioplayer = createAudioPlayer({
        behaviors: {
            noSubscriber: NoSubscriberBehavior.Pause,
        },
    });

    const download = ytdl(url, { filter: 'audioonly' });
    const writestream = fs.createWriteStream('audio.mp4');
    const pathtoresource = join('audio.mp4');
    // console.log(pathtoresource);

    download.pipe(writestream);

    const resource = createAudioResource(pathtoresource, {
        inlineVolume: true,
        metadata: {
            title: "SONG",
        },
    });

    audioplayer.play(resource);
    connection.subscribe(audioplayer);

    return interaction.reply(`Playing from: ${url}`);
}

Det bør spille av lydfilen etter å ha lastet ned sangen, men noen ganger spiller det noen sekunder av sangen, andre ganger ingenting i det hele tatt. (kanskje fordi nedlastingen ikke er ferdig i tide til å spille, men jeg vet ikke hvordan jeg får det til å vente på ytdl-nedlastingen.)

All hjelp settes stor pris på! (nok en gang, beklager for rotete kode, jeg lærer fortsatt)

REDIGER: Dette er intensjonene:

const client = new Client({
    intents: ["Guilds", "GuildMessages", "DirectMessages", "GuildVoiceStates" ],
});

Svar #1

Det du opplever er ikke et problem med Discord-intents. ytdl-core var ikke laget med tanke på å holde HTTP-tilkoblinger åpne over lengre tid. Dette skjer når man streamer media til noe som bruker dataene langsommere enn den hastigheten de blir sendt inn med.

En annen npm-pakke kjent som play-dl løser dette problemet (og legger til støtte for andre strømmetjenester, noe som virkelig er prikken over i-en). Sjekk ut eksempelet på Discord-bot-koden her for å se hvordan den brukes.

I mine gamle Discord-bot-prosjekter brukte jeg play-dl etter å ha opplevd det samme problemet med ytdl-core, og ting gikk problemfritt. Hvis du trenger mer hjelp, spør meg i en kommentar på dette innlegget.