File size: 4,049 Bytes
8b373a2
 
 
 
4091ceb
 
8b373a2
4091ceb
 
8b373a2
 
4091ceb
8b373a2
 
4091ceb
8b373a2
 
 
 
4091ceb
 
8b373a2
 
4091ceb
8b373a2
 
 
 
 
 
 
4091ceb
8b373a2
 
 
4091ceb
8b373a2
 
 
4091ceb
8b373a2
4091ceb
8b373a2
4091ceb
 
82e44ae
4091ceb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8b373a2
4091ceb
8b373a2
97abfa4
4091ceb
8b373a2
4091ceb
8b373a2
97abfa4
8b373a2
 
82e44ae
8b373a2
4091ceb
8b373a2
4091ceb
 
 
 
 
 
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
const { WebSocketServer } = require('ws');
const fs = require('fs');
const path = require('path');

// Les hébergeurs en ligne imposent leur propre PORT via la variable d'environnement process.env.PORT.
// Si aucune n'est fournie, il écoutera sur le port 7860.
const PORT = process.env.PORT || 7860; 

// En ligne, on écoute sur '0.0.0.0' pour accepter toutes les connexions entrantes (Internet)
const wss = new WebSocketServer({ port: PORT, host: '0.0.0.0' });

// Dossier où stocker les utilisateurs en persistance locale
const DOSSIER_USER = path.join(__dirname, 'user');

// Crée le dossier 'user' automatiquement s'il n'existe pas encore
if (!fs.existsSync(DOSSIER_USER)) {
    fs.mkdirSync(DOSSIER_USER);
}

console.log("=== SERVEUR DE CHAT PRODUCTION EN LIGNE ===");
console.log(`Serveur WebSocket actif sur le port ${PORT}...\n`);

wss.on('connection', (ws) => {
    console.log("[CONNEXION] Un client distant s'est connecté.");

    ws.on('message', (message) => {
        const texteRecu = message.toString();

        try {
            const donnees = JSON.parse(texteRecu);

            // --- CAS 1 : ENREGISTREMENT EN LIGNE ---
            if (donnees.type === "enregistrement" && donnees.email && donnees.pseudo) {
                const contenuFichier = `pseudo: ${donnees.pseudo}\nemail: ${donnees.email}`;
                
                // Sécurisation du nom de fichier
                const nomFichier = `${donnees.email.replace(/[^a-zA-Z0-9@.]/g, "_")}.txt`;
                const cheminFichier = path.join(DOSSIER_USER, nomFichier);

                // On écrit le fichier sur le disque du serveur en ligne
                fs.writeFileSync(cheminFichier, contenuFichier, 'utf8');
                console.log(`[PROD-USER] Nouvel enregistrement : user/${nomFichier}`);
                
                ws.send(JSON.stringify({ type: "reponse_enregistrement", statut: "succes" }));
                return; 
            }

            // --- CAS 2 : COMPARAISON / VÉRIFICATION EN LIGNE ---
            if (donnees.type === "comparer" && donnees.email && donnees.pseudo) {
                const nomFichier = `${donnees.email.replace(/[^a-zA-Z0-9@.]/g, "_")}.txt`;
                const cheminFichier = path.join(DOSSIER_USER, nomFichier);

                if (fs.existsSync(cheminFichier)) {
                    const contenu = fs.readFileSync(cheminFichier, 'utf8');
                    const contenuAttendu = `pseudo: ${donnees.pseudo}\nemail: ${donnees.email}`;

                    if (contentsMatch(contenu, contenuAttendu)) {
                        console.log(`[PROD-AUTH] Succès pour : ${donnees.email}`);
                        ws.send(JSON.stringify({ type: "reponse_comparer", valide: true, message: "Infos correctes" }));
                    } else {
                        console.log(`[PROD-AUTH] Échec (Pseudo invalide) pour : ${donnees.email}`);
                        ws.send(JSON.stringify({ type: "reponse_comparer", valide: false, message: "Pseudo incorrect" }));
                    }
                } else {
                    console.log(`[PROD-AUTH] Échec (Inconnu) pour : ${donnees.email}`);
                    ws.send(JSON.stringify({ type: "reponse_comparer", valide: false, message: "Utilisateur inconnu" }));
                }
                return; 
            }

        } catch (e) {
            // Pas du JSON -> Chat classique
        }

        // --- CODE DE CHAT CLASSIQUE ---
        wss.clients.forEach((client) => {
            if (client.readyState === 1) { 
                client.send(texteRecu);
            }
        });
    });

    ws.on('close', () => {
        console.log("[DÉCONNEXION] Un client s'est déconnecté.");
    });
});

// Fonction utilitaire pour nettoyer et comparer les textes sans être bloqué par des retours à la ligne cachés (\r)
function contentsMatch(str1, str2) {
    return str1.replace(/\r/g, '').trim() === str2.replace(/\r/g, '').trim();
}