public function get_player_certs($name = NULL) { //searching by name, null name = no buenos if ($name == NULL) { return Response::error('404'); } else { $input_name = urldecode($name); } //Look up the player, latest to account for deletes with the same name $player = Player::where('name', '=', $input_name)->order_by('created_at', 'DESC')->first(); //no player found, why not search? if (!$player) { return Response::error('404'); } //Does the player have an army? $army = Army::where('armyId', '=', $player->armyid)->order_by('created_at', 'DESC')->first(); //escape for output in title $playerName = htmlentities($player->name); //Player website preferences $web_prefs = WebsitePref::where('db_id', '=', $player->db_id)->first(); if (isset($web_prefs->attributes)) { $web_prefs = $web_prefs->attributes; } //website prefs we care about - show_workbench, show_craftables, show_market_listings if (!isset($web_prefs['show_workbench'])) { $web_prefs['show_workbench'] = 1; } if (!isset($web_prefs['show_craftables'])) { $web_prefs['show_craftables'] = 0; } if (!isset($web_prefs['show_market_listings'])) { $web_prefs['show_market_listings'] = 0; } if ($web_prefs['show_market_listings']) { //find out what this player has currently listed on the market $cache_key_player_market = $player->db_id . "_market_listings"; if (Cache::has($cache_key_player_market)) { //pull from cache $cached_market_listings = Cache::get($cache_key_player_market); $item_stats_lookup = $cached_market_listings['stats']; $market_listings = $cached_market_listings['data']; } else { $market_listings = MarketListing::where('active', '=', '1')->where('character_guid', '=', $player->db_id)->get(array('item_sdb_id', 'expires_at', 'price_cy', 'price_per_unit', 'rarity', 'quantity', 'title', 'icon', 'ff_id', 'category')); if (!empty($market_listings)) { $market_stat_ids = array(); $market_stat_cats = array(); foreach ($market_listings as $listing) { $market_stat_ids[] = $listing->attributes['ff_id']; $market_stat_cats[] = $listing->attributes['category']; } if (count($market_stat_cats) < 1) { $stats = false; } $market_stat_cats_unique = array_unique($market_stat_cats); $item_stats_lookup = false; foreach ($market_stat_cats_unique as $statcat) { switch ($statcat) { case 'AbilityModule': $stats = MarketStatAbilityModule::where_in('marketlisting_id', $market_stat_ids)->get(); foreach ($stats as $stat) { $temp = '<table>'; $ustats = (array) unserialize($stat->stats); ksort($ustats); foreach ($ustats as $key => $value) { $key = str_replace('_', ' ', $key); $key = ucwords($key); $value = number_format($value, 2); $temp .= '<tr><td>' . htmlentities($key) . ': </td><td>' . htmlentities($value) . '</td></tr>'; } $temp .= '</table>'; $item_stats_lookup[(string) $stat->marketlisting_id] = $temp; } break; case 'CraftingComponent': $stats = MarketStatCraftingComponent::where_in('marketlisting_id', $market_stat_ids)->get(); foreach ($stats as $stat) { $temp = ''; $key_lookup = array('mass' => 'MASS', 'power' => 'PWR', 'cpu' => 'CPU'); ksort($stat->attributes); foreach ($stat->attributes as $key => $value) { if ($value > 0 && array_key_exists($key, $key_lookup)) { $temp .= htmlentities($key_lookup[$key]) . ': ' . htmlentities($value) . '<br>'; } } $item_stats_lookup[(string) $stat->marketlisting_id] = $temp; } break; case 'Jumpjet': $stats = MarketStatJumpjet::where_in('marketlisting_id', $market_stat_ids)->get(); foreach ($stats as $stat) { $temp = '<table>'; $key_lookup = array('id', 'updated_at', 'created_at', 'marketlisting_id'); ksort($stat->attributes); foreach ($stat->attributes as $key => $value) { if (!in_array($key, $key_lookup)) { $key = str_replace('_', ' ', $key); $key = ucwords($key); $value = number_format($value, 2); $temp .= '<tr><td>' . htmlentities($key) . ': </td><td>' . htmlentities($value) . '</td></tr>'; } } $temp .= '</table>'; $item_stats_lookup[(string) $stat->marketlisting_id] = $temp; } break; case 'Plating': $stats = MarketStatPlating::where_in('marketlisting_id', $market_stat_ids)->get(); foreach ($stats as $stat) { $temp = '<table>'; $key_lookup = array('id', 'updated_at', 'created_at', 'marketlisting_id'); ksort($stat->attributes); foreach ($stat->attributes as $key => $value) { if (!in_array($key, $key_lookup)) { $key = str_replace('_', ' ', $key); $key = ucwords($key); $value = number_format($value, 2); $temp .= '<tr><td>' . htmlentities($key) . ': </td><td>' . htmlentities($value) . '</td></tr>'; } } $temp .= '</table>'; $item_stats_lookup[(string) $stat->marketlisting_id] = $temp; } break; case 'Resource': $stats = MarketStatResource::where_in('marketlisting_id', $market_stat_ids)->get(); foreach ($stats as $stat) { $temp = '<table>'; $key_lookup = array(1 => 'Thermal Resistance', 2 => 'Conductivity', 3 => 'Malleability', 4 => 'Density', 5 => 'Toughness', 'quality' => 'Quality'); $temp_ar = array(); foreach ($stat->attributes as $key => $value) { if (array_key_exists($key, $key_lookup)) { $temp_ar[$key] = '<tr><td>' . htmlentities($key_lookup[$key]) . ': </td><td>' . htmlentities($value) . '</td></tr>'; } } //because resources are special, we alpha order them numerically $temp .= $temp_ar[2]; $temp .= $temp_ar[4]; $temp .= $temp_ar[3]; $temp .= $temp_ar[1]; $temp .= $temp_ar[5]; $temp .= $temp_ar['quality']; $temp .= '</table>'; $item_stats_lookup[(string) $stat->marketlisting_id] = $temp; } break; case 'Servo': $stats = MarketStatServo::where_in('marketlisting_id', $market_stat_ids)->get(); foreach ($stats as $stat) { $temp = '<table>'; $key_lookup = array('id', 'updated_at', 'created_at', 'marketlisting_id'); ksort($stat->attributes); foreach ($stat->attributes as $key => $value) { if (!in_array($key, $key_lookup)) { $key = str_replace('_', ' ', $key); $key = ucwords($key); $value = number_format($value, 2); $temp .= '<tr><td>' . htmlentities($key) . ': </td><td>' . htmlentities($value) . '</td></tr>'; } } $temp .= '</table>'; $item_stats_lookup[(string) $stat->marketlisting_id] = $temp; } break; case 'Weapon': $stats = MarketStatWeapon::where_in('marketlisting_id', $market_stat_ids)->get(); foreach ($stats as $stat) { $temp = '<table>'; $key_lookup = array('id', 'updated_at', 'created_at', 'marketlisting_id'); ksort($stat->attributes); foreach ($stat->attributes as $key => $value) { if (!in_array($key, $key_lookup)) { $key = str_replace('_', ' ', $key); $key = ucwords($key); $value = number_format($value, 2); $temp .= '<tr><td>' . htmlentities($key) . ': </td><td>' . htmlentities($value) . '</td></tr>'; } } $temp .= '</table>'; $item_stats_lookup[(string) $stat->marketlisting_id] = $temp; } break; default: break; } } //Cache $cached_market_listings = array(); $cached_market_listings['data'] = $market_listings; $cached_market_listings['stats'] = $item_stats_lookup; Cache::put($cache_key_player_market, $cached_market_listings, 30); } } } if ($web_prefs['show_craftables']) { if (isset($web_prefs['show_progress'])) { if ($web_prefs['show_progress']) { $progress = Progress::where('db_id', '=', $player->db_id)->order_by('updated_at', 'DESC')->first(); } else { $progress = null; } } else { $progress = Progress::where('db_id', '=', $player->db_id)->order_by('updated_at', 'DESC')->first(); } if (!empty($progress)) { $cache_key_progress = $player->db_id . "_progress"; $progress = $progress->entry; $progress_md5 = md5($progress); if (Cache::Get($cache_key_progress . "_md5_cc") != $progress_md5) { $progress = unserialize($progress); if (isset($progress->unlocks)) { $master_cert_list = array(); //all odd number certs from 799 to 1245 //category names from 766 to 783 //arsenal = 1398 /* 766 = base assault 767 = base biotech 768 = base dreadnaught 769 = base engineer 770 = base recon 774 = firecat 775 = tigerclaw 776 = dragonfly 777 = recluse 778 = rhino 779 = mammoth 1398 = arsenal 780 = electron 781 = bastion 782 = nighthawk 783 = raptor */ //certs we don't care about $useless_certs = array(784, 785, 786, 788, 789, 790, 791, 792, 794, 1154, 1359, 1366, 1367, 1371, 1372, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392); $unlocked_base_assault = 0; $unlocked_base_biotech = 0; $unlocked_base_dreadnaught = 0; $unlocked_base_engineer = 0; $unlocked_base_recon = 0; $unlocked_firecat = 0; $unlocked_tigerclaw = 0; $unlocked_dragonfly = 0; $unlocked_recluse = 0; $unlocked_rhino = 0; $unlocked_arsenal = 0; $unlocked_mammoth = 0; $unlocked_electron = 0; $unlocked_bastion = 0; $unlocked_nighthawk = 0; $unlocked_raptor = 0; foreach ($progress->unlocks as $progress_certs) { //Make a master list of certs, note that certs are in numerical sorted order so we are able to do a fast merge for ($i = 0; $i < count($progress_certs); $i++) { if (!in_array($progress_certs[$i], $master_cert_list)) { if (!in_array($progress_certs[$i], $useless_certs)) { //unlock flags if ($progress_certs[$i] == 766) { $unlocked_base_assault = 1; } if ($progress_certs[$i] == 767) { $unlocked_base_biotech = 1; } if ($progress_certs[$i] == 768) { $unlocked_base_dreadnaught = 1; } if ($progress_certs[$i] == 769) { $unlocked_base_engineer = 1; } if ($progress_certs[$i] == 770) { $unlocked_base_recon = 1; } if ($progress_certs[$i] == 774) { $unlocked_firecat = 1; } if ($progress_certs[$i] == 775) { $unlocked_tigerclaw = 1; } if ($progress_certs[$i] == 776) { $unlocked_dragonfly = 1; } if ($progress_certs[$i] == 777) { $unlocked_recluse = 1; } if ($progress_certs[$i] == 778) { $unlocked_rhino = 1; } if ($progress_certs[$i] == 779) { $unlocked_mammoth = 1; } if ($progress_certs[$i] == 1398) { $unlocked_arsenal = 1; } if ($progress_certs[$i] == 780) { $unlocked_electron = 1; } if ($progress_certs[$i] == 781) { $unlocked_bastion = 1; } if ($progress_certs[$i] == 782) { $unlocked_nighthawk = 1; } if ($progress_certs[$i] == 783) { $unlocked_raptor = 1; } if ($progress_certs[$i] > 764 && $progress_certs[$i] < 798 || $progress_certs[$i] > 1246) { //add to the master list $master_cert_list[] = $progress_certs[$i]; } else { if ($progress_certs[$i] > 797 && $progress_certs[$i] < 1246 && $progress_certs[$i] % 2 == 0) { //add to the master list $master_cert_list[] = $progress_certs[$i]; } } } } } } //free up some memory $progress = null; sort($master_cert_list); $cert_info = Certification::where(function ($query) use($master_cert_list) { $query->where_in('id', $master_cert_list); })->get(array('id', 'name')); //look at all these arrays //jumpjets, secondary weapons {Assault rifle, burst rifle, grenade launcher, SMG, shotgun}, servos $base_shared_certs = array(910, 982, 984, 986, 988, 990, 992, 1222, 1224, 1226, 1228, 1230, 1242, 1244, 1345, 1346, 1347, 1348, 1349, 1355, 1356); //accord absorbtion plating, afterburners, bombs away, burn jets, crater, overcharge, plasma cannon, shockwave, assault plating $base_assault_certs = array(787, 793, 795, 798, 800, 802, 806, 828, 996, 1016, 1018, 1020, 1022, 1024, 1026, 1028, 1202, 1204, 1232, 1246, 1247, 1248, 1249, 1250, 1335, 1336, 1350); //accord chemical sprayer, accord siphoning plating, healing generator, healing wave, needler, poison ball, poison trail, triage, biotech plating $base_biotech_certs = array(804, 808, 812, 814, 824, 830, 832, 1008, 1010, 1054, 1056, 1058, 1060, 1062, 1064, 1210, 1212, 1236, 1256, 1264, 1265, 1266, 1267, 1268, 1339, 1340, 1352); //Absorption Bomb, Accord Explosive Rounds, Accord Mortar Arcfold, Accord Repulsor Blast, Heavy Armor, Turret Mode, Heavy Machine Gun, Resilient Plating $base_dreadnaught_certs = array(862, 866, 872, 880, 940, 998, 1012, 1014, 1090, 1092, 1094, 1096, 1098, 1100, 1206, 1208, 1234, 1281, 1282, 1283, 1284, 1285, 1286, 1337, 1338, 1351); //Anti-Personnel Turret, Charged Pulse Generator, Claymore, Deployable Shield, Heavy Turret, Supply Station, Accord Nanite Deployment, engineer plating, Sticky Grenade Launcher $base_engineer_certs = array(942, 944, 946, 948, 950, 994, 1004, 1006, 1126, 1128, 1130, 1132, 1134, 1136, 1214, 1216, 1238, 1299, 1300, 1301, 1302, 1303, 1304, 1341, 1342, 1353); //Accord Artillery Strike, Cryo Grenade, Decoy, Proximity Reponse, Resonating Bolts, SIN Beacon, Accord Regenerative Plating, R36 Assault Rifle $base_recon_certs = array(904, 918, 922, 928, 932, 934, 936, 1000, 1002, 1166, 1168, 1170, 1172, 1174, 1176, 1218, 1220, 1240, 1317, 1318, 1319, 1320, 1321, 1322, 1343, 1344, 1354); //ADV frames //fuel air bomb, immolate, incinerator, inferno dash, thermal cannon, thermal wave $base_firecat_certs = array(810, 816, 818, 820, 822, 826, 1030, 1032, 1034, 1036, 1038, 1040, 1251, 1252, 1253, 1254, 1255, 1257); //fusion cannon, Disruption, Missile Shot, Tether Field, Trailblaze, Auxiliary Tanks $base_tigerclaw_certs = array(834, 838, 842, 844, 848, 852, 1042, 1044, 1046, 1048, 1050, 1052, 1258, 1259, 1260, 1261, 1262, 1263); //bio rifle, Emergency Response, Healing Ball, Healing Dome, Healing Pillar, Rally $base_dragonfly_certs = array(836, 846, 850, 856, 860, 864, 1066, 1068, 1070, 1072, 1074, 1076, 1269, 1270, 1271, 1272, 1273, 1274); //bio crossbow, creeping death, evacuate, kinetic shot, necrosis, necrotic poison $base_recluse_certs = array(874, 878, 884, 888, 890, 898, 1078, 1080, 1082, 1084, 1086, 1088, 1275, 1276, 1277, 1278, 1279, 1280); //Charge!, Dreadfield, Gravity Field Grenade, Sundering Wave, Heavy Laser MG, Personal Shield $base_rhino_certs = array(912, 916, 920, 924, 926, 930, 1114, 1116, 1118, 1120, 1122, 1124, 1293, 1294, 1295, 1296, 1297, 1298, 1393, 1394, 1395); //Shield Wall, Teleport Shot, Thunderdome, Tremors, Imminent Threat, Heavy Plasma MG $base_mammoth_certs = array(892, 896, 900, 902, 906, 908, 938, 1102, 1104, 1106, 1108, 1110, 1112, 1287, 1288, 1289, 1290, 1291, 1292, 1357, 1358); //Boomerang Shot, Bulwark, Electrical Storm, Overclocking Station, Shock Rail, Fail-Safe $base_arsenal_certs = array(1399, 1400, 1403, 1406, 1407, 1408, 1409, 1410, 1411, 1416, 1417, 1418, 1421, 1422, 1423, 1426, 1427, 1428, 1436, 1437, 1438); //EMP, Particle Beam, Rocket Jump, Shoulder Rockets, Combat shotgun, light machine gun $base_electron_certs = array(964, 966, 968, 970, 972, 974, 1150, 1152, 1156, 1158, 1162, 1164, 1311, 1312, 1313, 1314, 1315, 1316); //Energy Wall, Fortify, Multi Turret, Sentinel Pod, Tesla Rifle, Overseer $base_bastion_certs = array(952, 954, 956, 958, 960, 962, 1138, 1140, 1142, 1144, 1146, 1148, 1305, 1306, 1307, 1308, 1309, 1310); //Eruption Rounds, Execute Shot, Remote Explosive, Smoke Screen, Sniper Rifle, Ambush $base_nighthawk_certs = array(870, 876, 882, 886, 894, 914, 980, 1178, 1180, 1182, 1184, 1186, 1188, 1323, 1324, 1325, 1326, 1327, 1328); //Overload, Power Field, SIN Scrambler, Teleport Beacon, Conduit, Charge Rifle $base_raptor_certs = array(840, 854, 858, 868, 976, 978, 1190, 1192, 1194, 1196, 1198, 1200, 1329, 1330, 1331, 1332, 1333, 1334); $base_shared_items = array(); $base_assault_items = array(); $base_biotech_items = array(); $base_dreadnaught_items = array(); $base_engineer_items = array(); $base_recon_items = array(); $base_firecat_items = array(); $base_tigerclaw_items = array(); $base_dragonfly_items = array(); $base_recluse_items = array(); $base_rhino_items = array(); $base_mammoth_items = array(); $base_arsenal_items = array(); $base_electron_items = array(); $base_bastion_items = array(); $base_nighthawk_items = array(); $base_raptor_items = array(); for ($i = 0; $i < count($cert_info); $i++) { //base items if (in_array($cert_info[$i]->id, $base_shared_certs)) { $base_shared_items[] = $cert_info[$i]->name; } if ($unlocked_base_assault) { if (in_array($cert_info[$i]->id, $base_assault_certs)) { $base_assault_items[] = $cert_info[$i]->name; } } if ($unlocked_base_biotech) { if (in_array($cert_info[$i]->id, $base_biotech_certs)) { $base_biotech_items[] = $cert_info[$i]->name; } } if ($unlocked_base_dreadnaught) { if (in_array($cert_info[$i]->id, $base_dreadnaught_certs)) { $base_dreadnaught_items[] = $cert_info[$i]->name; } } if ($unlocked_base_engineer) { if (in_array($cert_info[$i]->id, $base_engineer_certs)) { $base_engineer_items[] = $cert_info[$i]->name; } } if ($unlocked_base_recon) { if (in_array($cert_info[$i]->id, $base_recon_certs)) { $base_recon_items[] = $cert_info[$i]->name; } } //ASSAULT ADV if ($unlocked_firecat) { if (in_array($cert_info[$i]->id, $base_firecat_certs)) { $base_firecat_items[] = $cert_info[$i]->name; } } if ($unlocked_tigerclaw) { if (in_array($cert_info[$i]->id, $base_tigerclaw_certs)) { $base_tigerclaw_items[] = $cert_info[$i]->name; } } //BIOTECH ADV if ($unlocked_dragonfly) { if (in_array($cert_info[$i]->id, $base_dragonfly_certs)) { $base_dragonfly_items[] = $cert_info[$i]->name; } } if ($unlocked_recluse) { if (in_array($cert_info[$i]->id, $base_recluse_certs)) { $base_recluse_items[] = $cert_info[$i]->name; } } //DREADNAUGHT ADV if ($unlocked_rhino) { if (in_array($cert_info[$i]->id, $base_rhino_certs)) { $base_rhino_items[] = $cert_info[$i]->name; } } if ($unlocked_mammoth) { if (in_array($cert_info[$i]->id, $base_mammoth_certs)) { $base_mammoth_items[] = $cert_info[$i]->name; } } if ($unlocked_arsenal) { if (in_array($cert_info[$i]->id, $base_arsenal_certs)) { $base_arsenal_items[] = $cert_info[$i]->name; } } //ENGINEER ADV if ($unlocked_electron) { if (in_array($cert_info[$i]->id, $base_electron_certs)) { $base_electron_items[] = $cert_info[$i]->name; } } if ($unlocked_bastion) { if (in_array($cert_info[$i]->id, $base_bastion_certs)) { $base_bastion_items[] = $cert_info[$i]->name; } } //RECON ADV if ($unlocked_nighthawk) { if (in_array($cert_info[$i]->id, $base_nighthawk_certs)) { $base_nighthawk_items[] = $cert_info[$i]->name; } } if ($unlocked_raptor) { if (in_array($cert_info[$i]->id, $base_raptor_certs)) { $base_raptor_items[] = $cert_info[$i]->name; } } } asort($base_shared_items); asort($base_assault_items); asort($base_biotech_items); asort($base_dreadnaught_items); asort($base_engineer_items); asort($base_recon_items); asort($base_firecat_items); asort($base_tigerclaw_items); asort($base_dragonfly_items); asort($base_recluse_items); asort($base_rhino_items); asort($base_mammoth_items); asort($base_arsenal_items); asort($base_electron_items); asort($base_bastion_items); asort($base_nighthawk_items); asort($base_raptor_items); //cache it, cache it good $cached_can_craft = array(); $cached_can_craft['base_shared_items'] = $base_shared_items; $cached_can_craft['base_assault_items'] = $base_assault_items; $cached_can_craft['base_biotech_items'] = $base_biotech_items; $cached_can_craft['base_dreadnaught_items'] = $base_dreadnaught_items; $cached_can_craft['base_engineer_items'] = $base_engineer_items; $cached_can_craft['base_recon_items'] = $base_recon_items; $cached_can_craft['base_firecat_items'] = $base_firecat_items; $cached_can_craft['base_tigerclaw_items'] = $base_tigerclaw_items; $cached_can_craft['base_dragonfly_items'] = $base_dragonfly_items; $cached_can_craft['base_recluse_items'] = $base_recluse_items; $cached_can_craft['base_rhino_items'] = $base_rhino_items; $cached_can_craft['base_mammoth_items'] = $base_mammoth_items; $cached_can_craft['base_electron_items'] = $base_electron_items; $cached_can_craft['base_bastion_items'] = $base_bastion_items; $cached_can_craft['base_nighthawk_items'] = $base_nighthawk_items; $cached_can_craft['base_raptor_items'] = $base_raptor_items; $cached_can_craft['base_arsenal_items'] = $base_arsenal_items; Cache::forever($cache_key_progress . "_can_craft", $cached_can_craft); Cache::forever($cache_key_progress . "_md5_cc", $progress_md5); //set progress to 1 for the view control params. $progress = 1; } else { //this player does not have progress->unlocks so we can't even check for craftables; assume null. $progress = null; } } else { //load it all from cache $cached_can_craft = Cache::Get($cache_key_progress . "_can_craft"); //set all those variables $base_shared_items = $cached_can_craft['base_shared_items']; $base_assault_items = $cached_can_craft['base_assault_items']; $base_biotech_items = $cached_can_craft['base_biotech_items']; $base_dreadnaught_items = $cached_can_craft['base_dreadnaught_items']; $base_engineer_items = $cached_can_craft['base_engineer_items']; $base_recon_items = $cached_can_craft['base_recon_items']; $base_firecat_items = $cached_can_craft['base_firecat_items']; $base_tigerclaw_items = $cached_can_craft['base_tigerclaw_items']; $base_dragonfly_items = $cached_can_craft['base_dragonfly_items']; $base_recluse_items = $cached_can_craft['base_recluse_items']; $base_rhino_items = $cached_can_craft['base_rhino_items']; $base_mammoth_items = $cached_can_craft['base_mammoth_items']; $base_arsenal_items = $cached_can_craft['base_arsenal_items']; $base_electron_items = $cached_can_craft['base_electron_items']; $base_bastion_items = $cached_can_craft['base_bastion_items']; $base_nighthawk_items = $cached_can_craft['base_nighthawk_items']; $base_raptor_items = $cached_can_craft['base_raptor_items']; } } } if ($web_prefs['show_workbench']) { //Workbench Stuff $workbench_info = array(); if (Cache::has($player->db_id . '_printer')) { $workbench_info = Cache::get($player->db_id . '_printer'); } else { $wbinfo = Printer::where('db_id', '=', $player->db_id)->get(); foreach ($wbinfo as $wb) { $workbench_info[] = $wb->original; } Cache::forever($player->db_id . '_printer', $workbench_info); } if (!empty($workbench_info)) { $workbench_info_blueprints = array(); for ($i = 0; $i < count($workbench_info); $i++) { $workbench_info_blueprints[] = $workbench_info[$i]['blueprint_id']; } $workbench_results = Recipe::with(array('outputs'))->where_in('itemtypeid', $workbench_info_blueprints)->get(array('itemtypeid', 'description', 'name')); $workbench_output_ids = array(); $workbench_output_names = array(); //at this point we will always have something in the workbench so don't worry about null foreach ($workbench_results as $workbench_result) { if ($workbench_result->relationships['outputs'] != null) { //add the output itemtypeid to the list print_r($workbench_result->relationships['outputs']); } else { //add the blueprint_id as an itemtypeid because its a cert $workbench_output_ids[] = $workbench_result->attributes['itemtypeid']; if (strstr($workbench_result->attributes['description'], "Research")) { $workbench_output_names[$workbench_result->attributes['itemtypeid']] = $workbench_result->attributes['description']; } else { $workbench_output_names[$workbench_result->attributes['itemtypeid']] = $workbench_result->attributes['name']; } } } unset($workbench_results); //get the icons $wb_icons = hWebIcon::where(function ($query) use($workbench_output_ids) { $query->where('version', '=', Base_Controller::getVersionDate()); $query->where_in('itemTypeId', $workbench_output_ids); })->get(array('itemtypeid', 'asset_path')); foreach ($wb_icons as $wb) { $workbench_output_icons[$wb->itemtypeid] = $wb->asset_path; } unset($wb_icons); } } //ShipIt(TM) $response = View::make('player.player_profile_store')->with('title', 'Player Store for ' . $playerName)->with(compact('web_prefs'))->with(compact('player'))->with(compact('army')); if (!empty($progress)) { $response->progress = $progress; $response->base_shared_items = $base_shared_items; $response->base_assault_items = $base_assault_items; $response->base_biotech_items = $base_biotech_items; $response->base_dreadnaught_items = $base_dreadnaught_items; $response->base_engineer_items = $base_engineer_items; $response->base_recon_items = $base_recon_items; $response->base_firecat_items = $base_firecat_items; $response->base_tigerclaw_items = $base_tigerclaw_items; $response->base_dragonfly_items = $base_dragonfly_items; $response->base_recluse_items = $base_recluse_items; $response->base_rhino_items = $base_rhino_items; $response->base_mammoth_items = $base_mammoth_items; $response->base_arsenal_items = $base_arsenal_items; $response->base_electron_items = $base_electron_items; $response->base_bastion_items = $base_bastion_items; $response->base_nighthawk_items = $base_nighthawk_items; $response->base_raptor_items = $base_raptor_items; } if (!empty($market_listings)) { $response->market_listings = $market_listings; if (!empty($item_stats_lookup)) { $response->stats = $item_stats_lookup; } } if (!empty($workbench_info)) { $response->workbench_info = $workbench_info; $response->workbench_output_icons = $workbench_output_icons; $response->workbench_output_names = $workbench_output_names; } return $response; }
public function Player_Market_Listings($db_id) { $web_prefs = PlayerAPIController::Get_Player_Webprefs($db_id); if ($web_prefs['show_market_listings'] != 1) { return Response::json(array('status' => 'error', 'error' => 'Player is not allowing market listings to be shown.')); } //find out what this player has currently listed on the market if (Cache::has($this->class_name . "_" . $db_id . "_Market_Listings")) { //pull from cache $cached_market_listings = Cache::get($this->class_name . "_" . $db_id . "_Market_Listings"); } else { $market_listings = MarketListing::where('active', '=', '1')->where('character_guid', '=', $player->db_id)->get(array('item_sdb_id', 'expires_at', 'price_cy', 'price_per_unit', 'rarity', 'quantity', 'title', 'icon', 'ff_id', 'category')); if (empty($market_listings)) { //market listings is empty return Response::json(array('status' => 'error', 'error' => 'Player has no current market listings.')); } $market_stat_ids = array(); $market_stat_cats = array(); foreach ($market_listings as $listing) { $market_stat_ids[] = $listing->attributes['ff_id']; $market_stat_cats[] = $listing->attributes['category']; } if (count($market_stat_cats) < 1) { $stats = false; } $market_stat_cats_unique = array_unique($market_stat_cats); $item_stats_lookup = false; foreach ($market_stat_cats_unique as $statcat) { switch ($statcat) { case 'AbilityModule': $stats = MarketStatAbilityModule::where_in('marketlisting_id', $market_stat_ids)->get(); foreach ($stats as $stat) { $temp = '<table>'; $ustats = (array) unserialize($stat->stats); ksort($ustats); foreach ($ustats as $key => $value) { $key = str_replace('_', ' ', $key); $key = ucwords($key); $value = number_format($value, 2); $temp .= '<tr><td>' . htmlentities($key) . ': </td><td>' . htmlentities($value) . '</td></tr>'; } $temp .= '</table>'; $item_stats_lookup[(string) $stat->marketlisting_id] = $temp; } break; case 'CraftingComponent': $stats = MarketStatCraftingComponent::where_in('marketlisting_id', $market_stat_ids)->get(); foreach ($stats as $stat) { $temp = ''; $key_lookup = array('mass' => 'MASS', 'power' => 'PWR', 'cpu' => 'CPU'); ksort($stat->attributes); foreach ($stat->attributes as $key => $value) { if ($value > 0 && array_key_exists($key, $key_lookup)) { $temp .= htmlentities($key_lookup[$key]) . ': ' . htmlentities($value) . '<br>'; } } $item_stats_lookup[(string) $stat->marketlisting_id] = $temp; } break; case 'Jumpjet': $stats = MarketStatJumpjet::where_in('marketlisting_id', $market_stat_ids)->get(); foreach ($stats as $stat) { $temp = '<table>'; $key_lookup = array('id', 'updated_at', 'created_at', 'marketlisting_id'); ksort($stat->attributes); foreach ($stat->attributes as $key => $value) { if (!in_array($key, $key_lookup)) { $key = str_replace('_', ' ', $key); $key = ucwords($key); $value = number_format($value, 2); $temp .= '<tr><td>' . htmlentities($key) . ': </td><td>' . htmlentities($value) . '</td></tr>'; } } $temp .= '</table>'; $item_stats_lookup[(string) $stat->marketlisting_id] = $temp; } break; case 'Plating': $stats = MarketStatPlating::where_in('marketlisting_id', $market_stat_ids)->get(); foreach ($stats as $stat) { $temp = '<table>'; $key_lookup = array('id', 'updated_at', 'created_at', 'marketlisting_id'); ksort($stat->attributes); foreach ($stat->attributes as $key => $value) { if (!in_array($key, $key_lookup)) { $key = str_replace('_', ' ', $key); $key = ucwords($key); $value = number_format($value, 2); $temp .= '<tr><td>' . htmlentities($key) . ': </td><td>' . htmlentities($value) . '</td></tr>'; } } $temp .= '</table>'; $item_stats_lookup[(string) $stat->marketlisting_id] = $temp; } break; case 'Resource': $stats = MarketStatResource::where_in('marketlisting_id', $market_stat_ids)->get(); foreach ($stats as $stat) { $temp = '<table>'; $key_lookup = array(1 => 'Thermal Resistance', 2 => 'Conductivity', 3 => 'Malleability', 4 => 'Density', 5 => 'Toughness', 'quality' => 'Quality'); $temp_ar = array(); foreach ($stat->attributes as $key => $value) { if (array_key_exists($key, $key_lookup)) { $temp_ar[$key] = '<tr><td>' . htmlentities($key_lookup[$key]) . ': </td><td>' . htmlentities($value) . '</td></tr>'; } } //because resources are special, we alpha order them numerically $temp .= $temp_ar[2]; $temp .= $temp_ar[4]; $temp .= $temp_ar[3]; $temp .= $temp_ar[1]; $temp .= $temp_ar[5]; $temp .= $temp_ar['quality']; $temp .= '</table>'; $item_stats_lookup[(string) $stat->marketlisting_id] = $temp; } break; case 'Servo': $stats = MarketStatServo::where_in('marketlisting_id', $market_stat_ids)->get(); foreach ($stats as $stat) { $temp = '<table>'; $key_lookup = array('id', 'updated_at', 'created_at', 'marketlisting_id'); ksort($stat->attributes); foreach ($stat->attributes as $key => $value) { if (!in_array($key, $key_lookup)) { $key = str_replace('_', ' ', $key); $key = ucwords($key); $value = number_format($value, 2); $temp .= '<tr><td>' . htmlentities($key) . ': </td><td>' . htmlentities($value) . '</td></tr>'; } } $temp .= '</table>'; $item_stats_lookup[(string) $stat->marketlisting_id] = $temp; } break; case 'Weapon': $stats = MarketStatWeapon::where_in('marketlisting_id', $market_stat_ids)->get(); foreach ($stats as $stat) { $temp = '<table>'; $key_lookup = array('id', 'updated_at', 'created_at', 'marketlisting_id'); ksort($stat->attributes); foreach ($stat->attributes as $key => $value) { if (!in_array($key, $key_lookup)) { $key = str_replace('_', ' ', $key); $key = ucwords($key); $value = number_format($value, 2); $temp .= '<tr><td>' . htmlentities($key) . ': </td><td>' . htmlentities($value) . '</td></tr>'; } } $temp .= '</table>'; $item_stats_lookup[(string) $stat->marketlisting_id] = $temp; } break; default: break; } } //Cache $cached_market_listings = array(); $cached_market_listings['data'] = $market_listings; $cached_market_listings['stats'] = $item_stats_lookup; Cache::put($this->class_name . "_" . $db_id . "_Market_Listings", $cached_market_listings, 30); } $cached_market_listings['status'] = "success"; return json_encode($cached_market_listings); }
public function get_market_item_graph($sdb_id, $rarity) { if ($sdb_id == null || $rarity == null) { return Response::error('404'); } //check the cache, if the date on the cache is different than todays date than remake the graph else return the cache $cache_key_graphs = "Market_Graph"; $cached_graph = Cache::Get($cache_key_graphs . "_" . $sdb_id . "_" . $rarity); if (empty($cached_graph)) { $cached_graph['last_generated'] = 0; } if ($cached_graph['last_generated'] != gmdate("Y-m-d")) { //Fire up those databases //We need to query all the previously listed sdb_id's with the same quality so lets do that. $item_listings = MarketListing::where(function ($query) use($sdb_id, $rarity) { $query->where('item_sdb_id', '=', $sdb_id); $query->where('rarity', '=', $rarity); $query->where('active', '=', 0); $query->where('created_at', '<', gmdate("Y-m-d")); $query->order_by('created_at', 'ASC'); })->get(array('created_at', 'title', 'rarity', 'price_cy', 'price_per_unit', 'quantity')); if ($item_listings) { //Look at all these variables! $max_listing = 0.0; $min_listing = 100000000.0; $all_time_max_listing = 0.0; $all_time_min_listing = 100000000.0; $max_listing_date = ""; $min_listing_date = ""; $item_name = $item_listings[0]->title; //remove the ^Q or ^### $temp_name = explode("^", $item_name); $is_resource = 0; if (isset($temp_name[1])) { if ($temp_name[1] != "Q") { //this is a resource item, we need to use unit price, not price_cy $is_resource = 1; } } $item_name = $temp_name[0]; $market_info_javascript_range = "["; $market_info_javascript_average = "["; $item_running_average = array(); $last_date = explode(" ", $item_listings[0]->created_at)[0]; $last_date_supply = 0; $counter = 0; $index = 0; $i = 0; $total_listings = count($item_listings); //find an average, max and min price per day foreach ($item_listings as $market_listing) { //babies first market check if ($is_resource && $market_listing->quantity > 100 || !$is_resource) { //override for price_cy or price_per_unit if ($is_resource) { $price_field = $market_listing->price_per_unit; } else { $price_field = $market_listing->price_cy; } $date = explode(" ", $market_listing->created_at)[0]; if ($last_date != $date) { $last_date = $date; if ($counter != 0) { //there is an issue with the first item also being the only item for that day, avoid that (bad programming general) if ($i != 1) { //the average has to be calculated because we have more than one data point for this day if ($is_resource) { $calc_average = number_format($item_running_average[$index]['average'] / $counter, 3); } else { $calc_average = floor($item_running_average[$index]['average'] / ($counter + 1)); } //check to make sure the average isnt below the min, this happens when we have only two data points and they are significantly different if ($calc_average < $item_running_average[$index]['low']) { //re-do the average, this should NEVER happen for resources! $calc_average = floor($item_running_average[$index]['average'] / $counter); } $item_running_average[$index]['average'] = $calc_average; } } else { //we only have one data point thus it is the average $item_running_average[$index]['average'] = $price_field; $max_listing = $price_field; $min_listing = $price_field; } $item_running_average[$index]['high'] = $max_listing; $item_running_average[$index]['low'] = $min_listing; $min_listing = 100000000.0; $max_listing = 0.0; $counter = 0; $index = $index + 1; if ($is_resource) { //reset the supply counter $last_date_supply = 0; } } if (!empty($item_running_average[$index]['average'])) { $item_running_average[$index]['average'] = $item_running_average[$index]['average'] + $price_field; $item_running_average[$index]['date'] = $date; } else { $item_running_average[$index]['average'] = $price_field; } ++$counter; if ($price_field > $max_listing) { //update max listing $max_listing = $price_field; $item_running_average[$index]['high'] = $max_listing; } if ($price_field > $all_time_max_listing) { //update the all time max listing $all_time_max_listing = $price_field; $max_listing_date = $market_listing->created_at; } if ($price_field < $min_listing) { //update min listing $min_listing = $price_field; $item_running_average[$index]['low'] = $min_listing; } if ($price_field < $all_time_min_listing) { //update the all time max listing $all_time_min_listing = $price_field; $min_listing_date = $market_listing->created_at; } $item_running_average[$index]['date'] = $date; if ($is_resource) { $last_date_supply = $last_date_supply + $market_listing->quantity; } else { $last_date_supply = $counter; } ++$i; } } //deal with the last element //if we are doing resources we want to list the amount of units that were listed, not the amount of listings if (!$is_resource) { $item_running_average[$index]['average'] = floor($item_running_average[$index]['average'] / $last_date_supply); } else { //deal with single entries if ($counter == 1) { //we only had one entry so its unit price is the average. $item_running_average[$index]['average'] = number_format($price_field, 3); } else { $item_running_average[$index]['average'] = number_format($item_running_average[$index]['average'] / $counter, 3); } } for ($i = 0; $i < count($item_running_average); $i++) { $date = $item_running_average[$i]['date']; $market_info_javascript_range .= "[" . strtotime($date) * 1000 . "," . $item_running_average[$i]['low'] . "," . $item_running_average[$i]['high'] . "],"; $market_info_javascript_average .= "[" . strtotime($date) * 1000 . "," . $item_running_average[$i]['average'] . "],"; } //slice the array for an average compare if (count($item_running_average >= 2)) { $item_running_average = array_slice($item_running_average, count($item_running_average) - 2, 2); } else { $item_running_average = 0; } $market_info_javascript_range = rtrim($market_info_javascript_range, ",") . "]"; $market_info_javascript_average = rtrim($market_info_javascript_average, ",") . "]"; //cache this $cached_graph['last_generated'] = gmdate("Y-m-d"); $cached_graph['js_range'] = $market_info_javascript_range; $cached_graph['js_average'] = $market_info_javascript_average; $cached_graph['item_name'] = $item_name; $cached_graph['min_listing'] = $all_time_min_listing; $cached_graph['max_listing'] = $all_time_max_listing; $cached_graph['min_listing_date'] = $min_listing_date; $cached_graph['max_listing_date'] = $max_listing_date; $cached_graph['last_supply'] = $last_date_supply; $cached_graph['is_resource'] = $is_resource; $cached_graph['last_two_averages'] = $item_running_average; Cache::forever($cache_key_graphs . "_" . $sdb_id . "_" . $rarity, $cached_graph); //set item_listings to something for the view $item_listings = 1; } else { //no graphs! $item_listings = 0; $item_name = 0; } } else { //load from cache $market_info_javascript_range = $cached_graph['js_range']; $market_info_javascript_average = $cached_graph['js_average']; $item_name = $cached_graph['item_name']; $all_time_min_listing = $cached_graph['min_listing']; $all_time_max_listing = $cached_graph['max_listing']; $min_listing_date = $cached_graph['min_listing_date']; $max_listing_date = $cached_graph['max_listing_date']; $last_date_supply = $cached_graph['last_supply']; $is_resource = $cached_graph['is_resource']; $item_running_average = $cached_graph['last_two_averages']; $item_listings = 1; } //Push this data to the view. return View::make('market.graph')->with(compact('item_listings'))->with(compact('item_name'))->with(compact('market_info_javascript_range'))->with(compact('market_info_javascript_average'))->with(compact('all_time_min_listing'))->with(compact('all_time_max_listing'))->with(compact('min_listing_date'))->with(compact('max_listing_date'))->with(compact('last_date_supply'))->with(compact('rarity'))->with(compact('is_resource'))->with(compact('item_running_average'))->with(compact('sdb_id')); }