X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=app%2FConsole%2FCommands%2FSyncSpeedGaming.php;h=d75da5078bfea496aea043793149395154959b61;hb=8f82545b35219e093ea60e304699b61fb63966f2;hp=4d2cb9cb27cb9a4a9195f21c93f3851238a6f9c2;hpb=15132749249f6418fd5695547b5c323a0ad10939;p=alttp.git diff --git a/app/Console/Commands/SyncSpeedGaming.php b/app/Console/Commands/SyncSpeedGaming.php index 4d2cb9c..d75da50 100644 --- a/app/Console/Commands/SyncSpeedGaming.php +++ b/app/Console/Commands/SyncSpeedGaming.php @@ -3,7 +3,9 @@ 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; @@ -123,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 { @@ -160,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) { @@ -186,15 +265,37 @@ 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'])) { $tag = explode('#', $player['discordTag']);