public function __construct(Character $character, array $activities, array $raids, array $arenas, array $stats) { $this->character = $character; $this->dateActivityStarted = carbon($activities['dateActivityStarted']); $lastReset = last_weekly(); $nextReset = next_weekly(); // raid completion status $raidsCompleted = []; foreach ($raids as $raid) { $activityHash = (string) $raid['activityDetails']['referenceId']; $activity = manifest()->activity($activityHash); $activityId = sha1($activity->activityName); $activityLevel = $activity->activityLevel; $completed = (bool) array_get($raid, 'values.completed.basic.value', false); $date = carbon($raid['period']); if (!isset($raidsCompleted[$activityId])) { $raidsCompleted[$activityId] = null; } if ($completed && $date > $lastReset && $date < $nextReset) { if ($activityLevel > $raidsCompleted[$activityId]) { $raidsCompleted[$activityId] = $activityLevel; } } } // arena completion status $arenasCompleted = []; foreach ($arenas as $arena) { $activityHash = (string) $arena['activityDetails']['referenceId']; $completed = (bool) array_get($arena, 'values.completed.basic.value', false); $date = carbon($arena['period']); if (!array_key_exists($activityHash, $arenasCompleted)) { $arenasCompleted[$activityHash] = false; } if ($completed && $date > $lastReset && $date < $nextReset) { $arenasCompleted[$activityHash] = $completed; } } // stats grouped by activity hash $statsArray = []; foreach ($stats as $k => $stat) { $activityHash = (string) $stat['activityHash']; $statsArray[$activityHash] = new StatisticsCollection($stat['values']); } // build ActivityCollection foreach ($activities['available'] as $activity) { $activityHash = (string) $activity['activityHash']; $activityStats = array_get($statsArray, $activityHash); $activity = new Activity($character, $activity, $activityStats); $activityId = sha1($activity->activityName); if ($activity->isCompleted && ($activity->isWeekly() || $activity->isDaily())) { $lastReset = $activity->isWeekly() ? last_weekly() : last_daily(); $activity->isCompleted = $character->dateLastPlayed > $lastReset; } $this->put($activityHash, $activity); if ($activity->isRaid()) { $activity->isCompleted = false; $activityLevelCompleted = array_get($raidsCompleted, $activityId); if (!$activityLevelCompleted) { continue; } if ($activity->activityLevel <= $activityLevelCompleted) { $activity->isCompleted = true; } } if ($activity->isArena()) { $activity->isCompleted = array_get($arenasCompleted, $activityHash, false); } } }