-<?php
-
-namespace App\Jobs;
-
-use App\Beat\Encoder;
-use App\Models\AosSeed;
-use HeadlessChromium\BrowserFactory;
-use Illuminate\Bus\Queueable;
-use Illuminate\Contracts\Queue\ShouldBeUnique;
-use Illuminate\Contracts\Queue\ShouldQueue;
-use Illuminate\Foundation\Bus\Dispatchable;
-use Illuminate\Queue\InteractsWithQueue;
-use Illuminate\Queue\SerializesModels;
-use Illuminate\Support\Facades\Storage;
-
-class GenerateAosSeed implements ShouldQueue
-{
- use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
-
- /**
- * Create a new job instance.
- *
- * @return void
- */
- public function __construct(AosSeed $seed)
- {
- $this->seed = $seed;
- }
-
- /**
- * Execute the job.
- *
- * @return void
- */
- public function handle()
- {
- $stage = 'initial';
- try {
- $temp_dir = sys_get_temp_dir();
-
- $seed = $this->seed;
- $params = array_merge(['seed' => $seed->seed], $seed->settings);
- $url = config('aos.surge_url').'/?'.http_build_query($params, '', '&');
-
- $fac = new BrowserFactory('chromium');
- $browser = $fac->createBrowser();
-
- $stage = 'loading page';
- $page = $browser->createPage();
- $page->setDownloadPath($temp_dir);
- $page->navigate($url)->waitForNavigation();
-
- $stage = 'selecting rom';
- $fileInput = $page->dom()->querySelector('input[type=file]');
- $fileInput->sendFile(config('aos.base_rom'));
- $page->waitUntilContainsElement('select');
-
- $stage = 'clicking randomize';
- $page->mouse()->find('button', 2)->click();
- $page->waitUntilContainsElement('a[download]');
-
- $stage = 'clicking download';
- $page->dom()->querySelector('a[download]')->setAttributeValue('download', $seed->hash.'.gba');
- $page->mouse()->find('a[download]')->click();
-
- $stage = 'waiting for rom';
- $romFile = $temp_dir.'/'.$seed->hash.'.gba';
- for ($i = 0; $i < 100; ++$i) {
- clearstatcache();
- if (is_file($romFile) && filesize($romFile) >= 8388608) {
- break;
- }
- usleep(100_000);
- }
-
- $stage = 'calculating patch';
- $encoder = new Encoder(file_get_contents(config('aos.base_rom')));
- $patch = $encoder->createPatch(file_get_contents($romFile));
- Storage::disk('aos-seeds')->put($seed->hash.'.bps', $patch);
- unlink($romFile);
-
- $stage = 'done';
- $seed->status = 'generated';
- $seed->save();
-
- $browser->close();
- } catch (\Throwable $e) {
- $seed->status = 'error';
- $seed->error_detail = [
- 'stage' => $stage,
- 'type' => get_class($e),
- 'message' => $e->getMessage(),
- ];
- $seed->save();
- }
- }
-
- protected $seed;
-
-}