X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=app%2FModels%2FChannel.php;h=8debe4f9434ab554d70eb5e16086bf875ed1875e;hb=60b20c057188f8965d02c170099aaf1d8ff4e3c6;hp=738312dc3e82a60d6725a0289f2886a11b3dcc2e;hpb=93f50820771a0333b169f76f74727239cf0cb286;p=alttp.git diff --git a/app/Models/Channel.php b/app/Models/Channel.php index 738312d..8debe4f 100644 --- a/app/Models/Channel.php +++ b/app/Models/Channel.php @@ -2,13 +2,28 @@ namespace App\Models; +use Illuminate\Broadcasting\Channel as PublicChannel; +use Illuminate\Broadcasting\PrivateChannel; +use Illuminate\Database\Eloquent\BroadcastsEvents; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Arr; -class Channel extends Model -{ +class Channel extends Model { + + use BroadcastsEvents; use HasFactory; + public function broadcastOn($event) { + $channels = [ + new PrivateChannel('Channel.'.$this->id), + ]; + if (!empty($this->access_key)) { + $channels[] = new PublicChannel('ChannelKey.'.$this->access_key); + } + return $channels; + } + public function getCurrentEpisode() { return $this->episodes() ->where('start', '<', now()->subMinutes(10)) @@ -16,6 +31,10 @@ class Channel extends Model ->first(); } + public function getGuessingLeaderboard() { + return $this->winners()->selectRaw('(select t2.uname from guessing_winners t2 where t2.uid = guessing_winners.uid order by created_at desc limit 1) as name, sum(score) as score')->groupBy('uid')->orderBy('score', 'desc')->limit(10)->get(); + } + public function hasActiveGuessing() { return !is_null($this->guessing_start); } @@ -66,6 +85,9 @@ class Channel extends Model $distance = abs(intval($guess->guess) - intval($solution)); if (is_null($min_distance) || $distance == $min_distance) { $candidates[] = $guess; + if (is_null($min_distance)) { + $min_distance = $distance; + } } else if ($distance < $min_distance) { $candidates = [$guess]; $min_distance = $distance; @@ -131,6 +153,14 @@ class Channel extends Model return false; } + public function listAnd($entries) { + $lang = empty($this->languages) ? 'en' : $this->languages[0]; + if ($lang == 'de') { + return Arr::join($entries, ', ', ' und '); + } + return Arr::join($entries, ', ', ' and '); + } + public function crews() { return $this->hasMany(ChannelCrew::class); } @@ -149,20 +179,31 @@ class Channel extends Model return $this->belongsTo(Organization::class); } + public function winners() { + return $this->hasMany(GuessingWinner::class); + } + protected $casts = [ 'chat' => 'boolean', 'chat_commands' => 'array', 'chat_settings' => 'array', + 'guessing_end' => 'datetime', 'guessing_settings' => 'array', 'guessing_start' => 'datetime', - 'guessing_end' => 'datetime', 'languages' => 'array', 'join' => 'boolean', ]; protected $hidden = [ + 'access_key', + 'chat', + 'chat_commands', + 'chat_settings', 'created_at', 'ext_id', + 'guessing_settings', + 'join', + 'twitch_chat', 'updated_at', ];