dedicated = $dedicated; return $this; } /** * A list of node IDs that should be used when selecting an allocation. If empty, all * nodes will be used to filter with. */ public function setNodes(array $nodes): self { $this->nodes = $nodes; return $this; } /** * An array of individual ports or port ranges to use when selecting an allocation. If * empty, all ports will be considered when finding an allocation. If set, only ports appearing * in the array or range will be used. * * @throws \Pterodactyl\Exceptions\DisplayException */ public function setPorts(array $ports): self { $stored = []; foreach ($ports as $port) { if (is_digit($port)) { $stored[] = $port; } // Ranges are stored in the ports array as an array which can be // better processed in the repository. if (preg_match(AssignmentService::PORT_RANGE_REGEX, $port, $matches)) { if (abs(intval($matches[2]) - intval($matches[1])) > AssignmentService::PORT_RANGE_LIMIT) { throw new DisplayException(trans('exceptions.allocations.too_many_ports')); } $stored[] = [$matches[1], $matches[2]]; } } $this->ports = $stored; return $this; } /** * Return a single allocation that should be used as the default allocation for a server. * * @throws \Pterodactyl\Exceptions\Service\Deployment\NoViableAllocationException */ public function handle(): Allocation { $allocation = $this->repository->getRandomAllocation($this->nodes, $this->ports, $this->dedicated); if (is_null($allocation)) { throw new NoViableAllocationException(trans('exceptions.deployment.no_viable_allocations')); } return $allocation; } }