X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=server%2Fmodels%2FGame.js;h=ee381d4227329100712470bcb46f2b5fab3a934f;hb=1ef65040168ab7d55ce921abc9d63644a937d689;hp=641c0dcee365ca7d1d38f566cc505f2159d809ec;hpb=11589e7c4bb1b69473588d133db8b6d1d37b8fee;p=vchess.git diff --git a/server/models/Game.js b/server/models/Game.js index 641c0dce..ee381d42 100644 --- a/server/models/Game.js +++ b/server/models/Game.js @@ -18,6 +18,8 @@ const UserModel = require("./User"); * randomness: integer * deletedByWhite: boolean * deletedByBlack: boolean + * chatReadWhite: datetime + * chatReadBlack: datetime * * Structure table Moves: * gid: ref game id @@ -74,6 +76,7 @@ const GameModel = "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 " + @@ -300,10 +303,7 @@ const GameModel = // Check all that is possible (required) in obj: return ( ( - !obj.move || ( - !!(obj.move.played.toString().match(/^[0-9]+$/)) && - !!(obj.move.idx.toString().match(/^[0-9]+$/)) - ) + !obj.move || !!(obj.move.idx.toString().match(/^[0-9]+$/)) ) && ( !obj.drawOffer || !!(obj.drawOffer.match(/^[wbtn]$/)) ) && ( @@ -312,6 +312,8 @@ const GameModel = !obj.fen || !!(obj.fen.match(/^[a-zA-Z0-9, /-]*$/)) ) && ( !obj.score || !!(obj.score.match(/^[012?*\/-]+$/)) + ) && ( + !obj.chatRead || !(['w','b'].includes(obj.chatRead)) ) && ( !obj.scoreMsg || !!(obj.scoreMsg.match(/^[a-zA-Z ]+$/)) ) && ( @@ -346,6 +348,10 @@ const GameModel = const myColor = obj.deletedBy == 'w' ? "White" : "Black"; modifs += "deletedBy" + myColor + " = true,"; } + if (!!obj.chatRead) { + const myColor = obj.chatRead == 'w' ? "White" : "Black"; + modifs += "chatRead" + myColor + " = " + Date.now() + ","; + } if (!!obj.score) { modifs += "score = '" + obj.score + "'," + "scoreMsg = '" + obj.scoreMsg + "',"; @@ -383,7 +389,7 @@ const GameModel = "FROM Games " + "WHERE id = " + id; db.get(query, (err2, ret2) => { - const daysTc = parseInt(ret2.cadence.match(/\(^[0-9]+\)/)[0]); + const daysTc = parseInt(ret2.cadence.match(/^[0-9]+/)[0]); if (Date.now() - ret.lastPlayed > daysTc * 24 * 3600 * 1000) finishAndSendQuery(); else cb({ errmsg: "Time not over" }); @@ -457,7 +463,7 @@ const GameModel = "SELECT gid, count(*) AS nbMoves, MAX(played) AS lastMaj " + "FROM Moves " + "GROUP BY gid"; - db.get(query, (err2, mstats) => { + db.all(query, (err2, mstats) => { // Reorganize moves data to avoid too many array lookups: let movesGroups = {}; mstats.forEach(ms => { @@ -467,18 +473,18 @@ const GameModel = }; }); // Remove games still not really started, - // with no action in the last 3 months: + // with no action in the last 2 weeks: let toRemove = []; games.forEach(g => { if ( ( !movesGroups[g.id] && - tsNow - g.created > 91*day + tsNow - g.created > 14*day ) || ( movesGroups[g.id].nbMoves == 1 && - tsNow - movesGroups[g.id].lastMaj > 91*day + tsNow - movesGroups[g.id].lastMaj > 14*day ) ) { toRemove.push(g.id);