123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- from flask import Blueprint, abort, request, jsonify
- import db
- import lib
- game = Blueprint("game", __name__)
- def require_name():
- name = request.headers.get("Authorization", type=str)
- if name is None:
- abort(401)
- return name.split(maxsplit=1)[-1]
- def require_game(game_id):
- g = db.Game.query.get(game_id)
- if g is None:
- abort(404)
- return g
- def require_guess_set(game_id):
- name = require_name()
- gs = db.GuessSet.query.get((game_id, name))
- if gs is None:
- abort(404)
- return gs
- @game.route("", methods=["PUT"])
- def create_game():
- name = require_name()
- timer = request.json.get("timer", None)
- if not isinstance(timer, int) or timer <= 0:
- abort(400)
- new_game = db.Game.create(timer, name)
- return jsonify({"gameId": new_game.game_id})
- @game.route("/<game_id>")
- def game_settings(game_id):
- g = require_game(game_id)
- return jsonify(g.to_dict())
- @game.route("/<game_id>/join", methods=["POST"])
- def join(game_id):
- name = require_name()
- g = require_game(game_id)
- if db.GuessSet.query.get((g.game_id, name)) is not None:
- abort(409)
- cs = db.CoordSet()
- db.session.add(cs)
- db.session.commit()
- gs = db.GuessSet(game_id=g.game_id, player_name=name, coord_set=cs)
- db.session.add(gs)
- db.session.commit()
- return "", 201
- @game.route("/<game_id>/guesses")
- def guesses(game_id):
- gs = require_guess_set(game_id)
- return jsonify({
- "currentRound": gs.get_current_round(),
- "guesses": gs.to_dict(),
- })
- @game.route("/<game_id>/guesses/<round_num>", methods=["POST"])
- def make_guess(game_id, round_num):
- gs = require_guess_set(game_id)
- if round_num != gs.get_current_round():
- abort(409)
- timed_out = request.json.get("timeout", False)
- if timed_out:
- gs.set_timed_out(round_num)
- db.session.commit()
- return jsonify({
- "score": 0,
- "totalScore": gs.get_total_score(),
- "distance": None,
- }), 201
- try:
- lat = float(request.json.get("lat", None))
- lng = float(request.json.get("lng", None))
- except ValueError:
- abort(400)
- target = require_game(game_id).coord_set.get_coord(round_num)
- guess_score, distance = lib.score(target, (lat, lng))
- gs.set_guess(round_num, lat, lng, guess_score)
- db.session.commit()
- return jsonify({
- "score": guess_score,
- "totalScore": gs.get_total_score(),
- "distance": distance,
- }), 201
|