+ getRandomnessClass: function(pc) {
+ return {
+ ["random-" + pc.randomness]: true
+ };
+ },
+ visibilityChange: function() {
+ // TODO: Use document.hidden? https://webplatform.news/issues/2019-03-27
+ this.send(
+ document.visibilityState == "visible"
+ ? "getfocus"
+ : "losefocus"
+ );
+ },
+ partialResetNewchallenge: function() {
+ // Reset potential target and custom FEN:
+ this.newchallenge.to = "";
+ this.newchallenge.fen = "";
+ this.newchallenge.diag = "";
+ this.newchallenge.memorize = false;
+ },
+ showNewchallengeForm: function() {
+ this.partialResetNewchallenge();
+ window.doClick("modalNewgame");
+ },
+ addPresetChall: function(chall) {
+ // Add only if not already existing:
+ if (this.presetChalls.some(c =>
+ c.vid == chall.vid &&
+ c.cadence == chall.cadence &&
+ c.randomness == chall.randomness
+ )) {
+ return;
+ }
+ const L = this.presetChalls.length;
+ this.presetChalls.push({
+ index: L,
+ vid: chall.vid,
+ vname: chall.vname, //redundant, but easier
+ cadence: chall.cadence,
+ randomness: chall.randomness
+ });
+ localStorage.setItem("presetChalls", JSON.stringify(this.presetChalls));
+ },
+ removePresetChall: function(e, pchall) {
+ e.stopPropagation();
+ const pchallIdx = this.presetChalls.findIndex(pc => pc.index == pchall.index);
+ this.presetChalls.splice(pchallIdx, 1);
+ localStorage.setItem("presetChalls", JSON.stringify(this.presetChalls));
+ },
+ tchallButtonsMargin: function() {
+ if (!!this.curChallToAccept.fen) return { "margin-top": "10px" };
+ return {};
+ },
+ 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) {
+ // 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.focus && p.path.indexOf("/game/") >= 0);
+ },
+ isFocusedOnHall: function(sid) {
+ return (
+ // This is meant to challenge people, thus the next 2 conditions:
+ this.st.user.id > 0 &&
+ sid != this.st.user.sid &&
+ this.people[sid].pages.some(p => p.path == "/" && p.focus)
+ );
+ },
+ challenge: function(sid) {
+ this.partialResetNewchallenge();
+ // Available, in Hall
+ this.newchallenge.to = this.people[sid].name;
+ // TODO: also store target sid to not re-search for it
+ document.getElementById("modalPeople").checked = false;
+ window.doClick("modalNewgame");
+ },
+ watchGame: function(sid) {
+ // In some game, maybe playing maybe not: show a random one
+ let gids = [];
+ this.people[sid].pages.forEach(p => {
+ if (p.focus) {
+ const matchGid = p.path.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);
+ },
+ resetSocialColor: 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 });
+ },
+ getOppsid: function(c) {
+ let oppsid = c.from.sid; //may not be defined if corr + offline opp
+ if (!oppsid) {
+ oppsid = Object.keys(this.people).find(
+ sid => this.people[sid].id == c.from.id
+ );
+ }
+ return oppsid;
+ },
+ // Messaging center: