PageRenderTime 60ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/app/Http/Controllers/CareerController.php

https://gitlab.com/kidaa/ffxivcrafting
PHP | 398 lines | 295 code | 76 blank | 27 comment | 29 complexity | 78319cc59c5d745d709afe95e2881890 MD5 | raw file
  1. <?php namespace App\Http\Controllers;
  2. use App\Http\Requests;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. use Cookie;
  6. use Config;
  7. use App\Models\CAAS\ClassJob;
  8. class CareerController extends Controller
  9. {
  10. public function __construct()
  11. {
  12. parent::__construct();
  13. view()->share('active', 'career');
  14. }
  15. public function getIndex()
  16. {
  17. $job_ids = Config::get('site.job_ids');
  18. $crafting_job_list = ClassJob::with('name', 'en_abbr')->whereIn('id', $job_ids['crafting'])->get();
  19. $gathering_job_list = ClassJob::with('name', 'en_abbr')->whereIn('id', $job_ids['gathering'])->get();
  20. $previous_ccp = Cookie::get('previous_ccp');
  21. $previous_ccr = Cookie::get('previous_ccr');
  22. $previous_gc = Cookie::get('previous_gc');
  23. $previous_bc = Cookie::get('previous_bc');
  24. return view('career.index', compact('crafting_job_list', 'gathering_job_list', 'job_ids', 'previous_ccp', 'previous_ccr', 'previous_gc', 'previous_bc'));
  25. }
  26. public function postProducer(Request $request)
  27. {
  28. $input = $request->all();
  29. $my_class = $input['supporter-producer-class'];
  30. $supported_classes = implode(',', $input['supporter-supported-classes']);
  31. $min_level = (int) $input['supporter-min-level'] ?: 1;
  32. $max_level = (int) $input['supporter-max-level'] ?: 70;
  33. $url = '/career/producer/' . implode('/', [$my_class, $supported_classes, $min_level, $max_level]);
  34. // Queueing the cookie, we won't need it right away, so it'll save for the next Response::
  35. Cookie::queue('previous_ccp', $url, 525600); // 1 year's worth of minutes
  36. return redirect($url);
  37. }
  38. public function getProducer($my_class = '', $supported_classes = '', $min_level = 0, $max_level = 0)
  39. {
  40. # I am a Carpenter , what can I make to support these 8 Classes between levels x and y ?
  41. $supported_classes = explode(',', $supported_classes);
  42. $show_quests = false;//in_array($my_class, $supported_classes);
  43. if (empty($supported_classes))
  44. exit('No supported class selected... Todo: real error'); // TODO
  45. $all_classes = ClassJob::get_id_abbr_list();
  46. foreach ($supported_classes as $k => $v)
  47. if (in_array($v, array_keys($all_classes)))
  48. $supported_classes[$k] = $all_classes[$v];
  49. else
  50. unset($supported_classes[$k]);
  51. if (empty($supported_classes))
  52. exit('No supported class recognized...'); // TODO
  53. $jobs = ClassJob::with('name')->whereIn('id', $supported_classes)->get();
  54. foreach ($jobs as $k => $v)
  55. $jobs[$k] = $v->name->term;
  56. $job = ClassJob::get_by_abbr($my_class);
  57. if (empty($job))
  58. exit('No primary class recognized...'); // TODO
  59. \DB::statement('SET SESSION group_concat_max_len=16384');
  60. $recipies = \DB::table('recipes AS r')
  61. ->select('*', 'r.id AS recipe_id', \DB::raw('SUM(cj.amount) AS amount'),
  62. \DB::raw('
  63. (
  64. SELECT COUNT(*)
  65. FROM `items_npcs_shops` AS `ins`
  66. WHERE `ins`.`item_id` = `i`.`id`
  67. ) AS vendors
  68. ')
  69. // ,
  70. // \DB::raw('
  71. // (
  72. // SELECT COUNT(*)
  73. // FROM `npcs_items` AS `ni`
  74. // WHERE `ni`.`item_id` = `i`.`id`
  75. // ) AS beasts
  76. // ')
  77. )
  78. ->join('items AS i', 'i.id', '=', 'r.item_id')
  79. ->join('careers AS c', 'c.identifier', '=', 'r.id')
  80. ->join('career_classjob AS cj', 'cj.career_id', '=', 'c.id')
  81. ->join('translations AS t', 't.id', '=', 'i.name_' . Config::get('language'))
  82. ->whereBetween('c.level', [$min_level, $max_level])
  83. ->where('r.classjob_id', $job->id)
  84. ->where('c.type', 'recipe')
  85. ->whereIn('cj.classjob_id', $supported_classes)
  86. ->groupBy('r.id')
  87. ->orderBy('c.level')
  88. ->orderBy('i.level')
  89. ->having('amount', '>', '1')
  90. // ->remember(Config::get('site.cache_length'))
  91. ->get();
  92. return view('career.production', compact('recipies', 'show_quests', 'jobs', 'job', 'min_level', 'max_level'));
  93. }
  94. public function postReceiver(Request $request)
  95. {
  96. $input = $request->all();
  97. $my_class = $input['receiver-recipient-class'];
  98. $supported_classes = implode(',', $input['receiver-producer-classes']);
  99. $min_level = (int) $input['receiver-min-level'] ?: 1;
  100. $max_level = (int) $input['receiver-max-level'] ?: 70;
  101. $url ='/career/receiver/' . implode('/', [$my_class, $supported_classes, $min_level, $max_level]);
  102. // Queueing the cookie, we won't need it right away, so it'll save for the next Response::
  103. Cookie::queue('previous_ccr', $url, 525600); // 1 year's worth of minutes
  104. return redirect($url);
  105. }
  106. public function getReceiver($my_class = '', $supported_classes = '', $min_level = 0, $max_level = 0)
  107. {
  108. # I am a Carpenter , what should these 8 Classes make for me between levels x and y ?
  109. $supported_classes = explode(',', $supported_classes);
  110. $show_quests = false;//in_array($my_class, $supported_classes);
  111. if (empty($supported_classes))
  112. exit('No supported class selected... Todo: real error'); // TODO
  113. $all_classes = ClassJob::get_id_abbr_list();
  114. foreach ($supported_classes as $k => $v)
  115. if (in_array($v, array_keys($all_classes)))
  116. $supported_classes[$k] = $all_classes[$v];
  117. else
  118. unset($supported_classes[$k]);
  119. if (empty($supported_classes))
  120. exit('No supported class recognized...'); // TODO
  121. $jobs = ClassJob::with('name')->whereIn('id', $supported_classes)->get();
  122. foreach ($jobs as $k => $v)
  123. $jobs[$k] = $v->name->term;
  124. $job = ClassJob::get_by_abbr($my_class);
  125. if (empty($job))
  126. exit('No primary class recognized...'); // TODO
  127. \DB::statement('SET SESSION group_concat_max_len=16384');
  128. $recipies = \DB::table('career_classjob as cj')
  129. ->select('*', 'r.id AS recipe_id', \DB::raw('SUM(cj.amount) AS amount'),
  130. \DB::raw('
  131. (
  132. SELECT COUNT(*)
  133. FROM `items_npcs_shops` AS `ins`
  134. WHERE `ins`.`item_id` = `i`.`id`
  135. ) AS vendors
  136. ')
  137. )
  138. ->join('careers AS c', 'cj.career_id', '=', 'c.id')
  139. ->join('recipes AS r', 'r.id', '=', 'c.identifier')
  140. ->join('classjob AS j', 'j.id', '=', 'r.classjob_id')
  141. ->join('items AS i', 'i.id', '=', 'r.item_id')
  142. ->join('translations AS t', 't.id', '=', 'i.name_' . Config::get('language'))
  143. ->whereBetween('c.level', array($min_level, $max_level))
  144. ->where('cj.classjob_id', $job->id)
  145. ->where('c.type', 'recipe')
  146. ->whereIn('r.classjob_id', $supported_classes)
  147. ->groupBy('r.id')
  148. ->orderBy('r.level')
  149. ->having('amount', '>', '1')
  150. // ->remember(Config::get('site.cache_length'))
  151. ->get();
  152. return view('career.receiver', compact('recipies', 'show_quests', 'jobs', 'job', 'min_level', 'max_level'));
  153. }
  154. public function postGathering(Request $request)
  155. {
  156. $input = $request->all();
  157. $my_class = $input['gatherer-class'];
  158. $supported_classes = implode(',', $input['gathering-supported-classes']);
  159. $min_level = (int) $input['gathering-min-level'] ?: 1;
  160. $max_level = (int) $input['gathering-max-level'] ?: 70;
  161. // previous_gc or previous_bc
  162. $cookie_name = 'previous_' . ($my_class == 'BTL' ? 'b' : 'g') . 'c';
  163. $url = '/career/gathering/' . implode('/', [$my_class, $supported_classes, $min_level, $max_level]);
  164. // Queueing the cookie, we won't need it right away, so it'll save for the next Response::
  165. Cookie::queue($cookie_name, $url, 525600); // 1 year's worth of minutes
  166. return redirect($url);
  167. }
  168. public function getGathering($my_class = '', $supported_classes = '', $min_level = 0, $max_level = 0)
  169. {
  170. $supported_classes = explode(',', $supported_classes);
  171. $show_quests = in_array($my_class, $supported_classes);
  172. if (empty($supported_classes))
  173. exit('No supported class selected... Todo: real error'); // TODO
  174. $all_classes = ClassJob::get_id_abbr_list();
  175. foreach ($supported_classes as $k => $v)
  176. if (in_array($v, array_keys($all_classes)))
  177. $supported_classes[$k] = $all_classes[$v];
  178. else
  179. unset($supported_classes[$k]);
  180. if (empty($supported_classes))
  181. exit('No supported class recognized...'); // TODO
  182. $jobs = ClassJob::with('name')->whereIn('id', $supported_classes)->get();
  183. foreach ($jobs as $k => $v)
  184. $jobs[$k] = $v->name->term;
  185. if ($my_class != 'BTL')
  186. $job = ClassJob::get_by_abbr($my_class);
  187. else
  188. $job = $my_class;
  189. if (empty($job))
  190. exit('No primary class recognized...'); // TODO
  191. $top_query = $inner_query = $join = $where = $union = $having = '';
  192. $parameters = [];
  193. \DB::statement('SET SESSION group_concat_max_len=16384');
  194. if (in_array($my_class, array('MIN', 'BTN')))
  195. {
  196. // Add Nodes
  197. $top_query .= "
  198. (
  199. SELECT
  200. COUNT(*)
  201. FROM `cluster_items` AS `ci`
  202. JOIN `clusters` AS `c` ON `c`.`id` = `ci`.`cluster_id`
  203. WHERE `c`.`classjob_id` = ? AND `ci`.`item_id` = `x`.`item_id`
  204. ) AS nodes,
  205. ";
  206. $parameters[] = $job->id;
  207. $having = "HAVING nodes > 0";
  208. } else {
  209. // Battling or Fishing
  210. $join = "LEFT JOIN `cluster_items` AS `ci` ON `ci`.`item_id` = `i`.`id` " .
  211. 'LEFT JOIN `item_ui_category` AS `iuc` ON `iuc`.`id` = `i`.`itemuicategory_id` ' .
  212. 'LEFT JOIN `translations` AS `iuct` ON `iuct`.`id` = `iuc`.`name_en`';
  213. // FSH where the item is "seafood"
  214. // BTL where the item is not "seafood"
  215. $where = "AND `iuct`.`term` " . ($my_class == 'BTL' ? '!' : '') . "= 'Seafood'";
  216. $where .= " AND `ci`.`id` IS NULL";
  217. }
  218. $parameters[] = $min_level;
  219. $parameters[] = $max_level;
  220. $parameters = array_merge($parameters, $supported_classes);
  221. if ($my_class != 'BTL')
  222. {
  223. $union = "
  224. UNION
  225. SELECT
  226. `i`.`id`, t.term AS name, `i`.level, `i`.`min_price`, qi.amount AS amount,
  227. qi.level AS quest_level, qi.quality AS quest_quality
  228. FROM quest_items AS qi
  229. JOIN items AS i ON i.id = qi.item_id
  230. JOIN classjob AS j ON j.id = qi.classjob_id
  231. JOIN translations AS t ON t.id = i.name_" . Config::get('language') . "
  232. WHERE j.id = ?
  233. AND qi.level BETWEEN ? AND ?
  234. ";
  235. $parameters[] = $job->id;
  236. $parameters[] = $min_level;
  237. $parameters[] = $max_level;
  238. }
  239. // TODO Caching
  240. $items = \DB::select("
  241. SELECT x.*,
  242. " . $top_query . "
  243. (
  244. SELECT COUNT(*)
  245. FROM `items_npcs_shops` AS `ins`
  246. WHERE `ins`.`item_id` = `x`.`item_id`
  247. ) AS vendors,
  248. (
  249. SELECT COUNT(*)
  250. FROM `npcs_items` AS `ni`
  251. WHERE `ni`.`item_id` = `x`.`item_id`
  252. ) AS beasts
  253. FROM (
  254. SELECT
  255. `i`.`id` AS `item_id`, t.term AS name, `i`.level, `i`.`min_price`, SUM(cj.amount) AS amount,
  256. NULL AS quest_level, NULL AS quest_quality
  257. FROM `careers` AS `c`
  258. JOIN `items` AS `i` ON `i`.`id` = `c`.`identifier`
  259. JOIN `career_classjob` AS `cj` ON `cj`.`career_id` = `c`.`id`
  260. JOIN translations AS t ON t.id = i.name_" . Config::get('language') . "
  261. " . $join . "
  262. WHERE
  263. `c`.`type` = 'item'
  264. AND `c`.`level` BETWEEN ? AND ?
  265. AND `cj`.`classjob_id` in (" . str_pad('', count($supported_classes) * 2 - 1, '?,') . ")
  266. " . $where . "
  267. GROUP BY `c`.`identifier`
  268. " . $union . "
  269. ORDER BY `item_id` ASC
  270. ) AS x
  271. " . $having,
  272. $parameters
  273. );
  274. if ($my_class != 'BTL')
  275. {
  276. $quest_items = [];
  277. // Rip out Quest Entries
  278. foreach ($items as $k => $result)
  279. if ($result->quest_level != NULL)
  280. {
  281. $quest_items[] = $result;
  282. unset($items[$k]);
  283. }
  284. // Put them back in, either merge or insert
  285. if ($show_quests)
  286. foreach ($quest_items as $quest_item)
  287. {
  288. foreach($items as $k => $result)
  289. {
  290. if ($quest_item->item_id == $result->item_id)
  291. {
  292. // Merge
  293. $original_amount = $result->amount;
  294. $quest_amount = $quest_item->amount;
  295. $items[$k] = $quest_item;
  296. $items[$k]->amount = $original_amount;
  297. $items[$k]->quest_amount = $quest_amount;
  298. continue 2;
  299. }
  300. }
  301. // If a match was found it would have continued
  302. // This means at this point we add it in straight up
  303. $quest_item->quest_amount = $quest_item->amount;
  304. $items[] = $quest_item;
  305. }
  306. // Fishing doesn't have an ilvl...
  307. if ($my_class != 'FSH')
  308. {
  309. $sortable_items = [];
  310. foreach ($items as $row)
  311. $sortable_items[$row->level][] = $row;
  312. ksort($sortable_items);
  313. $items = [];
  314. foreach($sortable_items as $rows)
  315. foreach ($rows as $row)
  316. $items[] = $row;
  317. unset($sortable_results);
  318. }
  319. }
  320. return view('career.items', compact('items', 'show_quests', 'jobs', 'job', 'min_level', 'max_level'));
  321. }
  322. }