namespace App\Models;
+use App\Events\ResultChanged;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
{
use HasFactory;
+
+ public static function compareResult(Result $a, Result $b) {
+ $a_time = !$a->forfeit ? $a->time : 0;
+ $b_time = !$b->forfeit ? $b->time : 0;
+ if ($a_time) {
+ if ($b_time) {
+ if ($a_time < $b_time) return -1;
+ if ($b_time < $a_time) return 1;
+ return static::compareUsername($a, $b);
+ }
+ return -1;
+ }
+ if ($b_time) {
+ return 1;
+ }
+ if ($a->forfeit) {
+ if ($b->forfeit) {
+ return static::compareUsername($a, $b);
+ }
+ return -1;
+ }
+ if ($b->forfeit) {
+ return 1;
+ }
+ return static::compareUsername($a, $b);
+ }
+
+ public static function compareUsername(Result $a, Result $b) {
+ return strcasecmp($a->user->username, $b->user->username);
+ }
+
+
+ public function formatTime() {
+ $hours = floor($this->time / 60 / 60);
+ $minutes = floor(($this->time / 60) % 60);
+ $seconds = floor($this->time % 60);
+ return sprintf('%d:%02d:%02d', $hours, $minutes, $seconds);
+ }
+
+ public function updateResult($time, $forfeit) {
+ $this->time = $time;
+ $this->forfeit = $forfeit;
+ $this->save();
+ if ($this->wasChanged()) {
+ ResultChanged::dispatch($this);
+ }
+ }
+
+ public function updatePlacement($score, $placement) {
+ $this->score = $score;
+ $this->placement = $placement;
+ $this->save();
+ if ($this->wasChanged()) {
+ ResultChanged::dispatch($this);
+ }
+ }
+
+
public function round() {
return $this->belongsTo(Round::class);
}
return $this->belongsTo(Participant::class);
}
+ public function user() {
+ return $this->belongsTo(User::class);
+ }
+
+ public function getHasFinishedAttribute() {
+ return $this->time > 0 || $this->forfeit;
+ }
+
+
+ protected $casts = [
+ 'forfeit' => 'boolean',
+ 'time' => 'double',
+ 'user_id' => 'string',
+ ];
+
+ protected $appends = [
+ 'has_finished',
+ ];
+
+ protected $fillable = [
+ 'forfeit',
+ 'round_id',
+ 'time',
+ 'user_id',
+ ];
+
}