game_api.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. from functools import wraps
  2. import uuid
  3. from flask import Blueprint, session, abort, request, current_app, jsonify
  4. from db import db, Game, CoordSet, GuessSet
  5. from lib import generate_coord
  6. game = Blueprint("game", __name__)
  7. def require_name():
  8. name = session.get("name", None)
  9. if name is None:
  10. abort(401)
  11. return name
  12. def require_game(game_id):
  13. g = Game.query.get(game_id)
  14. if g is None:
  15. abort(404)
  16. return g
  17. def new_coord_string():
  18. lat, lng = generate_coord(current_app.config["GOOGLE_API_KEY"])
  19. return f"{lat},{lng}"
  20. @game.route("", methods=["PUT"])
  21. def create_game():
  22. name = require_name()
  23. timer = request.json.get("timer", None)
  24. if not isinstance(timer, int) or timer <= 0:
  25. abort(400)
  26. game_id = str(uuid.uuid4())
  27. while Game.query.get(game_id) is not None:
  28. # basically impossible collision, but let's be safe
  29. game_id = str(uuid.uuid4())
  30. cs = CoordSet(
  31. coord_1=new_coord_string(),
  32. coord_2=new_coord_string(),
  33. coord_3=new_coord_string(),
  34. coord_4=new_coord_string(),
  35. coord_5=new_coord_string()
  36. )
  37. db.session.add(cs)
  38. db.session.commit()
  39. new_game = Game(
  40. game_id=game_id,
  41. timer=timer,
  42. creator=name,
  43. coord_set=cs
  44. )
  45. db.session.add(new_game)
  46. db.session.commit()
  47. return jsonify({
  48. "gameId": game_id
  49. })
  50. @game.route("/<game_id>")
  51. def game_settings(game_id):
  52. g = require_game(game_id)
  53. return jsonify({
  54. "gameId": g.game_id,
  55. "creator": g.creator,
  56. "timer": g.timer,
  57. "coords": g.coord_set.to_dict(),
  58. "guesses": [], # TODO
  59. })
  60. @game.route("/<game_id>/guesses")
  61. def guesses(game_id):
  62. name = require_name()
  63. g = require_game(game_id)
  64. return "Unimplemented", 500 # TODO
  65. @game.route("/<game_id>/guesses/<round>", methods=["POST"])
  66. def make_guess(game_id, round):
  67. name = require_name()
  68. g = require_game(game_id)
  69. return "Unimplemented", 500 # TODO