db.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import uuid
  2. from flask_sqlalchemy import SQLAlchemy
  3. db = SQLAlchemy()
  4. session = db.session
  5. class Game(db.Model):
  6. game_id = db.Column(db.String, primary_key=True)
  7. timer = db.Column(db.Integer)
  8. rounds = db.Column(db.Integer)
  9. linked_game = db.Column(db.String)
  10. only_america = db.Column(db.Boolean)
  11. gen_method = db.Column(db.String)
  12. rule_set = db.Column(db.String)
  13. coordinates = db.relationship("Coordinate", lazy=True, order_by="Coordinate.round_number")
  14. players = db.relationship("Player", lazy=True, backref="game")
  15. @staticmethod
  16. def create(timer, rounds, only_america, gen_method, rule_set, coords):
  17. game_id = str(uuid.uuid4())
  18. while Game.query.get(game_id) is not None:
  19. # basically impossible collision, but let's be safe
  20. game_id = str(uuid.uuid4())
  21. new_game = Game(
  22. game_id=game_id,
  23. timer=timer,
  24. rounds=rounds,
  25. only_america=only_america,
  26. gen_method=gen_method,
  27. rule_set=rule_set,
  28. )
  29. db.session.add(new_game)
  30. for (round_num, (lat, lng)) in enumerate(coords):
  31. coord = Coordinate(
  32. game_id=game_id,
  33. round_number=round_num+1,
  34. latitude=lat,
  35. longitude=lng
  36. )
  37. db.session.add(coord)
  38. db.session.commit()
  39. return new_game
  40. def join(self, player_name):
  41. p = Player(
  42. game_id=self.game_id,
  43. player_name=player_name
  44. )
  45. db.session.add(p)
  46. db.session.commit()
  47. return p
  48. def link(self, linked_game):
  49. self.linked_game = linked_game
  50. db.session.commit()
  51. class Player(db.Model):
  52. player_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  53. game_id = db.Column(db.String, db.ForeignKey("game.game_id"))
  54. player_name = db.Column(db.String)
  55. guesses = db.relationship("Guess", lazy=True, order_by="Guess.round_number")
  56. def get_total_score(self):
  57. return sum(g.round_score or 0 for g in self.guesses)
  58. def get_current_round(self):
  59. if len(self.guesses) == 0:
  60. return 1
  61. next_round = self.guesses[-1].round_number + 1
  62. if next_round <= self.game.rounds:
  63. return next_round
  64. return None
  65. def add_guess(self, round_num, lat, lng, score, remaining):
  66. g = Guess(
  67. player_id=self.player_id,
  68. round_number=round_num,
  69. latitude=lat,
  70. longitude=lng,
  71. round_score=score,
  72. time_remaining=remaining,
  73. )
  74. db.session.add(g)
  75. db.session.commit()
  76. def add_timeout(self, round_num):
  77. self.add_guess(round_num, -200, -200, None, 0)
  78. def get_last_round_time_remaining(self):
  79. if len(self.guesses) == 0:
  80. return None
  81. return self.guesses[-1].time_remaining
  82. def timeout_remaining_rounds(self):
  83. round_num = self.get_current_round()
  84. if round_num is not None:
  85. for r in range(round_num, self.game.rounds + 1):
  86. self.add_timeout(r)
  87. class Coordinate(db.Model):
  88. game_id = db.Column(db.String, db.ForeignKey("game.game_id"), primary_key=True)
  89. round_number = db.Column(db.Integer, primary_key=True, autoincrement=False)
  90. latitude = db.Column(db.Float)
  91. longitude = db.Column(db.Float)
  92. class Guess(db.Model):
  93. player_id = db.Column(db.String, db.ForeignKey("player.player_id"), primary_key=True)
  94. round_number = db.Column(db.Integer, primary_key=True, autoincrement=False)
  95. latitude = db.Column(db.Float)
  96. longitude = db.Column(db.Float)
  97. round_score = db.Column(db.Integer)
  98. time_remaining = db.Column(db.Float)