【问题标题】:is there a way to make my music discord bot saves the volume setting?有没有办法让我的音乐不和谐机器人保存音量设置?
【发布时间】:2020-12-10 05:28:27
【问题描述】:

当我播放音乐时,我将音量设置为 20%,例如,当机器人离开语音频道,然后我播放另一首音乐时,音量又回到 100%,我必须手动重新设置再次降至 20%。

我想让我的机器人保存我设置的音量。有什么办法吗?

这是我的代码:

 } else if (command === "volume" || command === "vol") {
        if (!message.member.voice.channel) return message.channel.send("I'm sorry, but you need to be in a voice channel to set a volume!");
        if (!serverQueue) return message.channel.send("There is nothing playing");
        if (!args[1]) return message.channel.send(`The current volume is: **\`${serverQueue.volume}%\`**`);
        if (isNaN(args[1]) || args[1] > 100) return message.channel.send("Volume only can be set in a range of **\`1\`** - **\`100\`**");
        serverQueue.volume = args[1];
        serverQueue.connection.dispatcher.setVolume(args[1] / 100);
        return message.channel.send(`I set the volume to: **\`${args[1]}%\`**`);

【问题讨论】:

标签: javascript node.js discord bots discord.js


【解决方案1】:

建议的数据库解决方案对于这项任务来说似乎有点矫枉过正。您是否考虑过使用dotenv

配置 dotenv 后,您可以在应用程序根目录的 .env 中声明一个 VOLUME 变量:VOLUME=20

然后,您可以在应用程序的任何地方访问此值。看来您正在使用serverQueue.connection.dispatcher.setVolume() 方法来设置音量。

您现在可以在播放音频之前执行serverQueue.connection.dispatcher.setVolume(process.env.VOLUME) 以确保始终设置正确的值(在此上下文中,process.env.VOLUME === 20

现在,更改此值的函数将变得像process.env.VOLUME = args[1] / 100 一样简单。这将更新“VOLUME”变量:下次引用 process.env.VOLUME 时,它将具有新值,因此最好保留 args[1] 的输入验证(仍应为 1-100 范围内的数字)。

使用此方法,当您退出进程 (Ctrl + C) 并重新启动它时,VOLUME 变量将使用您在 .env 文件中声明的值重新初始化(本例中为 20

我相信这个解决方案更轻便,更适合您的需求,因为您应该已经在使用 dotenv 来保护您的 Discord API 密钥。

但是,如果除了 VOLUME 变量之外,您还有很多其他信息需要保留,aDeveloper 提到的解决方案(Keyv 额外依赖项)可能更适合。

Example of discord.js bot using dotenv,如果你需要一个例子来配置你的。

Here你可以看到一个硬编码的volume值:如果你克隆repo,在.env文件中添加VOLUME=50并将我的硬编码0.5替换为process.env.VOLUME / 100,它的工作原理完全一样。

/编辑

回答您的评论后,我将尝试恢复您必须采取的按时间顺序排列的步骤:

  • 按照自述文件中的说明安装dotenv 模块
  • 在我们应用的根目录下创建一个.env 文件
  • 在该文件中,声明一个 VOLUME 变量:VOLUME=20
  • require("dotenv").config(); 放入应用程序的入口点,如我在example 中所示
  • 启动您的机器人并确保 dotenv 正常工作,方法是将 console.log("VOLUME = ", process.env.VOLUME); 放在您可以通过 Discord 轻松调用的任何命令中
  • 调用该命令:您应该会在终端中看到您的 console.log。
  • 如果VOLUME = undefined,您在设置中遗漏了某些内容。重读他们的 README,重温我的例子,你应该明白了。
  • 如果VOLUME = 20,你很好,这意味着 VOLUME 变量已经初始化并且现在存在于你的应用程序中。
  • 您现在可以在应用程序的任何位置访问此变量 (process.env.VOLUME)。
  • 您可以使用process.env.VOLUME 访问它的值,就像使用console.log 一样。现在唯一的区别是您将此值传递给用于设置音量的方法(即我读过的 serverQueue.connection.dispatcher.setVolume()),而不是 console.log() 方法。
  • 您还可以通过process.env.VOLUME = newValue 更改其值。这样做会将newValue 分配给您的 VOLUME 变量。
  • 下次您访问 process.env.VOLUME 时,它将具有您分配给它的最后一个值:这就是您“保存音量设置”的方式。
  • 只要您的应用程序运行,VOLUME 变量就会以您设置的值存在。
  • 如果你杀死并重新启动你的机器人,process.env.VOLUME 将再次等于 20。那是因为您在 .env 文件中声明了这一点。
  • 这就是require("dotenv").config() 方法的作用,以及为什么应该在您的应用程序一开始就调用它:该方法将读取您的.env 文件,并将值分配给process.env.YOURCHOSENKEYWORDS
  • 注意:如果您希望即使重新启动机器人也保留最后一个卷集,则此解决方案将无法执行,您必须写入和读取本地 JSON 文件,或采用建议的数据库路由根据第一条评论

完成此操作后,下一步就是在 .env 文件中声明 Discord API 密钥,而不是对其进行硬编码。但这将是另一天/问题

【讨论】:

  • 这样吗? serverQueue.volume = args[1]; serverQueue.connection.dispatcher.setVolume(process.env.VOLUME); return message.channel.send(`I set the volume to: **\`${args[1]}%\`**`);
  • 我不太明白。我试过你告诉我的。但它不起作用
  • 你能帮我解释一下我应该改变哪一部分吗?
  • 我详细回答了
  • 我尝试了很多方法让它工作,以你的答案为指导..
猜你喜欢
  • 2019-04-04
  • 2020-06-20
  • 2021-08-23
  • 1970-01-01
  • 2019-02-26
  • 2018-08-24
  • 2019-08-03
  • 2020-12-19
  • 2021-11-24
相关资源
最近更新 更多