From 1ef65040168ab7d55ce921abc9d63644a937d689 Mon Sep 17 00:00:00 2001 From: Benjamin Auder Date: Mon, 30 Mar 2020 21:05:46 +0200 Subject: [PATCH] Experimental game upload added --- client/src/components/BaseGame.vue | 36 ++++--- client/src/components/Board.vue | 16 ++-- client/src/components/MoveList.vue | 6 +- client/src/components/UploadGame.vue | 90 +++++++++++++++++- client/src/main.js | 5 +- client/src/translations/en.js | 3 +- client/src/translations/es.js | 3 +- client/src/translations/fr.js | 3 +- client/src/utils/gameStorage.js | 1 + client/src/utils/importgameStorage.js | 2 +- client/src/utils/modalClick.js | 5 +- client/src/views/Game.vue | 130 +++++++++++++++----------- client/src/views/MyGames.vue | 27 ++++-- server/db/create.sql | 2 + server/models/Game.js | 9 ++ 15 files changed, 238 insertions(+), 100 deletions(-) diff --git a/client/src/components/BaseGame.vue b/client/src/components/BaseGame.vue index c3387e82..fd26d872 100644 --- a/client/src/components/BaseGame.vue +++ b/client/src/components/BaseGame.vue @@ -111,7 +111,7 @@ export default { : "" ); }, - // TODO: is it OK to pass "computed" as propoerties? + // TODO: is it OK to pass "computed" as properties? // Also, some are seemingly not recomputed when vr is initialized. showMoves: function() { return this.game.score != "*" @@ -211,6 +211,7 @@ export default { // Strategy working also for multi-moves: if (!Array.isArray(move)) move = [move]; move.forEach((m,idx) => { + m.index = this.vr.movesCount; m.notation = this.vr.getNotation(m); m.unambiguous = V.GetUnambiguousNotation(m); this.vr.play(m); @@ -221,6 +222,7 @@ export default { if (firstMoveColor == "b") { // 'start' & 'end' is required for Board component this.moves.unshift({ + index: parsedFen.movesCount, notation: "...", unambiguous: "...", start: { x: -1, y: -1 }, @@ -271,30 +273,36 @@ export default { let pgn = ""; pgn += '[Site "vchess.club"]\n'; pgn += '[Variant "' + this.game.vname + '"]\n'; - pgn += '[Date "' + getDate(new Date()) + '"]\n'; + const gdt = getDate(new Date(this.game.created || Date.now())); + pgn += '[Date "' + gdt + '"]\n'; pgn += '[White "' + this.game.players[0].name + '"]\n'; pgn += '[Black "' + this.game.players[1].name + '"]\n'; pgn += '[Fen "' + this.game.fenStart + '"]\n'; pgn += '[Result "' + this.game.score + '"]\n'; - if (!!this.game.id) - pgn += '[URL "' + params.serverUrl + '/game/' + this.game.id + '"]\n'; + if (!!this.game.id) { + pgn += '[Cadence "' + this.game.cadence + '"]\n'; + pgn += '[Url "' + params.serverUrl + '/game/' + this.game.id + '"]\n'; + } pgn += '\n'; for (let i = 0; i < this.moves.length; i += 2) { if (i > 0) pgn += " "; // Adjust dots notation for a better display: let fullNotation = getFullNotation(this.moves[i]); if (fullNotation == "...") fullNotation = ".."; - pgn += (i/2+1) + "." + fullNotation; + pgn += (this.moves[i].index / 2 + 1) + "." + fullNotation; if (i+1 < this.moves.length) pgn += " " + getFullNotation(this.moves[i+1]); } pgn += "\n\n"; for (let i = 0; i < this.moves.length; i += 2) { - const moveNumber = i / 2 + 1; - pgn += moveNumber + "." + i + " " + - getFullNotation(this.moves[i], "unambiguous") + "\n"; + const moveNumber = this.moves[i].index / 2 + 1; + // Skip "dots move", useless for machine reading: + if (this.moves[i].notation != "...") { + pgn += moveNumber + ".w " + + getFullNotation(this.moves[i], "unambiguous") + "\n"; + } if (i+1 < this.moves.length) { - pgn += moveNumber + "." + (i+1) + " " + + pgn += moveNumber + ".b " + getFullNotation(this.moves[i+1], "unambiguous") + "\n"; } } @@ -323,8 +331,14 @@ export default { this.autoplayLoop = null; } else { this.autoplay = true; - infinitePlay(); - this.autoplayLoop = setInterval(infinitePlay, 1500); + setTimeout( + () => { + infinitePlay(); + this.autoplayLoop = setInterval(infinitePlay, 1500); + }, + // Small delay otherwise the first move is played too fast + 500 + ); } }, // Animate an elementary move diff --git a/client/src/components/Board.vue b/client/src/components/Board.vue index 639938b2..56f34880 100644 --- a/client/src/components/Board.vue +++ b/client/src/components/Board.vue @@ -519,12 +519,11 @@ export default { }; }, mousedown: function(e) { - if (!([1, 3].includes(e.which))) return; e.preventDefault(); - if (e.which != 3) + if (!this.mobileBrowser && e.which != 3) // Cancel current drawing and circles, if any this.cancelResetArrows(); - if (e.which == 1 || this.mobileBrowser) { + if (this.mobileBrowser || e.which == 1) { // Mouse left button if (!this.start) { // NOTE: classList[0] is enough: 'piece' is the first assigned class @@ -566,8 +565,8 @@ export default { } else { this.processMoveAttempt(e); } - } else { - // e.which == 3 : mouse right button + } else if (e.which == 3) { + // Mouse right button let elem = e.target; // Next loop because of potential marks while (elem.tagName == "IMG") elem = elem.parentNode; @@ -612,17 +611,16 @@ export default { } }, mouseup: function(e) { - if (!([1, 3].includes(e.which))) return; e.preventDefault(); - if (e.which == 1) { + if (this.mobileBrowser || e.which == 1) { if (!this.selectedPiece) return; // Drag'n drop. Selected piece is no longer needed: this.selectedPiece.parentNode.removeChild(this.selectedPiece); delete this.selectedPiece; this.selectedPiece = null; this.processMoveAttempt(e); - } else { - // Mouse right button (e.which == 3) + } else if (e.which == 3) { + // Mouse right button this.movingArrow = { x: -1, y: -1 }; this.processArrowAttempt(e); } diff --git a/client/src/components/MoveList.vue b/client/src/components/MoveList.vue index d2ae3f35..4c351dd5 100644 --- a/client/src/components/MoveList.vue +++ b/client/src/components/MoveList.vue @@ -101,10 +101,8 @@ export default { window.addEventListener("resize", () => { if (!timeoutLaunched) { timeoutLaunched = true; - setTimeout(() => { - this.adjustBoard(); - timeoutLaunched = false; - }, 500); + this.adjustBoard(); + setTimeout(() => { timeoutLaunched = false; }, 500); } }); }, diff --git a/client/src/components/UploadGame.vue b/client/src/components/UploadGame.vue index 369333c1..a94c39b7 100644 --- a/client/src/components/UploadGame.vue +++ b/client/src/components/UploadGame.vue @@ -9,6 +9,7 @@ div