connection = $connection; $this->repository = $repository; $this->taskCreationService = $taskCreationService; } /** * Create a new schedule for a specific server. * * @param \Pterodactyl\Models\Server $server * @param array $data * @param array $tasks * @return \Pterodactyl\Models\Schedule * * @throws \Pterodactyl\Exceptions\Model\DataValidationException * @throws \Pterodactyl\Exceptions\Service\Schedule\Task\TaskIntervalTooLongException */ public function handle(Server $server, array $data, array $tasks = []) { $data = array_merge($data, [ 'server_id' => $server->id, 'next_run_at' => $this->getCronTimestamp($data), ]); $this->connection->beginTransaction(); $schedule = $this->repository->create($data); foreach ($tasks as $index => $task) { $this->taskCreationService->handle($schedule, [ 'time_interval' => array_get($task, 'time_interval'), 'time_value' => array_get($task, 'time_value'), 'sequence_id' => $index + 1, 'action' => array_get($task, 'action'), 'payload' => array_get($task, 'payload'), ], false); } $this->connection->commit(); return $schedule; } /** * Return a DateTime object after parsing the cron data provided. * * @param array $data * @return \DateTime */ private function getCronTimestamp(array $data) { $formattedCron = sprintf('%s %s %s * %s *', array_get($data, 'cron_minute', '*'), array_get($data, 'cron_hour', '*'), array_get($data, 'cron_day_of_month', '*'), array_get($data, 'cron_day_of_week', '*') ); return CronExpression::factory($formattedCron)->getNextRunDate(); } }