1 let router
= require("express").Router();
2 const UserModel
= require("../models/User");
3 const ChallengeModel
= require('../models/Challenge');
4 const GameModel
= require('../models/Game');
5 const access
= require("../utils/access");
6 const params
= require("../config/parameters");
8 // From main hall, start game between players 0 and 1
9 router
.post("/games", access
.logged
, access
.ajax
, (req
,res
) => {
10 const gameInfo
= req
.body
.gameInfo
;
11 const cid
= req
.body
.cid
;
13 Array
.isArray(gameInfo
.players
) &&
14 gameInfo
.players
.some(p
=> p
.id
== req
.userId
) &&
15 cid
.toString().match(/^[0-9]+$/) &&
16 GameModel
.checkGameInfo(gameInfo
)
18 ChallengeModel
.remove(cid
);
20 gameInfo
.vid
, gameInfo
.fen
, gameInfo
.cadence
, gameInfo
.players
,
22 const oppIdx
= (gameInfo
.players
[0].id
== req
.userId
? 1 : 0);
23 const oppId
= gameInfo
.players
[oppIdx
].id
;
24 UserModel
.tryNotify(oppId
,
25 "Game started: " + params
.siteURL
+ "/#/game/" + ret
.gid
);
26 res
.json({gameId: ret
.gid
});
32 router
.get("/games", access
.ajax
, (req
,res
) => {
33 const gameId
= req
.query
["gid"];
36 if (gameId
.match(/^[0-9]+$/))
38 GameModel
.getOne(gameId
, (err
,game
) => {
39 res
.json({game: game
});
45 // Get by (non-)user ID:
46 const userId
= req
.query
["uid"];
47 if (userId
.match(/^[0-9]+$/))
49 const excluded
= !!req
.query
["excluded"];
50 GameModel
.getByUser(userId
, excluded
, (err
,games
) => {
51 res
.json({games: games
});
57 // FEN update + score(Msg) + draw status / and new move + chats
58 router
.put("/games", access
.logged
, access
.ajax
, (req
,res
) => {
59 const gid
= req
.body
.gid
;
60 let obj
= req
.body
.newObj
;
61 if (gid
.toString().match(/^[0-9]+$/) && GameModel
.checkGameUpdate(obj
))
63 GameModel
.getPlayers(gid
, (err
,players
) => {
64 const myIdx
= players
.findIndex(p
=> p
.uid
== req
.userId
)
66 // Did I mark the game for deletion?
67 if (!!obj
.removeFlag
) {
68 obj
.deletedBy
= ["w","b"][myIdx
];
69 delete obj
["removeFlag"];
71 GameModel
.update(gid
, obj
, (err
) => {
72 if (!err
&& (!!obj
.move || !!obj
.score
))
74 // Notify opponent if he enabled notifications:
75 const oppid
= players
[0].uid
== req
.userId
78 const messagePrefix
= obj
.move
79 ? "New move in game: "
81 UserModel
.tryNotify(oppid
,
82 messagePrefix
+ params
.siteURL
+ "/#/game/" + gid
);
91 // TODO: chats deletion here, but could/should be elsewhere.
92 // Moves update also could, although logical unit in a game.
93 router
.delete("/chats", access
.logged
, access
.ajax
, (req
,res
) => {
94 const gid
= req
.query
["gid"];
95 GameModel
.getPlayers(gid
, (err
,players
) => {
96 if (players
.some(p
=> p
.uid
== req
.userId
))
98 GameModel
.update(gid
, {delchat: true}, () => {
105 module
.exports
= router
;