| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409 |
- <?php
- /**
- * Controller file.
- *
- * Provides a class to handle all posible request.
- *
- * @category Constroller
- */
- /**
- * Include some required files.
- */
- require_once(__DIR__ . "/config.php");
- require_once(PATH::HELPER . "DB_Helper.php");
- require_once(PATH::HELPER . "TEXT_Helper.php");
- require_once(PATH::HELPER . "NET_Helper.php");
- require_once(PATH::HELPER . "HTML_Helper.php");
- require_once(PATH::HELPER . "APPLICATION_Helper.php");
- require_once(PATH::ENTITY . "User.php");
- require_once(PATH::ENTITY . "Player.php");
- require_once(__DIR__ . "/Constant.php");
- /**
- * @global User $USER.
- */
- $USER = -1;
- /**
- * @global Player $PLAYER.
- */
- $PLAYER = -1;
- /**
- * @global int $MODE.
- */
- $MODE = GAME_MODE_ID::NORMAL;
- /**
- * @global resource $DB.
- */
- $db = null;
- /**
- * Application controller.
- *
- * Handles every request, creating the required models and selecting the
- * view.
- *
- * @category Controller
- */
- class Controller {
- /**
- * Constructor.
- *
- * Handles every request, creating the required models and selecting the
- * view.
- *
- * @param mixed[] $params POST parameters of the request.
- * @return int HTTP status codes 200 or 404;
- * @global int User ID.
- * @global resource Databse connection.
- */
- public function __construct($params){
- global $USER;
- global $PLAYER;
- global $MODE;
- global $db;
- $page = null;
- session_start();
- $db = DB::start();
- // Parse parameters, get lang and build the route.
- $pars = [];
- foreach($params as $p){
- if (strlen($p) > 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;
- }
- }
- }
- ?>
|