-
-
+// TODO: rename file "timeControl.js" in utils/
function timeUnitToSeconds(value, unit)
{
let seconds = value;
|| (unit1 == 'm' && unit2 == 's');
}
-export function checkChallenge(c)
+export function extractTime(timeControl)
{
- const vid = parseInt(c.vid);
- if (isNaN(vid) || vid <= 0)
- return "Please select a variant";
-
- const tcParts = c.timeControl.replace(/ /g,"").split('+');
- const mainTime = tcParts[0].match(/([0-9]+)([smhd])/);
- if (!mainTime)
- return "Wrong time control";
- const mainTimeValue = parseInt(mainTime[1]);
- const mainTimeUnit = mainTime[2];
- if (isNaN(mainTimeValue) || mainTimeValue <= 0)
- return "Main time should be strictly positive";
- c.mainTime = timeUnitToSeconds(mainTimeValue, mainTimeUnit);
+ const tcParts = timeControl.replace(/ /g,"").split('+');
+ const mainTimeArray = tcParts[0].match(/([0-9]+)([smhd])/);
+ if (!mainTimeArray)
+ return null;
+ const mainTimeValue = parseInt(mainTimeArray[1]);
+ const mainTimeUnit = mainTimeArray[2];
+ const mainTime = timeUnitToSeconds(mainTimeValue, mainTimeUnit);
+ let increment = 0;
if (tcParts.length >= 2)
{
const increment = tcParts[1].match(/([0-9]+)([smhd])/);
if (!increment)
- return "Wrong time control";
+ return null;
const incrementValue = parseInt(increment[1]);
const incrementUnit = increment[2];
+ // Increment unit cannot be larger than main unit:
if (isLargerUnit(incrementUnit, mainTimeUnit))
- return "Increment unit cannot be larger than main unit";
- if (isNaN(incrementValue) || incrementValue < 0)
- return "Increment must be positive";
- c.increment = timeUnitToSeconds(incrementValue, incrementUnit);
+ return null;
+ increment = timeUnitToSeconds(incrementValue, incrementUnit);
}
- else
- c.increment = 0;
+ return {mainTime:mainTime, increment:increment};
+}
+
+// TODO: put this in Hall.vue
+export function checkChallenge(c)
+{
+ const vid = parseInt(c.vid);
+ if (isNaN(vid) || vid <= 0)
+ return "Please select a variant";
+
+ const tc = extractTime(c.timeControl);
+ if (!tc)
+ return "Wrong time control";
// Basic alphanumeric check for players names
let playerCount = 0;
if (!V.IsGoodFen(c.fen))
return "Bad FEN string";
}
- else //generate a FEN
- c.fen = V.GenRandInitFen();
}
import { checkChallenge } from "@/data/challengeCheck";
import { ArrayFun } from "@/utils/array";
import { ajax } from "@/utils/ajax";
+import { genRandString } from "@/utils/alea";
import GameList from "@/components/GameList.vue";
import ChallengeList from "@/components/ChallengeList.vue";
export default {
// if (this.settings.sound >= 1)
// new Audio("/sounds/newgame.mp3").play().catch(err => {});
// },
+ // Load a variant file (TODO: should probably be global)
+ loadVariant: async function(vid, variantArray) {
+ const idxInVariants = variantArray.findIndex(v => v.id == vid);
+ const vname = variantArray[idxInVariants].name;
+ const vModule = await import("@/variants/" + vname + ".js");
+ window.V = vModule.VariantRules;
+ return vname;
+ },
// Send new challenge (corr or live, cf. time control), with button or click on player
newChallenge: async function() {
if (this.challenges.some(c => c.from.sid == this.st.user.sid))
document.getElementById("modalNewgame").checked = false;
return alert("You already have a pending challenge");
}
- const idxInVariants =
- this.st.variants.findIndex(v => v.id == this.newchallenge.vid);
- const vname = this.st.variants[idxInVariants].name;
- const vModule = await import("@/variants/" + vname + ".js");
- window.V = vModule.VariantRules;
+ // TODO: put this "load variant" block elsewhere
+ const vname = this.loadVariant(this.newchallenge.vid, this.st.variants);
// checkChallenge side-effect = set FEN, and mainTime + increment in seconds
// TODO: should not be a side-effect but set here ; for received server challenges we do not have mainTime+increment
const error = checkChallenge(this.newchallenge);
if (!!error)
return alert(error);
+// TODO: set FEN, set mainTime and increment ?!
+else //generate a FEN
+ c.fen = V.GenRandInitFen();
// Less than 3 days ==> live game (TODO: heuristic... 40 moves also)
const liveGame =
this.newchallenge.mainTime + 40 * this.newchallenge.increment < 3*24*60*60;
p.sid = this.players[pIdx].sid;
}
}
- const finishAddChallenge = () => {
+ const finishAddChallenge = (cid) => {
+ chall.id = cid || "c" + genRandString();
this.challenges.push(chall);
// Send challenge to peers
let challSock =
}
document.getElementById("modalNewgame").checked = false;
};
-
-
- // TODO: challenges all have IDs: "c" + genRandString()
-
-
if (liveGame)
{
// Live challenges have cid = 0