Ymc3013 commited on
Commit
4091ceb
·
verified ·
1 Parent(s): 8b373a2

Update serveur.js

Browse files
Files changed (1) hide show
  1. serveur.js +49 -25
serveur.js CHANGED
@@ -2,66 +2,90 @@ const { WebSocketServer } = require('ws');
2
  const fs = require('fs');
3
  const path = require('path');
4
 
5
- // Utilise le port fourni par Hugging Face (7860) ou 3000 par défaut
 
6
  const PORT = process.env.PORT || 7860;
 
 
7
  const wss = new WebSocketServer({ port: PORT, host: '0.0.0.0' });
8
 
9
- // Dossier où stocker les utilisateurs
10
  const DOSSIER_USER = path.join(__dirname, 'user');
11
 
12
- // Crée le dossier 'user' s'il n'existe pas encore
13
  if (!fs.existsSync(DOSSIER_USER)) {
14
  fs.mkdirSync(DOSSIER_USER);
15
  }
16
 
17
- console.log("=== SERVEUR DE CHAT PRIVÉ EN COURS D'EXÉCUTION ===");
18
- console.log(`En attente de connexions sur le port ${PORT} ...\n`);
19
 
20
  wss.on('connection', (ws) => {
21
- console.log("[CONNEXION] Un utilisateur a rejoint le serveur.");
22
 
23
  ws.on('message', (message) => {
24
  const texteRecu = message.toString();
25
 
26
- // 1. Tenter de lire le message comme une action d'inscription/connexion (JSON)
27
  try {
28
  const donnees = JSON.parse(texteRecu);
29
 
30
- // Si le message contient un type "enregistrement", un email et un pseudo
31
  if (donnees.type === "enregistrement" && donnees.email && donnees.pseudo) {
32
-
33
- // Préparation du contenu du fichier demandé : pseudo et email
34
  const contenuFichier = `pseudo: ${donnees.pseudo}\nemail: ${donnees.email}`;
35
 
36
- // Sécurisation du nom de fichier pour éviter les caractères interdits
37
  const nomFichier = `${donnees.email.replace(/[^a-zA-Z0-9@.]/g, "_")}.txt`;
38
  const cheminFichier = path.join(DOSSIER_USER, nomFichier);
39
 
40
- // Écriture (ou écrasement) du fichier utilisateur
41
  fs.writeFileSync(cheminFichier, contenuFichier, 'utf8');
42
- console.log(`[USER] Utilisateur enregistré dans : ${nomFichier}`);
43
 
44
- // Envoi d'une confirmation à TurboWarp
45
- ws.send(JSON.stringify({ statut: "succes", message: "Utilisateur enregistré !" }));
46
- return; // On s'arrête ici pour ce message, pas besoin de l'envoyer sur le chat
47
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  } catch (e) {
49
- // Si ce n'est pas du JSON (ou qu'il manque des données), le serveur ignore l'erreur
50
- // et passe directement à la suite (le code du chat normal)
51
  }
52
 
53
- // --- TON CODE DE CHAT CLASSIQUE ---
54
- console.log(`[MESSAGE CHAT] : ${texteRecu}`);
55
-
56
- // Renvoie le message reçu à tout le monde
57
  wss.clients.forEach((client) => {
58
- if (client.readyState === 1) {
59
  client.send(texteRecu);
60
  }
61
  });
62
  });
63
 
64
  ws.on('close', () => {
65
- console.log("[DÉCONNEXION] Un utilisateur a quitté le chat.");
66
  });
67
- });
 
 
 
 
 
 
2
  const fs = require('fs');
3
  const path = require('path');
4
 
5
+ // Les hébergeurs en ligne imposent leur propre PORT via la variable d'environnement process.env.PORT.
6
+ // Si aucune n'est fournie, il écoutera sur le port 7860.
7
  const PORT = process.env.PORT || 7860;
8
+
9
+ // En ligne, on écoute sur '0.0.0.0' pour accepter toutes les connexions entrantes (Internet)
10
  const wss = new WebSocketServer({ port: PORT, host: '0.0.0.0' });
11
 
12
+ // Dossier où stocker les utilisateurs en persistance locale
13
  const DOSSIER_USER = path.join(__dirname, 'user');
14
 
15
+ // Crée le dossier 'user' automatiquement s'il n'existe pas encore
16
  if (!fs.existsSync(DOSSIER_USER)) {
17
  fs.mkdirSync(DOSSIER_USER);
18
  }
19
 
20
+ console.log("=== SERVEUR DE CHAT PRODUCTION EN LIGNE ===");
21
+ console.log(`Serveur WebSocket actif sur le port ${PORT}...\n`);
22
 
23
  wss.on('connection', (ws) => {
24
+ console.log("[CONNEXION] Un client distant s'est connecté.");
25
 
26
  ws.on('message', (message) => {
27
  const texteRecu = message.toString();
28
 
 
29
  try {
30
  const donnees = JSON.parse(texteRecu);
31
 
32
+ // --- CAS 1 : ENREGISTREMENT EN LIGNE ---
33
  if (donnees.type === "enregistrement" && donnees.email && donnees.pseudo) {
 
 
34
  const contenuFichier = `pseudo: ${donnees.pseudo}\nemail: ${donnees.email}`;
35
 
36
+ // Sécurisation du nom de fichier
37
  const nomFichier = `${donnees.email.replace(/[^a-zA-Z0-9@.]/g, "_")}.txt`;
38
  const cheminFichier = path.join(DOSSIER_USER, nomFichier);
39
 
40
+ // On écrit le fichier sur le disque du serveur en ligne
41
  fs.writeFileSync(cheminFichier, contenuFichier, 'utf8');
42
+ console.log(`[PROD-USER] Nouvel enregistrement : user/${nomFichier}`);
43
 
44
+ ws.send(JSON.stringify({ type: "reponse_enregistrement", statut: "succes" }));
45
+ return;
 
46
  }
47
+
48
+ // --- CAS 2 : COMPARAISON / VÉRIFICATION EN LIGNE ---
49
+ if (donnees.type === "comparer" && donnees.email && donnees.pseudo) {
50
+ const nomFichier = `${donnees.email.replace(/[^a-zA-Z0-9@.]/g, "_")}.txt`;
51
+ const cheminFichier = path.join(DOSSIER_USER, nomFichier);
52
+
53
+ if (fs.existsSync(cheminFichier)) {
54
+ const contenu = fs.readFileSync(cheminFichier, 'utf8');
55
+ const contenuAttendu = `pseudo: ${donnees.pseudo}\nemail: ${donnees.email}`;
56
+
57
+ if (contentsMatch(contenu, contenuAttendu)) {
58
+ console.log(`[PROD-AUTH] Succès pour : ${donnees.email}`);
59
+ ws.send(JSON.stringify({ type: "reponse_comparer", valide: true, message: "Infos correctes" }));
60
+ } else {
61
+ console.log(`[PROD-AUTH] Échec (Pseudo invalide) pour : ${donnees.email}`);
62
+ ws.send(JSON.stringify({ type: "reponse_comparer", valide: false, message: "Pseudo incorrect" }));
63
+ }
64
+ } else {
65
+ console.log(`[PROD-AUTH] Échec (Inconnu) pour : ${donnees.email}`);
66
+ ws.send(JSON.stringify({ type: "reponse_comparer", valide: false, message: "Utilisateur inconnu" }));
67
+ }
68
+ return;
69
+ }
70
+
71
  } catch (e) {
72
+ // Pas du JSON -> Chat classique
 
73
  }
74
 
75
+ // --- CODE DE CHAT CLASSIQUE ---
 
 
 
76
  wss.clients.forEach((client) => {
77
+ if (client.readyState === 1) {
78
  client.send(texteRecu);
79
  }
80
  });
81
  });
82
 
83
  ws.on('close', () => {
84
+ console.log("[DÉCONNEXION] Un client s'est déconnecté.");
85
  });
86
+ });
87
+
88
+ // Fonction utilitaire pour nettoyer et comparer les textes sans être bloqué par des retours à la ligne cachés (\r)
89
+ function contentsMatch(str1, str2) {
90
+ return str1.replace(/\r/g, '').trim() === str2.replace(/\r/g, '').trim();
91
+ }