X-Git-Url: https://git.auder.net/?p=vchess.git;a=blobdiff_plain;f=client%2Fsrc%2Futils%2FgameStorage.js;h=05aaef7404fc4bb90e6ba72c0552804efb01802a;hp=3bd993470576a3186a2c0bc86770400a13d26572;hb=4f298adbee00942323fc7ec517117552aeb5a08a;hpb=42c15a75118bfeb3251cea1f65acb01fcd023f01 diff --git a/client/src/utils/gameStorage.js b/client/src/utils/gameStorage.js index 3bd99347..05aaef74 100644 --- a/client/src/utils/gameStorage.js +++ b/client/src/utils/gameStorage.js @@ -1,6 +1,6 @@ // Game object: { // // Static informations: -// gameId: string +// id: string // vname: string, // fenStart: string, // players: array of sid+id+name, @@ -16,13 +16,16 @@ // score: string (several options; '*' == running), // } +import { ajax } from "@/utils/ajax"; +import { store } from "@/store"; + function dbOperation(callback) { let db = null; let DBOpenRequest = window.indexedDB.open("vchess", 4); DBOpenRequest.onerror = function(event) { - alert("Database error: " + event.target.errorCode); + alert(store.state.tr["Database error:"] + " " + event.target.errorCode); }; DBOpenRequest.onsuccess = function(event) { @@ -34,10 +37,10 @@ function dbOperation(callback) DBOpenRequest.onupgradeneeded = function(event) { let db = event.target.result; db.onerror = function(event) { - alert("Error while loading database: " + event.target.errorCode); + alert(store.state.tr["Error while loading database:"] + " " + event.target.errorCode); }; // Create objectStore for vchess->games - let objectStore = db.createObjectStore("games", { keyPath: "gameId" }); + let objectStore = db.createObjectStore("games", { keyPath: "id" }); objectStore.createIndex("score", "score"); //to search by game result } } @@ -55,7 +58,7 @@ export const GameStorage = callback({}); //everything's fine } transaction.onerror = function() { - callback({errmsg: "addGame failed: " + transaction.error}); + callback({errmsg: store.state.tr["Game retrieval failed:"] + " " + transaction.error}); }; } let objectStore = transaction.objectStore("games"); @@ -64,56 +67,93 @@ export const GameStorage = }, // TODO: also option to takeback a move ? - // NOTE: for live games only (all on server for corr) - update: function(gameId, obj) //colorIdx, nextIdx, move, fen, addTime, score + // obj: chat, move, fen, clocks, score[Msg], initime, ... + update: function(gameId, obj) + { + if (Number.isInteger(gameId) || !isNaN(parseInt(gameId))) + { + // corr: only move, fen and score + ajax( + "/games", + "PUT", + { + gid: gameId, + newObj: + { + // Some fields may be undefined: + chat: obj.chat, + move: obj.move, + fen: obj.fen, + score: obj.score, + scoreMsg: obj.scoreMsg, + drawOffer: obj.drawOffer, + } + } + ); + } + else + { + // live + dbOperation((db) => { + let objectStore = db.transaction("games", "readwrite").objectStore("games"); + objectStore.get(gameId).onsuccess = function(event) { + const game = event.target.result; + Object.keys(obj).forEach(k => { + if (k == "move") + game.moves.push(obj[k]); + else + game[k] = obj[k]; + }); + objectStore.put(game); //save updated data + } + }); + } + }, + + // Retrieve all local games (running, completed, imported...) + getAll: function(callback) { dbOperation((db) => { - let objectStore = db.transaction("games", "readwrite").objectStore("games"); - objectStore.get(gameId).onsuccess = function(event) { - const game = event.target.result; - if (!!obj.move) + let objectStore = db.transaction('games').objectStore('games'); + let games = []; + objectStore.openCursor().onsuccess = function(event) { + let cursor = event.target.result; + // if there is still another cursor to go, keep running this code + if (cursor) { - game.moves.push(obj.move); - game.fen = obj.fen; - if (!!obj.addTime) //NaN if first move in game - game.clocks[obj.colorIdx] += obj.addTime; - game.initime[obj.nextIdx] = Date.now(); + games.push(cursor.value); + cursor.continue(); } - if (!!obj.score) - game.score = obj.score; - objectStore.put(game); //save updated data + else + callback(games); } }); }, - // Retrieve any live game from its identifiers (locally, running or not) + // Retrieve any game from its identifiers (locally or on server) // NOTE: need callback because result is obtained asynchronously get: function(gameId, callback) { - dbOperation((db) => { - let objectStore = db.transaction('games').objectStore('games'); - if (!gameId) //retrieve all - { - let games = []; - objectStore.openCursor().onsuccess = function(event) { - let cursor = event.target.result; - // if there is still another cursor to go, keep running this code - if (cursor) - { - games.push(cursor.value); - cursor.continue(); - } - else - callback(games); - } - } - else //just one game - { + // corr games identifiers are integers + if (Number.isInteger(gameId) || !isNaN(parseInt(gameId))) + { + ajax("/games", "GET", {gid:gameId}, res => { + let game = res.game; + game.moves.forEach(m => { + m.squares = JSON.parse(m.squares); + }); + callback(game); + }); + } + else //local game + { + dbOperation((db) => { + let objectStore = db.transaction('games').objectStore('games'); objectStore.get(gameId).onsuccess = function(event) { callback(event.target.result); } - } - }); + }); + } }, getCurrent: function(callback) @@ -137,7 +177,7 @@ export const GameStorage = callback({}); //everything's fine } transaction.onerror = function() { - callback({errmsg: "removeGame failed: " + transaction.error}); + callback({errmsg: store.state.tr["Game removal failed:"] + " " + transaction.error}); }; } transaction.objectStore("games").delete(gameId);