From: Daniel Karbach Date: Mon, 23 Jun 2025 11:05:06 +0000 (+0200) Subject: add cabookey sync script X-Git-Url: https://git.localhorst.tv/?a=commitdiff_plain;h=213cbd46fab1e59f35077f4c3a42446b5995cd3b;p=alttp.git add cabookey sync script --- diff --git a/app/Console/Commands/SyncCabookey.php b/app/Console/Commands/SyncCabookey.php new file mode 100644 index 0000000..83febfd --- /dev/null +++ b/app/Console/Commands/SyncCabookey.php @@ -0,0 +1,129 @@ +where(function (Builder $query) { + $query->whereNull('end'); + $query->orWhere('end', '>', now()); + }) + ->get(); + + if (empty($events)) { + return Command::SUCCESS; + } + + $schedule = Http::get('https://sheets.googleapis.com/v4/spreadsheets/1Ba4Mnuml11dqd7uSrtSNn6zdWgJ_GZ9e9FRkc_kM1Uw/values/Form Responses 1', [ + 'alt' => 'json', + 'key' => config('google.api_key'), + ])->json(); + + foreach ($events as $event) { + try { + $this->line('syncing '.$event->name); + $this->syncEvent($event, $schedule['values']); + } catch (\Exception $e) { + $this->error('error syncing event '.$event->name.': '.$e->getMessage()); + } + } + + return Command::SUCCESS; + } + + private function syncEvent(Event $event, $schedule) { + for ($i = 1; $i < count($schedule); ++$i) { + $this->syncSchedule($event, $schedule[$i]); + } + } + + private function syncSchedule(Event $event, $row) { + $ext_id = 'cabookey:'.$row[0]; + $episode = Episode::firstWhere('ext_id', '=', $ext_id); + if (!$episode) { + $episode = new Episode(); + $episode->ext_id = $ext_id; + } + $episode->event()->associate($event); + $episode->title = 'Cabookey'; + $start = Carbon::createFromFormat('m/d/Y h:i:s A', $row[5].' '.$row[6], 'America/Detroit')->setTimezone('UTC'); + if (!$episode->start || $start->ne($episode->start)) { + $episode->start = $start; + } + $episode->estimate = 90 * 60; + $episode->confirmed = true; + $episode->save(); + $this->syncPlayer($episode, $row[1], $row[2]); + $this->syncPlayer($episode, $row[3], $row[4]); + } + + private function syncPlayer(Episode $episode, $discord, $twitch) { + $ext_id = 'cabookey:'.$discord.'-'.$twitch; + $player = $episode->players()->firstWhere('ext_id', '=', $ext_id); + if (!$player) { + $player = new EpisodePlayer(); + $player->ext_id = $ext_id; + $player->episode()->associate($episode); + } + $user = $this->getUser($discord, $twitch); + if ($user) { + $player->user()->associate($user); + } else { + $player->user()->disassociate(); + $player->name_override = $twitch; + } + $player->save(); + return $player; + } + + private function getUser($discord, $twitch) { + $user = User::firstWhere('discord_nickname', 'LIKE', $discord); + if ($user) { + return $user; + } + $user = User::firstWhere('username', 'LIKE', $discord); + if ($user) { + return $user; + } + $user = User::firstWhere('stream_link', 'LIKE', '%/'.$twitch); + if ($user) { + return $user; + } + $user = User::firstWhere('username', 'LIKE', $twitch); + if ($user) { + return $user; + } + return null; + } + +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index f762c4f..298dfe5 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -18,6 +18,7 @@ class Kernel extends ConsoleKernel $schedule->command('twitch:channel-info')->everyFiveMinutes(); $schedule->command('sync:stepladder')->daily(); $schedule->command('sync:speedgaming')->everyFiveMinutes(); + $schedule->command('sync:cabookey')->everyFiveMinutes(); $schedule->command('sync:sra')->everyFifteenMinutes(); $schedule->command('sync:zsr')->everyFifteenMinutes(); $schedule->command('sync:avatars')->everyFiveMinutes();