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/gameStorage";
+import { extractTime } from "@/utils/timeControl";
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
},
};
return playerList;
},
},
- watch: {
- // Watch event "user infos retrieved" (through /whoami)
- "st.user.id": function(newId) {
- if (newId > 0) //should always be the case
- {
- // Ask server for current corr games (all but mines)
- // ajax(
- // "/games",
- // "GET",
- // {excluded: this.st.user.id},
- // 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);
- }
- );
- }
- },
- },
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 => {
+// 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"}));
}
case "askgame":
{
- // Send my current live game (if any)
- 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 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}));
+// }
break;
}
case "identity":
{
// 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;
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) {
+
+ console.log("click challenge");
+ console.log(c);
+
if (!!c.accepted)
{
this.st.conn.send(JSON.stringify({code: "withdrawchallenge",
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 => { return {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,
};
},
// NOTE: for live games only (corr games are launched on server)
newGame: function(gameInfo) {
- localStorage["gid"] = getRandString();
- // Extract times (in [milli]seconds), set clocks, store in localStorage
+ // Extract times (in [milli]seconds), set clocks
const tc = extractTime(gameInfo.timeControl);
- localStorage["timeControl"] = gameInfo.timeControl;
- localStorage["clocks"] = JSON.stringify(
- [...Array(gameInfo.players.length)].fill(tc.mainTime));
- localStorage["increment"] = tc.increment;
- localStorage["started"] = JSON.stringify(
- [...Array(gameInfo.players.length)].fill(false));
- localStorage["mysid"] = this.st.user.sid;
- localStorage["vname"] = this.getVname(gameInfo.vid);
- localStorage["fenInit"] = gameInfo.fen;
- localStorage["players"] = JSON.stringify(gameInfo.players);
+ let initime = [...Array(gameInfo.players.length)];
+ initime[0] = Date.now();
+ const game =
+ {
+ // Game infos: constant
+ gameId: gameInfo.gameId,
+ vname: this.getVname(gameInfo.vid),
+ fenStart: gameInfo.fen,
+ players: gameInfo.players,
+ timeControl: gameInfo.timeControl,
+ increment: tc.increment,
+ mode: "live", //function for live games only
+ // Game state: will be updated
+ fen: gameInfo.fen,
+ moves: [],
+ clocks: [...Array(gameInfo.players.length)].fill(tc.mainTime),
+ initime: initime,
+ score: "*",
+ };
+ GameStorage.add(game);
if (this.st.settings.sound >= 1)
new Audio("/sounds/newgame.mp3").play().catch(err => {});
+ // TODO: redirect to game
},
},
};
<style lang="sass">
// TODO
</style>
+
+<!--
+// TODO:
+// Remove duplicates if several players of one game send their game info (Hall)
+// When click on it, assign a random rid among online players (max. 4).
+-->