+ this.launchGame(c);
+ } else {
+ const oppsid = this.getOppsid(c);
+ if (!!oppsid)
+ this.send("refusechallenge", { data: c.id, target: oppsid });
+ if (c.type == "corr")
+ ajax("/challenges", "DELETE", { id: c.id });
+ }
+ this.send("deletechallenge", { data: c.id });
+ },
+ clickChallenge: async function(c) {
+ const myChallenge =
+ c.from.sid == this.st.user.sid || //live
+ (this.st.user.id > 0 && c.from.id == this.st.user.id); //corr
+ if (!myChallenge) {
+ if (c.type == "corr" && this.st.user.id <= 0) {
+ alert(this.st.tr["Please log in to accept corr challenges"]);
+ return;
+ }
+ c.accepted = true;
+ const vModule = await import("@/variants/" + c.vname + ".js");
+ window.V = vModule.VariantRules;
+ if (!!c.to) {
+ // c.to == this.st.user.name (connected)
+ if (!!c.fen) {
+ const parsedFen = V.ParseFen(c.fen);
+ c.mycolor = V.GetOppCol(parsedFen.turn);
+ this.tchallDiag = getDiagram({
+ position: parsedFen.position,
+ orientation: c.mycolor
+ });
+ this.curChallToAccept = c;
+ document.getElementById("modalAccept").checked = true;
+ }
+ else {
+ if (!confirm(this.st.tr["Accept challenge?"]))
+ c.accepted = false;
+ this.finishProcessingChallenge(c);
+ }
+ }
+ else
+ this.finishProcessingChallenge(c);
+ }
+ else {
+ // My challenge
+ if (c.type == "corr")
+ ajax("/challenges", "DELETE", { id: c.id });
+ this.send("deletechallenge", { data: c.id });
+ }
+ // In all cases, the challenge is consumed:
+ ArrayFun.remove(this.challenges, ch => ch.id == c.id);
+ },
+ // NOTE: when launching game, the challenge is already being deleted
+ launchGame: function(c) {
+ // These game informations will be shared
+ let gameInfo = {
+ id: getRandString(),
+ fen: c.fen || V.GenRandInitFen(c.randomness),
+ // White player index 0, black player index 1:
+ players: c.mycolor
+ ? (c.mycolor == "w" ? [c.seat, c.from] : [c.from, c.seat])
+ : shuffle([c.from, c.seat]),
+ vid: c.vid,
+ cadence: c.cadence
+ };
+ const notifyNewgame = () => {
+ const oppsid = this.getOppsid(c);
+ if (!!oppsid)
+ //opponent is online
+ this.send("startgame", { data: gameInfo, target: oppsid });
+ // Send game info (only if live) to everyone except me in this tab
+ this.send("newgame", { data: gameInfo });
+ };
+ if (c.type == "live") {
+ notifyNewgame();
+ this.startNewGame(gameInfo);
+ } //corr: game only on server
+ else {