+ public function hasActiveGuessing() {
+ return !is_null($this->guessing_start);
+ }
+
+ public function isAcceptingGuesses() {
+ return !is_null($this->guessing_start) && is_null($this->guessing_end);
+ }
+
+ public function startGuessing($type) {
+ $this->guessing_type = $type;
+ $this->guessing_start = now();
+ $this->save();
+ }
+
+ public function stopGuessing() {
+ $this->guessing_end = now();
+ $this->save();
+ }
+
+ public function solveGuessing($solution) {
+ $start = $this->guessing_start;
+ $end = is_null($this->guessing_end) ? now() : $this->guessing_end;
+ $guesses = $this->guesses()->whereBetween('created_at', [$start, $end])->orderBy('created_at', 'ASC')->get();
+ $unique_guesses = [];
+ foreach ($guesses as $guess) {
+ $unique_guesses[$guess->uid] = $guess;
+ }
+ $candidates = [];
+ foreach ($unique_guesses as $guess) {
+ if ($guess->guess == $solution) {
+ $candidates[] = $guess;
+ }
+ }
+ if (empty($candidates) && is_numeric($solution)) {
+ $min_distance = null;
+ foreach ($unique_guesses as $guess) {
+ $distance = abs(intval($guess->guess) - intval($solution));
+ if (is_null($min_distance) || $distance == $min_distance) {
+ $candidates[] = $guess;
+ } else if ($distance < $min_distance) {
+ $candidates = [$guess];
+ $min_distance = $distance;
+ }
+ }
+ }
+ $winners = [];
+ $first = true;
+ foreach ($candidates as $candidate) {
+ $score = $this->scoreGuessing($solution, $candidate->guess, $first);
+ $winner = new GuessingWinner();
+ $winner->channel()->associate($this);
+ $winner->pod = $start;
+ $winner->uid = $candidate->uid;
+ $winner->uname = $candidate->uname;
+ $winner->guess = $candidate->guess;
+ $winner->solution = $solution;
+ $winner->score = $score;
+ $winner->save();
+ $winners[] = $winner;
+ $first = false;
+ }
+ return $winners;
+ }
+
+ public function clearGuessing() {
+ $this->guessing_start = null;
+ $this->guessing_end = null;
+ $this->save();
+ }
+
+ public function registerGuess($uid, $uname, $guess) {
+ $model = new GuessingGuess();
+ $model->channel()->associate($this);
+ $model->uid = $uid;
+ $model->uname = $uname;
+ $model->guess = $guess;
+ $model->save();
+ }
+
+ public function scoreGuessing($solution, $guess, $first) {
+ return 1;
+ }
+
+ public function isValidGuess($solution) {
+ if ($this->guessing_type == 'gtbk') {
+ $int_solution = intval($solution);
+ return $int_solution > 0 && $int_solution < 23;
+ }
+ return false;
+ }
+