You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
4.5 KiB
176 lines
4.5 KiB
2 months ago
|
<?php
|
||
|
use Kirby\Cms\Page;
|
||
|
|
||
|
// more validation is needed
|
||
|
function addThrows($page, $site, $kirby){
|
||
|
$json["status"] = "ok";
|
||
|
$error = "";
|
||
|
if (!$page->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
|
||
|
];
|
||
|
};
|