wss.on("connection", (socket, req) => {
const query = getJsonFromUrl(req.url);
const sid = query["sid"];
- // TODO: later, allow duplicate connections (shouldn't be much more complicated)
if (!!clients[sid])
return socket.send(JSON.stringify({code:"duplicate"}));
clients[sid] = {sock: socket, page: query["page"]};
{code:"askchallenge",from:sid}));
break;
case "askgames":
+ {
// Check all clients playing, and send them a "askgame" message
+ let gameSids = {}; //game ID --> [sid1, sid2]
+ const regexpGid = /\/[a-zA-Z0-9]+$/;
Object.keys(clients).forEach(k => {
if (k != sid && clients[k].page.indexOf("/game/") >= 0)
{
- clients[k].sock.send(JSON.stringify(
- {code:"askgame", from: sid}));
+ const gid = clients[k].page.match(regexpGid)[0];
+ if (!gameSids[gid])
+ gameSids[gid] = [k];
+ else
+ gameSids[gid].push(k);
}
});
+ // Request only one client out of 2 (TODO: this is a bit heavy)
+ // Alt: ask game to all, and filter later?
+ Object.keys(gameSids).forEach(gid => {
+ const L = gameSids[gid].length;
+ const idx = L > 1
+ ? Math.floor(Math.random() * Math.floor(L))
+ : 0;
+ const rid = gameSids[gid][idx];
+ clients[rid].sock.send(JSON.stringify(
+ {code:"askgame", from: sid}));
+ });
+ break;
+ }
+ case "askfullgame":
+ clients[obj.target].sock.send(JSON.stringify(
+ {code:"askfullgame", from:sid}));
+ break;
+ case "fullgame":
+ clients[obj.target].sock.send(JSON.stringify(
+ {code:"fullgame", game:obj.game}));
break;
case "identity":
clients[obj.target].sock.send(JSON.stringify(
break;
case "resign":
clients[obj.target].sock.send(JSON.stringify(
- {code:"resign"}));
+ {code:"resign", side:obj.side}));
break;
case "abort":
clients[obj.target].sock.send(JSON.stringify(
- {code:"abort",msg:obj.msg}));
+ {code:"abort"}));
break;
case "drawoffer":
clients[obj.target].sock.send(JSON.stringify(
break;
case "draw":
clients[obj.target].sock.send(JSON.stringify(
- {code:"draw"}));
+ {code:"draw", message:obj.message}));
break;
}
});