X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=server%2Fmodels%2FGame.js;h=5304693096bb11bfffa4cbbc64b20074fd5abe2a;hb=d807470f965d4d60a7fe6e1320ac7dfd3f0ea03f;hp=02ef2d16abc2768857c39f9fa9c1d11fa779d175;hpb=937c24ab2871b31a7e531226603fc75acab7edb8;p=vchess.git diff --git a/server/models/Game.js b/server/models/Game.js index 02ef2d16..53046930 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 = @@ -74,14 +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.score, g.scoreMsg, " + - "g.chatReadWhite, g.chatReadBlack, " + - "g.drawOffer, g.rematchOffer, 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); @@ -107,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); }); @@ -175,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) @@ -206,7 +209,7 @@ const GameModel = { g => { return { id: g.id, - vname: g.vname, + vid: g.vid, cadence: g.cadence, created: g.created, score: g.score, @@ -229,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" + @@ -268,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, @@ -310,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?*\/-]+$/)) ) && ( @@ -462,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 = @@ -479,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); + } + } + }); + } }); }); });