0){ array_push($pars, $p); } } // API call: Use API controller if (count($pars) > 0 && strtoupper($pars[0]) == "API"){ if (count($pars) == 1){ // TODO: API MAIN PAGE } else{ $version = strtolower($pars[1]); $api_params = $pars; array_shift($api_params); array_shift($api_params); switch ($version){ case "v1": require_once(__DIR__ . "/API/v1/API_Controller.php"); new API_Controller($params); break; case "v2": require_once(__DIR__ . "/API/v2/API_Controller.php"); new API_Controller($params); break; case "v3": require_once(__DIR__ . "/API/v3/API_Controller.php"); new API_Controller($params); break; } } return; } // Special case: Actions. // Not redirecting to page, just execute a function // TODO: Secure actions elseif (count($pars) > 1 && strtoupper($pars[0]) == "ACTION"){ switch (strtoupper($pars[1])){ case "CHANGE_GAME_MODE": require_once(PATH::ACTION . "change_game_mode.php"); action(); return; break; case "LOGIN": require_once(PATH::ACTION . "login.php"); action(); return; break; case "LOGOUT": require_once(PATH::ACTION . "logout.php"); action(); return; break; case "NEW_TEAM": require_once(PATH::ACTION . "new_team.php"); action(); return; break; case "DELETE_TEAM": require_once(PATH::ACTION . "delete_team.php"); action(); return; break; case "RATE_TEAM": require_once(PATH::ACTION . "rate_team.php"); action(); return; break; case "SAVE_RUN_TEAM": require_once(PATH::ACTION . "save_run_team.php"); action(); return; break; case "OPTIMIZE_GET_RUNE_LIST": require_once(PATH::ACTION . "optimize_get_rune_list.php"); $response = action(); if (strlen($response) > 1){ echo($response); return; } else{ return; } break; case "OPTIMIZE_GET_OPTIONS": require_once(PATH::ACTION . "optimize_get_options.php"); $response = action(); if (strlen($response) > 1){ echo($response); return; } else{ return; } break; case "EDIT_PROFILE": require_once(PATH::ACTION . "edit_profile.php"); $response = action(); if (strlen($response) > 1){ echo($response); return; } else{ return; } break; default: require_once(PATH::PAGE . "Error_Page.php"); $page = new Error_Page(404); http_response_code(404); } } // Authentication $USER = null; if (array_key_exists("user_token", $_COOKIE) && array_key_exists("user_id", $_COOKIE)){ // Authenticated user, check token. $statement = $db->prepare(" SELECT count(token) AS c FROM token WHERE user = :user AND token = :token AND strftime('%s', datetime(expiry, 'unixepoch', 'localtime')) > strftime('%s','now') "); $statement->bindValue(":user", $_COOKIE["user_id"], SQLITE3_INTEGER); $statement->bindValue(":token", hash('sha256', $_COOKIE["user_token"]), SQLITE3_TEXT); $r = $statement->execute()->fetchArray(SQLITE3_ASSOC); if ($r["c"] == 0){ // Token is invalid, expired, clear cookies, session, and logout. require_once(PATH::ACTION . "logout.php"); action(); return; } else{ // Token is valid, renew session, and assign user. $_SESSION["user_id"] = $_COOKIE["user_id"]; $_SESSION["session"] = true; $USER = new User($_COOKIE["user_id"]); } } else{ // Unauthenticated user. Continue } // Validate URL (check if it has the player ID). $PLAYER = null; if (sizeof($pars) > 0 && preg_match("/^[0-9]{6,12}$/", $pars[0]) == 1){ error_log("PLAYER IN URL: " . $pars[0]); // Player ID passed in URL. Check it in database $statement = $db->prepare(" SELECT id, user, public FROM player WHERE id = :id "); $statement->bindValue(":id", $pars[0], SQLITE3_TEXT); $r = $statement->execute()->fetchArray(SQLITE3_ASSOC); if ($r){ // The player exists... if (null != $USER && $r["user"] == $USER->id){ // ... and it belongs to the user. Proceed. $PLAYER = new Player($r["id"]); error_log("PLAYER SET: " . $PLAYER->id); } elseif (null == $USER || $r["user"] != $USER->id){ // ... and it doesn't belong to the user... if ($r["public"] == 1){ // ... and it belongs to a public profile. Proceed. $PLAYER = new Player($r[$id]); } else{ // ... and it belongs to a private profile. Deny access. // TODO } } } } else{ error_log("PLAYER NOT IN URL: "); // Player ID is not passed as URL... if (null == $USER){ error_log(" USER NOT LOGGED IN: "); // ... and no user logged in. Go to the landing page. require_once(PATH::PAGE . "Landing_Page.php"); $page = new Landing_Page(); require_once($page->view); return; } else{ error_log(" USER LOGGED IN: " . $USER->id); // ... and the user is logged in. Get last accessed account. $statement = $db->prepare(" SELECT id FROM player WHERE user = :user ORDER BY last_access DESC "); $statement->bindValue(":user", $USER->id, SQLITE3_INTEGER); $r = $statement->execute()->fetchArray(SQLITE3_ASSOC); if ($r){ header("Location: /" . $r["id"] . parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH)); return; } else{ require_once(PATH::PAGE . "Landing_Page.php"); $page = new Landing_Page(); require_once($page->view); return; } } } // Get game mode $statement = $db->prepare("SELECT mode FROM player WHERE id = :id;"); $statement->bindValue(":id", $PLAYER->id, SQLITE3_INTEGER); $r = $statement->execute()->fetchArray(SQLITE3_ASSOC); if ($r && $r["mode"] == GAME_MODE_ID::RTA){ $MODE = GAME_MODE_ID::RTA; } else{ $MODE = GAME_MODE_ID::NORMAL; } // Select the model to load. array_shift($pars); // Remove first one, should be player_id if (sizeof($pars) == 0){ require_once(PATH::PAGE . "Home_Page.php"); $page = new Home_Page(); } else{ if (strtoupper($pars[0]) == "FUSION"){ require_once(PATH::PAGE . "Fusion_Page.php"); $page = new Fusion_Page(); } elseif (strtoupper($pars[0]) == "RUNES"){ require_once(PATH::PAGE . "Runes_Page.php"); $page = new Runes_Page(); } elseif (strtoupper($pars[0]) == "ENCHANTMENTS"){ require_once(PATH::PAGE . "Enchantments_Page.php"); $page = new Enchantments_Page(); } elseif (strtoupper($pars[0]) == "ARTIFACTS"){ require_once(PATH::PAGE . "Artifacts_Page.php"); $page = new Artifacts_Page(); } elseif (strtoupper($pars[0]) == "GUILD"){ require_once(PATH::PAGE . "Guild_Page.php"); $page = new Guild_Page(); } elseif (strtoupper($pars[0]) == "RUNS"){ require_once(PATH::PAGE . "Runs_Page.php"); $page = new Runs_Page(); } elseif (strtoupper($pars[0]) == "STATS"){ require_once(PATH::PAGE . "Stats_Page.php"); $page = new Stats_Page(); } elseif (strtoupper($pars[0]) == "TEAMS"){ require_once(PATH::PAGE . "Teams_Page.php"); $page = new Teams_Page(); } elseif (strtoupper($pars[0]) == "PROFILE"){ require_once(PATH::PAGE . "Profile_Page.php"); $page = new Profile_Page(); } elseif (strtoupper($pars[0]) == "MONSTERS"){ if (count($pars) == 1){ require_once(PATH::PAGE . "Monsters_Page.php"); $page = new Monsters_Page(); } else{ require_once(PATH::PAGE . "Monster_Page.php"); $page = new Monster_Page($pars[1]); } } elseif (strtoupper($pars[0]) == "CATALOG"){ if (count($pars) == 1){ require_once(PATH::PAGE . "Catalog_Page.php"); $page = new Catalog_Page(); } else{ require_once(PATH::PAGE . "Monster_Info_Page.php"); $page = new Monster_Info_Page($pars[1]); } } elseif (strtoupper($pars[0]) == "REPORT"){ if (count($pars) == 1){ require_once(PATH::PAGE . "Report_Page.php"); $page = new Report_Page(); } elseif (strtoupper($pars[1]) == "SKILLUP"){ require_once(PATH::PAGE . "Report_Skillup_Page.php"); $page = new Report_Skillup_Page($pars[1]); } elseif (strtoupper($pars[1]) == "RUNE_ENCHANTMENT"){ require_once(PATH::PAGE . "Report_Rune_Enchantment_Page.php"); $page = new Report_Rune_Enchantment_Page($pars[1]); } } elseif (strtoupper($pars[0]) == "OPTIMIZER"){ if (count($pars) == 1){ require_once(PATH::PAGE . "Optimizer_Page.php"); $page = new Optimizer_Page(); } else{ require_once(PATH::PAGE . "Optimizer_Unit_Page.php"); $page = new Optimizer_Unit_Page($pars[1]); } } } // Load the view, or set an error code. if (isset($page)){ require_once($page->view); return 200; } else{ require_once(PATH::PAGE . "Error_Page.php"); $page = new Error_Page(404); http_response_code(404); return 404; } } } ?>