/** * @param string $json * * @return Board * @throws \Exception */ public function fromJson($json) { $contestantFactory = new ContestantFactory(); $values = json_decode($json); $contestants = (new Collection($values->contestants))->map([$contestantFactory, 'createFromObject']); $categories = array_map(function (\stdClass $category) { return new Category($category->name, array_map(function (\stdClass $question) { $questionObj = new Question(new Clue($question->clue), new Answer($question->answer), $question->value, $question->daily_double ?? false, $question->type ?? Question::CLUE_TYPE_DEFAULT); if (isset($question->used) && $question->used || $questionObj->getClue() === null) { $questionObj->setUsed(true); } return $questionObj; }, $category->questions)); }, $values->categories); if (!isset($values->final)) { throw new \Exception('Final Jeopardy is not defined in your questions file'); } $finalJeopardyClue = new FinalJeopardyClue($values->final->category, $values->final->clue, $values->final->answer); $finalJeopardyState = new State($finalJeopardyClue, $contestants->map(function (Contestant $contestant) { return $contestant->getName(); })->toArray()); $board = new Board($contestants, $categories, new Resolver(), new BuzzerStatus(), $finalJeopardyState); return $board; }
/** * An admin has filled in the value that a user wants to bet on the daily double. We will let the clients know * that they can display the actual question text now. * * @param Question $question * @param $category * @param $bet */ public function onDailyDoubleBetRecieved(Question $question, $category, $bet) { if (!array_key_exists(self::DAILY_DOUBLE_BET_TOPIC, $this->subscribedTopics)) { return; } $response = $question->toArray(); $response['category'] = $category; $response['bet'] = $bet; $response = json_encode($response); $this->subscribedTopics[self::DAILY_DOUBLE_BET_TOPIC]->broadcast($response); }