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()
39 $temp_dir = sys_get_temp_dir();
42 $params = array_merge(['seed' => $seed->seed], $seed->settings);
43 $url = config('aos.surge_url').'/?'.http_build_query($params, '', '&');
45 $fac = new BrowserFactory('chromium');
46 $browser = $fac->createBrowser();
48 $stage = 'loading page';
49 $page = $browser->createPage();
50 $page->setDownloadPath($temp_dir);
51 $page->navigate($url)->waitForNavigation();
53 $stage = 'selecting rom';
54 $fileInput = $page->dom()->querySelector('input[type=file]');
55 $fileInput->sendFile(config('aos.base_rom'));
56 $page->waitUntilContainsElement('select');
58 $stage = 'clicking randomize';
59 $page->mouse()->find('button', 2)->click();
60 $page->waitUntilContainsElement('a[download]');
62 $stage = 'clicking download';
63 $page->dom()->querySelector('a[download]')->setAttributeValue('download', $seed->hash.'.gba');
64 $page->mouse()->find('a[download]')->click();
66 $stage = 'waiting for rom';
67 $romFile = $temp_dir.'/'.$seed->hash.'.gba';
68 for ($i = 0; $i < 100; ++$i) {
70 if (is_file($romFile) && filesize($romFile) >= 8388608) {
76 $stage = 'calculating patch';
77 $encoder = new Encoder(file_get_contents(config('aos.base_rom')));
78 $patch = $encoder->createPatch(file_get_contents($romFile));
79 Storage::disk('aos-seeds')->put($seed->hash.'.bps', $patch);
83 $seed->status = 'generated';
87 } catch (\Throwable $e) {
88 $seed->status = 'error';
89 $seed->error_detail = [
91 'type' => get_class($e),
92 'message' => $e->getMessage(),