enddate()->isEmpty()) { $error = "Game ended"; $json["status"] = "error"; $json["error"] = $error; return $json; } $throws = $kirby->request()->get("throws"); if (is_null($throws) || !is_array($throws)) { $error = "You have to pass throws as array"; if ($error != "") { $json["status"] = "error"; $json["error"] = $error; } return $json; } $checkoutTries = $kirby->request()->get("checkoutTries") ? intval($kirby->request()->get("checkoutTries")) : 0; $done = $kirby->request()->get("done"); $numDarts = 3; if ($kirby->request()->get("numDarts")) { $numDarts = intval($kirby->request()->get("numDarts")); } elseif (!$done) { $numDarts = count($throws); } try { $page->addThrows($throws, $numDarts, $checkoutTries, $done); } catch (\Exception $e) { $error = $e->getMessage(); } if ($error != "") { $json["status"] = "error"; $json["error"] = $error; } return $json; } function deleteLastThrow($page, $site, $kirby){ $json["status"] = "ok"; $error = ""; if (!$page->enddate()->isEmpty()) { $error = "Game ended"; $json["status"] = "error"; $json["error"] = $error; return $json; } $game = $page->rounds()->parseJSON(); $set = &$game["sets"][count($game["sets"])-1]; $leg = &$set["legs"][count($set["legs"])-1]; $visit = &$leg["visits"][count($leg["visits"])-1]; $completeVisit = $kirby->request()->get("visit"); if (count($visit['throws']) > 0 && !$completeVisit) { array_pop($visit['throws']); $kirby->impersonate('kirby'); $page = $page->update([ 'rounds' => json_encode($game), ]); } else { // delete last visit. This means, delete 2 lasts and insert one. array_pop($leg["visits"]); if (count($leg["visits"]) == 0){ array_pop($set["legs"]); if (count($set["legs"]) == 0){ array_pop($game["sets"]); if (count($game["sets"]) == 0){ $page = $page->initGame(false); $page->recalcStats(); return $json; } } } $kirby->impersonate('kirby'); $page = $page->update([ 'rounds' => json_encode($game), ]); $page = $page->clearLastVisit(); } $page = $page->recalcStats(); if ($error != "") { $json["status"] = "error"; $json["error"] = $error; } return $json; } function init($page, $site, $kirby){ $json["status"] = "ok"; $error = ""; if ($page->rounds()->toString() != "") { $error = "Game already started, can not update"; $json["status"] = "error"; $json["error"] = $error; return $json; } $players = $kirby->request()->get("players"); if (is_null($players) || !is_array($players) || count($players) == 0) { $error = "Players not given."; $json["status"] = "error"; $json["error"] = $error; return $json; } foreach ($players as $i => $player) { try { if (page($player)->intendedTemplate() != "member") { $error = "Player is not a member ".page($player)->template(); $json["status"] = "error"; $json["error"] = $error; return $json; } } catch (\Exception $e) { $error = "Player not found".$e; $json["status"] = "error"; $json["error"] = $error; return $json; } } $page = $page->reorderPlayer($players); $page->initGame(); if ($error != "") { $json["status"] = "error"; $json["error"] = $error; } return $json; } function update($page, $site, $kirby){ $json["status"] = "ok"; $error = ""; // TODO check data for valid fields $kirby->impersonate('kirby'); $data = $kirby->request()->get("data"); $page = $page->update($data); if ($error != "") { $json["status"] = "error"; $json["error"] = $error; } return $json; } return function ($page, $site, $kirby) { $error = ""; $json = []; $type = "html"; if ($kirby->request()->is('POST')) { $type = "json"; $action = $kirby->request()->get("action"); if ($action == "update") { $json = update($page, $site, $kirby); } elseif ($action == "init") { $json = init($page, $site, $kirby); } elseif ($action == "addThrows") { $json = addThrows($page, $site, $kirby); } elseif ($action == "deleteLastThrow") { $json = deleteLastThrow($page, $site, $kirby); } else { $json["error"] = "No known action defined"; $json["status"] = "error"; } } return [ 'type' => $type, 'json' => $json, 'error' => $error ]; };