398 lines
13 KiB
JavaScript
398 lines
13 KiB
JavaScript
const express = require('express');
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
const yaml = require('js-yaml');
|
|
|
|
const app = express();
|
|
|
|
// Activer le middleware JSON pour parser le corps des requêtes
|
|
app.use(express.json());
|
|
app.use(express.urlencoded({ extended: true })); // Si vous utilisez des requêtes POST de type formulaire
|
|
|
|
// Charger config.yaml
|
|
const config = yaml.load(fs.readFileSync('config.yaml', 'utf8'));
|
|
|
|
// Route pour récupérer les données utilisateur
|
|
app.get('/user/:username', (req, res) => {
|
|
const username = req.params.username;
|
|
const userFilePath = path.join(__dirname, `data/${username}.yaml`);
|
|
|
|
try {
|
|
const userData = yaml.load(fs.readFileSync(userFilePath, 'utf8'));
|
|
res.json(userData);
|
|
} catch (error) {
|
|
res.status(404).json({ error: "Utilisateur non trouvé" });
|
|
}
|
|
});
|
|
|
|
// Route pour mettre à jour la position d'un utilisateur
|
|
app.post('/update-position', (req, res) => {
|
|
const { username, latitude, longitude } = req.body;
|
|
const filePath = `./data/${username}.yaml`;
|
|
|
|
try {
|
|
if (fs.existsSync(filePath)) {
|
|
const data = yaml.load(fs.readFileSync(filePath, 'utf8'));
|
|
data.position_actuelle = {
|
|
latitude,
|
|
longitude,
|
|
last_update: new Date().toISOString(),
|
|
};
|
|
fs.writeFileSync(filePath, yaml.dump(data));
|
|
res.status(200).json({ message: 'Position mise à jour avec succès.' });
|
|
} else {
|
|
res.status(404).json({ error: 'Fichier utilisateur introuvable.' });
|
|
}
|
|
} catch (error) {
|
|
res.status(500).json({ error: 'Erreur lors de la mise à jour de la position.' });
|
|
}
|
|
});
|
|
|
|
|
|
|
|
// Servir les fichiers statiques
|
|
app.use('/static', express.static(path.join(__dirname, 'static')));
|
|
|
|
// Page principale
|
|
app.get('/', (req, res) => res.sendFile(path.join(__dirname, 'index.html')));
|
|
|
|
app.listen(config.port, () => {
|
|
console.log(`Serveur démarré sur http://localhost:${config.port}`);
|
|
});
|
|
|
|
// Route pour servir la page de supervision
|
|
app.get('/supervise', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'supervise.html'));
|
|
});
|
|
// Route pour récupérer les données de Baptiste
|
|
app.get('/data/baptiste.yaml', (req, res) => {
|
|
const userFilePath = path.join(__dirname, 'data/baptiste.yaml');
|
|
const configFilePath = path.join(__dirname, 'config.yaml');
|
|
|
|
try {
|
|
const userData = yaml.load(fs.readFileSync(userFilePath, 'utf8'));
|
|
const config = yaml.load(fs.readFileSync(configFilePath, 'utf8'));
|
|
// Inclure le décalage des pins dans la réponse
|
|
userData.pin_offset = config.pin_offset;
|
|
|
|
res.json(userData);
|
|
} catch (error) {
|
|
console.error("Erreur lors de la récupération des données :", error.message);
|
|
res.status(500).json({ error: "Impossible de récupérer les données" });
|
|
}
|
|
});
|
|
|
|
// Route pour la page de Julien
|
|
app.get('/julien', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'index_julien.html'));
|
|
});
|
|
|
|
/// Route pour récupérer les données de Julien
|
|
app.get('/data/julien.yaml', (req, res) => {
|
|
const userFilePath = path.join(__dirname, 'data/julien.yaml');
|
|
const configFilePath = path.join(__dirname, 'config.yaml');
|
|
|
|
try {
|
|
const userData = yaml.load(fs.readFileSync(userFilePath, 'utf8'));
|
|
const config = yaml.load(fs.readFileSync(configFilePath, 'utf8'));
|
|
// Inclure le décalage des pins dans la réponse
|
|
userData.pin_offset = config.pin_offset;
|
|
|
|
res.json(userData);
|
|
} catch (error) {
|
|
console.error("Erreur lors de la récupération des données :", error.message);
|
|
res.status(500).json({ error: "Impossible de récupérer les données" });
|
|
}
|
|
});
|
|
|
|
// Servir les fichiers statiques des tuiles
|
|
app.use('/tiles', express.static(path.join(__dirname, 'tiles')));
|
|
|
|
|
|
// Route pour marquer un défi comme résolu
|
|
app.post('/mark-challenge-resolved', (req, res) => {
|
|
const { username, challengeKey, } = req.body; // Extraction des données de la requête
|
|
|
|
if (!username || !challengeKey) {
|
|
console.error("Requête invalide : données manquantes");
|
|
return res.status(400).json({ error: "Les champs username et challengeKey sont requis." });
|
|
}
|
|
|
|
const userFilePath = path.join(__dirname, `data/${username}.yaml`);
|
|
|
|
// Vérification que le fichier existe
|
|
if (!fs.existsSync(userFilePath)) {
|
|
console.error(`Fichier utilisateur non trouvé : ${userFilePath}`);
|
|
return res.status(404).json({ error: `Utilisateur ${username} non trouvé.` });
|
|
}
|
|
|
|
try {
|
|
console.log(`Tentative de marquer comme résolu pour ${username}, défi : ${challengeKey}`);
|
|
|
|
const userData = yaml.load(fs.readFileSync(userFilePath, 'utf8'));
|
|
|
|
// Vérification de l'existence du défi
|
|
if (!userData.defis || !userData.defis[challengeKey]) {
|
|
console.error(`Défi ${challengeKey} non trouvé pour ${username}`);
|
|
return res.status(400).json({ error: `Défi ${challengeKey} non trouvé.` });
|
|
}
|
|
|
|
// Mise à jour du statut "resolu" pour le défi
|
|
userData.defis[challengeKey].resolu = "oui";
|
|
|
|
// Sauvegarde des données dans le fichier YAML
|
|
fs.writeFileSync(userFilePath, yaml.dump(userData), 'utf8');
|
|
|
|
console.log(`Défi ${challengeKey} mis à jour avec succès pour ${username}`);
|
|
res.json({ success: true, message: `Défi ${challengeKey} marqué comme résolu.` });
|
|
} catch (error) {
|
|
console.error(`Erreur lors de la mise à jour du défi pour ${username} :`, error.message);
|
|
res.status(500).json({ error: "Impossible de mettre à jour le défi." });
|
|
}
|
|
});
|
|
|
|
// Route pour la page "perdu"
|
|
app.get('/perdu', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'perdu.html'));
|
|
});
|
|
|
|
// Route pour la page "gagne_b"
|
|
app.get('/gagne_b', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'gagne_b.html'));
|
|
});
|
|
|
|
// Route pour la page "gagne_j"
|
|
app.get('/gagne_j', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'gagne_j.html'));
|
|
});
|
|
|
|
// Route pour la page "defi1_b"
|
|
app.get('/defi1_b', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'defi1_b.html'));
|
|
}
|
|
);
|
|
|
|
// Route pour la page "defi2_b"
|
|
app.get('/defi2_b', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'defi2_b.html'));
|
|
}
|
|
);
|
|
// Route pour la page "defi3_b"
|
|
app.get('/defi3_b', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'defi3_b.html'));
|
|
}
|
|
);
|
|
// Route pour la page "defi4_b"
|
|
app.get('/defi4_b', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'defi4_b.html'));
|
|
}
|
|
);
|
|
// Route pour la page "defi5_b"
|
|
app.get('/defi5_b', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'defi5_b.html'));
|
|
}
|
|
);
|
|
// Route pour la page "defi6_b"
|
|
app.get('/defi6_b', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'defi6_b.html'));
|
|
}
|
|
);
|
|
// Route pour la page "defi1_j"
|
|
app.get('/defi1_j', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'defi1_j.html'));
|
|
}
|
|
);
|
|
// Route pour la page "defi2_j"
|
|
app.get('/defi2_j', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'defi2_j.html'));
|
|
}
|
|
);
|
|
// Route pour la page "defi3_j"
|
|
app.get('/defi3_j', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'defi3_j.html'));
|
|
}
|
|
);
|
|
// Route pour la page "defi4_j"
|
|
app.get('/defi4_j', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'defi4_j.html'));
|
|
}
|
|
);
|
|
// Route pour la page "defi5_j"
|
|
app.get('/defi5_j', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'defi5_j.html'));
|
|
}
|
|
);
|
|
// Route pour la page "defi6_j"
|
|
app.get('/defi6_j', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'defi6_j.html'));
|
|
}
|
|
);
|
|
|
|
// Route pour la page "final1_j"
|
|
app.get('/final1_j', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'final1_j.html'));
|
|
}
|
|
);
|
|
// Route pour la page "final1_b"
|
|
app.get('/final1_b', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'final1_b.html'));
|
|
}
|
|
);
|
|
|
|
// Route pour récupérer les données du fichier YAML
|
|
app.get('/defis', (req, res) => {
|
|
try {
|
|
const data = yaml.load(fs.readFileSync('./data/defi_j.yaml', 'utf8'));
|
|
console.log('Données chargées depuis YAML :', data);
|
|
res.json(data.defis);
|
|
} catch (error) {
|
|
res.status(500).json({ error: 'Erreur lors de la lecture du fichier YAML.' });
|
|
}
|
|
});
|
|
|
|
// Route pour récupérer les données du fichier YAML
|
|
app.get('/defis_b', (req, res) => {
|
|
try {
|
|
const data = yaml.load(fs.readFileSync('./data/defi_b.yaml', 'utf8'));
|
|
console.log('Données chargées depuis YAML :', data);
|
|
res.json(data.defis);
|
|
} catch (error) {
|
|
res.status(500).json({ error: 'Erreur lors de la lecture du fichier YAML.' });
|
|
}
|
|
});
|
|
|
|
app.use(express.static('static'));
|
|
|
|
// Charger les données d'un utilisateur
|
|
app.get('/data/:username.yaml', (req, res) => {
|
|
const username = req.params.username;
|
|
const filePath = `./data/${username}.yaml`; // Chemin vers le fichier YAML
|
|
|
|
try {
|
|
if (fs.existsSync(filePath)) {
|
|
const userData = yaml.load(fs.readFileSync(filePath, 'utf8'));
|
|
res.json(userData);
|
|
} else {
|
|
res.status(404).json({ error: 'Fichier utilisateur non trouvé' });
|
|
}
|
|
} catch (error) {
|
|
res.status(500).json({ error: 'Erreur lors de la lecture du fichier utilisateur' });
|
|
}
|
|
});
|
|
|
|
function updateDefisAsResolved() {
|
|
fetch(`/resolve-defi`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({
|
|
username,
|
|
defi,
|
|
}),
|
|
})
|
|
.then((response) => {
|
|
if (response.ok) {
|
|
console.log(`Défi ${defi} pour l'utilisateur ${username} marqué comme résolu.`);
|
|
console.log('Mise à jour effectuée sur le serveur.');
|
|
window.location.href = 'https://jeu.maison43.duckdns.org/final1_j';
|
|
} else {
|
|
console.error('Erreur lors de la mise à jour du défi.');
|
|
}
|
|
})
|
|
.catch((error) => {
|
|
console.error('Erreur réseau lors de la mise à jour du défi :', error);
|
|
});
|
|
}
|
|
|
|
app.post('/resolve-defi', (req, res) => {
|
|
const { username, defi } = req.body;
|
|
const userFile = `./data/${username}.yaml`;
|
|
const globalFile = './data/defi_j.yaml';
|
|
|
|
try {
|
|
// Charger et modifier julien.yaml
|
|
const userData = yaml.load(fs.readFileSync(userFile, 'utf8'));
|
|
userData.defis[`defi_${defi}`].resolu = 'oui';
|
|
fs.writeFileSync(userFile, yaml.dump(userData));
|
|
console.log(`Fichier ${userFile} mis à jour pour le défi ${defi}.`);
|
|
|
|
// Charger et modifier defi_j.yaml
|
|
const globalData = yaml.load(fs.readFileSync(globalFile, 'utf8'));
|
|
globalData.defis[`defi_${defi}`].resolu = 'oui';
|
|
fs.writeFileSync(globalFile, yaml.dump(globalData));
|
|
console.log(`Fichier ${globalFile} mis à jour pour le défi ${defi}.`);
|
|
|
|
res.status(200).send({ message: 'Défi résolu.' });
|
|
} catch (error) {
|
|
console.error('Erreur lors de la mise à jour des fichiers :', error);
|
|
res.status(500).send({ error: 'Erreur lors de la mise à jour.' });
|
|
}
|
|
});
|
|
|
|
app.post('/resolve-defi_b', (req, res) => {
|
|
const { username, defi } = req.body;
|
|
const userFile = `./data/${username}.yaml`;
|
|
const globalFile = './data/defi_b.yaml';
|
|
|
|
try {
|
|
// Charger et modifier baptiste.yaml
|
|
const userData = yaml.load(fs.readFileSync(userFile, 'utf8'));
|
|
userData.defis[`defi_${defi}`].resolu = 'oui';
|
|
fs.writeFileSync(userFile, yaml.dump(userData));
|
|
console.log(`Fichier ${userFile} mis à jour pour le défi ${defi}.`);
|
|
|
|
// Charger et modifier defi_j.yaml
|
|
const globalData = yaml.load(fs.readFileSync(globalFile, 'utf8'));
|
|
globalData.defis[`defi_${defi}`].resolu = 'oui';
|
|
fs.writeFileSync(globalFile, yaml.dump(globalData));
|
|
console.log(`Fichier ${globalFile} mis à jour pour le défi ${defi}.`);
|
|
|
|
res.status(200).send({ message: 'Défi résolu.' });
|
|
} catch (error) {
|
|
console.error('Erreur lors de la mise à jour des fichiers :', error);
|
|
res.status(500).send({ error: 'Erreur lors de la mise à jour.' });
|
|
}
|
|
});
|
|
|
|
|
|
// Servir les fichiers statiques
|
|
app.use(express.static(path.join(__dirname, 'public')));
|
|
|
|
// Route pour la page de lecture de QR Code
|
|
app.get('/qrcode-reader', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'public', 'qrcode_reader.html'));
|
|
});
|
|
|
|
// Route pour la page final2_b.html
|
|
app.get('/final2_b', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'final2_b.html'));
|
|
});
|
|
|
|
// Route pour la page final2_j.html
|
|
app.get('/final2_j', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'final2_j.html'));
|
|
});
|
|
|
|
// Route pour mettre à jour le fichier YAML
|
|
app.post('/update_yaml', (req, res) => {
|
|
const data = req.body;
|
|
console.log('--- Requête reçue pour mise à jour du YAML ---');
|
|
console.log('Données reçues :', JSON.stringify(data, null, 2));
|
|
|
|
try {
|
|
// Convertir les données JSON en YAML
|
|
const yamlData = yaml.dump(data);
|
|
console.log('Données converties en YAML :');
|
|
console.log(yamlData);
|
|
|
|
// Écrire dans le fichier YAML
|
|
fs.writeFileSync('data/baptiste_final.yaml', yamlData, 'utf8');
|
|
console.log('Fichier YAML mis à jour avec succès.');
|
|
res.status(200).send({ message: 'Fichier YAML mis à jour avec succès' });
|
|
} catch (error) {
|
|
console.error('Erreur lors de la mise à jour du fichier YAML:', error);
|
|
res.status(500).send({ message: 'Erreur lors de la mise à jour du fichier YAML' });
|
|
}
|
|
});
|