/**
  * Basic tests for shareable scoreboard url
  */
 public function testScoreboardUrlNoLogin()
 {
     // Get a private contest with 0% of scoreboard show percentage
     $contestData = ContestsFactory::createContest(null, 0);
     ContestsFactory::setScoreboardPercentage($contestData, 0);
     // Create problem
     $problemData = ProblemsFactory::createProblem();
     ContestsFactory::addProblemToContest($problemData, $contestData);
     // Create our contestant, will submit 1 run
     $contestant = UserFactory::createUser();
     ContestsFactory::addUser($contestData, $contestant);
     $runData = RunsFactory::createRun($problemData, $contestData, $contestant);
     RunsFactory::gradeRun($runData);
     // Get the scoreboard url by using the MyList api being the
     // contest director
     $response = ContestController::apiMyList(new Request(array('auth_token' => $this->login($contestData['director']))));
     // Look for our contest from the list and save the scoreboard tokens
     $scoreboard_url = null;
     $scoreboard_admin_url = null;
     foreach ($response['results'] as $c) {
         if ($c['alias'] === $contestData['request']['alias']) {
             $scoreboard_url = $c['scoreboard_url'];
             $scoreboard_admin_url = $c['scoreboard_url_admin'];
             break;
         }
     }
     $this->assertNotNull($scoreboard_url);
     $this->assertNotNull($scoreboard_admin_url);
     // Call scoreboard api from the user
     $scoreboardResponse = ContestController::apiScoreboard(new Request(array('contest_alias' => $contestData['request']['alias'], 'token' => $scoreboard_url)));
     $this->assertEquals('0', $scoreboardResponse['ranking'][0]['total']['points']);
     // Call scoreboard api from the user with admin token
     $scoreboardResponse = ContestController::apiScoreboard(new Request(array('contest_alias' => $contestData['request']['alias'], 'token' => $scoreboard_admin_url)));
     $this->assertEquals('100', $scoreboardResponse['ranking'][0]['total']['points']);
 }
예제 #2
0
 /**
  * Get Contests which a certain user has participated in
  *
  * @param Request $r
  * @return Contests array
  * @throws InvalidDatabaseOperationException
  */
 public static function apiContestStats(Request $r)
 {
     self::authenticateOrAllowUnauthenticatedRequest($r);
     $response = array();
     $response['contests'] = array();
     $user = self::resolveTargetUser($r);
     // Get contests where user had at least 1 run
     try {
         $contestsParticipated = ContestsDAO::getContestsParticipated($user->getUserId());
     } catch (Exception $e) {
         throw new InvalidDatabaseOperationException($e);
     }
     $contests = array();
     foreach ($contestsParticipated as $contest) {
         // Get user ranking
         $scoreboardR = new Request(array('auth_token' => $r['auth_token'], 'contest_alias' => $contest->getAlias(), 'token' => $contest->getScoreboardUrlAdmin()));
         $scoreboardResponse = ContestController::apiScoreboard($scoreboardR);
         // Grab the place of the current user in the given contest
         $contests[$contest->getAlias()]['place'] = null;
         foreach ($scoreboardResponse['ranking'] as $userData) {
             if ($userData['username'] == $user->getUsername()) {
                 $contests[$contest->getAlias()]['place'] = $userData['place'];
                 break;
             }
         }
         $contest->toUnixTime();
         $contests[$contest->getAlias()]['data'] = $contest->asArray();
     }
     $response['contests'] = $contests;
     $response['status'] = 'ok';
     return $response;
 }
예제 #3
0
 /**
  * Get Contests which a certain user has participated in
  * 
  * @param Request $r
  * @return Contests array
  * @throws InvalidDatabaseOperationException
  */
 public static function apiContestStats(Request $r)
 {
     self::authenticateOrAllowUnauthenticatedRequest($r);
     $response = array();
     $response["contests"] = array();
     $user = self::resolveTargetUser($r);
     $contest_user_key = new ContestsUsers();
     $contest_user_key->setUserId($user->getUserId());
     // Get contests where user had at least 1 run
     try {
         $contestsParticipated = ContestsDAO::getContestsParticipated($user->getUserId());
     } catch (Exception $e) {
         throw new InvalidDatabaseOperationException($e);
     }
     $contests = array();
     foreach ($contestsParticipated as $contest) {
         // Get user ranking
         $scoreboardR = new Request(array("auth_token" => $r["auth_token"], "contest_alias" => $contest->getAlias(), "token" => $contest->getScoreboardUrlAdmin()));
         $scoreboardResponse = ContestController::apiScoreboard($scoreboardR);
         // Grab the place of the current user in the given contest
         $contests[$contest->getAlias()]["place"] = null;
         foreach ($scoreboardResponse["ranking"] as $userData) {
             if ($userData["username"] == $user->getUsername()) {
                 $contests[$contest->getAlias()]["place"] = $userData["place"];
                 break;
             }
         }
         $contest->toUnixTime();
         $contests[$contest->getAlias()]["data"] = $contest->asArray();
     }
     $response["contests"] = $contests;
     $response["status"] = "ok";
     return $response;
 }