146 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| use Pterodactyl\Models\Nest;
 | |
| use Illuminate\Database\Seeder;
 | |
| use Illuminate\Http\UploadedFile;
 | |
| use Illuminate\Support\Collection;
 | |
| use Illuminate\Filesystem\Filesystem;
 | |
| use Pterodactyl\Services\Eggs\Sharing\EggImporterService;
 | |
| use Pterodactyl\Contracts\Repository\EggRepositoryInterface;
 | |
| use Pterodactyl\Contracts\Repository\NestRepositoryInterface;
 | |
| use Pterodactyl\Exceptions\Repository\RecordNotFoundException;
 | |
| use Pterodactyl\Services\Eggs\Sharing\EggUpdateImporterService;
 | |
| 
 | |
| class EggSeeder extends Seeder
 | |
| {
 | |
|     /**
 | |
|      * @var \Illuminate\Filesystem\Filesystem
 | |
|      */
 | |
|     private $filesystem;
 | |
| 
 | |
|     /**
 | |
|      * @var \Pterodactyl\Services\Eggs\Sharing\EggImporterService
 | |
|      */
 | |
|     private $importerService;
 | |
| 
 | |
|     /**
 | |
|      * @var \Pterodactyl\Contracts\Repository\NestRepositoryInterface
 | |
|      */
 | |
|     private $nestRepository;
 | |
| 
 | |
|     /**
 | |
|      * @var \Pterodactyl\Contracts\Repository\EggRepositoryInterface
 | |
|      */
 | |
|     private $repository;
 | |
| 
 | |
|     /**
 | |
|      * @var \Pterodactyl\Services\Eggs\Sharing\EggUpdateImporterService
 | |
|      */
 | |
|     private $updateImporterService;
 | |
| 
 | |
|     /**
 | |
|      * EggSeeder constructor.
 | |
|      *
 | |
|      * @param \Pterodactyl\Services\Eggs\Sharing\EggImporterService       $importerService
 | |
|      * @param \Pterodactyl\Contracts\Repository\EggRepositoryInterface    $repository
 | |
|      * @param \Pterodactyl\Services\Eggs\Sharing\EggUpdateImporterService $updateImporterService
 | |
|      * @param \Illuminate\Filesystem\Filesystem                           $filesystem
 | |
|      * @param \Pterodactyl\Contracts\Repository\NestRepositoryInterface   $nestRepository
 | |
|      */
 | |
|     public function __construct(
 | |
|         EggImporterService $importerService,
 | |
|         EggRepositoryInterface $repository,
 | |
|         EggUpdateImporterService $updateImporterService,
 | |
|         Filesystem $filesystem,
 | |
|         NestRepositoryInterface $nestRepository
 | |
|     ) {
 | |
|         $this->filesystem = $filesystem;
 | |
|         $this->importerService = $importerService;
 | |
|         $this->repository = $repository;
 | |
|         $this->updateImporterService = $updateImporterService;
 | |
|         $this->nestRepository = $nestRepository;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Run the egg seeder.
 | |
|      */
 | |
|     public function run()
 | |
|     {
 | |
|         $this->getEggsToImport()->each(function ($nest) {
 | |
|             $this->parseEggFiles($this->findMatchingNest($nest));
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Return a list of eggs to import.
 | |
|      *
 | |
|      * @return \Illuminate\Support\Collection
 | |
|      */
 | |
|     protected function getEggsToImport(): Collection
 | |
|     {
 | |
|         return collect([
 | |
|             'Minecraft',
 | |
|             'Source Engine',
 | |
|             'Voice Servers',
 | |
|             'Rust',
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Find the nest that these eggs should be attached to.
 | |
|      *
 | |
|      * @param string $nestName
 | |
|      * @return \Pterodactyl\Models\Nest
 | |
|      *
 | |
|      * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
 | |
|      */
 | |
|     private function findMatchingNest(string $nestName): Nest
 | |
|     {
 | |
|         return $this->nestRepository->findFirstWhere([
 | |
|             ['author', '=', 'support@pterodactyl.io'],
 | |
|             ['name', '=', $nestName],
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Loop through the list of egg files and import them.
 | |
|      *
 | |
|      * @param \Pterodactyl\Models\Nest $nest
 | |
|      */
 | |
|     private function parseEggFiles(Nest $nest)
 | |
|     {
 | |
|         $files = $this->filesystem->allFiles(database_path('seeds/eggs/' . kebab_case($nest->name)));
 | |
| 
 | |
|         $this->command->alert('Updating Eggs for Nest: ' . $nest->name);
 | |
|         Collection::make($files)->each(function ($file) use ($nest) {
 | |
|             /* @var \Symfony\Component\Finder\SplFileInfo $file */
 | |
|             $decoded = json_decode($file->getContents());
 | |
|             if (json_last_error() !== JSON_ERROR_NONE) {
 | |
|                 $this->command->error('JSON decode exception for ' . $file->getFilename() . ': ' . json_last_error_msg());
 | |
| 
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             $file = new UploadedFile($file->getPathname(), $file->getFilename(), 'application/json');
 | |
| 
 | |
|             try {
 | |
|                 $egg = $this->repository->setColumns('id')->findFirstWhere([
 | |
|                     ['author', '=', $decoded->author],
 | |
|                     ['name', '=', $decoded->name],
 | |
|                     ['nest_id', '=', $nest->id],
 | |
|                 ]);
 | |
| 
 | |
|                 $this->updateImporterService->handle($egg, $file);
 | |
| 
 | |
|                 $this->command->info('Updated ' . $decoded->name);
 | |
|             } catch (RecordNotFoundException $exception) {
 | |
|                 $this->importerService->handle($file, $nest->id);
 | |
| 
 | |
|                 $this->command->comment('Created ' . $decoded->name);
 | |
|             }
 | |
|         });
 | |
| 
 | |
|         $this->command->line('');
 | |
|     }
 | |
| }
 | 
