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 router
.post("/gamestat", access
.ajax
, (req
,res
) => {
9 const vid
= req
.body
.vid
;
10 if (!!vid
&& !!vid
.toString().match(/^[0-9]+$/)) {
11 GameModel
.incrementCounter(vid
);
16 // From main hall, start game between players 0 and 1
17 router
.post("/games", access
.logged
, access
.ajax
, (req
,res
) => {
18 const gameInfo
= req
.body
.gameInfo
;
19 // Challenge ID is provided if game start from Hall:
20 const cid
= req
.body
.cid
;
22 Array
.isArray(gameInfo
.players
) &&
23 gameInfo
.players
.some(p
=> p
.id
== req
.userId
) &&
24 (!cid
|| !!cid
.toString().match(/^[0-9]+$/)) &&
25 GameModel
.checkGameInfo(gameInfo
)
27 if (!!cid
) ChallengeModel
.remove(cid
);
29 gameInfo
.vid
, gameInfo
.fen
, gameInfo
.options
,
30 gameInfo
.cadence
, gameInfo
.players
,
32 const oppIdx
= (gameInfo
.players
[0].id
== req
.userId
? 1 : 0);
33 const oppId
= gameInfo
.players
[oppIdx
].id
;
34 UserModel
.tryNotify(oppId
,
35 "Game started: " + params
.siteURL
+ "/#/game/" + ret
.id
);
42 // Get only one game (for Game page)
43 router
.get("/games", access
.ajax
, (req
,res
) => {
44 const gameId
= req
.query
["gid"];
45 if (!!gameId
&& gameId
.match(/^[0-9]+$/)) {
46 GameModel
.getOne(gameId
, (err
, game
) => {
47 res
.json(err
|| { game: game
});
52 // Get by (non-)user ID, for Hall
53 router
.get("/observedgames", access
.ajax
, (req
,res
) => {
54 const userId
= req
.query
["uid"];
55 const cursor
= req
.query
["cursor"];
56 if (!!userId
.match(/^[0-9]+$/) && !!cursor
.match(/^[0-9]+$/)) {
57 GameModel
.getObserved(userId
, cursor
, (err
, games
) => {
58 res
.json({ games: games
});
63 // Get by user ID, for MyGames page
64 router
.get("/runninggames", access
.logged
, access
.ajax
, (req
,res
) => {
65 GameModel
.getRunning(req
.userId
, (err
, games
) => {
66 res
.json({ games: games
});
70 router
.get("/completedgames", access
.logged
, access
.ajax
, (req
,res
) => {
71 const cursor
= req
.query
["cursor"];
72 if (!!cursor
.match(/^[0-9]+$/)) {
73 GameModel
.getCompleted(req
.userId
, cursor
, (err
, games
) => {
74 res
.json({ games: games
});
79 // FEN update + score(Msg) + draw status / and new move + chats
80 router
.put("/games", access
.logged
, access
.ajax
, (req
,res
) => {
81 const gid
= req
.body
.gid
;
82 let obj
= req
.body
.newObj
;
83 if (gid
.toString().match(/^[0-9]+$/) && GameModel
.checkGameUpdate(obj
)) {
84 GameModel
.getPlayers(gid
, (err
, players
) => {
86 if (players
.white
== req
.userId
) myColor
= 'w';
87 else if (players
.black
== req
.userId
) myColor
= 'b';
89 // Did I mark the game for deletion?
90 if (!!obj
.removeFlag
) {
91 obj
.deletedBy
= myColor
;
92 delete obj
["removeFlag"];
94 GameModel
.update(gid
, obj
, (err
) => {
95 if (!err
&& (!!obj
.move || !!obj
.score
)) {
96 // Notify opponent if he enabled notifications:
97 const oppid
= (myColor
== 'w' ? players
.black : players
.white
);
100 ? "New move in game : "
104 messagePrefix
+ params
.siteURL
+ "/#/game/" + gid
114 // TODO: chats deletion here, but could/should be elsewhere.
115 // Moves update also could, although logical unit in a game.
116 router
.delete("/chats", access
.logged
, access
.ajax
, (req
,res
) => {
117 const gid
= req
.query
["gid"];
118 GameModel
.getPlayers(gid
, (err
, players
) => {
119 if ([players
.white
, players
.black
].includes(req
.userId
))
121 GameModel
.update(gid
, { delchat: true }, () => {
128 module
.exports
= router
;