X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fviews%2FHall.vue;h=bbff9b951f14625ad8930facb44bb7134e739d94;hb=29ced362f46ae68e4314985bf836b3adeba23f32;hp=38ec2b302759f75e0e223f192f33c67d7157b295;hpb=a0c41e7e23c9ff64031739e072f38e493bac8dca;p=vchess.git diff --git a/client/src/views/Hall.vue b/client/src/views/Hall.vue index 38ec2b30..bbff9b95 100644 --- a/client/src/views/Hall.vue +++ b/client/src/views/Hall.vue @@ -18,7 +18,7 @@ main :selected="newchallenge.vid==v.id") | {{ v.name }} fieldset - label(for="timeControl") {{ st.tr["Time control"] }} * + label(for="timeControl") {{ st.tr["Cadence"] }} * div#predefinedTimeControls button 3+2 button 5+3 @@ -163,7 +163,7 @@ export default { })); } ); - // Also ask for corr challenges (open + sent to me) + // Also ask for corr challenges (open + sent by/to me) ajax( "/challenges", "GET", @@ -171,24 +171,44 @@ export default { response => { // Gather all senders names, and then retrieve full identity: // (TODO [perf]: some might be online...) - const uids = response.challenges.map(c => { return c.uid }); - ajax("/users", - "GET", - { ids: uids.join(",") }, - response2 => { - let names = {}; - response2.users.forEach(u => {names[u.id] = u.name}); - this.challenges = this.challenges.concat( - response.challenges.map(c => { - // (just players names in fact) - const from = {name: names[c.uid], id: c.uid}; - const type = this.classifyObject(c); - const vname = this.getVname(c.vid); - return Object.assign({}, c, {type: type, vname: vname, from: from}); - }) - ) - } - ); + let names = {}; + response.challenges.forEach(c => { + if (c.uid != this.st.user.id) + names[c.uid] = ""; //unknwon for now + else if (!!c.target && c.target != this.st.user.id) + names[c.target] = ""; + }); + const addChallenges = (newChalls) => { + names[this.st.user.id] = this.st.user.name; //in case of + this.challenges = this.challenges.concat( + response.challenges.map(c => { + const from = {name: names[c.uid], id: c.uid}; //or just name + const type = this.classifyObject(c); + const vname = this.getVname(c.vid); + return Object.assign({}, + { + type: type, + vname: vname, + from: from, + to: (!!c.target ? names[c.target] : ""), + }, + c); + }) + ); + }; + if (names !== {}) + { + ajax("/users", + "GET", + { ids: Object.keys(names).join(",") }, + response2 => { + response2.users.forEach(u => {names[u.id] = u.name}); + addChallenges(); + } + ); + } + else + addChallenges(); } ); // 0.1] Ask server for room composition: @@ -229,7 +249,6 @@ export default { return this.games.filter(g => g.type == type); }, classifyObject: function(o) { //challenge or game - // Heuristic: should work for most cases... (TODO) return (o.timeControl.indexOf('d') === -1 ? "live" : "corr"); }, showGame: function(g) { @@ -357,14 +376,18 @@ export default { if (cIdx >= 0) { const c = this.challenges[cIdx]; - if (!!c.to) - { - // Only share targeted challenges to the targets: - const toSid = Object.keys(this.people).find(k => - this.people[k].name == c.to); - if (toSid != data.from) - return; - } + // TODO: code below requires "c.to" to have given his identity, + // but it can happen that the identity arrives later, which + // prevent him from receiving the challenge. + // ==> Filter later (when receiving challenge) +// if (!!c.to) +// { +// // Only share targeted challenges to the targets: +// const toSid = Object.keys(this.people).find(k => +// this.people[k].name == c.to); +// if (toSid != data.from) +// return; +// } const myChallenge = { // Minimal challenge informations: (from not required) @@ -373,6 +396,7 @@ export default { fen: c.fen, vid: c.vid, timeControl: c.timeControl, + added: c.added, }; this.st.conn.send(JSON.stringify({code:"challenge", chall:myChallenge, target:data.from})); @@ -382,13 +406,16 @@ export default { case "challenge": { // Receive challenge from some player (+sid) - let newChall = data.chall; - newChall.type = this.classifyObject(data.chall); - newChall.from = - Object.assign({sid:data.from}, this.people[data.from]); - newChall.added = Date.now(); //TODO: this is reception timestamp, not creation - newChall.vname = this.getVname(newChall.vid); - this.challenges.push(newChall); + // NOTE about next condition: see "askchallenge" case. + if (!data.chall.to || data.chall.to == this.st.user.name) + { + let newChall = data.chall; + newChall.type = this.classifyObject(data.chall); + newChall.from = + Object.assign({sid:data.from}, this.people[data.from]); + newChall.vname = this.getVname(newChall.vid); + this.challenges.push(newChall); + } break; } case "game": @@ -397,23 +424,25 @@ export default { // NOTE: it may be correspondance (if newgame while we are connected) // If duplicate found: select rid (remote ID) at random let game = this.games.find(g => g.id == data.game.id); - if (!!game && Math.random() < 0.5) - game.rid = data.from; + if (!!game) + { + if (Math.random() < 0.5) + game.rid = data.from; + } else { let newGame = data.game; newGame.type = this.classifyObject(data.game); newGame.vname = this.getVname(data.game.vid); newGame.rid = data.from; - newGame.score = "*"; + if (!data.game.score) + newGame.score = "*"; this.games.push(newGame); } break; } case "newgame": { - // TODO: next line required ?! - //ArrayFun.remove(this.challenges, c => c.id == data.cid); // New game just started: data contain all information if (this.classifyObject(data.gameInfo) == "live") this.startNewGame(data.gameInfo); @@ -455,7 +484,7 @@ export default { this.st.conn.send(JSON.stringify({code:"askgame", target:data.from})); break; case "disconnect": - case "pdisconnect": + case "gdisconnect": this.$delete(this.people, data.from); if (data.code == "disconnect") { @@ -480,21 +509,24 @@ export default { this.newchallenge.to = this.people[sid].name; doClick("modalNewgame"); }, - challOrWatch: function(sid, e) { - switch (e.target.innerHTML) + challOrWatch: function(sid) { + if (!this.people[sid].gamer) { - case "Available": - this.tryChallenge(sid); - break; - case "Playing": - this.showGame(this.games.find( - g => g.players.some(pl => pl.sid == sid || pl.uid == this.people[sid].id))); - break; - }; + // Available, in Hall + this.tryChallenge(sid); + } + else + { + // Playing, in Game + this.showGame(this.games.find( + g => g.players.some(pl => pl.sid == sid || pl.uid == this.people[sid].id))); + } }, newChallenge: async function() { if (this.newchallenge.vid == "") return alert(this.st.tr["Please select a variant"]); + if (!!this.newchallenge.to && this.newchallenge.to == this.st.user.name) + return alert(this.st.tr["Self-challenge is forbidden"]); const vname = this.getVname(this.newchallenge.vid); const vModule = await import("@/variants/" + vname + ".js"); window.V = vModule.VariantRules; @@ -515,9 +547,9 @@ export default { {chall:chall}, !!warnDisconnected); if (!isSent) return; - // Remove old challenge if any (only one at a time): + // Remove old challenge if any (only one at a time of a given type): const cIdx = this.challenges.findIndex(c => - c.from.sid == this.st.user.sid && c.type == ctype); + (c.from.sid == this.st.user.sid || c.from.id == this.st.user.id) && c.type == ctype); if (cIdx >= 0) { // Delete current challenge (will be replaced now) @@ -614,7 +646,7 @@ export default { // In all cases, the challenge is consumed: ArrayFun.remove(this.challenges, ch => ch.id == c.id); }, - // NOTE: when launching game, the challenge is already deleted + // NOTE: when launching game, the challenge is already being deleted launchGame: async function(c) { const vModule = await import("@/variants/" + c.vname + ".js"); window.V = vModule.VariantRules;