]> git.localhorst.tv Git - alttp.git/blob - app/Jobs/GenerateAosSeed.php
configurable surge URL
[alttp.git] / app / Jobs / GenerateAosSeed.php
1 <?php
2
3 namespace App\Jobs;
4
5 use App\Beat\Encoder;
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;
15
16 class GenerateAosSeed implements ShouldQueue
17 {
18         use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
19
20         /**
21          * Create a new job instance.
22          *
23          * @return void
24          */
25         public function __construct(AosSeed $seed)
26         {
27                 $this->seed = $seed;
28         }
29
30         /**
31          * Execute the job.
32          *
33          * @return void
34          */
35         public function handle()
36         {
37                 $stage = 'initial';
38                 try {
39                         $temp_dir = sys_get_temp_dir();
40
41                         $seed = $this->seed;
42                         $params = array_merge(['seed' => $seed->seed], $seed->settings);
43                         $url = config('aos.surge_url').'/?'.http_build_query($params, '', '&');
44
45                         $fac = new BrowserFactory('chromium');
46                         $browser = $fac->createBrowser();
47
48                         $stage = 'loading page';
49                         $page = $browser->createPage();
50                         $page->setDownloadPath($temp_dir);
51                         $page->navigate($url)->waitForNavigation();
52
53                         $stage = 'selecting rom';
54                         $fileInput = $page->dom()->querySelector('input[type=file]');
55                         $fileInput->sendFile(config('aos.base_rom'));
56                         $page->waitUntilContainsElement('select');
57
58                         $stage = 'clicking randomize';
59                         $page->mouse()->find('button', 2)->click();
60                         $page->waitUntilContainsElement('a[download]');
61
62                         $stage = 'clicking download';
63                         $page->dom()->querySelector('a[download]')->setAttributeValue('download', $seed->hash.'.gba');
64                         $page->mouse()->find('a[download]')->click();
65
66                         $stage = 'waiting for rom';
67                         $romFile = $temp_dir.'/'.$seed->hash.'.gba';
68                         for ($i = 0; $i < 20; ++$i) {
69                                 clearstatcache();
70                                 if (is_file($romFile) && filesize($romFile) >= 8388608) {
71                                         break;
72                                 }
73                                 usleep(100_000);
74                         }
75
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);
80                         unlink($romFile);
81
82                         $stage = 'done';
83                         $seed->status = 'generated';
84                         $seed->save();
85
86                         $browser->close();
87                 } catch (\Throwable $e) {
88                         $seed->status = 'error';
89                         $seed->error_detail = [
90                                 'stage' => $stage,
91                                 'type' => get_class($e),
92                                 'message' => $e->getMessage(),
93                         ];
94                         $seed->save();
95                 }
96         }
97
98         protected $seed;
99
100 }