const DiscordVoice = require('@discordjs/voice'); const { join } = require('node:path'); console.log(DiscordVoice.generateDependencyReport()); module.exports.playAudio = playAudio; module.exports.stop = stop; module.exports.pause = pause; module.exports.unpause = unpause; const player = DiscordVoice.createAudioPlayer(); player.on('error', error => { console.error('Error:', error.message, 'with track', error.resource.metadata.title); }); player.on(DiscordVoice.AudioPlayerStatus.Playing, () => { console.log('The audio player has started playing!'); }); function playAudio(channel, guildId) { joinChannel(channel, guildId); const connection = DiscordVoice.getVoiceConnection(guildId); let resource = DiscordVoice.createAudioResource(join(__dirname, 'file.mp3'), { inlineVolume: true }); // requires ffmpeg //resource.volume.setVolume(0.5); // volume control if (!connection) { console.log("no connection"); return; } player.play(resource); player.on('error', error => { console.error(`Error: ${error.message} with resource ${error.resource.metadata.title}`); player.play(DiscordVoice.getNextResource()); }); connection.on(DiscordVoice.VoiceConnectionStatus.Ready, () => { console.log('The connection has entered the Ready state - ready to play audio!'); }); const subscription = connection.subscribe(player); if (!subscription) { subscription.unsubscribe(); console.log("Unsubscribed."); } if (subscription) { // Unsubscribe after 5 seconds (stop playing audio on the voice connection) setTimeout(() => subscription.unsubscribe(), 5_000); } } function joinChannel(channel, guildId) { const connection = DiscordVoice.joinVoiceChannel({ channelId: channel.id, guildId: guildId, adapterCreator: channel.guild.voiceAdapterCreator, }); if (!connection) { console.log("Couldn't join the channel " + channel.name + " in the guild " + guildId + "."); } else { console.log("Joined the voice channel " + channel.name + " in the guild " + guildId + "."); } } function stop() { player.stop(); } function pause() { player.pause(); } function unpause() { player.unpause(); }