+ // "newgame" message can provide a page (corr Game --> Hall)
+ if (obj.code == "newchallenge") {
+ // Filter out targeted challenges and correspondance games:
+ if (!obj.data.to && obj.data.cadence.indexOf('d') < 0) {
+ const challMsg = (
+ (obj.data.sender || "@nonymous") + " : " +
+ "**" + obj.data.vname + "** " +
+ "[" + obj.data.cadence + "] "
+ );
+ if (!!discordChannel) discordChannel.send(challMsg);
+ else
+ // Log when running locally (dev, debug):
+ console.log(challMsg);
+ }
+ delete obj.data["sender"];
+ }
+ notifyRoom(
+ obj.page || page, obj.code, {data: obj.data}, obj.excluded);
+ break;
+
+ case "rnewgame":
+ // A rematch game started:
+ notifyRoom(page, "newgame", {data: obj.data});
+ // Explicitely notify Hall if gametype == corr.
+ // Live games will be polled from Hall after gconnect event.
+ if (obj.data.cadence.indexOf('d') >= 0)
+ notifyRoom("/", "newgame", {data: obj.data});
+ break;
+
+ case "newmove": {
+ const dataWithFrom = { from: [sid,tmpId], data: obj.data };
+ // Special case re-send newmove only to opponent:
+ if (!!obj.target && !!clients[page][obj.target]) {
+ Object.keys(clients[page][obj.target]).forEach(x => {
+ send(
+ clients[page][obj.target][x].socket,
+ Object.assign({ code: "newmove" }, dataWithFrom)
+ );
+ });
+ } else {
+ // NOTE: data.from is useful only to opponent
+ notifyRoom(page, "newmove", dataWithFrom);
+ }
+ break;
+ }
+ case "gotmove":
+ if (
+ !!clients[page][obj.target[0]] &&
+ !!clients[page][obj.target[0]][obj.target[1]]
+ ) {
+ send(
+ clients[page][obj.target[0]][obj.target[1]].socket,
+ { code: "gotmove" }
+ );
+ }