forked from Androz2091/pronote-bot
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpronote-bot.js
More file actions
294 lines (275 loc) · 11.7 KB
/
pronote-bot.js
File metadata and controls
294 lines (275 loc) · 11.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
require("./helpers/extenders");
const getClient = require("./instagram/getClient");
const fetchEleve = require("./pronote/fetchEleve");
const checkCred = require("./pronote/checkCred");
const fs = require("fs");
const logger = require("./helpers/logger");
const beautify = require("json-beautify");
const reload = require("require-reload")(require);
const { writeFileSync, existsSync } = require("fs");
const { sep } = require("path");
const { readFile } = require("fs");
const { promisify } = require("util");
const readFileAsync = promisify(readFile);
const { getMenuNom } = require("./helpers/functions");
const InstaMessage = require("./instagram/InstaMessage");
const config = require("./config");
if (!existsSync(__dirname + sep + "credentials.json"))
writeFileSync(__dirname + sep + "credentials.json", [], "utf-8");
const commandsWait = {};
let loginStates = [];
const helpPage = `Voici la liste des commandes disponibles :
!moy (affiche vos moyennes)
!picture (affiche votre photo)
!recap (affiche infos sur la journée)
!notif (active les notifications)
!dénotif (désactive les notifications)
{{notifStatus}}
`;
(async () => {
let ig = await getClient();
let igWakeUp = Date.now();
logger.log("Client is ready.", "info");
// Extensions de certaines classes
require("./helpers/extenders");
// Lancement des tâches
require("./helpers/tasks")(ig);
setTimeout(() => {
logger.log("Client is listening.", "info");
}, 2000);
let currentUserID = null;
ig.realtime.on('message', async msgRaw => {
if(msgRaw.message.op !== "add") return;
// Il peut y avoir de fausses notifications si le bot est démarré depuis moins de 2 secondes
if (Date.now() - igWakeUp < 2000) {
return;
}
let message = new InstaMessage(msgRaw.message, ig);
if(message.author.id === currentUserID) return;
await message.author.fetchInfo();
if(message.author.username === config.username){
currentUserID = message.author.id;
return;
}
message.markAsSeen();
let credentials = require("./credentials.json");
let cooldown =
commandsWait[message.author.username] &&
Date.now() - commandsWait[message.author.username] < 20000;
if (loginStates.some(l => l.insta === message.author.username)) {
let i = loginStates
.map(l => l.insta)
.indexOf(message.author.username);
// If the user entered his username
if (loginStates[i].step === "username") {
loginStates[i].username = message.content.toLowerCase();
loginStates[i].step = "password";
return message.reply("Entrez votre mot de passe ENT :");
}
// If the user entered his password
if (loginStates[i].step === "password") {
loginStates[i].password = message.content;
message.reply("Vérification de vos identifiants...");
// Check if the credentials are correct
let isValid = await checkCred(
loginStates[i].username,
loginStates[i].password
);
if(isValid){
// If the credentials are correct
await message.reply(
"Vous êtes maintenant connecté! Pour des raisons évidentes de sécurité, il est conseillé de supprimer votre mot de passe de la discussion."
);
await message.reply(
helpPage.replace(
"{{notifStatus}}",
"🔔Notification activées"
)
);
credentials.push({
username: loginStates[i].username,
password: loginStates[i].password,
insta: message.author.username,
notif: true
});
fs.writeFileSync(
"./credentials.json",
beautify(credentials, null, 2, 100),
"utf-8"
);
reload("./credentials.json");
// Remove state
loginStates = loginStates.filter(
l => l.insta !== message.author.username
);
} else {
// Remove state
loginStates = loginStates.filter(
l => l.insta !== message.author.username
);
await message.reply(
"Hmm... on dirait que vos identifiants sont invalides."
);
return message.reply("Tapez !login pour réessayer!");
}
}
} else if (!message.author.logged && message.content !== "!login") {
/* LOGIN MESSAGE */
message.reply("Tapez !login pour vous connecter à l'ENT.");
} else if (message.content === "!login") {
/* LOGIN COMMAND */
if (message.author.logged)
return message.reply("Vous êtes déjà connecté !");
message.reply(
"Bonjour, @" +
message.author.username +
" !\nEntrez votre identifiant ENT (par exemple jean.dupont):"
);
loginStates.push({
insta: message.author.username,
step: "username",
username: null,
password: null
});
} else if (message.content === "!logout") {
/* LOGOUT COMMAND */
credentials = credentials.filter(
i => i.insta !== message.author.username
);
fs.writeFileSync(
"./credentials.json",
beautify(credentials, null, 2, 100),
"utf-8"
);
reload("./credentials.json");
message.reply(
"Déconnexion effectuée. Pour vous reconnecter, tapez !login."
);
} else if (message.content === "!moy") {
/* MOYENNES */
if (cooldown) {
return message.reply(
"⌛ Une requête est déjà en cours... merci de patienter!"
);
}
// Update cooldown
commandsWait[message.author.username] = Date.now();
message.reply("Veuillez patienter...");
fetchEleve(message.author.credentials)
.then(student => {
message.reply(
"Moyennes:\n\nNormale: " +
(student.moyenne || "Aucune note") +
"\nPluriannuelle: " +
student.moyennePluri
);
delete commandsWait[message.author.username];
})
.catch(e => {
message.reply("Une erreur est survenue (e=" + e + ")");
});
} else if (message.content === "!picture") {
/* PICTURE COMMAND */
await message.reply("Veuillez patienter...");
let img = await readFileAsync(
"./images/" + message.author.credentials.username + ".png"
);
await message.replyImage(Buffer.from(img, "binary"));
message.reply("Voilà votre photo de profil Pronote!");
} else if (message.content === "!notif") {
/* NOTIF COMMAND */
if (message.author.credentials.notif) {
return message.reply(
"Les notifications sont déjà activées ! Tapez !dénotif pour les désactiver."
);
}
credentials = credentials.filter(
i => i.insta !== message.author.username
);
message.author.credentials.notif = true;
credentials.push(message.author.credentials);
fs.writeFileSync(
"./credentials.json",
beautify(credentials, null, 2, 100),
"utf-8"
);
reload("./credentials.json");
message.reply(
"Vous recevrez une notification lorsqu'une note est ajoutée sur Pronote ! Tapez !dénotif pour désactiver cette option."
);
} else if (message.content === "!dénotif") {
/* DÉNOTIF COMMAND */
if (!message.author.credentials.notif) {
return message.reply(
"Les notifications sont déjà désactivées ! Tapez !notif pour les activer."
);
}
credentials = credentials.filter(
i => i.insta !== message.author.username
);
message.author.credentials.notif = false;
credentials.push(message.author.credentials);
fs.writeFileSync(
"./credentials.json",
beautify(credentials, null, 2, 100),
"utf-8"
);
reload("./credentials.json");
message.reply(
"Vous ne recevrez plus de notification lorsqu'une note est ajoutée sur Pronote... Tapez !notif pour réactiver cette option."
);
} else if (message.content === "!recap") {
if(process.modeVacances){
return message.reply("🌴 Le recap n'est pas disponible en mode vacances...");
} else if (process.coronaMode){
return message.reply("⚠️ Suite à une décision du gouvernement français, les cours ne s'organisent plus de la même façon à compter du lundi 16 mars 2020.");
}
/* RECAP COMMAND */
if (cooldown) {
return message.reply(
"⌛ Une requête est déjà en cours... merci de patienter!"
);
}
// Update cooldown
commandsWait[message.author.username] = Date.now();
message.reply("Veuillez patienter...");
fetchEleve(message.author.credentials)
.then(student => {
delete commandsWait[message.author.username];
let sum = student.getSummary();
if (sum === "unreachable") {
return message.reply("EDT unreachable.");
} else {
message.reply(sum);
}
})
.catch(e => {
console.error(e);
message.reply("Une erreur est survenue (e=" + e + ")");
});
} else if(message.content === "!menu") {
if(process.modeVacances){
return message.reply("🌴 Le menu n'est pas disponible en mode vacances...");
} else if (process.coronaMode){
return message.reply("⚠️ Suite à une décision du gouvernement français, les cours ne s'organisent plus de la même façon à compter du lundi 16 mars 2020.");
}
/* MENU COMMAND */
let menuName = getMenuNom();
await message.reply("Veuillez patienter...");
let img = await readFileAsync(
"./menus/" + menuName.cleanUpSpecialChars() + ".jpg"
);
message.replyImage(Buffer.from(img, "binary"));
} else {
/* HELP COMMAND */
await message.reply(
helpPage.replace(
"{{notifStatus}}",
message.author.credentials.notif
? "🔔 Notifications activées"
: "🔕 Notifications désactivées"
)
);
}
});
})();