from functools import wraps import uuid from flask import Blueprint, session, abort, request, current_app, jsonify from db import db, Game, CoordSet, GuessSet from lib import generate_coord game = Blueprint("game", __name__) def require_name(): name = session.get("name", None) if name is None: abort(401) return name def require_game(game_id): g = Game.query.get(game_id) if g is None: abort(404) return g def new_coord_string(): lat, lng = generate_coord(current_app.config["GOOGLE_API_KEY"]) return f"{lat},{lng}" @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) game_id = str(uuid.uuid4()) while Game.query.get(game_id) is not None: # basically impossible collision, but let's be safe game_id = str(uuid.uuid4()) cs = CoordSet( coord_1=new_coord_string(), coord_2=new_coord_string(), coord_3=new_coord_string(), coord_4=new_coord_string(), coord_5=new_coord_string() ) db.session.add(cs) db.session.commit() new_game = Game( game_id=game_id, timer=timer, creator=name, coord_set=cs ) db.session.add(new_game) db.session.commit() return jsonify({ "gameId": game_id }) @game.route("/") def game_settings(game_id): g = require_game(game_id) return jsonify({ "gameId": g.game_id, "creator": g.creator, "timer": g.timer, "coords": g.coord_set.to_dict(), "guesses": [], # TODO }) @game.route("//guesses") def guesses(game_id): name = require_name() g = require_game(game_id) return "Unimplemented", 500 # TODO @game.route("//guesses/", methods=["POST"]) def make_guess(game_id, round): name = require_name() g = require_game(game_id) return "Unimplemented", 500 # TODO