I was coding a new music command for my discord bot and when I use -play {url}
, I get an error. The error is: voice_channel.join is not a function
.
I checked some websites including Stack Overflow but I did not find any useful solution. I want to update this code from discord.js v12 to discord.js v13. The code:
const ytdl = require('ytdl-core');
const ytSearch = require('yt-search');
// pair in this map. { guild.id, queue_constructor{} }
const queue = new Map();
module.exports = {
name: 'play',
aliases: ['skip', 'stop'],
cooldown: 0,
description: 'Advanced music bot',
async execute(message,args, cmd, client, Discord){
const voice_channel = message.member.voice.channel;
if (!voice_channel) return message.channel.send('You need to be in a channel to execute this command!');
const permissions = voice_channel.permissionsFor(message.client.user);
if (!permissions.has('CONNECT')) return message.channel.send('You dont have the correct permissins');
if (!permissions.has('SPEAK')) return message.channel.send('You dont have the correct permissins');
const server_queue = queue.get(message.guild.id);
if (cmd === 'play'){
if (!args.length) return message.channel.send('You need to send the second argument!');
let song = {};
if (ytdl.validateURL(args[0])) {
const song_info = await ytdl.getInfo(args[0]);
song = { title: song_info.videoDetails.title, url: song_info.videoDetails.video_url }
} else {
const video_finder = async (query) =>{
const video_result = await ytSearch(query);
return (video_result.videos.length > 1) ? video_result.videos[0] : null;
}
const video = await video_finder(args.join(' '));
if (video){
song = { title: video.title, url: video.url }
} else {
message.channel.send('Error finding video.');
}
}
if (!server_queue){
const queue_constructor = {
voice_channel: voice_channel,
text_channel: message.channel,
connection: null,
songs: []
}
queue.set(message.guild.id, queue_constructor);
queue_constructor.songs.push(song);
try {
const connection = await voice_channel.join();
queue_constructor.connection = connection;
video_player(message.guild, queue_constructor.songs[0]);
} catch (err) {
queue.delete(message.guild.id);
message.channel.send('There was an error connecting!');
throw err;
}
} else{
server_queue.songs.push(song);
return message.channel.send(`👍 **${song.title}** added to queue!`);
}
}
else if(cmd === 'skip') skip_song(message, server_queue);
else if(cmd === 'stop') stop_song(message, server_queue);
}
}
I am using discord.js v13 and node.js 16.
vs code
>Solution :
Voice support is moved to a new library in v13. You will need to install it by running npm i @discordjs/voice
in your console.
Then, you can import the joinVoiceChannel
method from it on the top of your file:
const { joinVoiceChannel } = require('@discordjs/voice');
Once it’s imported, you can replace voice_channel.join()
with the following to create a connection:
const connection = joinVoiceChannel({
channelId: voice_channel.id,
guildId: voice_channel.guild.id,
adapterCreator: voice_channel.guild.voiceAdapterCreator,
});