From 8bdd522bc5589af88587989951e6140ef69022da Mon Sep 17 00:00:00 2001
From: Guillaume Vagner <guillaume.vagner@supelec.fr>
Date: Sat, 23 Feb 2019 22:05:11 +0100
Subject: [PATCH] create schedule.js

---
 connection-db.js |  4 +--
 requests.js      |  1 +
 schedule.js      | 55 ++++++++++++++++++++++++++++++++++++++++
 telegram.js      | 65 +++++++++++-------------------------------------
 website.js       |  2 +-
 5 files changed, 73 insertions(+), 54 deletions(-)

diff --git a/connection-db.js b/connection-db.js
index 6470d95..3a20002 100644
--- a/connection-db.js
+++ b/connection-db.js
@@ -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}, "", "", "", "", "", "")
     `)
 }
 
diff --git a/requests.js b/requests.js
index c2d8579..18ba9dd 100644
--- a/requests.js
+++ b/requests.js
@@ -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
diff --git a/schedule.js b/schedule.js
index e69de29..110dd90 100644
--- a/schedule.js
+++ b/schedule.js
@@ -0,0 +1,55 @@
+// 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
diff --git a/telegram.js b/telegram.js
index 0d9b601..7e31946 100644
--- a/telegram.js
+++ b/telegram.js
@@ -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' });
-            })
-        });
-        bot.sendMessage(chatId, `Votre rappel est configuré pour tous les jours à ${time}`);
-    })
+        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);
 })
 
 
diff --git a/website.js b/website.js
index 77cbe15..178a4bd 100644
--- a/website.js
+++ b/website.js
@@ -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
-- 
GitLab