+ // Helpers:
+ cadenceFocusIfOpened: function() {
+ if (event.target.checked)
+ document.getElementById("cadence").focus();
+ },
+ send: function(code, obj) {
+ if (this.conn) {
+ this.conn.send(JSON.stringify(Object.assign({ code: code }, obj)));
+ }
+ },
+ getVname: function(vid) {
+ const variant = this.st.variants.find(v => v.id == vid);
+ // this.st.variants might be uninitialized (variant == null)
+ return variant ? variant.name : "";
+ },
+ filterChallenges: function(type) {
+ return this.challenges.filter(c => c.type == type);
+ },
+ filterGames: function(type) {
+ return this.games.filter(g => g.type == type);
+ },
+ classifyObject: function(o) {
+ //challenge or game
+ return o.cadence.indexOf("d") === -1 ? "live" : "corr";
+ },
+ setDisplay: function(letter, type, e) {
+ this[letter + "display"] = type;
+ localStorage.setItem(
+ "type-" + (letter == "c" ? "challenges" : "games"),
+ type
+ );
+ let elt = e
+ ? e.target
+ : document.getElementById("btn" + letter.toUpperCase() + type);
+ elt.classList.add("active");
+ elt.classList.remove("somethingnew"); //in case of
+ if (elt.previousElementSibling)
+ elt.previousElementSibling.classList.remove("active");
+ else elt.nextElementSibling.classList.remove("active");
+ },
+ isGamer: function(sid) {
+ return this.people[sid].pages.some(p => p.indexOf("/game/") >= 0);
+ },
+ getActionLabel: function(sid) {
+ return this.people[sid].pages.some(p => p == "/")
+ ? "Challenge"
+ : "Observe";
+ },
+ challOrWatch: function(sid) {
+ if (this.people[sid].pages.some(p => p == "/")) {
+ // Available, in Hall
+ this.newchallenge.to = this.people[sid].name;
+ document.getElementById("modalPeople").checked = false;
+ window.doClick("modalNewgame");
+ } else {
+ // In some game, maybe playing maybe not: show a random one
+ let gids = [];
+ this.people[sid].pages.forEach(p => {
+ const matchGid = p.match(/[a-zA-Z0-9]+$/);
+ if (matchGid) gids.push(matchGid[0]);
+ });
+ const gid = gids[Math.floor(Math.random() * gids.length)];
+ const game = this.games.find(g => g.id == gid);
+ if (game) this.showGame(game);
+ else this.$router.push("/game/" + gid); //game vs. me
+ }
+ },
+ showGame: function(g) {
+ // NOTE: we are an observer, since only games I don't play are shown here
+ // ==> Moves sent by connected remote player(s) if live game
+ let url = "/game/" + g.id;
+ if (g.type == "live")
+ url += "?rid=" + g.rids[Math.floor(Math.random() * g.rids.length)];
+ this.$router.push(url);
+ },
+ resetChatColor: function() {
+ // TODO: this is called twice, once on opening an once on closing
+ document.getElementById("peopleBtn").classList.remove("somethingnew");
+ },
+ processChat: function(chat) {
+ this.send("newchat", { data: chat });
+ },
+ // Messaging center: