X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=app%2FConsole%2FCommands%2FSyncSpeedGaming.php;h=d75da5078bfea496aea043793149395154959b61;hb=e2af94795e9d8e8a2eb8c272201b4e54ebb130f0;hp=13eb3a30e8b1724857ee4492e692962f21d9796f;hpb=fb9c7a3524a5fc879bb062b343ec2f8fc3817f42;p=alttp.git diff --git a/app/Console/Commands/SyncSpeedGaming.php b/app/Console/Commands/SyncSpeedGaming.php index 13eb3a3..d75da50 100644 --- a/app/Console/Commands/SyncSpeedGaming.php +++ b/app/Console/Commands/SyncSpeedGaming.php @@ -5,6 +5,7 @@ namespace App\Console\Commands; use App\Models\Channel; use App\Models\DiscordBotCommand; use App\Models\Episode; +use App\Models\EpisodeCrew; use App\Models\EpisodePlayer; use App\Models\Event; use App\Models\Organization; @@ -124,6 +125,42 @@ class SyncSpeedGaming extends Command { $episode->channels()->syncWithoutDetaching($channelIds); } + $this->purgeCrew($episode, $sgEntry['broadcasters'], 'brd'); + foreach ($sgEntry['broadcasters'] as $sgCrew) { + try { + $this->syncCrew($episode, $sgCrew, 'brd', 'setup'); + } catch (Exception $e) { + $this->error('error syncing broadcaster '.$sgCrew['id'].': '.$e->getMessage()); + } + } + + $this->purgeCrew($episode, $sgEntry['commentators'], 'comm'); + foreach ($sgEntry['commentators'] as $sgCrew) { + try { + $this->syncCrew($episode, $sgCrew, 'comm', 'commentary'); + } catch (Exception $e) { + $this->error('error syncing commentator '.$sgCrew['id'].': '.$e->getMessage()); + } + } + + $this->purgeCrew($episode, $sgEntry['helpers'], 'help'); + foreach ($sgEntry['helpers'] as $sgCrew) { + try { + $this->syncCrew($episode, $sgCrew, 'help', 'setup'); + } catch (Exception $e) { + $this->error('error syncing helper '.$sgCrew['id'].': '.$e->getMessage()); + } + } + + $this->purgeCrew($episode, $sgEntry['trackers'], 'track'); + foreach ($sgEntry['trackers'] as $sgCrew) { + try { + $this->syncCrew($episode, $sgCrew, 'track', 'tracking'); + } catch (Exception $e) { + $this->error('error syncing tracker '.$sgCrew['id'].': '.$e->getMessage()); + } + } + $this->purgePlayers($episode, $sgEntry); foreach ($sgEntry['match1']['players'] as $sgPlayer) { try { @@ -161,6 +198,47 @@ class SyncSpeedGaming extends Command { return $channel; } + private function purgeCrew(Episode $episode, $sgCrews, $prefix) { + $ext_ids = []; + foreach ($sgCrews as $sgCrew) { + $ext_ids[] = 'sg:'.$prefix.':'.$sgCrew['id']; + } + $episode->crew()->where('ext_id', 'LIKE', 'sg:'.$prefix.':%')->whereNotIn('ext_id', $ext_ids)->delete(); + } + + private function syncCrew(Episode $episode, $sgCrew, $prefix, $role) { + $ext_id = 'sg:'.$prefix.':'.$sgCrew['id']; + $crew = $episode->crew()->firstWhere('ext_id', '=', $ext_id); + if (!$crew) { + $crew = new EpisodeCrew(); + $crew->ext_id = $ext_id; + $crew->episode()->associate($episode); + } + $user = $this->getUserBySGPlayer($sgCrew); + if ($user) { + $crew->user()->associate($user); + } else { + $crew->user()->disassociate(); + } + if ($role == 'commentary') { + $channel = $this->getChannelByCrew($episode, $sgCrew); + if ($channel) { + $crew->channel()->associate($channel); + } else { + $crew->channel()->disassociate(); + } + } + $crew->role = $role; + $crew->confirmed = $sgCrew['approved'] ?: false; + if (!empty($sgCrew['displayName'])) { + $crew->name_override = $sgCrew['displayName']; + } + if (!empty($sgCrew['publicStream'])) { + $crew->stream_override = 'https://twitch.tv/'.strtolower($sgCrew['publicStream']); + } + $crew->save(); + } + private function purgePlayers(Episode $episode, $sgEntry) { $ext_ids = []; foreach ($sgEntry['match1']['players'] as $sgPlayer) { @@ -180,15 +258,6 @@ class SyncSpeedGaming extends Command { $user = $this->getUserBySGPlayer($sgPlayer); if ($user) { $player->user()->associate($user); - if (empty($user->stream_link)) { - if (!empty($sgPlayer['publicStream'])) { - $user->stream_link = 'https://twitch.tv/'.strtolower($sgPlayer['publicStream']); - $user->save(); - } else if (!empty($sgPlayer['streamingFrom'])) { - $user->stream_link = 'https://twitch.tv/'.strtolower($sgPlayer['streamingFrom']); - $user->save(); - } - } } else { $player->user()->disassociate(); } @@ -196,15 +265,36 @@ class SyncSpeedGaming extends Command { $player->name_override = $sgPlayer['displayName']; } if (!empty($sgPlayer['streamingFrom'])) { - $player->stream_override = strtolower($sgPlayer['streamingFrom']); + $player->stream_override = 'https://twitch.tv/'.strtolower($sgPlayer['streamingFrom']); } $player->save(); } + private function getChannelByCrew(Episode $episode, $sgCrew) { + $channel = $episode->channels() + ->where('ext_id', 'LIKE', 'sg:%') + ->whereJsonContains('languages', $sgCrew['language']) + ->first(); + if ($channel) { + return $channel; + } + } + private function getUserBySGPlayer($player) { if (!empty($player['discordId'])) { $user = User::find($player['discordId']); - if ($user) return $user; + if ($user) { + if (empty($user->stream_link)) { + if (!empty($sgPlayer['publicStream'])) { + $user->stream_link = 'https://twitch.tv/'.strtolower($sgPlayer['publicStream']); + $user->save(); + } else if (!empty($sgPlayer['streamingFrom'])) { + $user->stream_link = 'https://twitch.tv/'.strtolower($sgPlayer['streamingFrom']); + $user->save(); + } + } + return $user; + } DiscordBotCommand::syncUser($player['discordId']); } if (!empty($player['discordTag'])) {