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("/") def game_settings(game_id): g = require_game(game_id) return jsonify(g.to_dict()) @game.route("//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("//guesses") def guesses(game_id): gs = require_guess_set(game_id) return jsonify({ "currentRound": gs.get_current_round(), "guesses": gs.to_dict(), }) @game.route("//guesses/", 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 lat = request.json.get("lat", None) lng = request.json.get("lng", None) if not isinstance(lat, float) or not isinstance(lng, float): 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