7
votes

I'm trying to make the bot writing messages at specific times. Example:

const Discord = require("discord.js");
const client = new Discord.Client();
client.on("ready", () => {
  console.log("Online!");
});
var now = new Date();
var hour = now.getUTCHours();
var minute = now.getUTCMinutes();
client.on("message", (message) => {
  if (hour === 10 && minute === 30) {
    client.channels.get("ChannelID").send("Hello World!");
  }
});

Unfortunately, it only works once I trigger another command like:

if (message.content.startsWith("!ping")) {
  message.channel.send("pong!");
}
my message: !ping (at 10:10 o'clock)
-> pong!
-> Hello World!

I guess it needs something that constantly checks the time variables.

2

2 Answers

12
votes

I would use cron: with this package you can set functions to be executed if the date matches the given pattern.
When building the pattern, you can use * to indicate that it can be executed with any value of that parameter and ranges to indicate only specific values: 1-3, 7 indicates that you accept 1, 2, 3, 7.

These are the possible ranges:

  • Seconds: 0-59
  • Minutes: 0-59
  • Hours: 0-23
  • Day of Month: 1-31
  • Months: 0-11 (Jan-Dec)
  • Day of Week: 0-6 (Sun-Sat)

Here's an example:

var cron = require("cron");

function test() {
  console.log("Action executed.");
}

let job1 = new cron.CronJob('01 05 01,13 * * *', test); // fires every day, at 01:05:01 and 13:05:01
let job2 = new cron.CronJob('00 00 08-16 * * 1-5', test); // fires from Monday to Friday, every hour from 8 am to 16

// To make a job start, use job.start()
job1.start();
// If you want to pause your job, use job.stop()
job1.stop();

In your case, I would do something like this:

const cron = require('cron');

client.on('message', ...); // You don't need to add anything to the message event listener

let scheduledMessage = new cron.CronJob('00 30 10 * * *', () => {
  // This runs every day at 10:30:00, you can do anything you want
  let channel = yourGuild.channels.get('id');
  channel.send('You message');
});

// When you want to start it, use:
scheduledMessage.start()
// You could also make a command to pause and resume the job
2
votes

As Federico stated, that is the right way to solve this problem but the syntax has changed and now with the new update of discord.js (v12) it would be like:

    // Getting Discord.js and Cron
    const Discord = require('discord.js');
    const cron = require('cron');
            
    // Creating a discord client
    const client = new Discord.Client();
        
    // We need to run it just one time and when the client is ready
    // Because then it will get undefined if the client isn't ready
    client.once("ready", () => {
      console.log(`Online as ${client.user.tag}`);
        
      let scheduledMessage = new cron.CronJob('00 30 10 * * *', () => {
      // This runs every day at 10:30:00, you can do anything you want
      // Specifing your guild (server) and your channel
         const guild = client.guilds.cache.get('id');
         const channel = guild.channels.cache.get('id');
         channel.send('You message');
        });
            
        // When you want to start it, use:
        scheduledMessage.start()
    };

// You could also make a command to pause and resume the job

But still credits to Federico, he saved my life!