Skip to content
Snippets Groups Projects
Commit 8bdd522b authored by Guillaume Vagner's avatar Guillaume Vagner
Browse files

create schedule.js

parent 4a21d9ac
Branches
No related tags found
No related merge requests found
......@@ -54,10 +54,10 @@ function getChanByChatId(chatId) {
`).then(rep => rep[0]);
}
function createChan(data) {
function createChan(chatId) {
return query(`
INSERT INTO channel
VALUES (${data.chatId}, "${data.username}", "${data.state}", "${data.token}", "${data.refresh}", "${data.expiration}", "${data.schedule}")
VALUES (${chatId}, "", "", "", "", "", "")
`)
}
......
......@@ -9,6 +9,7 @@ const config = require('./config');
// Fonction d'envoi d'une requête au GraphQL de LinkCS
async function sendRequest(req, token) {
// ici faire le refresh token
const options = {
headers: { 'Authorization': `Bearer ${token}` },
json: true
......
// Modules extérieurs
var schedule = require('node-schedule');
// Modules propres
var { modifyChan, getGroups } = require('./connection-db');
var { getBirthdays, getNewToken } = require('./requests');
// Création de variables
var schedules = {};
// En cas de redémarrage de l'appli
// query(`SELECT chatId, schedule FROM channel WHERE schedule <> ""`).then(rep => {
// rep.forEach(chan => {
//
// })
// })
function addSchedule(chan, time, bot) {
const hour = parseInt(time.split(':')[0]);
const minute = parseInt(time.split(':')[1]);
chan.schedule = time;
return Promise.all([
modifyChan(chan),
getGroups(chan.chatId)
]).then(([chan, groups]) => {
schedules[chan.chatId] = schedule.scheduleJob({ hour: hour, minute: minute }, function () {
return getNewToken(chan).then(chan => {
return getBirthdays(chan.token)
}).then(users => {
// récupère que les personnes du jour qui font partie des groupes ciblés
const newUsers = users.filter(user => user.asso.some(asso => groups.indexOf(asso) !== -1));
if (newUsers.length === 0) return
var msg = '**Joyeux anniversaire** à :\n'
newUsers.forEach(user => {
msg += `${user.name}\n`
});
return bot.sendMessage(chan.chatId, msg, { parse_mode: 'Markdown' });
})
})
})
};
function deleteSchedule(chatId) {
if (schedule[chatId]) {
schedule[chatId].cancel();
delete (schedule[chatId]);
}
}
module.exports = { schedules, addSchedule, deleteSchedule }
\ No newline at end of file
......@@ -2,27 +2,19 @@ process.env["NTBA_FIX_319"] = 1;
// Modules extérieurs
var TelegramBot = require('node-telegram-bot-api');
var schedule = require('node-schedule');
// Modules propres
var { query, getChanByChatId, createChan, deleteChanByChatId, modifyChan, addGroup, getGroups } = require('./connection-db');
var { getBirthdays, searchGroups, getGroupById, getNewToken } = require('./requests');
var { getChanByChatId, createChan, deleteChanByChatId, modifyChan, addGroup, getGroups } = require('./connection-db');
var { getBirthdays, searchGroups, getGroupById } = require('./requests');
var { addSchedule, deleteSchedule } = require('./schedule');
// Configurations
const config = require('./config');
// Création de variables
var bot = new TelegramBot(config.telegram.token, { polling: true });
var schedules = {};
// En cas de redémarrage de l'appli
// query(`SELECT chatId, schedule FROM channel WHERE schedule <> ""`).then(rep => {
// rep.forEach(chan => {
//
// })
// })
// A la connexion, création d'un document Channel dans MongoDB
bot.onText(/\/start/, msg => {
......@@ -30,15 +22,7 @@ bot.onText(/\/start/, msg => {
return getChanByChatId(chatId).then(chan => {
// /start déjà fait...
if (chan) return bot.sendMessage(chatId, 'Vous avez déjà fait lancé le bot sur cette conversation. Pour tout réinitialiser, faites /reset.')
return createChan({
chatId: chatId,
username: '',
state: '',
token: '',
refresh: '',
expiration: '',
schedule: ''
}).then(_ => {
return createChan(chatId).then(_ => {
const resp = 'Holà, je suis le Happy Botday, je suis là pour vous souhaiter vous rapeller les anniversaires de vos potes !\nPour commencer, il faut que quelqu\'un s\'identifie : /connect';
bot.sendMessage(chatId, resp);
})
......@@ -49,11 +33,10 @@ bot.onText(/\/start/, msg => {
bot.onText(/\/reset/, msg => {
const chatId = msg.chat.id;
// Suppression de l'objet
if (schedule[chatId]) {
schedule[chatId].cancel();
delete (schedule[chatId]);
}
return deleteChanByChatId(chatId).then(_ => {
deleteSchedule(chatId);
return Promise.all([
deleteChanByChatId(chatId),
]).then(_ => {
const resp = 'Toutes vos paramètres ont été supprimés. Pour recommencer à m\'utiliser, faites /start.';
bot.sendMessage(chatId, resp);
})
......@@ -67,7 +50,7 @@ bot.onText(/\/connect/, (msg, _) => {
// start pas encore fait
if (!chan) return bot.sendMessage(chatId, 'Avant de vous authentifier, faites /start.');
// /connect déjà fait, renvoie vers le lien précédent
if (chan.state.length !== 0) return bot.sendMessage(chatId, `@${chan.username} a déjà fait une demande. Vous pouvez annuler la demande via /cancel ou @${chan.username} peut se connecter depuis ce lien :\n${config.website.protocol}://${config.website.hostname}/?state=${chan.state}.`)
if (chan.state.length !== 0) return bot.sendMessage(chatId, `@${chan.username} a déjà fait une demande. Vous pouvez annuler la demande via /cancel ou @${chan.username} peut se connecter depuis ce lien :\n${config.website.protocol}://${config.website.hostname}/?state=${chan.state}`)
// authentification déjà faite
if (chan.token.length !== 0) return bot.sendMessage(chatId, `Une connexion a déjà été faite par @${chan.username}. Pour la réinitialiser, faites /disconnect`);
// dans le reste des cas, création d'un lien pour l'authentification et enregistrement dans l'objet pour être sur
......@@ -184,44 +167,24 @@ bot.onText(/\/add (.+)/, (msg, match) => {
})
})
// Ajout du temps de schedule
bot.onText(/\/schedule (.+)/, (msg, match) => {
const chatId = msg.chat.id;
const time = match[1];
if (!RegExp('^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$').test(time)) return bot.sendMessage(chatId, 'Le temps entré n\'est pas au format hh:mm');
const hour = parseInt(time.split(':')[0]);
const minute = parseInt(time.split(':')[1]);
getChanByChatId(chatId).then(chan => {
if (!chan) return bot.sendMessage(chatId, 'Pas de compte enregistré, faites /start pour commencer');
chan.schedule = time;
return Promise.all([
modifyChan(chan),
getGroups(chatId)
])
}).then(([chan, groups]) => {
schedules[chan.chatId] = schedule.scheduleJob({ hour: hour, minute: minute }, function () {
return getNewToken(chan).then(chan => {
return getBirthdays(chan.token)
}).then(users => {
// récupère que les personnes du jour qui font partie des groupes ciblés
const newUsers = users.filter(user => user.asso.some(asso => groups.indexOf(asso) !== -1));
if (newUsers.length === 0) return
var msg = '**Joyeux anniversaire** à :\n'
newUsers.forEach(user => {
msg += `${user.name}\n`
});
return bot.sendMessage(chan.chatId, msg, { parse_mode: 'Markdown' });
})
return addSchedule(chan, time, bot)
});
bot.sendMessage(chatId, `Votre rappel est configuré pour tous les jours à ${time}`);
})
})
// J'étais bien obligé (en vrai c'est pour tester)
bot.onText(/\/nikmarine/, msg => {
const chatId = msg.chat.id;
bot.sendMessage(chatId, 'Nik bien Marine');
console.log(schedules);
})
......
......@@ -3,7 +3,7 @@ var app = require('express')();
// Modules propres
var bot = require('./telegram');
var { modifyChan, getChanByState } = require('./connection-db');
var { getChanByState } = require('./connection-db');
var { getFirstToken } = require('./requests');
// Configurations
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment