X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fclient_OLD%2Fjavascripts%2Fcomponents%2Froom.js;fp=client%2Fclient_OLD%2Fjavascripts%2Fcomponents%2Froom.js;h=fbf02ee189904273792d41bcc9dab3f11caf7237;hb=625022fdcf750f0aff8fcd699f7e9b89730e1d10;hp=0000000000000000000000000000000000000000;hpb=b955c65b942d09d24b5c3bed0d755d4f2f8f71f1;p=vchess.git diff --git a/client/client_OLD/javascripts/components/room.js b/client/client_OLD/javascripts/components/room.js new file mode 100644 index 00000000..fbf02ee1 --- /dev/null +++ b/client/client_OLD/javascripts/components/room.js @@ -0,0 +1,158 @@ +// main playing hall: chat + online players + current challenges + button "new game" +// TODO: my-challenge-list, gérant clicks sur challenges, affichage, réception/émission des infos sur challenges ; de même, my-player-list +// TODO: si on est en train de jouer une partie, le notifier aux nouveaux connectés +/* +TODO: surligner si nouveau défi perso et pas affichage courant +(cadences base + incrément, corr == incr >= 1jour ou base >= 7j) +--> correspondance: stocker sur serveur lastMove + uid + color + movesCount + gameId + variant + timeleft +fin de partie corr: supprimer partie du serveur au bout de 7 jours (arbitraire) +main time should be positive (no 0+2 & cie...) +*/ +// TODO: au moins l'échange des coups en P2P ? +// TODO: objet game, objet challenge ? et player ? +Vue.component('my-room', { + props: ["conn","settings"], + data: function () { + return { + gdisplay: "live", + user: user, + liveGames: [], + corrGames: [], + players: [], //online players + challenges: [], //live challenges + people: [], //people who connect to this room (or disconnect) + }; + }, + // Modal new game, and then sub-components + template: ` +
+ +
+
+ +

+ {{ translate("Game state (FEN):") }} +

+ +

TODO: cadence, adversaire (pre-filled if click on name)

+

cadence 2m+12s ou 7d+1d (m,s ou d,d) --> main, increment

+

Note: leave FEN blank for random; FEN only for targeted challenge

+ +
+
+
+ + + +
+ +
+
+

Online players

+
+ {{ p.name }} +
+
+
+ + +
+ + + + +
+
+ `, + created: function() { + // TODO: ask server for current corr games (all but mines: names, ID, time control) + const socketMessageListener = msg => { + const data = JSON.parse(msg.data); + switch (data.code) + { + case "newgame": + // TODO: new game just started: data contain all informations + // (id, players, time control, fenStart ...) + break; + // TODO: also receive live games summaries (update) + // (just players names, time control, and ID + player ID) + case "acceptchallenge": + // oppid: opponent socket ID (or DB id if registered) + if (true) //TODO: if challenge is full + this.newGame(data.challenge, data.user); //user.id et user.name + break; + case "withdrawchallenge": + // TODO + break; + case "cancelchallenge": + // TODO + break; + // TODO: distinguish these (dis)connect events from their analogs in game.js + case "connect": + this.players.push({name:data.name, id:data.uid}); + break; + case "disconnect": + const pIdx = this.players.findIndex(p => p.id == data.uid); + this.players.splice(pIdx); + break; + } + }; + const socketCloseListener = () => { + this.conn.addEventListener('message', socketMessageListener); + this.conn.addEventListener('close', socketCloseListener); + }; + this.conn.onmessage = socketMessageListener; + this.conn.onclose = socketCloseListener; + }, + methods: { + translate: translate, + showGame: function(game) { + let hash = "#game?id=" + game.id; + if (!!game.uid) + hash += "&uid=" + game.uid; + location.hash = hash; + }, + challenge: function(player) { + this.conn.send(JSON.stringify({code:"sendchallenge", oppid:p.id, + user:{name:user.name,id:user.id}})); + }, + clickChallenge: function(challenge) { + const index = this.challenges.findIndex(c => c.id == challenge.id); + const toIdx = challenge.to.findIndex(p => p.id == user.id); + const me = {name:user.name,id:user.id}; + if (toIdx >= 0) + { + // It's a multiplayer challenge I accepted: withdraw + this.conn.send(JSON.stringify({code:"withdrawchallenge", + cid:challenge.id, user:me})); + this.challenges.to.splice(toIdx, 1); + } + else if (challenge.from.id == user.id) //it's my challenge: cancel it + { + this.conn.send(JSON.stringify({code:"cancelchallenge", cid:challenge.id})); + this.challenges.splice(index, 1); + } + else //accept a challenge + { + this.conn.send(JSON.stringify({code:"acceptchallenge", + cid:challenge.id, user:me})); + this.challenges[index].to.push(me); + } + }, + // user: last person to accept the challenge + newGame: function(chall, user) { + const fen = chall.fen || V.GenRandInitFen(); + const game = {}; //TODO: fen, players, time ... + //setStorage(game); //TODO + game.players.forEach(p => { + this.conn.send( + JSON.stringify({code:"newgame", oppid:p.id, game:game})); + }); + if (this.settings.sound >= 1) + new Audio("/sounds/newgame.mp3").play().catch(err => {}); + }, + }, +});