Files
geocaching_js/server.js
2024-12-24 00:52:14 +01:00

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' });
}
});