From 40f6fd626699bf13125f4496c08eac33267e338e Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Sat, 17 Jan 2026 22:38:54 +0100 Subject: [PATCH] add gmt sync script --- app/Console/Commands/SyncGMT.php | 174 +++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 app/Console/Commands/SyncGMT.php diff --git a/app/Console/Commands/SyncGMT.php b/app/Console/Commands/SyncGMT.php new file mode 100644 index 0000000..220d737 --- /dev/null +++ b/app/Console/Commands/SyncGMT.php @@ -0,0 +1,174 @@ +where(function (Builder $query) { + $query->whereNull('end'); + $query->orWhere('end', '>', now()); + }) + ->get(); + + if (empty($events)) { + return Command::SUCCESS; + } + + $html = Http::get('https://docs.google.com/spreadsheets/d/e/2PACX-1vR45guXZ22tuNkvYN-6Dk3LeQq2Re8tp8xKEiqYbkX1HOpqDgIA9OgQBoByHY03JYM-Cso5vNvA7OR1/pubhtml/sheet?headers=false&gid=724048250')->body(); + $dom = new \DOMDocument(); + libxml_use_internal_errors(true); + $dom->loadHTML($html); + libxml_use_internal_errors(false); + $rows = $dom->getElementsByTagName('tr'); + $schedule = []; + foreach ($rows as $row) { + $cells = $row->getElementsByTagName('td'); + $entry = []; + foreach ($cells as $cell) { + $entry[] = $cell->textContent; + } + if (!empty($entry)) { + $schedule[] = $entry; + } + } + + foreach ($events as $event) { + try { + $this->line('syncing '.$event->name); + $this->syncEvent($event, $schedule); + } catch (\Exception $e) { + $this->error('error syncing event '.$event->name.': '.$e->getMessage()); + } + } + + return Command::SUCCESS; + } + + private function syncEvent(Event $event, $schedule) { + for ($i = 2; $i < count($schedule); ++$i) { + $this->syncSchedule($event, $schedule[$i]); + } + } + + private function syncSchedule(Event $event, $row) { + $ext_id = 'gmt:'.$event->id.':'.$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 = $row[1].' vs '.$row[2]; + $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; + } + if (!empty($row[3]) || !empty($row[4])) { + $episode->comment = 'Mentors: '; + if (!empty($row[3])) { + $episode->comment .= $row[3]; + } + if (!empty($row[4])) { + if (!empty($row[3])) { + $episode->comment .= ' & '; + } + $episode->comment .= $row[4]; + } + } + if ($row[7] == 'No') { + if ($episode->comment == '') { + $episode->comment = 'No restream'; + } elseif (strpos($episode->comment, 'No restream') === false) { + $episode->comment .= ", don't restream"; + } + } + $episode->estimate = 90 * 60; + $episode->confirmed = true; + $episode->save(); + $this->syncPlayer($episode, $row[1]); + $this->syncPlayer($episode, $row[2]); + } + + private function syncPlayer(Episode $episode, string $codename): EpisodePlayer|null { + if (empty($codename)) { + return null; + } + $lower_name = strtolower($codename); + $ext_id = 'gmt:'.$lower_name; + $player = $episode->players()->firstWhere('ext_id', '=', $ext_id); + if (!$player) { + $player = new EpisodePlayer(); + $player->ext_id = $ext_id; + $player->episode()->associate($episode); + } + $player->name_override = $codename; + $user = $this->getUser($lower_name); + if ($user) { + $player->user()->associate($user); + } else { + $player->user()->disassociate(); + } + $player->save(); + return $player; + } + + private function getUser(string $codename): User|null { + if (isset($this->codename_table[$codename])) { + $user = User::query()->firstWhere('username', 'LIKE', $this->codename_table[$codename]); + if ($user) { + return $user; + } + } + $user = User::query()->firstWhere('username', 'LIKE', $codename); + if ($user) { + return $user; + } + $user = User::query()->firstWhere('global_name', 'LIKE', $codename); + if ($user) { + return $user; + } + $user = User::query()->firstWhere('discord_nickname', 'LIKE', $codename); + if ($user) { + return $user; + } + $user = User::query()->firstWhere('stream_link', 'LIKE', '%/'.$codename); + if ($user) { + return $user; + } + return null; + } + + private $codename_table = [ + ]; + +} -- 2.47.3