+ }
+ case "identity": {
+ const user = data.data;
+ this.$set(this.people, user.sid, {
+ id: user.id,
+ name: user.name,
+ pages: this.people[user.sid].pages
+ });
+ if (user.name) {
+ // If I multi-connect, kill current connexion if no mark (I'm older)
+ if (
+ this.newConnect[user.sid] &&
+ user.id > 0 &&
+ user.id == this.st.user.id &&
+ user.sid != this.st.user.sid
+ ) {
+ if (!this.killed[this.st.user.sid]) {
+ this.send("killme", { sid: this.st.user.sid });
+ this.killed[this.st.user.sid] = true;
+ }
+ }
+ }
+ delete this.newConnect[user.sid];
+ break;
+ }
+ case "askchallenge": {
+ // Send my current live challenge (if any)
+ const cIdx = this.challenges.findIndex(
+ c => c.from.sid == this.st.user.sid && c.type == "live"
+ );
+ if (cIdx >= 0) {
+ const c = this.challenges[cIdx];
+ // NOTE: in principle, should only send targeted challenge to the target.
+ // But we may not know yet the identity of the target (just name),
+ // so cannot decide if data.from is the target or not.
+ const myChallenge = {
+ id: c.id,
+ from: this.st.user.sid,
+ to: c.to,
+ randomness: c.randomness,
+ fen: c.fen,
+ vid: c.vid,
+ cadence: c.cadence,
+ added: c.added
+ };
+ this.send("challenge", { data: myChallenge, target: data.from });
+ }
+ break;
+ }
+ case "challenge": //after "askchallenge"
+ case "newchallenge": {
+ // NOTE about next condition: see "askchallenge" case.
+ const chall = data.data;
+ if (
+ !chall.to ||
+ (this.people[chall.from].id > 0 &&
+ (chall.from == this.st.user.sid || chall.to == this.st.user.name))
+ ) {
+ let newChall = Object.assign({}, chall);
+ newChall.type = this.classifyObject(chall);
+ newChall.randomness = chall.randomness;
+ newChall.added = Date.now();
+ let fromValues = Object.assign({}, this.people[chall.from]);
+ delete fromValues["pages"]; //irrelevant in this context
+ newChall.from = Object.assign({ sid: chall.from }, fromValues);
+ newChall.vname = this.getVname(newChall.vid);
+ this.challenges.push(newChall);
+ if (
+ (newChall.type == "live" && this.cdisplay == "corr") ||
+ (newChall.type == "corr" && this.cdisplay == "live")
+ ) {
+ document
+ .getElementById("btnC" + newChall.type)
+ .classList.add("somethingnew");
+ }
+ }
+ break;
+ }
+ case "refusechallenge": {
+ const cid = data.data;
+ ArrayFun.remove(this.challenges, c => c.id == cid);
+ alert(this.st.tr["Challenge declined"]);
+ break;
+ }
+ case "deletechallenge": {
+ // NOTE: the challenge may be already removed
+ const cid = data.data;
+ ArrayFun.remove(this.challenges, c => c.id == cid);
+ break;
+ }
+ case "game": //individual request
+ case "newgame": {
+ // NOTE: it may be live or correspondance
+ const game = data.data;
+ // Ignore games where I play (corr games)
+ if (game.players.every(p =>
+ p.sid != this.st.user.sid || p.id != this.st.user.id))
+ {
+ let locGame = this.games.find(g => g.id == game.id);
+ if (!locGame) {
+ let newGame = game;
+ newGame.type = this.classifyObject(game);
+ newGame.vname = this.getVname(game.vid);
+ if (!game.score)
+ //if new game from Hall
+ newGame.score = "*";
+ newGame.rids = [game.rid];
+ delete newGame["rid"];
+ this.games.push(newGame);
+ if (
+ (newGame.type == "live" && this.gdisplay == "corr") ||
+ (newGame.type == "corr" && this.gdisplay == "live")
+ ) {
+ document
+ .getElementById("btnG" + newGame.type)
+ .classList.add("somethingnew");
+ }
+ } else {
+ // Append rid (if not already in list)
+ if (!locGame.rids.includes(game.rid)) locGame.rids.push(game.rid);
+ }
+ }