From d5c26e14efd75e0b81b2f0006d3940a66967b6a7 Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Mon, 19 May 2025 18:46:46 +0200 Subject: [PATCH] add step ladder importer --- app/Console/Commands/SyncStepLadder.php | 95 +++++++++++++++++++ app/Console/Kernel.php | 2 +- app/Models/StepLadderMode.php | 12 +++ ..._162331_create_step_ladder_modes_table.php | 30 ++++++ 4 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 app/Console/Commands/SyncStepLadder.php create mode 100644 app/Models/StepLadderMode.php create mode 100644 database/migrations/2025_05_19_162331_create_step_ladder_modes_table.php diff --git a/app/Console/Commands/SyncStepLadder.php b/app/Console/Commands/SyncStepLadder.php new file mode 100644 index 0000000..1b9f48e --- /dev/null +++ b/app/Console/Commands/SyncStepLadder.php @@ -0,0 +1,95 @@ +where(function (Builder $query) { + $query->whereNull('end'); + $query->orWhere('end', '>', now()); + }) + ->get(); + + foreach ($events as $event) { + try { + $this->line('syncing '.$event->name); + $this->syncEvent($event); + } catch (\Exception $e) { + $this->error('error syncing event '.$event->name.': '.$e->getMessage()); + } + } + } + + private function syncEvent(Event $event) { + $ladderSchedule = Http::get('https://alttpr.racing/api/v1/upcoming')->json(); + foreach ($ladderSchedule as $ladderEntry) { + try { + $this->syncSchedule($event, $ladderEntry); + } catch (\Exception $e) { + $this->error('error syncing episode '.$ladderEntry['id'].': '.$e->getMessage()); + } + } + } + + private function syncSchedule(Event $event, $ladderEntry) { + $ext_id = 'stepladder:'.$ladderEntry['id']; + $episode = Episode::firstWhere('ext_id', '=', $ext_id); + if (!$episode) { + $episode = new Episode(); + $episode->ext_id = $ext_id; + } + $mode = $this->getMode($ladderEntry); + $episode->event()->associate($event); + $episode->title = $mode->name; + $episode->start = Carbon::createFromTimestamp($ladderEntry['time']); + $episode->estimate = 2 * 60 * 60; + $episode->confirmed = true; + $episode->save(); + } + + private function getMode($ladderEntry) { + $ext_id = 'stepladder:'.$ladderEntry['mode']; + $mode = StepLadderMode::firstWhere('ext_id', '=', $ext_id); + if (!$mode) { + $ladderMode = Http::get('https://alttpr.racing/api/v1/modes/'.$ladderEntry['mode'])->json(); + $mode = new StepLadderMode(); + $mode->ext_id = $ext_id; + $mode->name = $ladderMode['name']; + $mode->last_sync = Carbon::now(); + $mode->save(); + } + return $mode; + } + +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 14c7840..f762c4f 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -16,7 +16,7 @@ class Kernel extends ConsoleKernel protected function schedule(Schedule $schedule) { $schedule->command('twitch:channel-info')->everyFiveMinutes(); - $schedule->command('sync:ladder')->daily(); + $schedule->command('sync:stepladder')->daily(); $schedule->command('sync:speedgaming')->everyFiveMinutes(); $schedule->command('sync:sra')->everyFifteenMinutes(); $schedule->command('sync:zsr')->everyFifteenMinutes(); diff --git a/app/Models/StepLadderMode.php b/app/Models/StepLadderMode.php new file mode 100644 index 0000000..8cfec9a --- /dev/null +++ b/app/Models/StepLadderMode.php @@ -0,0 +1,12 @@ +id(); + $table->string('ext_id'); + $table->string('name'); + $table->timestamps(); + $table->timestamp('last_sync')->nullable()->default(null); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('step_ladder_modes'); + } +}; -- 2.39.5