X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=server%2Fmodels%2FGame.js;h=f05d2fec82d8f8955feb93ba7503e39bfded4fdd;hb=81b71035639a4204bd7834c9185ea961755af1cf;hp=76a91dc9d76e84629213052345324d90aa86fc7e;hpb=7ec05c0ef6b1a329831d74148652115f9147e3b3;p=vchess.git diff --git a/server/models/Game.js b/server/models/Game.js index 76a91dc9..f05d2fec 100644 --- a/server/models/Game.js +++ b/server/models/Game.js @@ -15,7 +15,7 @@ const UserModel = require("./User"); * created: datetime * drawOffer: char ('w','b' or '' for none) * rematchOffer: char (similar to drawOffer) - * randomness: integer + * options: varchar * deletedByWhite: boolean * deletedByBlack: boolean * chatReadWhite: datetime @@ -40,7 +40,6 @@ const GameModel = { return ( g.vid.toString().match(/^[0-9]+$/) && g.cadence.match(/^[0-9dhms +]+$/) && - g.randomness.toString().match(/^[0-2]$/) && g.fen.match(/^[a-zA-Z0-9, /-]*$/) && g.players.length == 2 && g.players.every(p => p.id.toString().match(/^[0-9]+$/)) @@ -57,22 +56,22 @@ const GameModel = { }); }, - create: function(vid, fen, randomness, cadence, players, cb) { + create: function(vid, fen, options, cadence, players, cb) { db.serialize(function() { let query = "INSERT INTO Games " + "(" + - "vid, fenStart, fen, randomness, " + + "vid, fenStart, fen, options, " + "white, black, " + "cadence, created" + ") " + "VALUES " + "(" + - vid + ",'" + fen + "','" + fen + "'," + randomness + "," + + vid + ",'" + fen + "','" + fen + "',?," + players[0].id + "," + players[1].id + "," + "'" + cadence + "'," + Date.now() + ")"; - db.run(query, function(err) { + db.run(query, options, function(err) { cb(err, { id: this.lastID }); }); }); @@ -84,15 +83,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, options, 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 +113,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); }); @@ -138,7 +132,7 @@ const GameModel = { getObserved: function(uid, cursor, cb) { db.serialize(function() { let query = - "SELECT id, vid, cadence, created, score, white, black " + + "SELECT id, vid, cadence, options, created, score, white, black " + "FROM Games " + "WHERE created < " + cursor + " "; if (uid > 0) { @@ -150,6 +144,7 @@ const GameModel = { "ORDER BY created DESC " + "LIMIT 20"; //TODO: 20 hard-coded... db.all(query, (err, games) => { + games = games || []; // Query players names let pids = {}; games.forEach(g => { @@ -157,6 +152,7 @@ const GameModel = { if (!pids[g.black]) pids[g.black] = true; }); UserModel.getByIds(Object.keys(pids), (err2, users) => { + users = users || []; let names = {}; users.forEach(u => { names[u.id] = u.name; }); cb( @@ -167,6 +163,7 @@ const GameModel = { id: g.id, vid: g.vid, cadence: g.cadence, + options: g.options, created: g.created, score: g.score, players: [ @@ -186,13 +183,11 @@ 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, options, created, white, black " + + "FROM Games " + "WHERE score = '*' AND (white = " + uid + " OR black = " + uid + ")"; db.all(query, (err, games) => { + games = games || []; // Get movesCount (could be done in // with next query) query = "SELECT gid, COUNT(*) AS nbMoves " + @@ -209,6 +204,7 @@ const GameModel = { if (!pids[g.black]) pids[g.black] = true; }); UserModel.getByIds(Object.keys(pids), (err2, users) => { + users = users || []; let names = {}; users.forEach(u => { names[u.id] = u.name; }); cb( @@ -217,8 +213,9 @@ const GameModel = { g => { return { id: g.id, - vname: g.vname, + vid: g.vid, cadence: g.cadence, + options: g.options, created: g.created, score: g.score, movesCount: movesCounts[g.id] || 0, @@ -240,12 +237,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, options, created, score, scoreMsg, " + + "white, black, deletedByWhite, deletedByBlack " + + "FROM Games " + "WHERE " + " score <> '*' AND" + " created < " + cursor + " AND" + @@ -264,6 +258,7 @@ const GameModel = { "ORDER BY created DESC " + "LIMIT 20"; db.all(query, (err, games) => { + games = games || []; // Query player names let pids = {}; games.forEach(g => { @@ -271,6 +266,7 @@ const GameModel = { if (!pids[g.black]) pids[g.black] = true; }); UserModel.getByIds(Object.keys(pids), (err2, users) => { + users = users || []; let names = {}; users.forEach(u => { names[u.id] = u.name; }); cb( @@ -279,8 +275,9 @@ const GameModel = { g => { return { id: g.id, - vname: g.vname, + vid: g.vid, cadence: g.cadence, + options: g.options, created: g.created, score: g.score, scoreMsg: g.scoreMsg, @@ -321,8 +318,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?*\/-]+$/)) ) && ( @@ -510,6 +506,7 @@ const GameModel = { } // 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 >