created: function() {
// Always add myself to players' list
this.people.push(this.st.user);
+ // Retrieve live challenge (not older than 30 minute) if any:
+ const chall = JSON.parse(localStorage.getItem("challenge") || "false");
+ if (!!chall)
+ {
+ if ((Date.now() - chall.added)/1000 <= 30*60)
+ this.challenges.push(chall);
+ else
+ localStorage.removeItem("challenge");
+ }
if (this.st.user.id > 0)
{
// Ask server for current corr games (all but mines)
{target: sid}
)));
};
- if (!!to[0])
+ if (!!to)
{
- to.forEach(pname => {
- // Challenge with targeted players
- const targetSid = this.getSid(pname);
- if (!targetSid)
- {
- if (!!warnDisconnected)
- alert("Warning: " + pname + " is not connected");
- }
- else
- doSend(code, obj, targetSid);
- });
+ // Challenge with targeted players
+ const targetSid = this.getSid(to);
+ if (!targetSid)
+ {
+ if (!!warnDisconnected)
+ alert("Warning: " + pname + " is not connected");
+ }
+ else
+ doSend(code, obj, targetSid);
}
else
{
timeControl: c.timeControl
};
this.st.conn.send(JSON.stringify({code:"challenge",
- challenge:myChallenge, target:data.from}));
+ chall:myChallenge, target:data.from}));
}
break;
}
case "askgame":
{
- // Send my current live games (if any)
- // TODO: from indexedDB, through GameStorage.
-// if (!!localStorage["gid"])
-// {
-// const myGame =
-// {
-// // Minimal game informations: (fen+clock not required)
-// id: localStorage["gid"],
-// players: JSON.parse(localStorage["players"]), //array sid+id+name
-// vname: localStorage["vname"],
-// timeControl: localStorage["timeControl"],
-// };
-// this.st.conn.send(JSON.stringify({code:"game",
-// game:myGame, target:data.from}));
-// }
+ // 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),
+ vname: game.vname,
+ timeControl: game.timeControl,
+ };
+ this.st.conn.send(JSON.stringify({code:"game",
+ game:myGame, target:data.from}));
+ }
+ });
break;
}
case "identity":
newChall.type = this.classifyObject(data.chall);
const pIdx = this.people.findIndex(p => p.sid == data.from);
newChall.from = this.people[pIdx]; //may be anonymous
- newChall.added = Date.now();
- newChall.vname = this.getVname(newChall.vid);
+ newChall.added = Date.now(); //TODO: this is reception timestamp, not creation
+ newChall.vname = this.getVname(newChall.vid); //TODO: just send vname?
this.challenges.push(newChall);
break;
}
{
// Receive game from some player (+sid)
// NOTE: it may be correspondance (if newgame while we are connected)
- // TODO: ambiguous naming "newGame" ==> rename function ?
let newGame = data.game;
newGame.type = this.classifyObject(data.game);
- newGame.vname = newGame.vname;
+ newGame.rid = data.from;
+ newGame.score = "*";
this.games.push(newGame);
break;
}
// Delete corresponding challenge:
ArrayFun.remove(this.challenges, c => c.id == data.cid);
// New game just started: data contain all informations
- this.newGame(data.gameInfo);
+ this.startNewGame(data.gameInfo);
break;
}
// * - receive "accept/cancel challenge": apply action to challenges list
}
case "deletechallenge":
{
+ // NOTE: the challenge may be already removed
ArrayFun.remove(this.challenges, c => c.id == data.cid);
break;
}
const finishAddChallenge = (cid,warnDisconnected) => {
chall.id = cid || "c" + getRandString();
// Send challenge to peers (if connected)
- this.sendSomethingTo(cto, "challenge", {chall:chall}, !!warnDisconnected);
+ this.sendSomethingTo(chall.to, "challenge", {chall:chall}, !!warnDisconnected);
chall.added = Date.now();
chall.type = ctype;
chall.vname = vname;
chall.from = this.st.user;
this.challenges.push(chall);
+ localStorage.setItem("challenge", JSON.stringify(chall));
document.getElementById("modalNewgame").checked = false;
};
const cIdx = this.challenges.findIndex(
console.log("click challenge");
console.log(c);
- else if (c.from.sid == this.st.user.sid
+ if (c.from.sid == this.st.user.sid
|| (this.st.user.id > 0 && c.from.id == this.st.user.id))
{
// It's my challenge: cancel it
else //accept (or refuse) a challenge
{
c.accepted = true;
- if (!!c.to[0])
+ if (!!c.to)
{
// TODO: if special FEN, show diagram after loading variant
c.accepted = confirm("Accept challenge?");
this.st.conn.send(JSON.stringify({
code: (c.accepted ? "accept" : "refuse") + "challenge",
cid: c.id, target: c.from.sid}));
- if (c.type == "corr" && c.accepted)
+ if (c.accepted)
{
- ajax(
- "/challenges",
- "PUT",
- {id: this.challenges[cIdx].id}
- );
+ if (c.type == "corr")
+ {
+ ajax(
+ "/challenges",
+ "PUT",
+ {id: this.challenges[cIdx].id}
+ );
+ }
}
- if (!c.accepted)
+ else
{
ArrayFun.remove(this.challenges, ch => ch.id == c.id);
+ if (!c.to) //TODO: send to everyone except me and opponent ?
+ this.sendSomethingTo("", "deletechallenge", {cid: this.challenges[cIdx].id});
if (c.type == "corr")
{
ajax(
gameInfo:gameInfo, cid:c.id, target:c.seat.sid}));
// Delete corresponding challenge:
ArrayFun.remove(this.challenges, ch => ch.id == c.id);
- this.newGame(gameInfo); //also!
+ this.startNewGame(gameInfo); //also!
},
// NOTE: for live games only (corr games are launched on server)
- newGame: function(gameInfo) {
+ startNewGame: function(gameInfo) {
// Extract times (in [milli]seconds), set clocks
const tc = extractTime(gameInfo.timeControl);
let initime = [...Array(gameInfo.players.length)];