Commit | Line | Data |
---|---|---|
9d58ef95 BA |
1 | |
2 | ||
3 | function timeUnitToSeconds(value, unit) | |
4 | { | |
5 | let seconds = value; | |
6 | switch (unit) | |
7 | { | |
8 | case 'd': | |
9 | seconds *= 24; | |
10 | case 'h': | |
11 | seconds *= 60; | |
12 | case 'm': | |
13 | seconds *= 60; | |
14 | } | |
15 | return seconds; | |
16 | } | |
17 | ||
18 | function isLargerUnit(unit1, unit2) | |
19 | { | |
20 | return (unit1 == 'd' && unit2 != 'd') | |
21 | || (unit1 == 'h' && ['s','m'].includes(unit2)) | |
22 | || (unit1 == 'm' && unit2 == 's'); | |
23 | } | |
24 | ||
25 | export function checkChallenge(c) | |
ab4f4bf2 BA |
26 | { |
27 | const vid = parseInt(c.vid); | |
28 | if (isNaN(vid) || vid <= 0) | |
29 | return "Please select a variant"; | |
30 | ||
9d58ef95 BA |
31 | const tcParts = c.timeControl.replace(/ /g,"").split('+'); |
32 | const mainTime = tcParts[0].match(/([0-9]+)([smhd])/); | |
33 | if (!mainTime) | |
34 | return "Wrong time control"; | |
35 | const mainTimeValue = parseInt(mainTime[1]); | |
36 | const mainTimeUnit = mainTime[2]; | |
37 | if (isNaN(mainTimeValue) || mainTimeValue <= 0) | |
ab4f4bf2 | 38 | return "Main time should be strictly positive"; |
9d58ef95 BA |
39 | c.mainTime = timeUnitToSeconds(mainTimeValue, mainTimeUnit); |
40 | if (tcParts.length >= 2) | |
41 | { | |
42 | const increment = tcParts[1].match(/([0-9]+)([smhd])/); | |
43 | if (!increment) | |
44 | return "Wrong time control"; | |
45 | const incrementValue = parseInt(increment[1]); | |
46 | const incrementUnit = increment[2]; | |
47 | if (isLargerUnit(incrementUnit, mainTimeUnit)) | |
48 | return "Increment unit cannot be larger than main unit"; | |
49 | if (isNaN(incrementValue) || incrementValue < 0) | |
50 | return "Increment must be positive"; | |
51 | c.increment = timeUnitToSeconds(incrementValue, incrementUnit); | |
52 | } | |
ab4f4bf2 BA |
53 | |
54 | // Basic alphanumeric check for players names | |
55 | let playerCount = 0; | |
56 | for (p of c.players) | |
57 | { | |
74ea2e8d | 58 | if (p.name.length > 0) |
ab4f4bf2 | 59 | { |
9d58ef95 | 60 | // TODO: slightly redundant (see data/userCheck.js) |
74ea2e8d | 61 | if (!p.name.match(/^[\w]+$/)) |
ab4f4bf2 BA |
62 | return "Wrong characters in players names"; |
63 | playerCount++; | |
64 | } | |
65 | } | |
66 | ||
74ea2e8d | 67 | if (playerCount > 0 && playerCount != c.nbPlayers-1) |
ab4f4bf2 BA |
68 | return "None, or all of the opponent names must be filled" |
69 | ||
9d58ef95 BA |
70 | // Allow custom FEN (and check it) only for individual challenges |
71 | if (c.fen.length > 0 && playerCount > 0) | |
72 | { | |
73 | if (!V.IsGoodFen(c.fen)) | |
74 | return "Bad FEN string"; | |
75 | } | |
76 | else //generate a FEN | |
77 | c.fen = V.GenRandInitFen(); | |
ab4f4bf2 | 78 | } |