'Discord.js unable to find a way to create cooldown for my command

I'm trying to implement a weekly cooldown to my command, I want to put set cooldown for a user who will successfully trigger command providing date of birth, unfortunately I'm not able find a way to do it, I was looking for some solution, found only one but it's not working as I can't fit it properly and it seems I'm doing something wrong, but I have no idea what. Any suggestion or ideas how to do it will be much appreciate.

client.on("messageCreate", message => {
    if (message.author.bot) return;
    // This is where we'll put our code.
    if (message.content.indexOf(config.prefix) !== 0) return;
  
    const args = message.content.slice(config.prefix.length).trim().split(/ +/g);
    const command = args.shift().toLowerCase();
  
    if(command === 'mycommand') {
      async function main() {
        const cooldowns = new Map();
        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);
        }
      const messages = await message.channel.messages.fetch({ limit: 1 });
      const lastMessage = messages.last();
      const isValidDate = (dateString) => new Date(dateString).toString() !== 'Invalid Date'
      if(isValidDate(lastMessage.content) == false && lastMessage.content !== 'mycommand')
      message.reply("I need your date of birth!.")
      if(lastMessage.content === '>p predict')
      message.reply("Please provide me your date of birth.")
      if(isValidDate(lastMessage.content) == true && lastMessage.content !== 'mycommand') {
      cooldowns.set(message.author.id, Date.now() + 604800000); // <---- I want to trigger cooldown from here, (after user succesfully use the command with date of birth)
      setTimeout(() => cooldowns.delete(message.author.id), 604800000);
      message.reply("Check your DMs.")
      message.react("emoji"); //react with emoji to the issued command
      const predictions = ["Prediction 1", "Prediction 2", "Prediction 3", "Prediction 4", "Prediction 5", "Prediction 6", "Prediction 7"]
      const randomprediction = predictions[Math.floor(Math.random() * predictions.length)];
        const prediction1 = new MessageEmbed()
          .setColor('#ff7518')
        .setAuthor(client.user.username, client.user.displayAvatarURL())
          .setTitle(`Weekly message` + lastMessage.author.username + `#` + lastMessage.author.discriminator) 
        .setDescription(randomprediction);
        message.author.send({ embeds: [prediction1] });
        var random = Math.random()
        if (random < 0.9) {
        message.author.send("Congrats! You received this message " + '<@' + message.author.id + '>!')
        message.channel.send('Congrats again! ' + '<@' + message.author.id + '>'); 
        }
      }
  }

Here is a code example, unfortunately it's not working. Help will be much appreciated!



Solution 1:[1]

I found the solution, it's required to have maps in the top of the code, cooldown is set after successful usage of the command. Here is the solution.

//outside at the beggining 
const humanizeDuration = require('humanize-duration');
const cooldowns = new Map();

client.on("messageCreate", message => {
    if (message.author.bot) return;
    // This is where we'll put our code.
    if (message.content.indexOf(config.prefix) !== 0) return;
  
    const args = message.content.slice(config.prefix.length).trim().split(/ +/g);
    const command = args.shift().toLowerCase();
  
    if(command === 'mycommand') {
    const cooldown = cooldowns.get(message.author.id);
    if (cooldown) {
        const remaining = humanizeDuration(cooldown - Date.now(), { round: true }, { units: ["d","h","m","s"] });
    
        message.reply(`Your cooldown is. ${remaining}`)
        return;
    }  
      async function main() {
      const messages = await message.channel.messages.fetch({ limit: 1 });
      const lastMessage = messages.last();
      const isValidDate = (dateString) => new Date(dateString).toString() !== 'Invalid Date'
      if(isValidDate(lastMessage.content) == false && lastMessage.content !== 'my')
      message.reply("I need your date of birth!.")
      if(lastMessage.content === 'mycommand')
      message.reply("Please provide me your date of birth.")
      if(isValidDate(lastMessage.content) == true && lastMessage.content !== 'mycommand') {
      cooldowns.set(message.author.id, Date.now() + 604800000);
      message.reply("Check your DMs.")
      message.react("emoji"); //react with emoji to the issued command
      const predictions = ["Prediction 1", "Prediction 2", "Prediction 3", "Prediction 4", "Prediction 5", "Prediction 6", "Prediction 7"]
      const randomprediction = predictions[Math.floor(Math.random() * predictions.length)];
        const prediction1 = new MessageEmbed()
          .setColor('#ff7518')
        .setAuthor(client.user.username, client.user.displayAvatarURL())
          .setTitle(`Weekly message` + lastMessage.author.username + `#` + lastMessage.author.discriminator) 
        .setDescription(randomprediction);
        message.author.send({ embeds: [prediction1] });
        var random = Math.random()
        if (random < 0.9) {
        message.author.send("Congrats! You received this message " + '<@' + message.author.id + '>!')
        message.channel.send('Congrats again! ' + '<@' + message.author.id + '>'); 
        }
        setTimeout(() => cooldowns.delete(message.author.id), 604800000);
      }
  }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1