From cdb7709affe1991534953e357d57be54eeb140c3 Mon Sep 17 00:00:00 2001 From: Zakaria Date: Thu, 9 Apr 2026 15:09:44 -0400 Subject: [PATCH] first c --- engine.js | 94 ++++++++++++++++++++++++++++++++++++++++ evalbar.js | 42 ++++++++++++++++++ fen.js | 33 ++++++++++++++ icon.png | Bin 0 -> 13454 bytes main.js | 2 + manifest.json | 24 +++++++++++ panel.js | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 312 insertions(+) create mode 100644 engine.js create mode 100644 evalbar.js create mode 100644 fen.js create mode 100644 icon.png create mode 100644 main.js create mode 100644 manifest.json create mode 100644 panel.js diff --git a/engine.js b/engine.js new file mode 100644 index 0000000..60d6aed --- /dev/null +++ b/engine.js @@ -0,0 +1,94 @@ +var globalDepth = 15; + +var _hackEngine = null; +var _evalEngine = null; +var _movePoller = null; + +const STOCKFISH_PATH = "/bundles/app/js/vendor/jschessengine/stockfish.asm.1abfa10c.js"; +const CHAR_MAP = { a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7, h: 8 }; + +function startEngines(playerColour) { + let baseFen = getBoardFen(); + let evalSideToMove = "w"; + let activeSide = "w"; + + // --- Hack engine --- + _hackEngine = new Worker(STOCKFISH_PATH); + _hackEngine.postMessage(`position fen ${baseFen} ${playerColour}`); + _hackEngine.postMessage("go wtime 300000 btime 300000 winc 2000 binc 2000"); + _hackEngine.postMessage(`go depth ${globalDepth}`); + + _hackEngine.onmessage = function(event) { + if (!event.data.startsWith("bestmove")) return; + + const bestMove = event.data.split(" ")[1]; + const display = document.getElementById("best-move"); + if (display) display.textContent = `Best move: ${bestMove} (depth ${globalDepth})`; + + document.querySelectorAll(".cheat-highlight").forEach(el => el.remove()); + + const m = bestMove.split(""); + const from = `${CHAR_MAP[m[0]]}${m[1]}`; + const to = `${CHAR_MAP[m[2]]}${m[3]}`; + const board = document.querySelector("wc-chess-board"); + if (!board) return; + + [from, to].forEach(sq => { + const hl = document.createElement("div"); + hl.className = `highlight cheat-highlight square-${sq}`; + hl.style = "background:red;opacity:0.5"; + board.appendChild(hl); + }); + }; + + // --- Eval engine --- + _evalEngine = new Worker(STOCKFISH_PATH); + let evalGeneration = 0; + + function startEvalSearch() { + activeSide = evalSideToMove; + const gen = ++evalGeneration; + const side = activeSide; + _evalEngine.postMessage("stop"); + _evalEngine.postMessage(`position fen ${baseFen} ${evalSideToMove}`); + _evalEngine.postMessage("go depth 10"); + + let pending = null; + _evalEngine.onmessage = function(event) { + if (gen !== evalGeneration) return; // discard stale results from old search + if (event.data.startsWith("info")) { + const scoreCP = event.data.match(/score cp (-?\d+)/); + const scoreMate = event.data.match(/score mate (-?\d+)/); + if (scoreMate) pending = { val: parseInt(scoreMate[1]), isMate: true }; + else if (scoreCP) pending = { val: parseInt(scoreCP[1]), isMate: false }; + } else if (event.data.startsWith("bestmove") && pending) { + // Only update the bar once the search is fully done — avoids wild swings + // from shallow-depth lines (e.g. seeing a capture but not the recapture) + updateEvalBar(pending.val, pending.isMate, side); + pending = null; + } + }; + } + startEvalSearch(); + + // --- Move poller --- + _movePoller = setInterval(() => { + const newFen = getBoardFen(); + if (newFen === baseFen) return; + baseFen = newFen; + + evalSideToMove = evalSideToMove === "w" ? "b" : "w"; + startEvalSearch(); + + _hackEngine.postMessage(`position fen ${baseFen} ${playerColour}`); + _hackEngine.postMessage("go wtime 300000 btime 300000 winc 2000 binc 2000"); + _hackEngine.postMessage(`go depth ${globalDepth}`); + }, 500); +} + +function stopEngines() { + if (_movePoller) { clearInterval(_movePoller); _movePoller = null; } + if (_evalEngine) { _evalEngine.terminate(); _evalEngine = null; } + if (_hackEngine) { _hackEngine.terminate(); _hackEngine = null; } + document.querySelectorAll(".cheat-highlight").forEach(el => el.remove()); +} diff --git a/evalbar.js b/evalbar.js new file mode 100644 index 0000000..758e608 --- /dev/null +++ b/evalbar.js @@ -0,0 +1,42 @@ +var evalLabel = document.createElement("span"); +evalLabel.style = `font-size:12px;font-weight:bold;color:#94a3b8;min-width:38px;text-align:right;font-family:monospace;`; +evalLabel.textContent = "0.0"; + +var evalTrack = document.createElement("div"); +evalTrack.style = `flex:1;height:6px;border-radius:4px;background:#0f172a;overflow:hidden;`; + +var evalFill = document.createElement("div"); +evalFill.style = `height:100%;width:50%;background:#e2e8f0;transition:width 0.4s ease;border-radius:4px;`; +evalTrack.appendChild(evalFill); + +var evalPercent = document.createElement("span"); +evalPercent.style = `font-size:11px;color:#64748b;min-width:34px;font-family:monospace;`; +evalPercent.textContent = "50%"; + +function cpToWinPercent(cp) { + return 50 + 50 * (2 / (1 + Math.exp(-0.00368208 * cp)) - 1); +} + +function updateEvalBar(cp, isMate, sideToMove) { + let whiteCP = sideToMove === "w" ? cp : -cp; + let whitePercent, labelText; + + if (isMate) { + if (cp === 0) { + // Position IS checkmate — the side to move has already been mated + whitePercent = sideToMove === "b" ? 98 : 2; + labelText = sideToMove === "b" ? "M0" : "-M0"; + } else { + whitePercent = whiteCP > 0 ? 98 : 2; + labelText = whiteCP > 0 ? `M${Math.abs(cp)}` : `-M${Math.abs(cp)}`; + } + } else { + whitePercent = cpToWinPercent(whiteCP); + let v = (whiteCP / 100).toFixed(1); + labelText = whiteCP >= 0 ? `+${v}` : `${v}`; + } + + evalFill.style.width = `${whitePercent}%`; + evalLabel.textContent = labelText; + evalPercent.textContent = `${Math.round(whitePercent)}%`; +} diff --git a/fen.js b/fen.js new file mode 100644 index 0000000..e3c81fc --- /dev/null +++ b/fen.js @@ -0,0 +1,33 @@ +function getBoardFen() { + let fen = ""; + for (let i = 8; i >= 1; i--) { + for (let j = 1; j <= 8; j++) { + if (j === 1 && i !== 8) fen += "/"; + + let classes = document.querySelectorAll(`.piece.square-${j}${i}`)[0]?.classList ?? null; + let piece = null; + if (classes) { + for (let cls of classes.values()) { + if (cls.length === 2) piece = cls; + } + } + + if (piece === null) { + let last = fen.slice(-1); + fen = (!isNaN(Number(last)) && last !== "") + ? fen.slice(0, -1) + (Number(last) + 1) + : fen + "1"; + } else if (piece[0] === "b") { + fen += piece[1]; + } else { + fen += piece[1].toUpperCase(); + } + } + } + return fen; +} + +function getPlayerColour() { + const board = document.querySelector("wc-chess-board"); + return board?.classList.contains("flipped") ? "b" : "w"; +} diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..68a38635d29bef8205fbc7d685be52ffc7e31047 GIT binary patch literal 13454 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 literal 0 HcmV?d00001 diff --git a/main.js b/main.js new file mode 100644 index 0000000..b31818e --- /dev/null +++ b/main.js @@ -0,0 +1,2 @@ +const mainBody = document.querySelector(".board-layout-main"); +if (mainBody) mainBody.prepend(panel); diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..e58558e --- /dev/null +++ b/manifest.json @@ -0,0 +1,24 @@ +{ + "manifest_version": 2, + "name": "Chesscheat", + "version": "1.3", + "icons": { + "16": "icon.png", + "48": "icon.png", + "128": "icon.png" + }, + "browser_specific_settings": { + "gecko": { + "id": "chesscheatextension@gmail.com", + "strict_min_version": "57.0" + } + }, + "description": "Always see the optimal move in any chess.com game. Guarantees wins almost 100% of the time", + "content_scripts": [ + { + "js": ["fen.js", "evalbar.js", "engine.js", "panel.js", "main.js"], + "matches": [ + ] + } + ] +} diff --git a/panel.js b/panel.js new file mode 100644 index 0000000..2ffc339 --- /dev/null +++ b/panel.js @@ -0,0 +1,117 @@ +var hackRunning = false; + +// --- Panel container --- +var panel = document.createElement("div"); +panel.style = ` + background: #1e293b; + border: 1px solid #334155; + border-radius: 8px; + padding: 6px 10px; + margin: 4px 0; + font-family: 'Segoe UI', sans-serif; + display: flex; + flex-direction: column; + gap: 5px; + box-shadow: 0 2px 8px rgba(0,0,0,0.4); +`; + +// Row 1: title + depth slider + value + button +var controlRow = document.createElement("div"); +controlRow.style = `display:flex;align-items:center;gap:8px;`; + +var panelTitle = document.createElement("span"); +panelTitle.textContent = "Chess Assist"; +panelTitle.style = `font-size:11px;font-weight:600;color:#64748b;white-space:nowrap;`; + +var depthSlider = document.createElement("input"); +depthSlider.type = "range"; +depthSlider.min = "5"; depthSlider.max = "30"; depthSlider.value = globalDepth; +depthSlider.style = `flex:1;accent-color:#3b82f6;cursor:pointer;height:4px;`; + +var depthValue = document.createElement("span"); +depthValue.textContent = globalDepth; +depthValue.style = `font-size:11px;color:#64748b;min-width:16px;font-family:monospace;`; + +depthSlider.addEventListener("input", function() { + globalDepth = parseInt(this.value); + depthValue.textContent = this.value; +}); + +var actionBtn = document.createElement("button"); +actionBtn.id = "hack_button"; +actionBtn.textContent = "Start"; +actionBtn.style = ` + padding: 4px 12px; + border: none; + border-radius: 5px; + font-size: 11px; + font-weight: 600; + cursor: pointer; + background: #22c55e; + color: #fff; + white-space: nowrap; + transition: opacity 0.2s; +`; +actionBtn.onmouseenter = () => { if (!actionBtn.disabled) actionBtn.style.opacity = "0.8"; }; +actionBtn.onmouseleave = () => { actionBtn.style.opacity = "1"; }; + +controlRow.appendChild(panelTitle); +controlRow.appendChild(depthSlider); +controlRow.appendChild(depthValue); +controlRow.appendChild(actionBtn); +panel.appendChild(controlRow); + +// Row 2: best move + eval bar (hidden until running) +var infoRow = document.createElement("div"); +infoRow.style = `display:none;align-items:center;gap:8px;`; + +var bestMoveDisplay = document.createElement("span"); +bestMoveDisplay.id = "best-move"; +bestMoveDisplay.style = `font-size:11px;color:#94a3b8;font-family:monospace;white-space:nowrap;`; +bestMoveDisplay.textContent = "Calculating..."; + +infoRow.appendChild(bestMoveDisplay); +infoRow.appendChild(evalLabel); +infoRow.appendChild(evalTrack); +infoRow.appendChild(evalPercent); +panel.appendChild(infoRow); + +// --- State machine --- +function setIdleState() { + hackRunning = false; + actionBtn.textContent = "Start"; + actionBtn.style.background = "#22c55e"; + actionBtn.disabled = false; + infoRow.style.display = "none"; + depthSlider.disabled = false; + depthSlider.style.opacity = "1"; +} + +function setRunningState() { + actionBtn.textContent = "Stop"; + actionBtn.style.background = "#ef4444"; + actionBtn.disabled = false; + infoRow.style.display = "flex"; + depthSlider.disabled = true; + depthSlider.style.opacity = "0.4"; +} + +function startHack() { + if (hackRunning) return; + hackRunning = true; + actionBtn.textContent = "..."; + actionBtn.style.background = "#475569"; + actionBtn.disabled = true; + startEngines(getPlayerColour()); + setRunningState(); +} + +function stopHack() { + stopEngines(); + setIdleState(); +} + +actionBtn.onclick = () => { + if (!hackRunning) startHack(); + else stopHack(); +};