Проблема с функцией Broadcast Dispatcher .resume() Discord JS v12

#javascript #node.js #discord #discord.js

#javascript #node.js #Discord #discord.js

Вопрос:

Я кодирую музыкального бота в Discord JS v12 и в настоящее время работаю над командами !pause и !resume . Они довольно просты, и в коде нет ошибок. Вот что происходит:

  1. Воспроизводится песня.
  2. ! вызывается пауза, и песня приостанавливается, и отображается сообщение о подтверждении паузы.
  3. !вызывается resume и отображается сообщение о подтверждении возобновления.
  4. Песня не возобновляется, все остальное работает отлично, !очередь, !команды воспроизведения также.

    Это мой! код команды pause:

 // Discord.js initialization.
const Discord = require("discord.js");

// Functions initialization.
const functions = require("../../functions.js");

// Initialization of the server specific variables data.
const serverData = require("../../serverData.json");

// The command's code goes inside an async function.
module.exports.run = async (bot, message, args, ops) => {

    /****************************/
    /****  MESSAGE DELETION  ****/
    /****************************/

    // Deletes the command invocation.
    await message.delete().catch(O_o => { });

    /************************/
    /****  CONDITIONALS  ****/
    /************************/

    // Fetches the guild object from the Map.
    let fetched = ops.active.get(message.guild.id);

    // Checks if there is any object in the fetched.
    if (!fetched) {

        // End of the function and message prints
        return message.channel.send(`> ${message.author}, there is no music playing or queued.`).then(msg => msg.delete({ timeout: 3000 }));
    }

    // Checks if the message author is in the same voice channel as the bot.
    if (message.member.voice.channel !== message.guild.me.voice.channel) {

        // End of the function and message prints.
        return message.channel.send(`> ${message.author}, you must be in the same voice channel as the bot.`).then(msg => msg.delete({ timeout: 3000 }));
    }

    // Then, check if the dispatcher is already paused.
    if(fetched.dispatcher.paused){

        // End of the function and message prints.
        return message.channel.send(`> ${message.author}, the song is already paused.`).then(msg => msg.delete({ timeout: 3000 }));
    }

    /*****************************/
    /****  COMMAND EXECUTION  ****/
    /*****************************/

    // If nothing made the command exit, it executes the pause.
    fetched.dispatcher.pause(true);

    // Otherwise tell them in chat that they added a vote to skip.
    message.channel.send(`> ${message.member}, the current song has been paused.`).then(msg => msg.delete({ timeout: 4000 }));
}

// Command name.
module.exports.help = {
    name: "pause"
}
 

Это мой !код команды resume:

 // Discord.js initialization.
const Discord = require("discord.js");

// Functions initialization.
const functions = require("../../functions.js");

// Initialization of the server specific variables data.
const serverData = require("../../serverData.json");

// The command's code goes inside an async function.
module.exports.run = async (bot, message, args, ops) => {

    /****************************/
    /****  MESSAGE DELETION  ****/
    /****************************/

    // Deletes the command invocation.
    await message.delete().catch(O_o => { });

    /************************/
    /****  CONDITIONALS  ****/
    /************************/

    // Fetches the guild object from the Map.
    let fetched = ops.active.get(message.guild.id);

    // Checks if there is any object in the fetched.
    if (!fetched) {

        // End of the function and message prints
        return message.channel.send(`> ${message.author}, there is no music playing or queued.`).then(msg => msg.delete({ timeout: 3000 }));
    }

    // Checks if the message author is in the same voice channel as the bot.
    if (message.member.voice.channel !== message.guild.me.voice.channel) {

        // End of the function and message prints.
        return message.channel.send(`> ${message.author}, you must be in the same voice channel as the bot.`).then(msg => msg.delete({ timeout: 3000 }));
    }

    // Then, check if the dispatcher is already paused.
    if(!fetched.dispatcher.paused){

        // End of the function and message prints.
        return message.channel.send(`> ${message.author}, the song is not paused.`).then(msg => msg.delete({ timeout: 3000 }));
    }

    /*****************************/
    /****  COMMAND EXECUTION  ****/
    /*****************************/

    // If nothing made the command exit, it executes the pause.
    fetched.dispatcher.resume(true);

    // Otherwise tell them in chat that they added a vote to skip.
    message.channel.send(`> ${message.member}, the current song has been resumed.`).then(msg => msg.delete({ timeout: 4000 }));
}

// Command name.
module.exports.help = {
    name: "resume"
}
 

Я заметил, что если я изменю команду resume и удалю последнее предложение if, проверяющее, приостановлена ли песня, и если я также добавлю .pause() перед .resume() и еще один дополнительный .resume() и выполню те же действия, это сработает:

  1. Воспроизводится песня.
  2. ! вызывается пауза, и песня приостанавливается, и отображается сообщение о подтверждении паузы.
  3. !вызывается resume и отображается сообщение о подтверждении возобновления.
  4. !resume вызывается во второй раз, и песня возобновляется практически без сбоев звука, также отправляется сообщение о подтверждении возобновления в чате.
  5. ! вызывается пауза, и песня приостанавливается и отправляет сообщение о подтверждении паузы.
  6. !resume вызывается только один раз, и песня возобновляется практически без сбоев звука, также отправляет сообщение о подтверждении возобновления в чате.
  7. С этого момента команды работают нормально.

Это измененный код команды !resume:

 // Discord.js initialization.
const Discord = require("discord.js");

// Functions initialization.
const functions = require("../../functions.js");

// Initialization of the server specific variables data.
const serverData = require("../../serverData.json");

// The command's code goes inside an async function.
module.exports.run = async (bot, message, args, ops) => {

    /****************************/
    /****  MESSAGE DELETION  ****/
    /****************************/

    // Deletes the command invocation.
    await message.delete().catch(O_o => { });

    /************************/
    /****  CONDITIONALS  ****/
    /************************/

    // Fetches the guild object from the Map.
    let fetched = ops.active.get(message.guild.id);

    // Checks if there is any object in the fetched.
    if (!fetched) {

        // End of the function and message prints
        return message.channel.send(`> ${message.author}, there is no music playing or queued.`).then(msg => msg.delete({ timeout: 3000 }));
    }

    // Checks if the message author is in the same voice channel as the bot.
    if (message.member.voice.channel !== message.guild.me.voice.channel) {

        // End of the function and message prints.
        return message.channel.send(`> ${message.author}, you must be in the same voice channel as the bot.`).then(msg => msg.delete({ timeout: 3000 }));
    }

    /*****************************/
    /****  COMMAND EXECUTION  ****/
    /*****************************/

    // If nothing made the command exit, it executes the pause.
    fetched.dispatcher.pause(true);
    fetched.dispatcher.resume();
    fetched.dispatcher.resume();
    

    // Otherwise tell them in chat that they added a vote to skip.
    message.channel.send(`> ${message.member}, the current song has been resumed.`).then(msg => msg.delete({ timeout: 4000 }));
}

// Command name.
module.exports.help = {
    name: "resume"
}
 

Я знаю, что это немного странно, и я не видел много информации об этом, но я видел много людей с такой же ошибкой. Я проверил извлечено, и это хорошо, поэтому я не знаю, в чем проблема. Я был бы на 110% признателен за вашу помощь, ребята.

Комментарии:

1. Вы можете попытать счастья с message.guild.me.voice.connection.dispatcher.resume() . В противном случае вы можете попробовать npm i discordjs/discord.js установить основную (не проверенную на 100%) версию и проверить, продолжает ли у вас возникать эта проблема.

2. ни один из них не помог. Я совершенно ошеломлен этим.

3. Скорее всего, никто на самом деле не знает, что здесь происходит. Лучшим вариантом было бы уменьшить как можно больше кода и посмотреть, остались ли у вас проблемы с ним, когда вы удалили все не discord.js части.

Ответ №1:

У меня тоже была эта проблема, ее можно исправить, используя LTS-версию Node.js (14.15.5)

Ответ №2:

Для всех, кто ищет решение. dispacter.resume() глючит в node v14.16.1 , поэтому, если вы хотите, чтобы он работал, используйте node <=14.16.1.