- human readable to unix timestamp conversion in clion code added
- test-related request block redesigned - elvis operator replaced with the more adequate null coalescing one
This commit is contained in:
parent
68b9310069
commit
59e113333a
@ -90,7 +90,7 @@ function get_all_games()
|
||||
|
||||
function patch_up_game_data(array &$game_data)
|
||||
{
|
||||
$game_version = $game_data["version"] ?: 0;
|
||||
$game_version = $game_data["version"] ?? 0;
|
||||
if ($game_version < 2) { // update to game version 2
|
||||
if (!key_exists("public_id", $game_data)) {
|
||||
$game_data["public"] = false;
|
||||
|
@ -15,6 +15,8 @@ const LOGIN_URL = "login.php";
|
||||
const MAIN_URL = "main.php";
|
||||
const SESSION_NAME = "spreadquiz_sid";
|
||||
|
||||
const MISSING_IMAGE_PLACEHOLDER = "media/image-missing_120px.png";
|
||||
|
||||
session_name(SESSION_NAME);
|
||||
|
||||
// autoload session
|
||||
|
@ -63,7 +63,7 @@ function change_group_user_assignments(string $groupid, $nickname_add, $nickname
|
||||
if (count($group_data) != 0) {
|
||||
// --------- UPDATE group assignments (DEV ONLY!)------
|
||||
|
||||
$group_data["editors"] = $group_data["editors"] ?: [];
|
||||
$group_data["editors"] = $group_data["editors"] ?? [];
|
||||
|
||||
// ---------
|
||||
|
||||
|
151
interface.php
151
interface.php
@ -22,7 +22,6 @@ require_once "testmgr.php";
|
||||
|
||||
require_once "controller.php";
|
||||
|
||||
const MISSING_IMAGE_PLACEHOLDER = "media/image-missing_120px.png";
|
||||
function patch_through_image(string $gameid, string $img_url)
|
||||
{
|
||||
$game_dir = get_game_dir_by_gameid($gameid);
|
||||
@ -105,14 +104,14 @@ switch ($action) {
|
||||
break;
|
||||
case "start_or_continue_test":
|
||||
{
|
||||
$gameid = trim($_REQUEST["gameid"] ?: "");
|
||||
$gameid = trim($_REQUEST["gameid"] ?? "");
|
||||
$testid = create_or_continue_test($gameid, $nickname);
|
||||
$result = $testid;
|
||||
}
|
||||
break;
|
||||
case "get_results_overview":
|
||||
{
|
||||
$gameid = trim($_REQUEST["gameid"] ?: "");
|
||||
$gameid = trim($_REQUEST["gameid"] ?? "");
|
||||
$concluded_tests = get_concluded_tests($gameid, $nickname);
|
||||
$overviews = [];
|
||||
foreach ($concluded_tests as $ct) {
|
||||
@ -130,50 +129,56 @@ switch ($action) {
|
||||
}
|
||||
|
||||
// test-related queries
|
||||
$is_a_default_test_with_access = isset($_REQUEST["testid"]) && (($testid = trim($_REQUEST["testid"])) !== "") &&
|
||||
((count($test_data = get_test($testid))) > 0) && (($test_data["nickname"] === $nickname));
|
||||
const TEST_RELATED_ACTIONS = ["get_test", "save_answer", "submit_test"];
|
||||
if (in_array($action, TEST_RELATED_ACTIONS)) {
|
||||
|
||||
$user_is_contributor_or_quizmaster = $is_quizmaster || is_user_contributor_to_game($test_data["gameid"], $nickname);
|
||||
$testid = trim($_REQUEST["testid"] ?? "");
|
||||
$test_data = ($testid !== "") ? get_test($testid) : [];
|
||||
$is_a_default_test_with_access = ($testid !== "") && ((count($test_data)) > 0) && (($test_data["nickname"] === $nickname));
|
||||
|
||||
if ($is_a_default_test_with_access || $user_is_contributor_or_quizmaster) {
|
||||
$user_is_contributor_or_quizmaster = $is_quizmaster || is_user_contributor_to_game($test_data["gameid"], $nickname);
|
||||
|
||||
// update the test if timed
|
||||
update_timed_tests([$test_data]);
|
||||
if ($is_a_default_test_with_access || $user_is_contributor_or_quizmaster) {
|
||||
|
||||
switch ($action) {
|
||||
case "get_test":
|
||||
{
|
||||
$test_data_with_current_time = $test_data;
|
||||
$test_data_with_current_time["current_time"] = time();
|
||||
$result = json_encode($test_data_with_current_time);
|
||||
}
|
||||
break;
|
||||
case "save_answer":
|
||||
{
|
||||
$chidx = $_REQUEST["challenge_index"];
|
||||
$answeridx = $_REQUEST["answer_index"];
|
||||
save_answer($testid, $chidx, $answeridx);
|
||||
}
|
||||
break;
|
||||
case "submit_test":
|
||||
{
|
||||
conclude_test($testid);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
// update the test if timed
|
||||
update_timed_tests([$test_data]);
|
||||
|
||||
// $user_has_access_to_game = does_user_access_game($nickname, $gameid);
|
||||
|
||||
// get_image needs special treatment
|
||||
if ($action === "get_image") {
|
||||
if ($is_a_default_test_with_access || $user_is_contributor_or_quizmaster) { // default case
|
||||
$img_url = trim($_REQUEST["img_url"] ?: "");
|
||||
if ($img_url !== "") {
|
||||
$gameid = $test_data["gameid"];
|
||||
patch_through_image($gameid, $img_url);
|
||||
switch ($action) {
|
||||
case "get_test":
|
||||
{
|
||||
$test_data_with_current_time = $test_data;
|
||||
$test_data_with_current_time["current_time"] = time();
|
||||
$result = json_encode($test_data_with_current_time);
|
||||
}
|
||||
break;
|
||||
case "save_answer":
|
||||
{
|
||||
$chidx = $_REQUEST["challenge_index"];
|
||||
$answeridx = $_REQUEST["answer_index"];
|
||||
save_answer($testid, $chidx, $answeridx);
|
||||
}
|
||||
break;
|
||||
case "submit_test":
|
||||
{
|
||||
conclude_test($testid);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// $user_has_access_to_game = does_user_access_game($nickname, $gameid);
|
||||
|
||||
// get_image needs special treatment
|
||||
if ($action === "get_image") {
|
||||
if ($is_a_default_test_with_access || $user_is_contributor_or_quizmaster) { // default case
|
||||
$img_url = trim($_REQUEST["img_url"] ?? "");
|
||||
if ($img_url !== "") {
|
||||
$gameid = $_REQUEST["gameid"];
|
||||
patch_through_image($gameid, $img_url);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// creator or quizmaster actions
|
||||
@ -188,17 +193,17 @@ switch ($action) {
|
||||
case "update_game":
|
||||
{
|
||||
$update = $action === "update_game";
|
||||
$data = json_decode($_REQUEST["data"], true) ?: [];
|
||||
if (($data === []) || (trim($data["name"] ?: "") === "")) { // no further processing
|
||||
$data = json_decode($_REQUEST["data"], true) ?? [];
|
||||
if (($data === []) || (trim($data["name"] ?? "") === "")) { // no further processing
|
||||
goto print_result; // ~exit...
|
||||
}
|
||||
$gameid = $data["_id"];
|
||||
$name = $data["name"];
|
||||
$description = $data["description"];
|
||||
$contributors = explode_list($data["contributors"] ?: "");
|
||||
$owner = $update ? trim($data["owner"] ?: $nickname) : $nickname;
|
||||
$groups = explode_list($data["groups"] ?: "");
|
||||
$properties = $data["properties"] ?: [];
|
||||
$contributors = explode_list($data["contributors"] ?? "");
|
||||
$owner = $update ? trim($data["owner"] ?? $nickname) : $nickname;
|
||||
$groups = explode_list($data["groups"] ?? "");
|
||||
$properties = $data["properties"] ?? [];
|
||||
|
||||
$groupids = get_groupids_by_compounds($groups); // convert group compounds to _ids
|
||||
|
||||
@ -277,7 +282,7 @@ switch ($action) {
|
||||
$zip->extractTo($game_dir . DIRECTORY_SEPARATOR);
|
||||
|
||||
// search for the CSV table file
|
||||
$csv_files = glob($game_dir . DIRECTORY_SEPARATOR . "*.csv") ?: [];
|
||||
$csv_files = glob($game_dir . DIRECTORY_SEPARATOR . "*.csv") ?? [];
|
||||
if (count($csv_files)) {
|
||||
$challenge_import_status = import_challenges_from_csv($csv_files[0], $gameid);
|
||||
}
|
||||
@ -302,7 +307,7 @@ switch ($action) {
|
||||
break;
|
||||
case "get_challenges":
|
||||
{
|
||||
$gameid = ($_REQUEST["gameid"] ?: "");
|
||||
$gameid = ($_REQUEST["gameid"] ?? "");
|
||||
$game_data = get_game($gameid);
|
||||
if ((count($game_data) > 0) && ($is_quizmaster || (is_user_contributor_to_game($gameid, $requester_nickname)))) {
|
||||
$result = file_get_contents(get_game_file_by_gameid($gameid));
|
||||
@ -311,7 +316,7 @@ switch ($action) {
|
||||
break;
|
||||
case "delete_games":
|
||||
{
|
||||
$gameids = explode_list(trim($_REQUEST["ids"] ?: ""));
|
||||
$gameids = explode_list(trim($_REQUEST["ids"] ?? ""));
|
||||
foreach ($gameids as $gameid) {
|
||||
if (($gameid !== "") && (is_user_owner_of_the_game($gameid, $nickname))) { // only the owner may delete a game
|
||||
delete_game($gameid);
|
||||
@ -321,7 +326,7 @@ switch ($action) {
|
||||
break;
|
||||
case "export_game_file_csv":
|
||||
{
|
||||
$gameid = trim($_REQUEST["gameid"] ?: "");
|
||||
$gameid = trim($_REQUEST["gameid"] ?? "");
|
||||
if (($gameid !== "") && is_user_contributor_to_game($gameid, $nickname)) {
|
||||
$f = tmpfile();
|
||||
header("Content-Type: text/csv");
|
||||
@ -334,9 +339,9 @@ switch ($action) {
|
||||
break;
|
||||
case "get_results_by_gameid":
|
||||
{
|
||||
$gameid = trim($_REQUEST["gameid"] ?: "");
|
||||
$filter = trim($_REQUEST["filter"] ?: "");
|
||||
$ordering = trim($_REQUEST["orderby"] ?: "");
|
||||
$gameid = trim($_REQUEST["gameid"] ?? "");
|
||||
$filter = trim($_REQUEST["filter"] ?? "");
|
||||
$ordering = trim($_REQUEST["orderby"] ?? "");
|
||||
if (($gameid !== "") && (is_user_contributor_to_game($gameid, $nickname) || $is_quizmaster)) {
|
||||
$game_results = get_results_by_gameid($gameid, $filter, $ordering, true);
|
||||
$result = json_encode($game_results);
|
||||
@ -345,20 +350,20 @@ switch ($action) {
|
||||
break;
|
||||
case "generate_detailed_stats":
|
||||
{
|
||||
$testids = json_decode(trim($_REQUEST["testids"] ?: "[]"), true);
|
||||
$gameid = trim($_REQUEST["gameid"] ?: "");
|
||||
$testids = json_decode(trim($_REQUEST["testids"] ?? "[]"), true);
|
||||
$gameid = trim($_REQUEST["gameid"] ?? "");
|
||||
$stats = generate_detailed_stats($gameid, $testids);
|
||||
$result = json_encode($stats);
|
||||
}
|
||||
break;
|
||||
|
||||
case "get_image":
|
||||
{
|
||||
$gameid = trim($_REQUEST["gameid"] ?: "");
|
||||
$img_url = trim($_REQUEST["img_url"] ?: "");
|
||||
patch_through_image($gameid, $img_url);
|
||||
}
|
||||
break;
|
||||
// case "get_image":
|
||||
// {
|
||||
// $gameid = trim($_REQUEST["gameid"] ?? "");
|
||||
// $img_url = trim($_REQUEST["img_url"] ?? "");
|
||||
// patch_through_image($gameid, $img_url);
|
||||
// }
|
||||
// break;
|
||||
}
|
||||
|
||||
// quizmaster actions
|
||||
@ -371,9 +376,9 @@ switch ($action) {
|
||||
case "update_group":
|
||||
{
|
||||
$update = $action === "update_group";
|
||||
$groupname = trim($_REQUEST["groupname"] ?: "");
|
||||
$description = trim($_REQUEST["description"] ?: "");
|
||||
$editors = explode_list(trim($_REQUEST["editors"] ?: ""));
|
||||
$groupname = trim($_REQUEST["groupname"] ?? "");
|
||||
$description = trim($_REQUEST["description"] ?? "");
|
||||
$editors = explode_list(trim($_REQUEST["editors"] ?? ""));
|
||||
$owner = (!$update) ? $user_data["nickname"] : trim($_REQUEST["owner"]);
|
||||
if ($owner === "") {
|
||||
$owner = $user_data["nickname"];
|
||||
@ -404,7 +409,7 @@ switch ($action) {
|
||||
break;
|
||||
case "delete_groups":
|
||||
{
|
||||
$groups = explode_list($_REQUEST["ids"] ?: "");
|
||||
$groups = explode_list($_REQUEST["ids"] ?? "");
|
||||
foreach ($groups as $g) {
|
||||
delete_group($g);
|
||||
}
|
||||
@ -415,7 +420,7 @@ switch ($action) {
|
||||
break;
|
||||
case "search_groups":
|
||||
{
|
||||
$needle = $_REQUEST["needle"] ?: "";
|
||||
$needle = $_REQUEST["needle"] ?? "";
|
||||
$result = json_encode(search_groups($needle));
|
||||
}
|
||||
break;
|
||||
@ -423,11 +428,11 @@ switch ($action) {
|
||||
case "update_user":
|
||||
{
|
||||
$update = $action === "update_user";
|
||||
$target_nickname = trim($_REQUEST["nickname"] ?: "");
|
||||
$password = trim($_REQUEST["password"] ?: "");
|
||||
$groups = explode_list($_REQUEST["groups"] ?: "");
|
||||
$realname = trim($_REQUEST["realname"] ?: "");
|
||||
$privilege = trim($_REQUEST["privilege"] ?: PRIVILEGE_PLAYER);
|
||||
$target_nickname = trim($_REQUEST["nickname"] ?? "");
|
||||
$password = trim($_REQUEST["password"] ?? "");
|
||||
$groups = explode_list($_REQUEST["groups"] ?? "");
|
||||
$realname = trim($_REQUEST["realname"] ?? "");
|
||||
$privilege = trim($_REQUEST["privilege"] ?? PRIVILEGE_PLAYER);
|
||||
|
||||
$groupids = get_groupids_by_compounds($groups); // convert group compounds to _ids
|
||||
|
||||
@ -469,7 +474,7 @@ switch ($action) {
|
||||
break;
|
||||
case "delete_users":
|
||||
{
|
||||
$users = explode_list($_REQUEST["users"] ?: "");
|
||||
$users = explode_list($_REQUEST["users"] ?? "");
|
||||
foreach ($users as $g) {
|
||||
delete_user($g);
|
||||
}
|
||||
|
10
js/common.js
10
js/common.js
@ -1,7 +1,11 @@
|
||||
function unix_time_to_human_readable(tunix, date_delim = ". ") {
|
||||
function unix_time_to_human_readable(tunix) {
|
||||
const date = new Date(Number(tunix) * 1000);
|
||||
return date.getFullYear() + date_delim + String(date.getMonth() + 1).padStart(2, "0") + date_delim + String(date.getDate()).padStart(2, "0") + ". "
|
||||
+ String(date.getHours()).padStart(2, "0") + ":" + String(date.getMinutes()).padStart(2, "0") + ":" + String(date.getSeconds()).padStart(2, "0");
|
||||
return date.getFullYear() + "-" + String(date.getMonth() + 1).padStart(2, "0") + "-" + String(date.getDate()).padStart(2, "0") + " " +
|
||||
String(date.getHours()).padStart(2, "0") + ":" + String(date.getMinutes()).padStart(2, "0") + ":" + String(date.getSeconds()).padStart(2, "0");
|
||||
}
|
||||
|
||||
function human_readable_to_unix_time(hrtime) {
|
||||
return (new Date(hrtime)).getTime() / 1000;
|
||||
}
|
||||
|
||||
function seconds_to_time(s) {
|
||||
|
@ -4,15 +4,46 @@ function create_cell(content = "") {
|
||||
return cell;
|
||||
}
|
||||
|
||||
function autoconvert_datetime(str) {
|
||||
// preprocess time fields in filter string
|
||||
const dateTimeRE = /([0-9]{4}-[0-1][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9])/;
|
||||
let filterParts = str.split(dateTimeRE);
|
||||
|
||||
// First, process full datetime entries
|
||||
// datetime values will be at the odd indices
|
||||
for (let i = 1; i < filterParts.length; i += 2) {
|
||||
filterParts[i] = human_readable_to_unix_time(filterParts[i]);
|
||||
}
|
||||
|
||||
// join the surrounding and converted parts
|
||||
let filter = filterParts.join("");
|
||||
|
||||
// Now, process the only date parts
|
||||
const dateRE = /([0-9]{4}-[0-1][0-9]-[0-3][0-9])/;
|
||||
filterParts = filter.split(dateRE);
|
||||
|
||||
for (let i = 1; i < filterParts.length; i += 2) {
|
||||
filterParts[i] = human_readable_to_unix_time(filterParts[i] + " 00:00:00");
|
||||
}
|
||||
|
||||
filter = filterParts.join("");
|
||||
|
||||
return filter;
|
||||
}
|
||||
|
||||
function fetch_results() {
|
||||
|
||||
let filterF = document.getElementById("filter");
|
||||
let orderbyF = document.getElementById("orderby");
|
||||
|
||||
let filter = autoconvert_datetime(filterF.value.trim());
|
||||
|
||||
// ----------
|
||||
|
||||
let req = {
|
||||
action: "get_results_by_gameid",
|
||||
gameid: GAMEID,
|
||||
filter: filterF.value.trim(),
|
||||
filter: filter.trim(),
|
||||
orderby: orderbyF.value.trim()
|
||||
};
|
||||
|
||||
|
@ -36,6 +36,11 @@ if (!is_user_contributor_to_game($game_id, $user_data["nickname"]) && ($user_dat
|
||||
<script src="js/result_analyzer.js"></script>
|
||||
<link rel="stylesheet" href="style/spreadquiz.css">
|
||||
<link rel="stylesheet" href="style/quizmaster_area.css"/>
|
||||
<style>
|
||||
tbody#results_display > tr {
|
||||
cursor: auto;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
@ -8,9 +8,9 @@ if (!get_autologin_state() || !isset($_REQUEST["testid"])) {
|
||||
exit();
|
||||
}
|
||||
|
||||
$testid = trim($_REQUEST["testid"] ?: "");
|
||||
$view_only = trim($_REQUEST["view_only"] ?: "false") === "true" ? true : false;
|
||||
$gameid = trim($_REQUEST["gameid"] ?: "");
|
||||
$testid = trim($_REQUEST["testid"] ?? "");
|
||||
$view_only = trim($_REQUEST["view_only"] ?? "false") === "true";
|
||||
$gameid = trim($_REQUEST["gameid"] ?? "");
|
||||
|
||||
if ($testid === "") {
|
||||
exit();
|
||||
|
@ -187,8 +187,6 @@ function automatic_typecast(string $rval)
|
||||
} else { // is it a float?
|
||||
return (double)$rval;
|
||||
}
|
||||
} elseif (str_starts_with($rval, 'T')) { // is it a date/time value?
|
||||
return strtotime(substr($rval, 1)); // convert to UNIX timestamp
|
||||
} else { // it's a string
|
||||
return substr($rval, 1, strlen($rval) - 2); // strip leading and trailing quotes
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user