]> git.localhorst.tv Git - alttp.git/blob - app/Jobs/GenerateAosSeed.php
7169c3610f90f4714796329d809fb25bf65e05e1
[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                 try {
38                         $temp_dir = sys_get_temp_dir();
39
40                         $seed = $this->seed;
41                         $params = array_merge(['seed' => $seed->seed], $seed->settings);
42                         $url = 'https://aosrando.surge.sh/?'.http_build_query($params, '', '&');
43
44                         $fac = new BrowserFactory('chromium');
45                         $browser = $fac->createBrowser();
46
47                         $page = $browser->createPage();
48                         $page->setDownloadPath($temp_dir);
49                         $page->navigate($url)->waitForNavigation();
50
51                         $fileInput = $page->dom()->querySelector('input[type=file]');
52                         $fileInput->sendFile(config('aos.base_rom'));
53                         $page->waitUntilContainsElement('select');
54
55                         $page->mouse()->find('button', 2)->click();
56                         $page->waitUntilContainsElement('a[download]');
57
58                         $page->dom()->querySelector('a[download]')->setAttributeValue('download', $seed->hash.'.gba');
59                         $page->mouse()->find('a[download]')->click();
60
61                         sleep(2);
62
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');
67
68                         $seed->status = 'generated';
69                         $seed->save();
70
71                         $browser->close();
72                 } catch (\Throwable $e) {
73                         $seed->status = 'error';
74                         $seed->error_detail = [
75                                 'type' => get_class($e),
76                                 'message' => $e->getMessage(),
77                         ];
78                         $seed->save();
79                 }
80         }
81
82         protected $seed;
83
84 }