【问题标题】:Problem with Broadcast Dispatcher .resume() function Discord JS v12Broadcast Dispatcher .resume() 函数 Discord JS v12 的问题
【发布时间】:2021-04-30 15:43:21
【问题描述】:

我正在使用 Discord JS v12 编写音乐机器人,目前正在处理 !pause 和 !resume 命令。它们非常简单,代码没有错误。这就是发生的事情:

  1. 歌曲正在播放。

  2. !pause 被调用,歌曲暂停并显示暂停确认消息。

  3. !resume 调用并显示恢复确认消息。

  4. 歌曲无法继续播放,其他一切正常,!queue, !play 命令也一样。

    这是我的 !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 语句,检查歌曲是否已经暂停,并且如果我还在 .resume 之前添加一个 .pause() () 和另一个额外的 .resume() 并按照相同的步骤,它的工作原理:

  1. 正在播放歌曲。
  2. !pause 被调用,歌曲暂停并显示暂停确认消息。
  3. !resume 调用并显示恢复确认消息。
  4. !resume 再次调用,歌曲继续播放,几乎没有任何声音故障,还在聊天中发送恢复确认消息。
  5. !pause 被调用,歌曲暂停并发送暂停确认消息。
  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"
}

我知道这有点奇怪,并且没有看到太多关于它的信息,但我看到很多人有同样的错误。我检查了 fetched 并且很好,所以我不知道问题是什么。伙计们,我将 110% 的感谢您的帮助。

【问题讨论】:

  • 您可以通过message.guild.me.voice.connection.dispatcher.resume() 试试运气。否则,您可以尝试npm i discordjs/discord.js 安装主版本(未经过 100% 测试)并检查您是否继续遇到此问题。
  • 这些都没有帮助。我对此感到非常困惑。
  • 很可能没有人真正知道这里发生了什么。您最好的选择是尽可能多地减少代码,并在删除所有非 discord.js 部分时查看是否仍有问题。

标签: javascript node.js discord discord.js


【解决方案1】:

适合所有寻求解决方案的人。 dispacter.resume() 在节点 v14.16.1+ 中有错误 所以如果你想让它工作使用节点

【讨论】:

    【解决方案2】:

    我也遇到了这个问题,可以使用 LTS 版本的 Node.js (14.15.5) 解决

    【讨论】:

      猜你喜欢
      • 2021-11-14
      • 2021-04-06
      • 2021-07-18
      • 1970-01-01
      • 2019-09-19
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      相关资源
      最近更新 更多