/** * @dataProvider statusAndOutputProvider */ public function testPrintStatus($name, $success, $expectedLine, $expectedStatus) { $output = $this->getMock('Output', array('write', 'writeln')); $output->expects($this->once())->method('write')->with($expectedLine); $output->expects($this->once())->method('writeln')->with($expectedStatus); $fixture = new Progress($output, 10); $fixture->printStatus($name, $success); }
/** * @depends testPattern */ public function testLineBreak() { $progress = new Progress(10, '%bar%'); $progress->width = 10; $progress->lineBreakOnFinish = false; ob_start(); $progress->show(10); $this->assertEquals("\r[==========]", ob_get_clean()); $progress->lineBreakOnFinish = true; ob_start(); $progress->show(10); $this->assertEquals("\r[==========]\n", ob_get_clean()); }
public function testRunClearProgress() { $this->shell->setRawArgs(['data', '--reset', '--config', 'file/to/config.xml']); $mode = $this->getMock('\\Migration\\Mode\\Data', [], [], '', false); $mode->expects($this->any())->method('run'); $this->modeFactory->expects($this->once())->method('create')->with('data')->willReturn($mode); $this->progress->expects($this->once())->method('reset'); $this->shell->run(); }
private function replacePhrases($data, $phrases, Progress $progress, float $progressModifier) { $phrases = array_filter($phrases, function ($value) { return !empty($value); }); usort($phrases, function ($a, $b) use($data) { $aUses = substr_count($data, $a) * strlen($a); $bUses = substr_count($data, $b) * strlen($b); return $bUses <=> $aUses; }); $replacements = []; $i = 0; foreach ($phrases as $phrase) { $i++; $progress->notify($i / count($phrases) + $progressModifier); if (!strstr($data, $phrase)) { // This phrase isn't even in the data. Skip it continue; } $key = $this->findKey($data); if (strlen($phrase) <= strlen($key)) { // Do not bother if the key is as big as the word $this->freeKey($key); continue; } $usages = substr_count($data, $phrase); $usedSpace = $usages * strlen($phrase); $willUse = $usages * strlen($key) + strlen($key) + strlen($phrase) + 1; if ($willUse >= $usedSpace) { // Do not bother if the extra meta data means its overall larger with replacement $this->freeKey($key); continue; } $replacements[$phrase] = $key; } return $replacements; }
} function getSent() { return $this->sent; } function getRelativePath() { return dirname($this->filename); } function getFullPath() { return realpath($this->getRelativePath()); } } class Progress { private $measurableContent; function __construct(Measurable $measurableContent) { $this->measurableContent = $measurableContent; } function getAsPercent() { return $this->measurableContent->getSent() * 100 / $this->measurableContent->getLength(); } } $file = new File(); $file->setLength(200); $file->setSent(100); $progress = new Progress($file); echo $progress->getAsPercent();
protected function afterSave() { parent::afterSave(); $users = DisciplineToUser::model()->findAllByAttributes(array('id_discipline' => $this->id_discipline)); if ($this->isNewRecord) { foreach ($users as $user) { $model = new Progress(); $model->id_user = $user->id_user; $model->id_lesson = $this->id_lesson; $model->save(); } } }
public function Set_Player_Progress($db_id, $input) { if (Cache::has($this->class_name . "_" . $db_id . "_Progress_MD5")) { //check the input MD5 against this if (md5($input) == Cache::get($this->class_name . "_" . $db_id . "_Progress_MD5")) { return true; } } else { //Check the last send for progress, see if we need to update, or make a new row $last_progress_update = Progress::where(function ($query) use($db_id) { $query->where('db_id', '=', $db_id); $query->where(DB::raw('DATE(updated_at)'), '=', $this->date_only); })->order_by('id', 'desc')->first('id'); try { if ($last_progress_update) { $query_update_prog = "UPDATE `progresses` SET `entry` = ?, updated_at = ? WHERE `id` = ?"; $bindings_update_progress = array(gzcompress(json_encode($input), 5), $this->date, $last_progress_update->id); if (DB::query($query_update_prog, $bindings_update_progress) === false) { throw new Exception('Error updating progress.'); } } else { $progress = new Progress(); $progress->db_id = $db_id; $progress->entry = gzcompress(json_encode($input), 5); if (!$progress->save()) { throw new Exception('Add progress query failed:'); } } } catch (Exception $e) { Log::info($log_header . $e->getMessage()); file_put_contents($this->logpath . $this->logdate . '_bad_player.json', json_encode($input)); return false; } } //set cache file and cache MD5 file Cache::forever($this->class_name . "_" . $db_id . "_Progress", json_encode($input)); Cache::forever($this->class_name . "_" . $db_id . "_Progress_MD5", md5($input)); return true; }
public function actionStudentprogress() { $model = new Progress('search'); $model->unsetAttributes(); // clear any default values if (isset($_GET['Progress'])) { $model->attributes = $_GET['Progress']; } if (isset($_POST['id_discipline'])) { $id = $_POST['id_discipline']; $criteria = new CDbCriteria(); $criteria->compare('lesson.id_discipline', $id); $criteria->compare('t.id_user', Yii::app()->user->id); $criteriaAttendance = clone $criteria; //$criteriaAttendance->compare('attendance', 1); $criteriaEstimate = clone $criteria; $criteriaEstimate->compare('attendance', 0); unset($criteria); $this->renderPartial('_progressAttendanceStudent', array('model' => $model, 'criteriaAttendance' => $criteriaAttendance)); $this->renderPartial('_progressEstimateStudent', array('model' => $model, 'criteriaEstimate' => $criteriaEstimate)); Yii::app()->end(); } $disp = DisciplineToUser::model()->findByAttributes(array('id_user' => Yii::app()->user->id)); $id = $disp ? $disp->id_discipline : 0; $criteria = new CDbCriteria(); $criteria->compare('lesson.id_discipline', $id); $criteria->compare('t.id_user', Yii::app()->user->id); $criteriaAttendance = clone $criteria; //$criteriaAttendance->compare('attendance', 1); $criteriaEstimate = clone $criteria; $criteriaEstimate->compare('attendance', 0); unset($criteria); $this->render('showProgressStudent', array('model' => $model, 'criteriaAttendance' => $criteriaAttendance, 'criteriaEstimate' => $criteriaEstimate)); }
amessage('operating', "?entry=gmissions&action=outputauto&gsid={$gsid}&pages={$pages}&npage={$npage}&fromid={$fromid}&confirm=1&use_push=1{$param_suffix}", $pages, $npage, "<a href=\"?entry=gmissions&action=gmissionsedit{$param_suffix}\">", '</a>'); } adminlog(lang('content_auto_output')); amessage('conautoutfin'); } elseif ($action == 'allauto' && $gsid) { empty($gmissions[$gsid]) && amessage('choosegatmis'); if (empty($confirm)) { $message = lang('choose_allauto') . "<br><br>"; $message .= lang('confirmclick') . ">><a href=?entry=gmissions&action=allauto&gsid=" . $gsid . "&confirm=1&use_push=1{$param_suffix}>" . lang('start') . "</a>"; amessage($message); } $gmission = read_cache('gmission', $gsid, '', $sid); $c_upload = new cls_upload(); $gather = new cls_gather(); $gather->set_mission($gsid); $progress = new Progress(); if (empty($deal)) { $surls = $gather->fetch_surls(); foreach ($surls as $surl) { $gather->fetch_gurls($surl); } $progress->hide(); amessage('toautogather', "?entry=gmissions&action=allauto&gsid={$gsid}&deal=gather&confirm=1&use_push=1{$param_suffix}"); } elseif ($deal == 'gather') { //已采集但未完结的合辑中的子内容也需要采集 $wheresql = "WHERE gsid='{$gsid}' AND " . ($gmission['sonid'] ? 'abover=0' : 'gatherdate=0'); if (empty($pages)) { if (!($nums = $db->result_one("SELECT COUNT(*) FROM {$tblprefix}gurls {$wheresql}"))) { amessage('nogatheritem'); } $pages = @ceil($nums / $atpp);
$cookie = Cookie::forget('quiz_progress'); return Redirect::to('/')->withCookie($cookie); }); Route::get('cookies', function () { return View::make('legal.cookies'); }); Route::get('privacy', function () { return View::make('legal.privacy'); }); Route::get('continue', array('before' => 'reload', function () { if (!Cookie::has('quiz_progress')) { return Redirect::to('/'); } $questions = Config::get('questions'); $progress_id = Cookie::get('quiz_progress'); $progress = Progress::find($progress_id); if (!$progress) { return Redirect::to('/'); } $saved_progress = json_decode($progress->progress, true); $new_questions = array_merge_recursive($questions, $saved_progress); reset($new_questions); //add to session Session::put('questions', $new_questions); Session::put('source', json_decode($progress->source, true)); foreach ($new_questions as $section => $pages) { foreach ($pages['pages'] as $page => $details) { if (!isset($details['done'])) { $last_set['section'] = $section; $last_set['page'] = $page; break 2;
<?php // Bereich für alle User zugänglich if ($_SESSION['profile']['loggedin'] == 1) { // Objekte erzeugen $topic = new Topic(); $progress = new Progress(); // Überprüfung / Wertzuweisung $action = ''; if (isset($_GET['action'])) { $action = strval($_GET['action']); } $topic = 0; if (isset($_REQUEST["t_id"])) { $topic = abs(intval($_REQUEST["t_id"])); } // Übeprüfung auf buchstaben (keine Zahlen zugelassen) if (!ctype_alpha($action)) { unset($action); } // als Tabelle zeigen if ($action == "showTable") { $progress->setTopic($topic); $progress->getProgress(); $progress->showTable(); } // als Liniendiagramm anzeigen if ($action == "showGraph") { $progress->setTopic($topic); $progress->getProgress(); $progress->showGraph();
public function get_single_battleframe($name = NULL, $frame_name = NULL) { //searching by name, null name = no buenos if ($name == NULL || $frame_name == NULL) { return Response::error('404'); } else { $input_name = urldecode($name); } $valid_frame_name = array('assault', 'firecat', 'tigerclaw', 'biotech', 'recluse', 'dragonfly', 'dreadnaught', 'rhino', 'mammoth', 'engineer', 'electron', 'bastion', 'recon', 'raptor', 'nighthawk', 'arsenal'); if (!in_array($frame_name, $valid_frame_name)) { return Response::error('404'); } //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'); } //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; } //loadouts /* Mappings: $loadout->Gear[$i] = Currently equipped items array $loadout->Gear[$i]->slot_index $loadout->Gear[$i]->info->durability->pool $loadout->Gear[$i]->info->durability->current $loadout->Gear[$i]->info->attribute_modifiers[$k] = array of custom attributes for this item $loadout->Gear[$i]->info->quality = The quality of the crafted item $loadout->Gear[$i]->info->creator_guid = the creators unique player ID $loadout->Gear[$i]->info->item_sdb_id = The root item this was crafted from $loadout->Weapons[$i] = Currently equiped weapons array $loadout->Weapons[$i]->info->durability->pool $loadout->Weapons[$i]->info->durability->current $loadout->Weapons[$i]->info->attribute_modifiers[$k] $loadout->Weapons[$i]->info->quality $loadout->Weapons[$i]->info->creator_guid $loadout->Weapons[$i]->info->item_sdb_id $loadout->Weapons[$i]->allocated_power $loadout->Weapons[$i]->slot_index = Weapon slot, 0 is main hand, 1 is alt weapon */ /* Attribute modifiers mapping: 5 = Jet Energy Recharge 6 = health 7 = health regen 12 = Run Speed 29 = weapon splash radius 35 = Energy (for jetting) 37 = Jump Height 950 = Max durability pool 951 = Mass (unmodified - YOU MUST take the abs of this to get it to display correctly!) 952 = Power (unmodified - YOU MUST take the abs of this to get it to display correctly!) 953 = CPU (unmodified - YOU MUST take the abs of this to get it to display correctly!) 956 = clip size 954 = damage per round 977 = Damage 978 = Debuff Duration 1121= Air Sprint Defaults for weapons are set in the "hstats" table. */ if (isset($web_prefs['show_loadout'])) { if ($web_prefs['show_loadout'] == 1) { $loadout = Loadout::where('db_id', '=', $player->db_id)->first(); } else { $loadout = null; } } else { $loadout = Loadout::where('db_id', '=', $player->db_id)->first(); } if ($loadout) { //Lets play the cache game, where all the stuff is stored locally and the points don't matter! $loadout = unserialize($loadout->entry); //VERSION 0.6 CHECKING (Array = Good, Object = BAD!) if (gettype($loadout) == "object") { //This is from version 0.6, we can no longer use this data. $loadout = null; } $cache_key_loadouts = $player->db_id . "_loadouts"; $loadout_md5 = md5(serialize($loadout)); if (Cache::Get($cache_key_loadouts . '_md5') != $loadout_md5 && $loadout != null) { //Oh I am playing the game, the one that will take me to my end. //Make sure this isnt a terrible send if (isset($loadout[0]->Gear)) { for ($k = 0; $k < count($loadout); $k++) { if ($loadout[$k]->Chassis_ID == 77733 || $loadout[$k]->Chassis_ID == 82394 || $loadout[$k]->Chassis_ID == 31334) { //ignore the training frame } else { //Break each loadout into its own cache Cache::forever($cache_key_loadouts . '_' . $loadout[$k]->Chassis_ID, $loadout[$k]); } } //Cache the loadout md5 so we can call it again later Cache::forever($cache_key_loadouts . '_md5', $loadout_md5); //and finally set loadout=1 so we know to display equipped gear data $loadout = 1; } } } //progress (feat. obama) if (isset($web_prefs['show_progress'])) { if ($web_prefs['show_progress'] == 1) { $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(); } /* Mappings: $progress->xp[$i].sdb_id = ItemTypeId for chassis $progress->xp[$i].name = battle frame name $progress->xp[$i].lifetime_xp = amount of xp gained overall $progress->xp[$i].current_xp = currently allocated XP (WARNING: key may not exist!) $progress->chassis_id = current chassis ID, use this to identify what battleframe the player was last using $progress->unlocks.array() = certificate array for currently equipped chassis */ if ($progress) { //Progression graph builder $player_progresses_cache_key = $player->db_id . "_graph"; $player_id = $player->db_id; $frame_progress_javascript = array(); if (Cache::has($player_progresses_cache_key)) { //pull from cache $frame_progress_javascript = Cache::get($player_progresses_cache_key); } else { //don't cache the query, that wont help us; cache the javascript output for highcharts instead. $player_progresses = DB::query('SELECT DISTINCT(`db_id`),`entry`,unix_timestamp(`updated_at`) AS `updated_at` FROM `progresses` WHERE db_id= ' . $player_id . ' AND `created_at` > DATE_SUB(CURDATE(), INTERVAL 7 DAY) GROUP BY `created_at` ORDER BY `updated_at` ASC LIMIT 7'); //check chassis_id exists if (!empty($player_progresses)) { $check_chassis = unserialize($player_progresses[0]->entry); } else { $check_chassis = ""; $check_chassis_id = false; } if (!isset($check_chassis->chassis_id)) { $check_chassis_id = false; } else { $check_chassis_id = true; } if ($player_progresses && $check_chassis_id) { $frame_progress = array(); for ($i = 0; $i < count($player_progresses); $i++) { $day_progress = unserialize($player_progresses[$i]->entry); unset($day_progress->unlocks); foreach ($day_progress->xp as $key => $value) { if ($value->sdb_id == 77733 || $value->sdb_id == 82394 || $value->sdb_id == 31334) { //ignore training frame } else { $frame_progress[$value->name][$player_progresses[$i]->updated_at] = $value->lifetime_xp; } } } //Make it json datas $frame_progress_javascript = array(); foreach ($frame_progress as $battle_frame_name => $value) { $xp_data_string = "["; foreach ($value as $day => $xp_amt) { $xp_data_string .= "[" . $day * 1000 . "," . $xp_amt . "],"; $frame_progress_javascript[$battle_frame_name] = rtrim($xp_data_string, ",") . "]"; } } } else { $frame_progress_javascript = null; $progress = false; } //build cache Cache::put($player_progresses_cache_key, $frame_progress_javascript, 30); } } else { $frame_progress_javascript = null; $progress = false; } //Frames & Unlocks if ($progress) { $progress = unserialize($progress->entry); $cache_key_progress = $player->db_id . "_progress"; if (Cache::Get($cache_key_progress) != $progress) { if (isset($progress->xp)) { $battle_frame_id_list = array(); for ($i = 0; $i < count($progress->xp); $i++) { $battle_frame_id_list[$i] = $progress->xp[$i]->sdb_id; } $battle_frame_images = hWebIcon::where(function ($query) use($battle_frame_id_list) { $query->where('version', '=', Base_Controller::getVersionDate()); $query->where_in('itemTypeId', $battle_frame_id_list); })->get(); //set some cache Cache::forever($cache_key_progress . "_battleframe_images", $battle_frame_images); } else { $battle_frame_images = null; } if (isset($web_prefs['show_unlocks'])) { $show_unlocks = $web_prefs['show_unlocks']; } else { //Assume show unlocks is 1 $show_unlocks = 1; } if (isset($progress->unlocks) && $show_unlocks == 1) { //VERSION 0.6 CHECK (Array = BAD, Object = Good!) if (gettype($progress->unlocks) == "array") { //NOPE. $battle_frame_unlocks = null; } else { if (gettype($progress->unlocks) == "object") { //Looks like 0.7+ to me! //Create a cache for each frame unlock set foreach ($progress->unlocks as $chassis_id => $cert_array) { if ($chassis_id == 77733 || $chassis_id == 82394 || ($chassis_id = 31334)) { //ignore training frame } else { Cache::forever($cache_key_progress . "_" . $chassis_id, $cert_array); } } } } } //Cache the progress variable so we can do a quick compare on a later load Cache::forever($cache_key_progress, $progress); } else { //Assign cache values to local variable names. $battle_frame_images = Cache::Get($cache_key_progress . "_battleframe_images"); $progress = Cache::Get($cache_key_progress); } } else { $battle_frame_unlocks = null; } return View::make('player.single_battleframe')->with('title', 'Player Profile for ' . $playerName)->with(compact('player'))->with(compact('frame_name'))->with(compact('loadout'))->with(compact('battle_frame_unlocks'))->with(compact('progress'))->with(compact('frame_progress_javascript'))->with(compact('battle_frame_images'))->with(compact('web_prefs')); }
public function get_barsiggen($name = NULL, $beer = NULL, $frame_request = NULL) { //Your arguments must be recognized in Fort Kickass if (is_null($beer) || is_null($name) || is_null($frame_request)) { return Response::error('404'); } //Light beer vs. Dark beer, the showdown - Thanks Van. if (!in_array($beer, array('light', 'dark'))) { return Response::error('404'); } //check to make sure in valid frame names //don't forget "barsig" for current $valid_frame_requests = array('barsig', 'arsenal', 'assault', 'firecat', 'tigerclaw', 'biotech', 'recluse', 'dragonfly', 'dreadnaught', 'rhino', 'mammoth', 'engineer', 'electron', 'bastion', 'recon', 'raptor', 'nighthawk'); if (!in_array($frame_request, $valid_frame_requests)) { return Response::error('404'); } //Alright, now that I'm nice and limber. Let's see if you're even people. $input_name = urldecode($name); $player = Player::where('name', '=', $input_name)->order_by('created_at', 'DESC')->first(); //If you're not even people (like Xtops), go away if (is_null($player)) { return Response::error('404'); } //STOP. Hammertime. Get that data. Set that data straight. $output_name = ""; $output_xp = ""; $output_class = ""; $output_weapon = ""; $current_frame = ""; //Let's set the player name with army tag if it exists $playerName = htmlentities($player->name); if (isset($player->armytag) && strlen($player->armytag) > 1) { $output_name = htmlentities($player->armytag . ' ' . $player->name); } else { $output_name = htmlentities($player->name); } //Alright, now we're making progress! (get it?) //Naw, let's just copy X5s $cache_key = $playerName . "_" . $beer . "_sig_" . $frame_request; if (!Cache::has($player->db_id . '_' . $beer . '_sig_' . $frame_request)) { $progress = Progress::where('db_id', '=', $player->db_id)->order_by('updated_at', 'DESC')->first(); if ($progress) { $progress = unserialize($progress->entry); $cache_key_progress = $player->db_id . "_progress"; if (isset($progress->xp) && isset($progress->chassis_id)) { //if we're barsig only, current frame, if not check entry for other frame exists if ($frame_request == 'barsig') { $current_frame = $progress->chassis_id; } else { $frame_request_exists = self::simpleNameToChassisId($frame_request); if (!$frame_request_exists) { return Response::error('404'); } else { $current_frame = $frame_request_exists; } } foreach ($progress->xp as $chassy) { if ($chassy->sdb_id == $current_frame) { $output_xp = $chassy->lifetime_xp; break; } } } else { //we need this data, abort! return Response::error('404'); } } else { //We kind of need progress in order to display anything so if the user doesn't have a progress than abort everything. return Response::error('404'); } $output_xp = number_format($output_xp / 1000000, 2) . 'M XP'; //Classy. But if not, gtfo $output_class = strtolower(self::chassisIdToSimpleName($current_frame)); if (!$output_class) { Log::info('no class: ' . $current_frame); return Response::error('404'); } //WEAPON ICONS, ASSEMBLE switch ($output_class) { case 'arsenal': case 'assault': case 'firecat': case 'tigerclaw': $output_weapon = 'assault'; break; case 'engineer': case 'bastion': case 'electron': $output_weapon = 'engineer'; break; case 'dreadnaught': case 'mammoth': case 'rhino': $output_weapon = 'dreadnaught'; break; case 'biotech': case 'recluse': case 'dragonfly': $output_weapon = 'biotech'; break; case 'recon': case 'raptor': case 'nighthawk': $output_weapon = 'recon'; break; default: $output_weapon = 'assault'; break; } // Copy and merge those sexy sexy images $background = imagecreatefrompng('public/img/sig_set/Bar/base-' . $beer . '.png'); $overlay_weapon_icon = imagecreatefrompng('public/img/sig_set/Bar/class_weapons/' . $output_weapon . '.png'); $overlay_class_icon = imagecreatefrompng('public/img/sig_set/Bar/class_icons/' . $output_class . '.png'); imagesavealpha($background, true); self::imagecopymerge_alpha($background, $overlay_weapon_icon, 305, 2, 0, 0, imagesx($overlay_weapon_icon), imagesy($overlay_weapon_icon), 100); imagedestroy($overlay_weapon_icon); imagesavealpha($background, true); self::imagecopymerge_alpha($background, $overlay_class_icon, 5, 2, 0, 0, imagesx($overlay_class_icon), imagesy($overlay_class_icon), 100); imagedestroy($overlay_class_icon); imagesavealpha($background, true); imageantialias($background, true); //Don't worry text, we didn't forget about you! $text_color = $beer == 'light' ? imagecolorallocate($background, 0, 0, 0) : imagecolorallocate($background, 255, 255, 255); imagestring($background, 2, 30, 3, $output_name, $text_color); imagestring($background, 1, 240, 6, $output_xp, $text_color); // Output and free from memory Cache::put($player->db_id . '_' . $beer . '_sig', '1', 5); imagepng($background, 'storage/cache/sigs/' . $playerName . '_' . $beer . '_sig_' . $frame_request . '.png', 9); imagedestroy($background); } //end cache $image_path = 'storage/cache/sigs/' . $playerName . '_' . $beer . '_sig_' . $frame_request . '.png'; //Generate the response Response::make('', 200, array('Content-Type' => 'image/png', 'Content-Transfer-Encoding' => 'binary', 'Content-Disposition' => 'inline', 'Expires' => 0, 'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0', 'Pragma' => 'public', 'Content-Length' => filesize($image_path)))->send_headers(); readfile($image_path); exit; }
public function post_player() { $log_header = "addon_v2.php@player [" . $this->user_ip . "] - ({$this->logdate}): "; $line = Input::json(); if ($this->savedata) { file_put_contents($this->logpath . $this->logdate . '_player.json', serialize($line)); } $datlog = new DatLog(); $datlog->ip = ip2long($this->user_ip); $datlog->db_id = isset($line->Player_ID) ? $line->Player_ID : NULL; $datlog->name = isset($line->Player_Name) ? $line->Player_Name : NULL; $datlog->category = 'player'; $datlog->save(); try { /* ******************************** ** Validate Minimum Keys Exist** ******************************** * # Fail if invalid */ //Minimum keys if (!isset($line->Inventory) || !isset($line->Progress) || !isset($line->Website_Prefs) || !isset($line->Player_ID) || !isset($line->Player_Name) || !isset($line->Player_Instance) || !isset($line->Loadouts) || !isset($line->Player_EID) || !isset($line->Player_Coords) || !isset($line->ArmyID) || !isset($line->Battle_Frame)) { throw new Exception('Player did not send all keys.'); } /* ******************************** ** Validate Player ID (db_id) ** ******************************** * # Fail if invalid * @ sets $player_db_id * * -check digits only * -19 characters long * -Begins with a 9 */ //Digits only? if (preg_match('/[^0-9]/', $line->Player_ID)) { throw new Exception("Player ID was more than just numbers: " . $line->Player_ID); } //19 Characters long? if (strlen($line->Player_ID) !== 19) { throw new Exception("Player ID was not 19 characters: " . $line->Player_ID); } //Starts with a 9? if (substr($line->Player_ID, 0, 1) !== '9') { throw new Exception("Player ID did not start with a 9: " . $line->Player_ID); } $player_db_id = $line->Player_ID; /* ********************************** ** Validate Player Name/Army Tag** ********************************** * # Warn if invalid * @ sets $player_name * @ sets $player_army_tag * * -15 + 6 characters or less ~23 to be safe * -We don't care about character content as much as FF does */ //Check if name is way too long, or too short if (strlen($line->Player_Name) > 30 || trim(strlen($line->Player_Name)) < 3) { throw new Exception("Player ({$player_db_id}) name was longer than 30 characters, should be <= 23: " . $line->Player_Name); } //Warn if longer than expected (that's what she said) //But allow for armytag length too if (strlen($line->Player_Name) > 27) { Log::warn("Player ({$player_db_id}) sent a character name longer than max expected length of 27: " . $line->Player_Name); } //Name is ok, but does it have an army tag? Does it blend? if (strpos($line->Player_Name, ']')) { $last = strripos($line->Player_Name, ']') + 1; $player_army_tag = substr($line->Player_Name, 0, $last); $player_name = trim(substr($line->Player_Name, $last)); } else { $player_army_tag = NULL; $player_name = $line->Player_Name; } /* *********************************** ** Check existing name/db_id ** *********************************** * Does the db_id exist? * Does the submitted name match existing? */ $check_existing_sql = Player::where('db_id', '=', $player_db_id)->order_by('created_at', 'DESC')->first(); if ($check_existing_sql) { if ($check_existing_sql->name != $player_name) { throw new Exception("Existing db_id does not match existing name: (player sent:{$player_db_id}|{$player_name};existing:{$check_existing_sql->db_id}|{$check_existing_sql->name};)"); Log::warn("Existing db_id does not match existing name({$player_db_id}|in:{$player_name}|existing:{$check_existing_sql->name})"); } } /* ******************************** ** Validate Website Prefs ** ******************************** * # Allow, but only if valid * @ (self contained) * * -Contain all keys * -Only 0 or 1 values */ //Minimum keys if (isset($line->Website_Prefs) && isset($line->Website_Prefs->show_loadout) && isset($line->Website_Prefs->show_inventory) && isset($line->Website_Prefs->show_progress) && isset($line->Website_Prefs->show_unlocks) && isset($line->Website_Prefs->show_pve_kills) && isset($line->Website_Prefs->show_pve_stats) && isset($line->Website_Prefs->show_pve_events) && isset($line->Website_Prefs->show_location)) { //Get ready to save, check for boolean digit values only $save_prefs = true; foreach ($line->Website_Prefs as $pref) { //allowed values 1|0 if ($pref !== 0 && $pref !== 1) { $save_prefs = false; } } //because not everyone uses the latest version $show_workbench = isset($line->Website_Prefs->show_workbench) ? $line->Website_Prefs->show_workbench : 0; $show_craftables = isset($line->Website_Prefs->show_craftables) ? $line->Website_Prefs->show_craftables : 0; $show_market_listings = isset($line->Website_Prefs->show_market_listings) ? $line->Website_Prefs->show_market_listings : 0; //IF Website Prefs are appropriate, right click, save as if ($save_prefs) { $prefs = $line->Website_Prefs; $query_webpref = 'INSERT INTO `websiteprefs` (db_id, '; $query_webpref .= 'show_loadout, show_progress, show_inventory, show_unlocks, '; $query_webpref .= 'show_pve_kills, show_pve_stats, show_pve_events, show_location, '; $query_webpref .= 'show_workbench, show_craftables, show_market_listings, '; $query_webpref .= 'created_at, updated_at) VALUES '; $query_webpref .= '(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE '; $query_webpref .= '`show_loadout` = ?, `show_progress` = ?, `show_inventory` = ?, show_unlocks = ?, '; $query_webpref .= '`show_pve_kills` = ?, `show_pve_stats` = ?, `show_pve_events` = ?, `show_location` = ?, '; $query_webpref .= '`show_workbench` = ?, `show_craftables` = ?, `show_market_listings` = ?, '; $query_webpref .= '`updated_at` = ?'; $bindings_webpref = array($player_db_id, $prefs->show_loadout, $prefs->show_progress, $prefs->show_inventory, $prefs->show_unlocks, $prefs->show_pve_kills, $prefs->show_pve_stats, $prefs->show_pve_events, $prefs->show_location, $show_workbench, $show_craftables, $show_market_listings, $this->date, $this->date, $prefs->show_loadout, $prefs->show_progress, $prefs->show_inventory, $prefs->show_unlocks, $prefs->show_pve_kills, $prefs->show_pve_stats, $prefs->show_pve_events, $prefs->show_location, $show_workbench, $show_craftables, $show_market_listings, $this->date); DB::query($query_webpref, $bindings_webpref); } else { Log::warn("Player ({$player_db_id}) sent invalid Website Prefs values: " . implode(',', (array) $line->Website_Prefs)); } } else { Log::warn($log_header . "Player ({$player_db_id}) did not send all website prefs or correct keys: "); } /* ********************************** ** Validate Instance ID ** ********************************** * # Fail if not numeric, or 9|10 long * @ sets $player_instance_id * * -Greater than 0 * -Expected length 9 or 10, but others possible */ //Not negative 1 for some reason if ($line->Player_Instance === -1) { throw new Exception("Player ({$player_db_id}) Instance ID was -1: " . $line->Player_Instance); } //Sending only digits if (preg_match('/[^0-9]/', $line->Player_Instance)) { throw new Exception("Player ({$player_db_id}) Instance ID contained something other than a number: " . $line->Player_Instance); } //Log if non regular instanceid (can be legit) if (strlen($line->Player_Instance) < 5) { Log::warn("Player ({$player_db_id}) Instance ID was less than 5 digits long: " . $line->Player_Instance); } $player_instance_id = $line->Player_Instance; /* ********************************** ** Validate Player EID ** ********************************** * # Fail is non numeric, NULL otherwise * @ sets $player_eid * * -Greater than 0 * -Expected length 9 or 10, but others possible */ //Sent only numbers if (preg_match('/[^0-9]/', $line->Player_EID)) { throw new Exception("Player ({$player_db_id}) EID contained something other than a number: " . $line->Player_EID); } //EID should be as long as a db_id if (strlen($line->Player_EID) !== 19) { Log::warn("Player ({$player_db_id}) EID was not the expected 19 digits long: " . $line->Player_EID); $line->Player_EID = NULL; } $player_eid = $line->Player_EID; /* ********************************** ** Validate Army ID ** ********************************** * # Fail if set and not nil or numeric * @ sets $player_army_id * * -Greater than 0 * -Expected length 9 or 10, but others possible */ //ArmyID nil -> null if (isset($line->ArmyID)) { if ($line->ArmyID == 'nil' || $line->ArmyID == false) { $player_army_id = NULL; } else { //Numbers only plx if (preg_match('/[^0-9]/', $line->ArmyID)) { throw new Exception("Player ({$player_db_id}) ArmyID was not numeric and not nil: " . $line->ArmyID); } else { $player_army_id = $line->ArmyID; } } } else { $player_army_id = NULL; } /* ********************************** ** Validate Current Archetype ** ********************************** * # Fail to null * @ sets $player_current_archetype * * -in array expected * -guardian,recon,medic,bunker,berzerker,unknown,NULL */ $expected_archetypes = array('guardian', 'recon', 'medic', 'bunker', 'berzerker', 'unknown'); //Valid archetype? I don't know what I expected if (!in_array($line->Battle_Frame, $expected_archetypes)) { $player_current_archetype = NULL; Log::warn("Player ({$player_db_id}) sent unexpected battleframe: " . $line->Battle_Frame); } else { $player_current_archetype = $line->Battle_Frame; } /* ********************************** ** Validate Player Region ** ********************************** * # Fail to null * @ sets $player_region * * Is alpha/-/num.. */ //Valid region; but not the nether region if (isset($line->Player_Region)) { $player_region = preg_replace('/[^A-Z0-9\\-]/i', '', $line->Player_Region); } else { $player_region = ""; } /* ********************************** ** Validate Player Coords ** ********************************** * # Fail if out of bounds * @ sets $player_coord_x * @ sets $player_coord_y * @ sets $player_coord_z * @ sets $spotter_db_id * * -check keys (x,y,z) * -coords within 0->3328 +/- * -spotter_db_id is db_id */ /* $spotter_db_id = $player_db_id; //Minimum keys if( !isset($line->Player_Coords->x) || !isset($line->Player_Coords->y) || !isset($line->Player_Coords->z) || !isset($line->Player_Coords->chunkX) || !isset($line->Player_Coords->chunkY) ) { throw new Exception("Player ($player_db_id) didn't send all location keys"); }else{ $save_loc = true; $log_loc = false; foreach ($line->Player_Coords as $k => $v) { //float values for locations if( $k == 'x' || $k == 'y' || $k == 'z' ) { if( !is_float($v) && $v !== 0 ) { $log_loc = true; } }else{ //integers for chunks if( !is_numeric($v) ) { $log_loc = true; } } } //We're going to allow all locations, but log unexpected ones if( $save_loc ) { $loc = new Location; $loc->db_id = $player_db_id; $loc->spotter_db_id = $spotter_db_id; $loc->name = $player_name; $loc->instanceId = $player_instance_id; $loc->current_archetype = $player_current_archetype; $loc->coord_x = $line->Player_Coords->x; $loc->coord_y = $line->Player_Coords->y; $loc->coord_z = $line->Player_Coords->z; $loc->chunkX = $line->Player_Coords->chunkX; $loc->chunkY = $line->Player_Coords->chunkY; $loc->save(); if($log_loc) { Log::warn("Player ($player_db_id) sent unexpected coordinates: (locid: {$loc->id}) " . implode(',', (array) $line->Player_Coords) ); } }else{ Log::warn("Player ($player_db_id) sent out of bounds coordinates: " . implode(',', (array) $line->Player_Coords) ); } } */ //------------------------------------------------------------------------------------------------------------- // UPDATE/INSERT PLAYER, FOLLOW WITH INVENTORY/PROGRESS/LOADOUTS ON SUCCESS ---------------------------------- //------------------------------------------------------------------------------------------------------------- $is_addon_user = 1; $query_add_player = "INSERT INTO `players` "; $query_add_player .= "(name, armyTag, instanceId, db_id, e_id,"; $query_add_player .= "armyId, current_archetype, region, "; $query_add_player .= "created_at, updated_at) "; $query_add_player .= "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) "; $query_add_player .= "ON DUPLICATE KEY UPDATE "; $query_add_player .= "name = ?, armyTag = ?, instanceId = ?, armyId = ?, "; $query_add_player .= "e_id = ?, current_archetype = ?, addon_user = ?, region = ?, "; $query_add_player .= "updated_at = ?"; $bindings = array($player_name, $player_army_tag, $player_instance_id, $player_db_id, $player_eid, $player_army_id, $player_current_archetype, $player_region, $this->date, $this->date, $player_name, $player_army_tag, $player_instance_id, $player_army_id, $player_eid, $player_current_archetype, $is_addon_user, $player_region, $this->date); try { if (!DB::query($query_add_player, $bindings)) { throw new Exception('Add/Update player query failed'); } /* ********************************** ** Set Inventory If Not Empty ** ********************************** */ if (!empty($line->Inventory)) { //Check the last send for inventory, see if we need to update, or make a new row $last_inventory_update = Inventory::where(function ($query) use($player_db_id) { $query->where('db_id', '=', $player_db_id); $query->where(DB::raw('DATE(updated_at)'), '=', $this->date_only); })->order_by('id', 'desc')->first('id'); if ($last_inventory_update) { $query_update_inv = "UPDATE `inventories` SET `inventory` = ?, updated_at = ? WHERE `id` = ?"; $bindings_update_inventory = array(serialize($line->Inventory), $this->date, $last_inventory_update->id); if (DB::query($query_update_inv, $bindings_update_inventory) === false) { throw new Exception('Error updating inventory.'); } } else { $inv = new Inventory(); $inv->db_id = $player_db_id; $inv->inventory = serialize($line->Inventory); if (!$inv->save()) { throw new Exception('Add inventory query failed:'); } } } //not empty inventory /* ********************************** ** Set Progress If Not Empty ** ********************************** */ if (!empty($line->Progress)) { //Check the last send for progress, see if we need to update, or make a new row $last_progress_update = Progress::where(function ($query) use($player_db_id) { $query->where('db_id', '=', $player_db_id); $query->where(DB::raw('DATE(updated_at)'), '=', $this->date_only); })->order_by('id', 'desc')->first('id'); if ($last_progress_update) { $query_update_prog = "UPDATE `progresses` SET `entry` = ?, updated_at = ? WHERE `id` = ?"; $bindings_update_progress = array(serialize($line->Progress), $this->date, $last_progress_update->id); if (DB::query($query_update_prog, $bindings_update_progress) === false) { throw new Exception('Error updating progress.'); } } else { $progress = new Progress(); $progress->db_id = $player_db_id; $progress->entry = serialize($line->Progress); if (!$progress->save()) { throw new Exception('Add progress query failed:'); } } } //not empty progress /* ********************************** ** Set Loadouts If Not Empty ** ********************************** */ if (!empty($line->Loadouts)) { $query_add_loadout = "INSERT INTO `loadouts` "; $query_add_loadout .= "(db_id, entry, created_at, updated_at) "; $query_add_loadout .= "VALUES (?, ?, ?, ?) "; $query_add_loadout .= "ON DUPLICATE KEY UPDATE "; $query_add_loadout .= "entry = ?, updated_at = ?"; $loadout_entry = serialize($line->Loadouts); $bindings = array($player_db_id, $loadout_entry, $this->date, $this->date, $loadout_entry, $this->date); if (!DB::query($query_add_loadout, $bindings)) { throw new Exception('Add loadout query failed:'); } } } catch (Exception $e) { Log::info($log_header . $e->getMessage()); file_put_contents($this->logpath . $this->logdate . '_bad_player.json', serialize($line)); } } catch (Exception $e) { Log::info($log_header . $e->getMessage()); file_put_contents($this->logpath . $this->logdate . '_bad_player.json', serialize($line)); } return Response::json(array('ThumpDumpDB', '(Player) Thanks')); }
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; }
if ($this->msg_project['progress'] != 0) { $completed = $total * $this->msg_project['progress'] / 10; } else { $completed = 0; } $newCompleted = $completed + $chaHour; $newProgress = sprintf("%.2f", $newCompleted / $total); $data_project['progress'] = $newCompleted; $this->db->update('task_project', $data_project, 'id=' . $this->msg_task['project_id']); } } } if (isset($_POST['id'])) { $db = new DB(); $id = $_POST['id']; $updateData = new Progress($db, $id); if ($_POST['field'] == 'used_hour') { $updateData->updateTaskProgress($_POST['field'], $_POST['value']); $updateData->updateTotalUsedHour($_POST['value']); $updateData->updateTotalProgress(); } if ($_POST['field'] == 'hour') { $updateData->updateTaskProgress($_POST['field'], $_POST['value']); $updateData->updateTotalHour($_POST['value']); $updateData->updateTotalProgress(); } if ($_POST['field'] == 'progress') { $updateData->updateTaskStatus($_POST['field'], $_POST['value']); $updateData->tasksToUpdateProjectStatus(); //$updateData -> countProgress($_POST['value']); }
* ========================================== * @copyright Copyright (C) 2016 * @author Kylaksizov <*****@*****.**> * @link http://kylaksizov.ru/ * @version 0.0.1 * ------------------------------------------ * mission: --- * ========================================== * Distributed under an MIT license: http://apps-system.ru/LICENSE */ if (!defined('KYLAKSIZOV')) { exit("Stop! Forbidden"); } //Подключаем API require_once "../../../systems/api_start.php"; $progress = new Progress(); $func = new FunctionSystems(); /*if(!empty($_POST["test"]) && !empty($_POST["kyls"])){ // первый запрос $count = $progress -> GetProgress(); if($count < 30){ // 30 записей в БД $arr = Array( "name" => $_POST["test"] . $count, "text" => $_POST["kyls"] . $count, "mess_title" => "111" . $count ); $user = $db -> insert("test", $arr); $func -> log($count);