Music bot discord

480 Views Asked by At

I have a problem with my code in discord js v14 and distube v4, it always show this error.

if (!queue.autoplay && queue.songs.length <= 1) return;
             ^

TypeError: Cannot read properties of undefined (reading 'autoplay')
    at Client.<anonymous> (C:\Users\Alberto\Desktop\Bot discord\index.js:51:14)
    at Client.emit (node:events:525:35)
    at MessageCreateAction.handle (C:\Users\Alberto\node_modules\discord.js\src\client\actions\MessageCreate.js:28:14)
    at module.exports [as MESSAGE_CREATE] (C:\Users\Alberto\node_modules\discord.js\src\client\websocket\handlers\MESSAGE_CREATE.js:4:32)
    at WebSocketManager.handlePacket (C:\Users\Alberto\node_modules\discord.js\src\client\websocket\WebSocketManager.js:352:31)
    at WebSocketShard.onPacket (C:\Users\Alberto\node_modules\discord.js\src\client\websocket\WebSocketShard.js:494:22)
    at WebSocketShard.onMessage (C:\Users\Alberto\node_modules\discord.js\src\client\websocket\WebSocketShard.js:328:10)
    at callListener (C:\Users\Alberto\node_modules\ws\lib\event-target.js:290:14)
    at WebSocket.onMessage (C:\Users\Alberto\node_modules\ws\lib\event-target.js:209:9)
    at WebSocket.emit (node:events:513:28)

Node.js v19.9.0

Here's my code:

const discord = require('discord.js');
const { EmbedBuilder } = require('discord.js');
const { SpotifyPlugin } = require("@distube/spotify")
const { SoundCloudPlugin } = require("@distube/soundcloud")

const { DisTube } = require('distube');

const client = new discord.Client({
  intents: [
    discord.GatewayIntentBits.Guilds,
    discord.GatewayIntentBits.GuildMessages,
    discord.GatewayIntentBits.GuildVoiceStates,
    discord.GatewayIntentBits.MessageContent
  ]
});

const distube = new DisTube(client, {
  leaveOnStop: false,
  emitNewSongOnly: true,
  emitAddSongWhenCreatingQueue: false,
  emitAddListWhenCreatingQueue: false,
  plugins: [new SpotifyPlugin(), new SoundCloudPlugin()]
});

client.once('ready', () => {
  console.log(`Logged in as ${client.user.tag}`);
});

client.on("messageCreate", async (message) => {
  if (!message.content.startsWith('-play')) return;

  const voiceChannel = message.member.voice.channel;
  if (!voiceChannel) return message.channel.send('Devi essere in un canale vocale per utilizzare questo comando.');

  const args = message.content.slice(6).trim();
  if (!args) return message.channel.send('Devi specificare una canzone o un URL valido.');

    const song = distube.play(message.member.voice.channel, args, {
      member: message.member,
      textChannel: message.channel,
      message: message
    });
    
  
});


client.on('messageCreate', (message) => {
  if (!message.content === ('-s')) return;
  const queue = distube.getQueue(message);
  if (!queue.autoplay && queue.songs.length <= 1) return;
  distube.skip(message);
  message.channel.send('⏭ Saltata la canzone attuale.');
});

client.on('messageCreate', (message) => {
  if (!message.content.startsWith('-stop')) return;
  const queue = distube.getQueue(message);
  if (!queue.autoplay && queue.songs.length <= 1) return;
  distube.stop(message);
  message.channel.send(' La coda di riproduzione è stata interrotta.');
});


distube.on('playSong', (queue, song) => {
  const embed = new discord.EmbedBuilder()
        .setTitle("Riproducendo canzone:")
        .addFields({ name: "Canzone:", value: song.name })
    queue.textChannel.send({ embeds: [embed] })  
});

distube.on('addSong', (queue, song) => {
  const embed = new discord.EmbedBuilder()
  .setTitle("Canzone aggiunta:")
  .addFields({ name: "Canzone:", value: song.name })
  queue.textChannel.send({ embeds: [embed] })  
});


client.login('TOKEN');

If this is possible i want to write on discord -p and do the same of -play,

1

There are 1 best solutions below

0
Samuel Newman On

If you look at the DisTube documentation, getQueue returns either a Queue, or undefined. In your case, it's returning undefined (presumably to indicate there is no queue at the time).

The solution is thus to check if the queue exists.

  const queue = distube.getQueue(message);
  if (!queue || (!queue.autoplay && queue.songs.length <= 1)) return;