gdisplay: "live",
games: [],
challenges: [],
- people: [], //(all) online players
+ people: [], //people in main hall
infoMessage: "",
newchallenge: {
fen: "",
});
this.games.forEach(g => {
if (g.vname == "")
- g.vname = this.getVname(g.vid)
+ g.vname = this.getVname(g.vid);
});
},
},
}
this.$router.push(url);
},
- // TODO: ...filter(...)[0].name, one-line, just remove this function
getVname: function(vid) {
- const vIdx = this.st.variants.findIndex(v => v.id == vid);
- return vIdx >= 0 ? this.st.variants[vIdx].name : "";
+ const variant = this.st.variants.find(v => v.id == vid);
+ // this.st.variants might be uninitialized (variant == null)
+ return (!!variant ? variant.name : "");
},
getSid: function(pname) {
const pIdx = this.people.findIndex(pl => pl.name == pname);
}
break;
}
- case "askgame":
- {
- // Send my current live game (if any)
- GameStorage.getCurrent((game) => {
- if (!!game)
- {
- const myGame =
- {
- // Minimal game informations:
- id: game.id,
- players: game.players.map(p => p.name),
- vid: game.vid,
- timeControl: game.timeControl,
- };
- this.st.conn.send(JSON.stringify({code:"game",
- game:myGame, target:data.from}));
- }
- });
- break;
- }
case "identity":
{
const pIdx = this.people.findIndex(p => p.sid == data.user.sid);
else
{
this.infoMessage = "New game started: " +
- "<a href='/game/" + data.gameInfo.gameId + "'>" +
- "/game/" + data.gameInfo.gameId + "</a>";
+ "<a href='#/game/" + data.gameInfo.id + "'>" +
+ "#/game/" + data.gameInfo.id + "</a>";
let modalBox = document.getElementById("modalInfo");
modalBox.checked = true;
setTimeout(() => { modalBox.checked = false; }, 3000);
}
case "connect":
{
- this.people.push({name:"", id:0, sid:data.sid});
- this.st.conn.send(JSON.stringify({code:"askidentity", target:data.sid}));
- this.st.conn.send(JSON.stringify({code:"askchallenge", target:data.sid}));
- this.st.conn.send(JSON.stringify({code:"askgame", target:data.sid}));
+ this.people.push({name:"", id:0, sid:data.from});
+ this.st.conn.send(JSON.stringify({code:"askidentity", target:data.from}));
+ this.st.conn.send(JSON.stringify({code:"askchallenge", target:data.from}));
+ this.st.conn.send(JSON.stringify({code:"askgame", target:data.from}));
break;
}
case "disconnect":
{
- ArrayFun.remove(this.people, p => p.sid == data.sid);
+ ArrayFun.remove(this.people, p => p.sid == data.from);
// Also remove all challenges sent by this player:
- ArrayFun.remove(this.challenges, c => c.from.sid == data.sid);
+ ArrayFun.remove(this.challenges, c => c.from.sid == data.from);
// And all live games where he plays and no other opponent is online
ArrayFun.remove(this.games, g =>
- g.type == "live" && (g.players.every(p => p.sid == data.sid
+ g.type == "live" && (g.players.every(p => p.sid == data.from
|| !this.people.some(pl => pl.sid == p.sid))), "all");
break;
}
chall.vname = vname;
chall.from = this.people[0]; //avoid sending email
this.challenges.push(chall);
- localStorage.setItem("challenge", JSON.stringify(chall));
+ if (ctype == "live")
+ localStorage.setItem("challenge", JSON.stringify(chall));
document.getElementById("modalNewgame").checked = false;
};
const cIdx = this.challenges.findIndex(
}
else //my challenge
{
- localStorage.removeItem("challenge");
if (c.type == "corr")
{
ajax(
{id: c.id}
);
}
+ else //live
+ localStorage.removeItem("challenge");
}
// In (almost) all cases, the challenge is consumed:
ArrayFun.remove(this.challenges, ch => ch.id == c.id);
// These game informations will be sent to other players
const gameInfo =
{
- gameId: getRandString(),
+ id: getRandString(),
fen: c.fen || V.GenRandInitFen(),
players: shuffle([c.from, c.seat]), //white then black
vid: c.vid,
+ vname: c.vname, //theoretically vid is enough, but much easier with vname
timeControl: c.timeControl,
};
let target = c.from.sid; //may not be defined if corr + offline opp
"POST",
{gameInfo: gameInfo, cid: c.id}, //cid useful to delete challenge
response => {
- gameInfo.gameId = response.gameId;
+ gameInfo.id = response.gameId;
tryNotifyOpponent();
this.$router.push("/game/" + response.gameId);
}
);
}
+ // Send game info to everyone except opponent (and me)
+ this.st.conn.send(JSON.stringify({code:"game",
+ game: { //minimal game info:
+ id: gameInfo.id,
+ players: gameInfo.players.map(p => p.name),
+ vid: gameInfo.vid,
+ timeControl: gameInfo.timeControl,
+ },
+ oppsid: target}));
},
// NOTE: for live games only (corr games start on the server)
startNewGame: function(gameInfo) {
const game = Object.assign({}, gameInfo, {
// (other) Game infos: constant
fenStart: gameInfo.fen,
- created: Date.now(),
+ added: Date.now(),
// Game state (including FEN): will be updated
moves: [],
clocks: [-1, -1], //-1 = unstarted
GameStorage.add(game);
if (this.st.settings.sound >= 1)
new Audio("/sounds/newgame.mp3").play().catch(err => {});
- this.$router.push("/game/" + gameInfo.gameId);
+ this.$router.push("/game/" + gameInfo.id);
},
},
};