namespace App\Models;
+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),
+ ];
+ return $channels;
+ }
+
public function getCurrentEpisode() {
return $this->episodes()
->where('start', '<', now()->subMinutes(10))
->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);
}
$this->save();
}
+ public function getGuessingSetting($name, $default = null) {
+ if (empty($this->guessing_settings) ||
+ empty($this->guessing_type) ||
+ !array_key_exists($this->guessing_type, $this->guessing_settings) ||
+ !array_key_exists($name, $this->guessing_settings[$this->guessing_type])
+ ) {
+ return $default;
+ }
+ return $this->guessing_settings[$this->guessing_type][$name];
+ }
+
public function solveGuessing($solution) {
$start = $this->guessing_start;
$end = is_null($this->guessing_end) ? now() : $this->guessing_end;
}
public function scoreGuessing($solution, $guess, $first) {
- return 1;
+ if ($guess == $solution) {
+ if ($first) {
+ return $this->getGuessingSetting('points_exact_first', 1);
+ }
+ return $this->getGuessingSetting('points_exact_other', 1);
+ }
+ $distance = abs(intval($guess) - intval($solution));
+ if ($distance <= $this->getGuessingSetting('points_close_max', 3)) {
+ if ($first) {
+ return $this->getGuessingSetting('points_close_first', 1);
+ }
+ return $this->getGuessingSetting('points_close_other', 1);
+ }
+ return 0;
}
public function isValidGuess($solution) {
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);
}
return $this->belongsTo(Organization::class);
}
+ public function winners() {
+ return $this->hasMany(GuessingWinner::class);
+ }
+
protected $casts = [
'chat' => 'boolean',
'chat_commands' => 'array',
'chat_settings' => 'array',
+ 'guessing_settings' => 'array',
'guessing_start' => 'datetime',
'guessing_end' => 'datetime',
'languages' => 'array',