X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=server%2Fmodels%2FGame.js;h=7c3c8081bae3f21d4252c3f647f7392870c9e8c5;hb=eaa5ad3e93b761fefb16b32071be0b439761f843;hp=e6c26168749d2726605715d0617a3f7ffc13435a;hpb=9f9e9a0588d4b28a1825a56ae53553d89bf0c65f;p=vchess.git diff --git a/server/models/Game.js b/server/models/Game.js index e6c26168..7c3c8081 100644 --- a/server/models/Game.js +++ b/server/models/Game.js @@ -84,15 +84,11 @@ const GameModel = { db.serialize(function() { let query = "SELECT " + - "g.id, g.fen, g.fenStart, g.cadence, g.created, " + - "g.white, g.black, g.randomness, g.score, g.scoreMsg, " + - "g.chatReadWhite, g.chatReadBlack, g.drawOffer, " + - // TODO: vid and vname are redundant - "g.rematchOffer, v.id as vid, v.name AS vname " + - "FROM Games g " + - "JOIN Variants v " + - " ON g.vid = v.id " + - "WHERE g.id = " + id; + "id, vid, fen, fenStart, cadence, created, " + + "white, black, randomness, score, scoreMsg, " + + "chatReadWhite, chatReadBlack, drawOffer, rematchOffer " + + "FROM Games " + + "WHERE id = " + id; db.get(query, (err, gameInfo) => { if (!gameInfo) { cb(err || { errmsg: "Game not found" }, undefined); @@ -118,13 +114,12 @@ const GameModel = { "WHERE gid = " + id; db.all(query, (err4, chats) => { const game = Object.assign( - {}, - gameInfo, { players: players, moves: moves, chats: chats - } + }, + gameInfo ); cb(null, game); }); @@ -186,11 +181,8 @@ const GameModel = { getRunning: function(uid, cb) { db.serialize(function() { let query = - "SELECT g.id, g.cadence, g.created, " + - "g.white, g.black, v.name AS vname " + - "FROM Games g " + - "JOIN Variants v " + - " ON g.vid = v.id " + + "SELECT id, vid, cadence, created, white, black " + + "FROM Games " + "WHERE score = '*' AND (white = " + uid + " OR black = " + uid + ")"; db.all(query, (err, games) => { // Get movesCount (could be done in // with next query) @@ -240,12 +232,9 @@ const GameModel = { getCompleted: function(uid, cursor, cb) { db.serialize(function() { let query = - "SELECT g.id, g.cadence, g.created, g.score, g.scoreMsg, " + - "g.white, g.black, g.deletedByWhite, g.deletedByBlack, " + - "v.name AS vname " + - "FROM Games g " + - "JOIN Variants v " + - " ON g.vid = v.id " + + "SELECT id, vid, cadence, created, score, scoreMsg, " + + "white, black, deletedByWhite, deletedByBlack " + + "FROM Games " + "WHERE " + " score <> '*' AND" + " created < " + cursor + " AND" + @@ -279,7 +268,7 @@ const GameModel = { g => { return { id: g.id, - vname: g.vname, + vid: g.vid, cadence: g.cadence, created: g.created, score: g.score, @@ -321,8 +310,7 @@ const GameModel = { ) && ( !obj.rematchOffer || !!(obj.rematchOffer.match(/^[wbn]$/)) ) && ( - // TODO: check if commas are still used (probably not) - !obj.fen || !!(obj.fen.match(/^[a-zA-Z0-9,. /-]*$/)) + !obj.fen || !!(obj.fen.match(/^[a-zA-Z0-9,.:{}\[\]" /-]*$/)) ) && ( !obj.score || !!(obj.score.match(/^[012?*\/-]+$/)) ) && ( @@ -473,7 +461,7 @@ const GameModel = { const day = 86400000; db.serialize(function() { let query = - "SELECT id, created " + + "SELECT id, created, cadence, score " + "FROM Games"; db.all(query, (err, games) => { query = @@ -490,25 +478,51 @@ const GameModel = { }; }); // Remove games still not really started, - // with no action in the last 2 weeks: + // with no action in the last 2 weeks, or result != '*': let toRemove = []; + let lostOnTime = [ [], [] ]; games.forEach(g => { if ( ( !movesGroups[g.id] && - tsNow - g.created > 14*day + (g.score != '*' || tsNow - g.created > 14*day) ) || ( !!movesGroups[g.id] && movesGroups[g.id].nbMoves == 1 && - tsNow - movesGroups[g.id].lastMaj > 14*day + (g.score != '*' || tsNow - movesGroups[g.id].lastMaj > 14*day) ) ) { toRemove.push(g.id); } + // Set score if lost on time and >= 2 moves: + else if ( + g.score == '*' && + !!movesGroups[g.id] && + movesGroups[g.id].nbMoves >= 2 && + tsNow - movesGroups[g.id].lastMaj > + // cadence in days * nb seconds per day: + parseInt(g.cadence.slice(0, -1), 10) * day + ) { + lostOnTime[movesGroups[g.id].nbMoves % 2].push(g.id); + } }); if (toRemove.length > 0) GameModel.remove(toRemove); + if (lostOnTime.some(l => l.length > 0)) { + db.parallelize(function() { + for (let i of [0, 1]) { + if (lostOnTime[i].length > 0) { + const score = (i == 0 ? "0-1" : "1-0"); + const query = + "UPDATE Games " + + "SET score = '" + score + "', scoreMsg = 'Time' " + + "WHERE id IN (" + lostOnTime[i].join(',') + ")"; + db.run(query); + } + } + }); + } }); }); });