X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=server%2Fmodels%2FGame.js;h=76a91dc9d76e84629213052345324d90aa86fc7e;hb=7ec05c0ef6b1a329831d74148652115f9147e3b3;hp=ee381d4227329100712470bcb46f2b5fab3a934f;hpb=1ef65040168ab7d55ce921abc9d63644a937d689;p=vchess.git diff --git a/server/models/Game.js b/server/models/Game.js index ee381d42..76a91dc9 100644 --- a/server/models/Game.js +++ b/server/models/Game.js @@ -34,8 +34,8 @@ const UserModel = require("./User"); * added: datetime */ -const GameModel = -{ +const GameModel = { + checkGameInfo: function(g) { return ( g.vid.toString().match(/^[0-9]+$/) && @@ -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 " + @@ -128,12 +139,13 @@ const GameModel = db.serialize(function() { let query = "SELECT id, vid, cadence, created, score, white, black " + - "FROM Games "; - if (uid > 0) query += - "WHERE " + - " created < " + cursor + " AND " + - " white <> " + uid + " AND " + - " black <> " + uid + " "; + "FROM Games " + + "WHERE created < " + cursor + " "; + if (uid > 0) { + query += + " AND white <> " + uid + " " + + " AND black <> " + uid + " "; + } query += "ORDER BY created DESC " + "LIMIT 20"; //TODO: 20 hard-coded... @@ -309,11 +321,12 @@ const GameModel = ) && ( !obj.rematchOffer || !!(obj.rematchOffer.match(/^[wbn]$/)) ) && ( - !obj.fen || !!(obj.fen.match(/^[a-zA-Z0-9, /-]*$/)) + // TODO: check if commas are still used (probably not) + !obj.fen || !!(obj.fen.match(/^[a-zA-Z0-9,. /-]*$/)) ) && ( !obj.score || !!(obj.score.match(/^[012?*\/-]+$/)) ) && ( - !obj.chatRead || !(['w','b'].includes(obj.chatRead)) + !obj.chatRead || ['w','b'].includes(obj.chatRead) ) && ( !obj.scoreMsg || !!(obj.scoreMsg.match(/^[a-zA-Z ]+$/)) ) && ( @@ -379,8 +392,10 @@ const GameModel = "(" + id + ",?," + Date.now() + "," + obj.move.idx + ")"; db.run(query, JSON.stringify(obj.move.squares)); finishAndSendQuery(); - } else cb({ errmsg: "Wrong move index" }); - } else { + } + else cb({ errmsg: "Wrong move index" }); + } + else { if (ret.maxIdx < 2) cb({ errmsg: "Time not over" }); else { // We also need the game cadence @@ -397,14 +412,16 @@ const GameModel = } } }); - } else finishAndSendQuery(); + } + else finishAndSendQuery(); // NOTE: chat and delchat are mutually exclusive if (!!obj.chat) { const query = "INSERT INTO Chats (gid, msg, name, added) VALUES (" + id + ",?,'" + obj.chat.name + "'," + Date.now() + ")"; db.run(query, obj.chat.msg); - } else if (obj.delchat) { + } + else if (obj.delchat) { const query = "DELETE " + "FROM Chats " + @@ -456,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 = @@ -473,28 +490,55 @@ 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); + } + } + }); + } }); }); }); } -} + +}; module.exports = GameModel;