import { ArrayFun } from "@/utils/array";
import { ajax } from "@/utils/ajax";
import { getRandString, shuffle } from "@/utils/alea";
-import { extractTime } from "@/utils/timeControl";
import GameList from "@/components/GameList.vue";
import ChallengeList from "@/components/ChallengeList.vue";
+import { GameStorage } from "@/utils/storage";
export default {
name: "my-hall",
components: {
fen: "",
vid: 0,
nbPlayers: 0,
- to: ["", "", ""], //name of challenged players
+ to: ["", "", ""], //name(s) of challenged player(s)
timeControl: "", //"2m+2s" ...etc
},
};
created: function() {
// Always add myself to players' list
this.players.push(this.st.user);
+ if (this.st.user.id > 0)
+ {
// Ask server for current corr games (all but mines)
// ajax(
-// "",
+// "/games",
// "GET",
+// {excluded: this.st.user.id},
// response => {
-//
-// }
-// );
- // // Also ask for corr challenges (all) --> + accepted status if I play
-// ajax(
-// "",
-// "GET",
-// response => {
-//
+// this.games = this.games.concat(response.games);
// }
// );
+ // Also ask for corr challenges (open + sent to me)
+ ajax(
+ "/challenges",
+ "GET",
+ {uid: this.st.user.id},
+ response => {
+ console.log(response.challenges);
+ // TODO: post-treatment on challenges ?
+ this.challenges = this.challenges.concat(response.challenges);
+ }
+ );
+ }
// 0.1] Ask server for room composition:
const socketOpenListener = () => {
this.st.conn.send(JSON.stringify({code:"pollclients"}));
{target: sid}
)));
};
- else if (!!to[0])
+ if (!!to[0])
{
to.forEach(pname => {
// Challenge with targeted players
{
// Minimal game informations: (fen+clock not required)
id: localStorage["gid"],
- players: JSON.parse(localStorage["players"]), //array sid+name
- vid: localStorage["vid"],
+ players: JSON.parse(localStorage["players"]), //array sid+id+name
+ vname: localStorage["vname"],
timeControl: localStorage["timeControl"],
};
this.st.conn.send(JSON.stringify({code:"game",
// NOTE: it may be correspondance (if newgame while we are connected)
let newGame = data.game;
newGame.type = this.classifyObject(data.game);
- newGame.vname = this.getVname(newGame.vid);
+ newGame.vname = newGame.vname;
this.games.push(newGame);
break;
}
{
this.players.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:sid}));
- this.st.conn.send(JSON.stringify({code:"askgame", target:sid}));
+ this.st.conn.send(JSON.stringify({code:"askchallenge", target:data.sid}));
+ this.st.conn.send(JSON.stringify({code:"askgame", target:data.sid}));
break;
}
case "disconnect":
if (!!error)
return alert(error);
const ctype = this.classifyObject(this.newchallenge);
- const cto = this.newchallenge.to.slice(0, this.newchallenge.nbPlayers);
+ const cto = this.newchallenge.to.slice(0, this.newchallenge.nbPlayers - 1);
// NOTE: "from" information is not required here
let chall =
{
// * - prepare and start new game (if challenge is full after acceptation)
// * --> include challenge ID (so that opponents can delete the challenge too)
clickChallenge: function(c) {
- switch (c.type)
+
+ console.log("click challenge");
+ console.log(c);
+
+ if (!!c.accepted)
{
- case "live":
- if (!!c.accepted)
- {
- this.st.conn.send(JSON.stringify({code: "withdrawchallenge",
- cid: c.id, target: c.from.sid}));
-
- break;
- case "corr":
+ this.st.conn.send(JSON.stringify({code: "withdrawchallenge",
+ cid: c.id, target: c.from.sid}));
+ if (c.type == "corr")
+ {
ajax(
"/challenges",
"PUT",
{action:"withdraw", id: this.challenges[cIdx].id}
);
- break;
- }
- c.accepted = false;
- {
+ }
+ c.accepted = false;
}
- else if (c.from.sid == this.st.user.sid) //it's my challenge: cancel it
+ else 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
this.sendSomethingTo(c.to, "deletechallenge", {cid:c.id});
ArrayFun.remove(this.challenges, ch => ch.id == c.id);
+ if (c.type == "corr")
+ {
+ ajax(
+ "/challenges",
+ "DELETE",
+ {id: this.challenges[cIdx].id}
+ );
+ }
}
else //accept (or refuse) a 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)
+ {
+ ajax(
+ "/challenges",
+ "PUT",
+ {action: "accept", id: this.challenges[cIdx].id}
+ );
+ }
if (!c.accepted)
+ {
ArrayFun.remove(this.challenges, ch => ch.id == c.id);
+ if (c.type == "corr")
+ {
+ ajax(
+ "/challenges",
+ "DELETE",
+ {id: this.challenges[cIdx].id}
+ );
+ }
+ }
}
},
- // c.type == corr alors use id...sinon sid (figés)
- // NOTE: only for live games ?
- launchGame: function(c) {
+ // NOTE: for live games only (corr games are launched on server)
+ launchGame: async function(c) {
// Just assign colors and pass the message
const vname = this.getVname(c.vid);
const vModule = await import("@/variants/" + vname + ".js");
window.V = vModule.VariantRules;
let players = [c.from];
Array.prototype.push.apply(players, c.seats);
- let gameInfo =
+ // These game informations will be sent to other players
+ const gameInfo =
{
+ gameId: getRandString(),
fen: c.fen || V.GenRandInitFen(),
- // Shuffle players order (white then black then other colors).
// Players' names may be required if game start when a player is offline
- players: shuffle(players).map(p => {name:p.name, sid:p.sid},
+ // Shuffle players order (white then black then other colors).
+ players: shuffle(players.map(p => { return {name:p.name, sid:p.sid} })),
vid: c.vid,
timeControl: c.timeControl,
};
ArrayFun.remove(this.challenges, ch => ch.id == c.id);
this.newGame(gameInfo); //also!
},
- // NOTE: for live games only (corr games are laucnhed on server)
+ // NOTE: for live games only (corr games are launched on server)
newGame: function(gameInfo) {
- // Extract times (in [milli]seconds), set clocks, store in localStorage
- const tc = extractTime(gameInfo.timeControl);
- dddddddd
- // TODO: [in game] send move + elapsed time (in milliseconds); in case of "lastate" message too
- // //setStorage(game); //TODO
-// if (this.settings.sound >= 1)
-// new Audio("/sounds/newgame.mp3").play().catch(err => {});
+ GameStorage.init({
+ gameId: gameInfo.gameId,
+ vname: this.getVname(gameInfo.vid),
+ fenStart: gameInfo.fen,
+ players: gameInfo.players,
+ timeControl: gameInfo.timeControl,
+ });
+ if (this.st.settings.sound >= 1)
+ new Audio("/sounds/newgame.mp3").play().catch(err => {});
+ // TODO: redirect to game
},
},
};