+
+ 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);
+ }
+ }
+
+