Implement cron job scheduling for daily reminders and add send reminder functionality

This commit is contained in:
David Vargas 2024-11-06 09:00:36 -06:00
parent 71dbf28481
commit 9ffcf83889
4 changed files with 89 additions and 10 deletions

View File

@ -1,15 +1,13 @@
// index.js
const { Client, LocalAuth } = require('whatsapp-web.js');
const qrcode = require('qrcode-terminal');
const dotenv = require('dotenv');
const weatherUtils = require('./utils/weather_utils');
const weatherService = require('./services/weather_service');
const logger = require('./utils/logger');
const { handleRecipeCommand } = require('./commands/recipes_command'); // Importar el comando de recetas
const { handleWeatherCommand } = require('./commands/weather_command'); // Importar el comando de clima
const { handleRecipeCommand } = require('./commands/recipes_command');
const { handleWeatherCommand } = require('./commands/weather_command');
const { initializeCronJobs } = require('./services/cron_service');
// Configuración inicial
dotenv.config();
// Constantes
@ -22,7 +20,6 @@ if (!AUTHORIZED_NUMBER) {
process.exit(1);
}
// Configuración del cliente
const clientConfig = {
authStrategy: new LocalAuth(),
puppeteer: {
@ -60,6 +57,8 @@ class WhatsAppBot {
this.myNumber = this.myId.split('@')[0];
logger.info(`🔑 Tu ID de WhatsApp es: ${this.myId}`);
logger.info(`📱 Tu número de teléfono es: ${this.myNumber}`);
const initCron = await initializeCronJobs(this.client);
if (initCron) logger.info('⏰ Tareas programadas inicializadas correctamente');
const chat = await this.client.getChatById(this.myId);
logger.info(`💭 Chat propio encontrado: ${JSON.stringify(chat, null, 2)}`);
} catch (error) {
@ -121,6 +120,5 @@ class WhatsAppBot {
}
}
// Iniciar el bot
const bot = new WhatsAppBot();
bot.start();

View File

@ -28,9 +28,6 @@ const translateText = async (text, targetLang = 'es') => {
}
);
console.log('Respuesta de la API de traducción:', response.data);
console.log('Texto original:', text);
// Extrae el texto traducido de la respuesta
const translatedText = response.data.candidates[0].content.parts[0].text;
return translatedText;

56
services/cron_service.js Normal file
View File

@ -0,0 +1,56 @@
const cron = require('node-cron');
const { sendReminder } = require('../tasks/send_reminder');
const config = require('../config.json');
/**
* Convierte el intervalo en horas o minutos a minutos.
* @param {String} intervalo - Intervalo en el formato "2 horas" o "45 minutos".
* @returns {Number} - Intervalo en minutos.
*/
const getIntervalInMinutes = (intervalo) => {
const [amount, unit] = intervalo.split(' ');
return unit.includes('hora') ? parseInt(amount) * 60 : parseInt(amount);
};
/**
* Programa las tareas de recordatorio basadas en el horario y el intervalo.
* @param {Object} client - Instancia del cliente de WhatsApp.
*/
const initializeCronJobs = (client) => {
const dailyRoutines = config.rutinas.diarias;
dailyRoutines.forEach((routine) => {
const { actividad, detalles } = routine;
const { intervalo, horario, que, hora } = detalles;
if (intervalo && horario) {
const intervalInMinutes = getIntervalInMinutes(intervalo);
const [startHour, startMinute] = horario.inicio.split(':').map(Number);
const [endHour, endMinute] = horario.fin.split(':').map(Number);
cron.schedule(`*/${intervalInMinutes} * * * *`, () => {
const now = new Date();
const isWithinTimeFrame =
now.getHours() >= startHour &&
now.getHours() <= endHour &&
(now.getHours() < endHour || now.getMinutes() <= endMinute);
if (isWithinTimeFrame) {
sendReminder(client, actividad, que);
}
});
}
else if (hora) {
const [hour, minute] = hora.split(':');
cron.schedule(`${minute} ${hour} * * *`, () => {
sendReminder(client, actividad, que);
});
}
});
console.log('⏰ Recordatorios programados según configuración en config.json');
};
module.exports = {
initializeCronJobs
};

28
tasks/send_reminder.js Normal file
View File

@ -0,0 +1,28 @@
const { MessageMedia } = require('whatsapp-web.js');
const config = require('../config.json');
const dotenv = require('dotenv');
dotenv.config();
const AUTHORIZED_NUMBER = process.env.AUTHORIZED_NUMBER;
/**
* Enviar un recordatorio de actividad diaria al número autorizado.
* @param {Object} client - Instancia del cliente de WhatsApp.
* @param {String} actividad - Nombre de la actividad.
* @param {String} mensaje - Mensaje personalizado para la actividad.
*/
const sendReminder = async (client, actividad, mensaje) => {
const formattedMessage = `🔔 Recordatorio: ${actividad}\n📝 ${mensaje}`;
try {
await client.sendMessage(AUTHORIZED_NUMBER, formattedMessage);
console.log(`📤 Recordatorio de ${actividad} enviado a ${AUTHORIZED_NUMBER}`);
} catch (error) {
console.error(`❌ Error al enviar recordatorio de ${actividad}:`, error);
}
};
module.exports = {
sendReminder
};