ui: Prepare ui for public interface

This commit is contained in:
nemunaire 2021-09-09 18:20:03 +02:00
commit 56d8d49304
7 changed files with 118 additions and 27 deletions

View file

@ -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 !";
}
}
}

View file

@ -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>