]> git.localhorst.tv Git - alttp.git/blobdiff - app/Models/Channel.php
add simple guessing game browser source
[alttp.git] / app / Models / Channel.php
index 738312dc3e82a60d6725a0289f2886a11b3dcc2e..8debe4f9434ab554d70eb5e16086bf875ed1875e 100644 (file)
@@ -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',
        ];