db.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. from flask_sqlalchemy import SQLAlchemy
  2. db = SQLAlchemy()
  3. class Game(db.Model):
  4. game_id = db.Column(db.String, primary_key=True)
  5. timer = db.Column(db.Integer)
  6. creator = db.Column(db.String)
  7. coord_id = db.Column(db.Integer, db.ForeignKey("coord_set.coord_id"))
  8. coord_set = db.relationship("CoordSet")
  9. guess_sets = db.relationship("GuessSet", backref="game", lazy=True)
  10. def __str__(self):
  11. return f"Game({self.game_id}, {self.timer})"
  12. class CoordSet(db.Model):
  13. coord_id = db.Column(db.Integer, primary_key=True)
  14. coord_1 = db.Column(db.String)
  15. coord_2 = db.Column(db.String)
  16. coord_3 = db.Column(db.String)
  17. coord_4 = db.Column(db.String)
  18. coord_5 = db.Column(db.String)
  19. def to_dict(self):
  20. to_return = {}
  21. for r, c in zip("12345", (self.coord_1, self.coord_2, self.coord_3, self.coord_4, self.coord_5)):
  22. if c is None:
  23. continue
  24. lat, lng = c.split(",")
  25. to_return[r] = {
  26. "lat": float(lat),
  27. "lng": float(lng)
  28. }
  29. return to_return
  30. def get_coord(self, round_num):
  31. # TODO this logic is a little gross
  32. if round_num == "1":
  33. c = self.coord_1
  34. elif round_num == "2":
  35. c = self.coord_2
  36. elif round_num == "3":
  37. c = self.coord_3
  38. elif round_num == "4":
  39. c = self.coord_4
  40. elif round_num == "5":
  41. c = self.coord_5
  42. else:
  43. raise ValueError(f"Invalid round number {round_num}")
  44. if c is not None:
  45. return tuple(float(x) for x in c.split(","))
  46. # returns None if the selected coord was None
  47. def set_coord(self, round_num, lat, lng):
  48. # TODO this logic is a little gross
  49. if round_num == "1":
  50. self.coord_1 = f"{lat},{lng}"
  51. elif round_num == "2":
  52. self.coord_2 = f"{lat},{lng}"
  53. elif round_num == "3":
  54. self.coord_3 = f"{lat},{lng}"
  55. elif round_num == "4":
  56. self.coord_4 = f"{lat},{lng}"
  57. elif round_num == "5":
  58. self.coord_5 = f"{lat},{lng}"
  59. else:
  60. raise ValueError(f"Invalid round number {round_num}")
  61. class GuessSet(db.Model):
  62. game_id = db.Column(db.String, db.ForeignKey(
  63. "game.game_id"), primary_key=True)
  64. player_name = db.Column(db.String, primary_key=True)
  65. coord_id = db.Column(db.Integer, db.ForeignKey("coord_set.coord_id"))
  66. coord_set = db.relationship("CoordSet")
  67. score_1 = db.Column(db.Integer)
  68. score_2 = db.Column(db.Integer)
  69. score_3 = db.Column(db.Integer)
  70. score_4 = db.Column(db.Integer)
  71. score_5 = db.Column(db.Integer)
  72. def to_dict(self):
  73. c = self.coord_set.to_dict()
  74. for r, s in zip("12345", (self.score_1, self.score_2, self.score_3, self.score_4, self.score_5)):
  75. if r in c:
  76. c[r]["score"] = s
  77. else:
  78. c[r] = None
  79. return c
  80. def get_current_round(self):
  81. for r, s in zip("12345", (self.score_1, self.score_2, self.score_3, self.score_4, self.score_5)):
  82. if s is None:
  83. return r
  84. # returns None if all rounds completed
  85. def get_total_score(self):
  86. return ((self.score_1 or 0) +
  87. (self.score_2 or 0) +
  88. (self.score_3 or 0) +
  89. (self.score_4 or 0) +
  90. (self.score_5 or 0))
  91. def set_timed_out(self, round_num):
  92. self.set_guess(round_num, -200, -200, 0)
  93. def set_guess(self, round_num, lat, lng, score):
  94. self.coord_set.set_coord(round_num, lat, lng)
  95. # TODO this logic is a little gross
  96. if round_num == "1":
  97. self.score_1 = score
  98. elif round_num == "2":
  99. self.score_2 = score
  100. elif round_num == "3":
  101. self.score_3 = score
  102. elif round_num == "4":
  103. self.score_4 = score
  104. elif round_num == "5":
  105. self.score_5 = score
  106. else:
  107. raise ValueError(f"Invalid round number {round_num}")