def post(self): data = flask.request.get_json() answer = utils.normalize_input(data['answer']) try: correct = controllers.test_answer(data['cid'], answer) except errors.IntegrityError: raise errors.InvalidAnswerError('Invalid answer.') if not correct: raise errors.InvalidAnswerError('Invalid answer.') return dict(message='Answer OK.')
def submit_answer(cid, answer): """Submits an answer. Returns: Number of points awarded for answer. """ try: challenge = models.Challenge.query.get(cid) if not challenge.unlocked: raise errors.AccessDeniedError('Challenge is locked!') if challenge.verify_answer(answer): # Deductions for hints hints = models.UnlockedHint.query.filter( models.UnlockedHint.team == flask.g.team).all() deduction = sum( h.hint.cost for h in hints if h.hint.challenge_cid == cid) points = challenge.points - deduction flask.g.team.score += points models.Answer.create(challenge, flask.g.team, answer) correct = 'CORRECT' return points else: correct = 'WRONG' raise errors.InvalidAnswerError('Really? Haha no....') finally: app.challenge_log.info( '[%s] Player %s <%s>(%d)/Team %s(%d) submitted "%s" for Challenge ' '%s<%d>: %s', flask.request.access_route[0], flask.g.user.nick, flask.g.user.email, flask.g.user.uid, flask.g.team.name, flask.g.team.tid, answer, challenge.name, challenge.cid, correct)
def submit_answer(cid, answer, token): """Submits an answer. Args: cid: The ID of the challenge. answer: The answer to check. token: Provided proof of work token. Returns: Number of points awarded for answer. """ correct = 'WRONG' nbits = app.config.get('PROOF_OF_WORK_BITS', 0) if nbits and not utils.validate_proof_of_work(answer, token, nbits): raise errors.InvalidAnswerError('Bad proof of work token!') team = models.Team.current() if not team: raise errors.AccessDeniedError('No team!') try: challenge = models.Challenge.query.get(cid) if not challenge.unlocked_for_team(team): raise errors.AccessDeniedError('Challenge is locked!') validator = validators.GetValidatorForChallenge(challenge) if validator.validate_answer(answer, team): points = save_team_answer(challenge, team, answer) if utils.GameTime.over(): correct = 'CORRECT (Game Over)' else: correct = 'CORRECT' return points else: raise errors.InvalidAnswerError('Really? Haha no....') except (errors.IntegrityError, errors.FlushError) as exc: app.logger.exception('Error saving flag: %s', exc) models.db.session.rollback() raise finally: user = models.User.current() app.challenge_log.info( 'Player %s <%s>(%d)/Team %s(%d) submitted ' '"%s" for Challenge %s<%d>: %s', user.nick, user.email, user.uid, team.name, team.tid, answer, challenge.name, challenge.cid, correct)
def submit_answer(cid, answer): """Submits an answer. Returns: Number of points awarded for answer. """ correct = 'WRONG' team = models.Team.current() if not team: raise errors.AccessDeniedError('No team!') try: challenge = models.Challenge.query.get(cid) if not challenge.unlocked_for_team(team): raise errors.AccessDeniedError('Challenge is locked!') validator = validators.GetValidatorForChallenge(challenge) if validator.validate_answer(answer, team): ans = models.Answer.create(challenge, team, answer) if utils.GameTime.over(): correct = 'CORRECT (Game Over)' else: team.score += ans.current_points correct = 'CORRECT' team.last_solve = datetime.datetime.utcnow() models.ScoreHistory.add_entry(team) challenge.update_answers(exclude_team=team) if utils.GameTime.over(): return 0 else: return ans.current_points else: raise errors.InvalidAnswerError('Really? Haha no....') except errors.IntegrityError: models.db.session.rollback() raise finally: user = models.User.current() app.challenge_log.info( 'Player %s <%s>(%d)/Team %s(%d) submitted ' '"%s" for Challenge %s<%d>: %s', user.nick, user.email, user.uid, team.name, team.tid, answer, challenge.name, challenge.cid, correct)
def submit_answer(cid, answer): """Submits an answer. Args: cid: The ID of the challenge. answer: The answer to check. Returns: Number of points awarded for answer. """ correct = 'WRONG' team = models.Team.current() if not team: raise errors.AccessDeniedError('No team!') try: challenge = models.Challenge.query.get(cid) if not challenge.unlocked_for_team(team): raise errors.AccessDeniedError('Challenge is locked!') validator = validators.GetValidatorForChallenge(challenge) if validator.validate_answer(answer, team): points = save_team_answer(challenge, team, answer) if utils.GameTime.over(): correct = 'CORRECT (Game Over)' else: correct = 'CORRECT' return points else: raise errors.InvalidAnswerError('Really? Haha no....') except errors.IntegrityError: models.db.session.rollback() raise finally: user = models.User.current() app.challenge_log.info( 'Player %s <%s>(%d)/Team %s(%d) submitted ' '"%s" for Challenge %s<%d>: %s', user.nick, user.email, user.uid, team.name, team.tid, answer, challenge.name, challenge.cid, correct)