|
124 | 124 |
|
125 | 125 | <div class="container"> |
126 | 126 | <h1>🔐 Multi-Cipher Cracker</h1> |
127 | | - <div class="version">v2.5 <span class="new-badge">3 Workers Parallèles</span></div> |
| 127 | + <div class="version">v2.5 <span class="new-badge">3 Workers + Live Results</span></div> |
128 | 128 | <p class="subtitle"> |
129 | 129 | <span class="worker-status"> |
130 | 130 | <span class="worker-dot" id="workerDot"></span> |
@@ -624,6 +624,9 @@ <h2>⚙️ Options</h2> |
624 | 624 | updateWorkerUI(workerId, 'Terminé', finalCases, elapsed, true); |
625 | 625 | updateGlobalProgress(); |
626 | 626 |
|
| 627 | + // Afficher les résultats en LIVE dès qu'un worker termine |
| 628 | + displayLiveResults(); |
| 629 | + |
627 | 630 | if (pendingWorkers === 0) { |
628 | 631 | finishCracking(); |
629 | 632 | } |
@@ -658,24 +661,26 @@ <h2>⚙️ Options</h2> |
658 | 661 | document.getElementById('progressText').textContent = `${doneCount}/3 workers terminés — ${totalCases.toLocaleString()} cas — ${cpsStr}/s`; |
659 | 662 | } |
660 | 663 |
|
661 | | -function finishCracking() { |
662 | | - const elapsed = (Date.now() - crackStartTime) / 1000; |
663 | | - const totalCases = workerStats.vig.cases + workerStats.beau.cases + workerStats.std.cases; |
664 | | - const cps = elapsed > 0 ? Math.round(totalCases / elapsed) : 0; |
665 | | - const cpsStr = cps > 1000 ? (cps/1000).toFixed(1) + 'k' : cps; |
666 | | - |
667 | | - // Dédupliquer et trier |
668 | | - allResults.sort((a, b) => b.score - a.score); |
| 664 | +function displayLiveResults() { |
| 665 | + // Trier et dédupliquer les résultats actuels |
| 666 | + const sorted = [...allResults].sort((a, b) => b.score - a.score); |
669 | 667 | const seen = new Set(); |
670 | | - const unique = allResults.filter(r => { |
| 668 | + const unique = sorted.filter(r => { |
671 | 669 | const k = r.text.slice(0, 80); |
672 | 670 | if (seen.has(k)) return false; |
673 | 671 | seen.add(k); |
674 | 672 | return true; |
675 | 673 | }); |
676 | 674 |
|
677 | 675 | const maxResults = parseInt(document.getElementById('maxResults').value); |
678 | | - displayResults(unique.slice(0, maxResults)); |
| 676 | + displayResults(unique.slice(0, maxResults), pendingWorkers > 0); |
| 677 | +} |
| 678 | + |
| 679 | +function finishCracking() { |
| 680 | + const elapsed = (Date.now() - crackStartTime) / 1000; |
| 681 | + const totalCases = workerStats.vig.cases + workerStats.beau.cases + workerStats.std.cases; |
| 682 | + const cps = elapsed > 0 ? Math.round(totalCases / elapsed) : 0; |
| 683 | + const cpsStr = cps > 1000 ? (cps/1000).toFixed(1) + 'k' : cps; |
679 | 684 |
|
680 | 685 | setWorking(false); |
681 | 686 | document.getElementById('workerStatus').textContent = `Terminé (${totalCases.toLocaleString()} cas en ${elapsed.toFixed(1)}s — ${cpsStr}/s)`; |
@@ -930,13 +935,20 @@ <h2>⚙️ Options</h2> |
930 | 935 | } |
931 | 936 | } |
932 | 937 |
|
933 | | -function displayResults(results) { |
| 938 | +function displayResults(results, isLive = false) { |
934 | 939 | if (results.length === 0) { |
935 | | - document.getElementById('results').innerHTML = '<div class="result-box">Aucun résultat ≥ ' + document.getElementById('minScore').value + '%</div>'; |
| 940 | + document.getElementById('results').innerHTML = isLive |
| 941 | + ? '<div class="result-box" style="border-left-color: #ffd700;"><span style="color:#ffd700;">⏳ Recherche en cours...</span></div>' |
| 942 | + : '<div class="result-box">Aucun résultat ≥ ' + document.getElementById('minScore').value + '%</div>'; |
936 | 943 | return; |
937 | 944 | } |
938 | 945 |
|
939 | 946 | let html = ''; |
| 947 | + |
| 948 | + if (isLive) { |
| 949 | + html += '<div class="result-box" style="border-left-color: #ffd700; background: linear-gradient(90deg, #1a1a0a 0%, #0a0a15 100%);"><span style="color:#ffd700;">⏳ Résultats partiels — Workers en cours...</span></div>'; |
| 950 | + } |
| 951 | + |
940 | 952 | for (let i = 0; i < results.length; i++) { |
941 | 953 | const r = results[i]; |
942 | 954 | const isWinner = i === 0; |
|
0 commit comments