X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=server%2Fmodels%2FGame.js;h=76a91dc9d76e84629213052345324d90aa86fc7e;hb=70614f553ed321d53280d89a077c8c34aad46f12;hp=02ef2d16abc2768857c39f9fa9c1d11fa779d175;hpb=937c24ab2871b31a7e531226603fc75acab7edb8;p=vchess.git diff --git a/server/models/Game.js b/server/models/Game.js index 02ef2d16..76a91dc9 100644 --- a/server/models/Game.js +++ b/server/models/Game.js @@ -47,6 +47,16 @@ const GameModel = { ); }, + incrementCounter: function(vid, cb) { + db.serialize(function() { + let query = + "UPDATE GameStat " + + "SET total = total + 1 " + + "WHERE vid = " + vid; + db.run(query, cb); + }); + }, + create: function(vid, fen, randomness, cadence, players, cb) { db.serialize(function() { let query = @@ -75,9 +85,10 @@ const GameModel = { let query = "SELECT " + "g.id, g.fen, g.fenStart, g.cadence, g.created, " + - "g.white, g.black, g.score, g.scoreMsg, " + - "g.chatReadWhite, g.chatReadBlack, " + - "g.drawOffer, g.rematchOffer, v.name AS vname " + + "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 " + @@ -462,7 +473,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 = @@ -479,25 +490,50 @@ 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 ( + !!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); + } + } + }); + } }); }); });