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;
$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 {
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) {
$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();
}
$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'])) {