Discord.js 命令冷却时间 + 剩余时间

Posted

技术标签:

【中文标题】Discord.js 命令冷却时间 + 剩余时间【英文标题】:Discord.js Command Cooldown + Time Remaining 【发布时间】:2020-05-27 08:22:25 【问题描述】:

好的,所以我正在努力让冷却时间显示用户需要等待多长时间才能再次工作。冷却有效,但我希望它显示剩余时间,而不是说您需要等待 15 分钟才能输入此命令。可能吗?

const  RichEmbed  = require("discord.js");
const  stripIndents  = require("common-tags");
const  prefix  = require("../../botconfig.json");
const db = require('quick.db')
let bal = require("../../database/balance.json");
let works = require('../../database/works.json');
const fs = require('fs');
const talkedRecently = new Set();

//Set cooldown


module.exports = 
    name: "work",
    aliases: [],
    category: "economy",
    description: "Gets you money",
    usage: "[command | alias]",
    run: async (client, message, args) => 
       if (talkedRecently.has(message.author.id)) 
 message.channel.send("You have to wait TIME minutes before you can work again")

     else 
if(!bal[message.author.id])
    bal[message.author.id] = 
      balance: 0
    ;
   
  if(!works[message.author.id]) 
    works[message.author.id] = 
     work: 0
    ;
   

  const Jwork = require('../../work.json');
  const JworkR = Jwork[Math.floor(Math.random() * Jwork.length)];
  var random = Math.floor(Math.random() * 20) + 3;
  let curBal = bal[message.author.id].balance 
  bal[message.author.id].balance = curBal + random;
  let curWork = works[message.author.id].work
  works[message.author.id].work = curWork + 1;
  fs.writeFile('././database/works.json', JSON.stringify(works, null, 2), (err) => 
    if (err) console.log(err)
    )
  fs.writeFile('././database/balance.json', JSON.stringify(bal, null, 2), (err) => 
    let embed = new RichEmbed() 
    .setColor("RANDOM") 
    .setDescription(`
    **\???? | $message.author.username**, $JworkR ???? **$random**
    `) 
    message.channel.send(embed)
    if (err) console.log(err)
  );

        // Adds the user to the set so that they can't talk for a minute
        talkedRecently.add(message.author.id);
        setTimeout(() => 
          // Removes the user from the set after a minute
          talkedRecently.delete(message.author.id);
        , 900000);
    



【问题讨论】:

与其使用 JSON 文件存储数据,不如考虑使用数据库。您会注意到速度和易用性方面的显着改进。 【参考方案1】:

很遗憾,您当前的系统将无济于事。如果您想使用他们的冷却时间,您必须存储的不仅仅是用户。

让我们为变量使用Map,这样我们就可以拥有键值对。这将使我们更容易跟踪我们需要的信息

// Replace talkedRecently's declaration with this...
const cooldowns = new Map();

要让用户进入冷却时间,请使用Map.set() 将用户及其冷却时间到期的时间添加到cooldowns。然后,在冷却时间用完时使用Map.delete() 以允许用户再次访问该命令。

// Replace the  talkedRecently.add(...)  section with this...
cooldowns.set(message.author.id, Date.now() + 900000);
setTimeout(() => cooldowns.delete(message.author.id), 900000);

为了确定冷却时间的剩余时间,我们必须从它到期的时间中减去当前时间。但是,这会给我们几毫秒,使我们无法读取该值。将持续时间转换为单词的简单方法是使用humanize-duration moment 也是一个选项)。最后,我们可以发送所需的消息,让用户知道他们的冷却时间还剩多少。

// Put this where you require your other dependencies...
const humanizeDuration = require('humanize-duration');

// Replace the  if (talkedRecently.has(...))  part with this...
const cooldown = cooldowns.get(message.author.id);
if (cooldown) 
  const remaining = humanizeDuration(cooldown - Date.now());

  return message.channel.send(`You have to wait $remaining before you can work again`)
    .catch(console.error);

【讨论】:

好的,谢谢它的工作,但是秒的结果是十进制的,有什么方法可以让我在 59 秒内说 14 分钟而不是 14 分和 59.254 秒? 您可以利用humanizeDuration 函数的第二个参数来定义某些行为。例如, units: ['m'], round: true 会给你你想要的输出。有关更多选项和详细用法,请参阅包页面。 很高兴我能帮上忙。如果您觉得我解决了您问题的所有部分,您可以使用accept it 答案左侧的复选标记。

以上是关于Discord.js 命令冷却时间 + 剩余时间的主要内容,如果未能解决你的问题,请参考以下文章

用于检查每个冷却时间的冷却命令 (Discord.js)

Discord.js 命令冷却时间

discord.js 的冷却系统问题

TypeError: command.execute 在捕获错误时不是函数。此外,冷却不起作用。在 Discord.js 上

我正在 discord.js 中制作自定义动态嵌入帮助命令,如何嵌入命令信息?

Discord.js-commando 节流不起作用