ui: Prepare ui for public interface
This commit is contained in:
parent
d010b86fa0
commit
56d8d49304
7 changed files with 118 additions and 27 deletions
|
|
@ -12,6 +12,10 @@
|
|||
Spinner,
|
||||
} from 'sveltestrap';
|
||||
|
||||
import { blake2b } from 'hash-wasm';
|
||||
|
||||
import { my } from '../stores/my.js';
|
||||
|
||||
import DateFormat from './DateFormat.svelte';
|
||||
import FlagKey from './FlagKey.svelte';
|
||||
import FlagMCQ from './FlagMCQ.svelte';
|
||||
|
|
@ -36,42 +40,89 @@
|
|||
})
|
||||
}
|
||||
|
||||
export let forcesolved = false;
|
||||
let responses = { };
|
||||
async function submitFlags() {
|
||||
submitInProgress = true;
|
||||
sberr = "";
|
||||
message = "";
|
||||
|
||||
const response = await fetch(
|
||||
"submit/" + exercice.id,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {'Accept': 'application/json'},
|
||||
body: JSON.stringify(responses),
|
||||
}
|
||||
)
|
||||
if ($my && $my.team_id === 0) {
|
||||
let allGoodResponse = true;
|
||||
for (const f in flags) {
|
||||
const flag = flags[f];
|
||||
|
||||
let soluce = "";
|
||||
if (flag.type == "mcq") {
|
||||
for (const c in flag.choices) {
|
||||
soluce += responses.mcqs[c] ? "t" : "f";
|
||||
}
|
||||
} else {
|
||||
soluce = responses.flags[flag.id];
|
||||
}
|
||||
|
||||
if (flag.ignore_case) {
|
||||
soluce = soluce.toLowerCase();
|
||||
}
|
||||
|
||||
if (flag.validator_regexp) {
|
||||
let re = new RegExp(flag.validator_regexp, flag.ignore_case?'i':'');
|
||||
soluce = soluce.match(re).slice(1).join("+");
|
||||
}
|
||||
|
||||
if (await blake2b(soluce) == flag.soluce) {
|
||||
flags[f].found = new Date();
|
||||
} else if (!flag.found) {
|
||||
allGoodResponse = false;
|
||||
}
|
||||
flags = flags;
|
||||
}
|
||||
|
||||
if (allGoodResponse) {
|
||||
forcesolved = true;
|
||||
}
|
||||
|
||||
if (exercice.tries) {
|
||||
exercice.tries += 1;
|
||||
} else {
|
||||
exercice.tries = 1;
|
||||
}
|
||||
exercice.solved_time = new Date();
|
||||
exercice = exercice;
|
||||
|
||||
if (response.status < 300) {
|
||||
const data = await response.json();
|
||||
messageClass = 'text-success';
|
||||
message = data.errmsg;
|
||||
waitDiff(20);
|
||||
} else {
|
||||
submitInProgress = false;
|
||||
} else {
|
||||
const response = await fetch(
|
||||
"submit/" + exercice.id,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {'Accept': 'application/json'},
|
||||
body: JSON.stringify(responses),
|
||||
}
|
||||
)
|
||||
|
||||
messageClass = 'text-danger';
|
||||
|
||||
let data = "";
|
||||
try {
|
||||
data = await response.json();
|
||||
} catch(e) {
|
||||
data = null;
|
||||
}
|
||||
|
||||
if (data && data.errmsg)
|
||||
if (response.status < 300) {
|
||||
const data = await response.json();
|
||||
messageClass = 'text-success';
|
||||
message = data.errmsg;
|
||||
if (response.statys != 402)
|
||||
sberr = "Oups !";
|
||||
waitDiff(20);
|
||||
} else {
|
||||
submitInProgress = false;
|
||||
|
||||
messageClass = 'text-danger';
|
||||
|
||||
let data = "";
|
||||
try {
|
||||
data = await response.json();
|
||||
} catch(e) {
|
||||
data = null;
|
||||
}
|
||||
|
||||
if (data && data.errmsg)
|
||||
message = data.errmsg;
|
||||
if (response.statys != 402)
|
||||
sberr = "Oups !";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,11 @@
|
|||
})
|
||||
}
|
||||
|
||||
function showHint(hint) {
|
||||
hint.hidden = false;
|
||||
hints = hints; // Force Svelte update
|
||||
}
|
||||
|
||||
async function openHint(hint) {
|
||||
hints_submitted[hint.id] = true;
|
||||
hinterror = "";
|
||||
|
|
@ -122,7 +127,7 @@
|
|||
</button>
|
||||
{/if}
|
||||
{#if !hint.file && hint.hidden}
|
||||
<button type="button" ng-click="hint.hidden = false;" class="btn btn-info">
|
||||
<button type="button" on:click={() => showHint(hint)} class="btn btn-info">
|
||||
<Icon name="lock" aria-hidden="true" />
|
||||
Afficher
|
||||
</button>
|
||||
|
|
|
|||
Reference in a new issue