6 use App\Models\AosSeed;
7 use HeadlessChromium\BrowserFactory;
8 use Illuminate\Bus\Queueable;
9 use Illuminate\Contracts\Queue\ShouldBeUnique;
10 use Illuminate\Contracts\Queue\ShouldQueue;
11 use Illuminate\Foundation\Bus\Dispatchable;
12 use Illuminate\Queue\InteractsWithQueue;
13 use Illuminate\Queue\SerializesModels;
14 use Illuminate\Support\Facades\Storage;
16 class GenerateAosSeed implements ShouldQueue
18 use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
21 * Create a new job instance.
25 public function __construct(AosSeed $seed)
35 public function handle()
38 $temp_dir = sys_get_temp_dir();
41 $params = array_merge(['seed' => $seed->seed], $seed->settings);
42 $url = 'https://aosrando.surge.sh/?'.http_build_query($params, '', '&');
44 $fac = new BrowserFactory('chromium');
45 $browser = $fac->createBrowser();
47 $page = $browser->createPage();
48 $page->setDownloadPath($temp_dir);
49 $page->navigate($url)->waitForNavigation();
51 $fileInput = $page->dom()->querySelector('input[type=file]');
52 $fileInput->sendFile(config('aos.base_rom'));
53 $page->waitUntilContainsElement('select');
55 $page->mouse()->find('button', 2)->click();
56 $page->waitUntilContainsElement('a[download]');
58 $page->dom()->querySelector('a[download]')->setAttributeValue('download', $seed->hash.'.gba');
59 $page->mouse()->find('a[download]')->click();
63 $encoder = new Encoder(file_get_contents(config('aos.base_rom')));
64 $patch = $encoder->createPatch(file_get_contents($temp_dir.'/'.$seed->hash.'.gba'));
65 Storage::disk('aos-seeds')->put($seed->hash.'.bps', $patch);
66 unlink($temp_dir.'/'.$seed->hash.'.gba');
68 $seed->status = 'generated';
72 } catch (\Throwable $e) {
73 $seed->status = 'error';
74 $seed->error_detail = [
75 'type' => get_class($e),
76 'message' => $e->getMessage(),