Discord. js Перезарядка команды + Оставшееся время - PullRequest
0 голосов
/ 11 февраля 2020

Хорошо, я хочу сделать так, чтобы время восстановления показывало, сколько времени пользователю нужно ждать, пока он снова не сможет работать. Охлаждение работает, но я хочу, чтобы оно показывало оставшееся время, а не говорило, что вам нужно подождать 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);
    }
}

}

1 Ответ

0 голосов
/ 12 февраля 2020

К сожалению, ваша текущая система не поможет. Вам придется хранить больше, чем просто пользователя, если вы хотите использовать время его перезарядки.

Давайте используем 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);
}
...