-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
143 lines (122 loc) · 5.47 KB
/
index.js
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
// Importer quelques librairies
const fastify = require("fastify")({ logger: { level: "silent" } })
const { FreeboxClient } = require("freebox-wrapper")
require("dotenv").config()
// Supabase
var { createClient } = require("@supabase/supabase-js")
var supabase = createClient(process.env.SUPABASE_LINK, process.env.SUPABASE_PUBLIC_KEY)
// Générer un code unique
async function generateUniqueCode(i = 0){
// Si on a essayé trop de fois fois, on arrête
if(i > 20){
console.error("Failed generating unique code: tried too many times")
return null
}
// On génère un code
var code = ""
var possible = "0123456789"
var length = i < 10 ? 6 : 12 // si on a déjà essayé 10 fois, on passe à 12 caractères au lieu de 6
for(var i = 0; i < length; i++) code += possible.charAt(Math.floor(Math.random() * possible.length))
// On le vérifie
var { data, error } = await supabase.from("uniquecode").select("*").eq("code", code)
if(error){
console.error("Failed checking if unique code is unique:", error)
return generateUniqueCode(i += 1)
}
// Si on a déjà ce code, on en génère un autre
if(data?.length > 0) return generateUniqueCode(i += 1)
// Sinon, on retourne le code
return code
}
// Supprimer les codes uniques trop anciens
async function deleteExpiredUniquecode(){
// Obtenir les codes uniques
console.log("Trying to delete expired unique code...")
var { data, error } = await supabase.from("uniquecode").select("*")
console.log(`Found ${data?.length} unique code(s)`)
// Si on a une erreur, ou pas de données
if(error) return console.error("Failed getting unique code:", error)
if(!data) return
// Pour chaque code
for(var i = 0; i < data.length; i++){
// Supprimer s'il est trop ancien
if(data?.[i]?.created){
var created = new Date(data[i].created)
if(created < new Date(Date.now() - (1000 * 60 * 30))){ // 30 minutes
var { error } = await supabase.from("uniquecode").delete().match({ code: data[i].code })
if(error) console.error("Failed deleting unique code:", error)
else console.log("Deleted unique code:", data[i].code)
} else console.log("unique code not expired:", data[i].code)
}
}
}
deleteExpiredUniquecode()
setInterval(async () => {
deleteExpiredUniquecode()
}, 1000 * 60 * 60) // toutes les heures
// Rediriger vers la docs
fastify.all("/", async (req, res) => {
return res.redirect("https://github.com/Freebox-Tools/api-notifier")
})
// Associer une Freebox à un compte Telegram
fastify.post("/associateBoxWithTelegram", async (req, res) => {
// Récupérer les données depuis le body
var { appToken, apiDomain, httpsPort } = req.body
if(!appToken || !apiDomain || !httpsPort) throw { statusCode: 400, error: "Missing Parameters", message: "Des arguments sont manquants dans le body.", details: "appToken, apiDomain, httpsPort sont tous nécessaires." }
// On tente de se connecter à la box
console.log("Trying to associate a new box...")
var client = new FreeboxClient({ appToken, apiDomain, httpsPort, appId: "fbx.notifier" })
var response = await client.authentificate()
// Si on a une erreur
if(!response?.success){
console.log("Failed to associate a new box, canceling.")
throw { statusCode: 400, error: "Unable to connect", message: "La connexion à votre Freebox n'a pas pu être réalisé.", details: response }
} else console.log("New Freebox associated successfully.")
// On génère un code unique
console.log("Generating unique code for the new box...")
var code = await generateUniqueCode()
if(!code) throw { statusCode: 500, error: "Failed generating unique code", message: "Une erreur est survenue lors de la génération du code d'association à Telegram. Veuillez réessayer plus tard." }
// On ajoute le code à la base de données
console.log("Adding unique code to the database...")
var { error } = await supabase.from("uniquecode").insert({
code,
created: new Date(),
content: {
appToken,
apiDomain: client?.freebox?.api_domain || apiDomain,
httpsPort: client?.freebox?.https_port || httpsPort,
boxModel: client?.freebox?.box_model_name || null,
}
})
// Si on a une erreur
if(error){
console.error("Failed adding unique code to the database:", error)
throw { statusCode: 500, error: "Failed adding unique code to the database", message: "Une erreur est survenue lors de l'inscription des informations de votre Freebox à la base de données. Veuillez réessayer plus tard." }
}
// On retourne le code
return { success: true, code }
})
// Afficher le status des différents services
fastify.get("/status", async (req, res) => {
// Obtenir les données depuis Supabase
var { data, error } = await supabase.from("status").select("*")
if(error) throw { statusCode: 500, error: "Failed getting status", message: "Une erreur est survenue lors de la récupération des informations de status. Veuillez réessayer plus tard.", "discord": "down", "telegram": "down" }
// Obtenir l'écart de temps entre maintenant et chaque date enregistrée
var now = Date.now()
var toReturn = {}
data.forEach(d => {
d.difference = now - new Date(d.lastSeen).getTime()
d.down = d.difference > 1000 * 60 * 2 // 2 minutes (car les plateformes mettent à jour toutes les 1min30)
toReturn[d.name] = d.down ? "down" : "up"
})
// On retourne les données au format "plateforme": "up/down"
return {
data,
...toReturn
}
})
// Démarrer le serveur
fastify.listen({ port: process.env.PORT || 3000 }, (err) => {
if(err) fastify.log.error(err), process.exit(1)
console.log(`Server listening on port ${fastify.server.address().port}`)
})