Controller.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. <?php
  2. /**
  3. * Controller file.
  4. *
  5. * Provides a class to handle all posible request.
  6. *
  7. * @category Constroller
  8. */
  9. /**
  10. * Include some required files.
  11. */
  12. require_once(__DIR__ . "/config.php");
  13. require_once(PATH::HELPER . "DB_Helper.php");
  14. require_once(PATH::HELPER . "TEXT_Helper.php");
  15. require_once(PATH::HELPER . "NET_Helper.php");
  16. require_once(PATH::HELPER . "HTML_Helper.php");
  17. require_once(PATH::HELPER . "APPLICATION_Helper.php");
  18. require_once(PATH::ENTITY . "User.php");
  19. require_once(PATH::ENTITY . "Player.php");
  20. require_once(__DIR__ . "/Constant.php");
  21. /**
  22. * @global User $USER.
  23. */
  24. $USER = -1;
  25. /**
  26. * @global Player $PLAYER.
  27. */
  28. $PLAYER = -1;
  29. /**
  30. * @global int $MODE.
  31. */
  32. $MODE = GAME_MODE_ID::NORMAL;
  33. /**
  34. * @global resource $DB.
  35. */
  36. $db = null;
  37. /**
  38. * Application controller.
  39. *
  40. * Handles every request, creating the required models and selecting the
  41. * view.
  42. *
  43. * @category Controller
  44. */
  45. class Controller {
  46. /**
  47. * Constructor.
  48. *
  49. * Handles every request, creating the required models and selecting the
  50. * view.
  51. *
  52. * @param mixed[] $params POST parameters of the request.
  53. * @return int HTTP status codes 200 or 404;
  54. * @global int User ID.
  55. * @global resource Databse connection.
  56. */
  57. public function __construct($params){
  58. global $USER;
  59. global $PLAYER;
  60. global $MODE;
  61. global $db;
  62. $page = null;
  63. session_start();
  64. $db = DB::start();
  65. // Parse parameters, get lang and build the route.
  66. $pars = [];
  67. foreach($params as $p){
  68. if (strlen($p) > 0){
  69. array_push($pars, $p);
  70. }
  71. }
  72. // API call: Use API controller
  73. if (count($pars) > 0 && strtoupper($pars[0]) == "API"){
  74. if (count($pars) == 1){
  75. // TODO: API MAIN PAGE
  76. }
  77. else{
  78. $version = strtolower($pars[1]);
  79. $api_params = $pars;
  80. array_shift($api_params);
  81. array_shift($api_params);
  82. switch ($version){
  83. case "v1":
  84. require_once(__DIR__ . "/API/v1/API_Controller.php");
  85. new API_Controller($params);
  86. break;
  87. case "v2":
  88. require_once(__DIR__ . "/API/v2/API_Controller.php");
  89. new API_Controller($params);
  90. break;
  91. case "v3":
  92. require_once(__DIR__ . "/API/v3/API_Controller.php");
  93. new API_Controller($params);
  94. break;
  95. }
  96. }
  97. return;
  98. }
  99. // Special case: Actions.
  100. // Not redirecting to page, just execute a function
  101. // TODO: Secure actions
  102. elseif (count($pars) > 1 && strtoupper($pars[0]) == "ACTION"){
  103. switch (strtoupper($pars[1])){
  104. case "CHANGE_GAME_MODE":
  105. require_once(PATH::ACTION . "change_game_mode.php");
  106. action();
  107. return;
  108. break;
  109. case "LOGIN":
  110. require_once(PATH::ACTION . "login.php");
  111. action();
  112. return;
  113. break;
  114. case "LOGOUT":
  115. require_once(PATH::ACTION . "logout.php");
  116. action();
  117. return;
  118. break;
  119. case "NEW_TEAM":
  120. require_once(PATH::ACTION . "new_team.php");
  121. action();
  122. return;
  123. break;
  124. case "DELETE_TEAM":
  125. require_once(PATH::ACTION . "delete_team.php");
  126. action();
  127. return;
  128. break;
  129. case "RATE_TEAM":
  130. require_once(PATH::ACTION . "rate_team.php");
  131. action();
  132. return;
  133. break;
  134. case "SAVE_RUN_TEAM":
  135. require_once(PATH::ACTION . "save_run_team.php");
  136. action();
  137. return;
  138. break;
  139. case "OPTIMIZE_GET_RUNE_LIST":
  140. require_once(PATH::ACTION . "optimize_get_rune_list.php");
  141. $response = action();
  142. if (strlen($response) > 1){
  143. echo($response);
  144. return;
  145. }
  146. else{
  147. return;
  148. }
  149. break;
  150. case "OPTIMIZE_GET_OPTIONS":
  151. require_once(PATH::ACTION . "optimize_get_options.php");
  152. $response = action();
  153. if (strlen($response) > 1){
  154. echo($response);
  155. return;
  156. }
  157. else{
  158. return;
  159. }
  160. break;
  161. case "EDIT_PROFILE":
  162. require_once(PATH::ACTION . "edit_profile.php");
  163. $response = action();
  164. if (strlen($response) > 1){
  165. echo($response);
  166. return;
  167. }
  168. else{
  169. return;
  170. }
  171. break;
  172. default:
  173. require_once(PATH::PAGE . "Error_Page.php");
  174. $page = new Error_Page(404);
  175. http_response_code(404);
  176. }
  177. }
  178. // Authentication
  179. $USER = null;
  180. if (array_key_exists("user_token", $_COOKIE) && array_key_exists("user_id", $_COOKIE)){
  181. // Authenticated user, check token.
  182. $statement = $db->prepare("
  183. SELECT count(token) AS c
  184. FROM token
  185. WHERE
  186. user = :user AND
  187. token = :token AND
  188. strftime('%s', datetime(expiry, 'unixepoch', 'localtime')) > strftime('%s','now')
  189. ");
  190. $statement->bindValue(":user", $_COOKIE["user_id"], SQLITE3_INTEGER);
  191. $statement->bindValue(":token", hash('sha256', $_COOKIE["user_token"]), SQLITE3_TEXT);
  192. $r = $statement->execute()->fetchArray(SQLITE3_ASSOC);
  193. if ($r["c"] == 0){
  194. // Token is invalid, expired, clear cookies, session, and logout.
  195. require_once(PATH::ACTION . "logout.php");
  196. action();
  197. return;
  198. }
  199. else{
  200. // Token is valid, renew session, and assign user.
  201. $_SESSION["user_id"] = $_COOKIE["user_id"];
  202. $_SESSION["session"] = true;
  203. $USER = new User($_COOKIE["user_id"]);
  204. }
  205. }
  206. else{
  207. // Unauthenticated user. Continue
  208. }
  209. // Validate URL (check if it has the player ID).
  210. $PLAYER = null;
  211. if (sizeof($pars) > 0 && preg_match("/^[0-9]{6,12}$/", $pars[0]) == 1){
  212. error_log("PLAYER IN URL: " . $pars[0]);
  213. // Player ID passed in URL. Check it in database
  214. $statement = $db->prepare("
  215. SELECT
  216. id,
  217. user,
  218. public
  219. FROM player
  220. WHERE id = :id
  221. ");
  222. $statement->bindValue(":id", $pars[0], SQLITE3_TEXT);
  223. $r = $statement->execute()->fetchArray(SQLITE3_ASSOC);
  224. if ($r){
  225. // The player exists...
  226. if (null != $USER && $r["user"] == $USER->id){
  227. // ... and it belongs to the user. Proceed.
  228. $PLAYER = new Player($r["id"]);
  229. error_log("PLAYER SET: " . $PLAYER->id);
  230. }
  231. elseif (null == $USER || $r["user"] != $USER->id){
  232. // ... and it doesn't belong to the user...
  233. if ($r["public"] == 1){
  234. // ... and it belongs to a public profile. Proceed.
  235. $PLAYER = new Player($r[$id]);
  236. }
  237. else{
  238. // ... and it belongs to a private profile. Deny access.
  239. // TODO
  240. }
  241. }
  242. }
  243. }
  244. else{
  245. error_log("PLAYER NOT IN URL: ");
  246. // Player ID is not passed as URL...
  247. if (null == $USER){
  248. error_log(" USER NOT LOGGED IN: ");
  249. // ... and no user logged in. Go to the landing page.
  250. require_once(PATH::PAGE . "Landing_Page.php");
  251. $page = new Landing_Page();
  252. require_once($page->view);
  253. return;
  254. }
  255. else{
  256. error_log(" USER LOGGED IN: " . $USER->id);
  257. // ... and the user is logged in. Get last accessed account.
  258. $statement = $db->prepare("
  259. SELECT id
  260. FROM player
  261. WHERE user = :user
  262. ORDER BY last_access DESC
  263. ");
  264. $statement->bindValue(":user", $USER->id, SQLITE3_INTEGER);
  265. $r = $statement->execute()->fetchArray(SQLITE3_ASSOC);
  266. if ($r){
  267. header("Location: /" . $r["id"] . parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH));
  268. return;
  269. }
  270. else{
  271. require_once(PATH::PAGE . "Landing_Page.php");
  272. $page = new Landing_Page();
  273. require_once($page->view);
  274. return;
  275. }
  276. }
  277. }
  278. // Get game mode
  279. $statement = $db->prepare("SELECT mode FROM player WHERE id = :id;");
  280. $statement->bindValue(":id", $PLAYER->id, SQLITE3_INTEGER);
  281. $r = $statement->execute()->fetchArray(SQLITE3_ASSOC);
  282. if ($r && $r["mode"] == GAME_MODE_ID::RTA){
  283. $MODE = GAME_MODE_ID::RTA;
  284. }
  285. else{
  286. $MODE = GAME_MODE_ID::NORMAL;
  287. }
  288. // Select the model to load.
  289. array_shift($pars); // Remove first one, should be player_id
  290. if (sizeof($pars) == 0){
  291. require_once(PATH::PAGE . "Home_Page.php");
  292. $page = new Home_Page();
  293. }
  294. else{
  295. if (strtoupper($pars[0]) == "FUSION"){
  296. require_once(PATH::PAGE . "Fusion_Page.php");
  297. $page = new Fusion_Page();
  298. }
  299. elseif (strtoupper($pars[0]) == "RUNES"){
  300. require_once(PATH::PAGE . "Runes_Page.php");
  301. $page = new Runes_Page();
  302. }
  303. elseif (strtoupper($pars[0]) == "ENCHANTMENTS"){
  304. require_once(PATH::PAGE . "Enchantments_Page.php");
  305. $page = new Enchantments_Page();
  306. }
  307. elseif (strtoupper($pars[0]) == "ARTIFACTS"){
  308. require_once(PATH::PAGE . "Artifacts_Page.php");
  309. $page = new Artifacts_Page();
  310. }
  311. elseif (strtoupper($pars[0]) == "GUILD"){
  312. require_once(PATH::PAGE . "Guild_Page.php");
  313. $page = new Guild_Page();
  314. }
  315. elseif (strtoupper($pars[0]) == "RUNS"){
  316. require_once(PATH::PAGE . "Runs_Page.php");
  317. $page = new Runs_Page();
  318. }
  319. elseif (strtoupper($pars[0]) == "STATS"){
  320. require_once(PATH::PAGE . "Stats_Page.php");
  321. $page = new Stats_Page();
  322. }
  323. elseif (strtoupper($pars[0]) == "TEAMS"){
  324. require_once(PATH::PAGE . "Teams_Page.php");
  325. $page = new Teams_Page();
  326. }
  327. elseif (strtoupper($pars[0]) == "PROFILE"){
  328. require_once(PATH::PAGE . "Profile_Page.php");
  329. $page = new Profile_Page();
  330. }
  331. elseif (strtoupper($pars[0]) == "MONSTERS"){
  332. if (count($pars) == 1){
  333. require_once(PATH::PAGE . "Monsters_Page.php");
  334. $page = new Monsters_Page();
  335. }
  336. else{
  337. require_once(PATH::PAGE . "Monster_Page.php");
  338. $page = new Monster_Page($pars[1]);
  339. }
  340. }
  341. elseif (strtoupper($pars[0]) == "CATALOG"){
  342. if (count($pars) == 1){
  343. require_once(PATH::PAGE . "Catalog_Page.php");
  344. $page = new Catalog_Page();
  345. }
  346. else{
  347. require_once(PATH::PAGE . "Monster_Info_Page.php");
  348. $page = new Monster_Info_Page($pars[1]);
  349. }
  350. }
  351. elseif (strtoupper($pars[0]) == "REPORT"){
  352. if (count($pars) == 1){
  353. require_once(PATH::PAGE . "Report_Page.php");
  354. $page = new Report_Page();
  355. }
  356. elseif (strtoupper($pars[1]) == "SKILLUP"){
  357. require_once(PATH::PAGE . "Report_Skillup_Page.php");
  358. $page = new Report_Skillup_Page($pars[1]);
  359. }
  360. elseif (strtoupper($pars[1]) == "RUNE_ENCHANTMENT"){
  361. require_once(PATH::PAGE . "Report_Rune_Enchantment_Page.php");
  362. $page = new Report_Rune_Enchantment_Page($pars[1]);
  363. }
  364. }
  365. elseif (strtoupper($pars[0]) == "OPTIMIZER"){
  366. if (count($pars) == 1){
  367. require_once(PATH::PAGE . "Optimizer_Page.php");
  368. $page = new Optimizer_Page();
  369. }
  370. else{
  371. require_once(PATH::PAGE . "Optimizer_Unit_Page.php");
  372. $page = new Optimizer_Unit_Page($pars[1]);
  373. }
  374. }
  375. }
  376. // Load the view, or set an error code.
  377. if (isset($page)){
  378. require_once($page->view);
  379. return 200;
  380. }
  381. else{
  382. require_once(PATH::PAGE . "Error_Page.php");
  383. $page = new Error_Page(404);
  384. http_response_code(404);
  385. return 404;
  386. }
  387. }
  388. }
  389. ?>