other.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. from typing import List, Optional
  2. from fastapi import APIRouter, Depends
  3. from fastapi_camelcase import CamelModel
  4. from pydantic import confloat
  5. from sqlalchemy.orm import Session
  6. from .. import scoring
  7. from ..schemas import CacheInfo, GameConfig, GeneratorInfo, ScoreMethodEnum
  8. from ..db import get_db, queries
  9. from ..point_gen import points, generator_info, reverse_geocode
  10. router = APIRouter()
  11. class Point(CamelModel):
  12. lat: confloat(ge=-90.0, le=90.0)
  13. lng: confloat(ge=-180.0, le=180.0)
  14. class ScoreCheck(CamelModel):
  15. point1: Point
  16. point2: Point
  17. score_method: Optional[ScoreMethodEnum] = None
  18. round_number: Optional[int] = None
  19. class Score(CamelModel):
  20. distance: float
  21. score: int
  22. class CacheResponse(CamelModel):
  23. caches: List[CacheInfo]
  24. class GeneratorResponse(CamelModel):
  25. generators: List[GeneratorInfo]
  26. class RecentResponse(CamelModel):
  27. recent_games: List[str]
  28. @router.get("/health")
  29. def health():
  30. return { "status": "healthy", "version": "5.0" }
  31. @router.post("/score", response_model=Score)
  32. async def check_score(check: ScoreCheck):
  33. match check.score_method:
  34. case ScoreMethodEnum.country_distance:
  35. p1_code = await reverse_geocode(check.point1.lat, check.point1.lng)
  36. p2_code = await reverse_geocode(check.point2.lat, check.point2.lng)
  37. score_fn = scoring.score if p1_code == p2_code else scoring.score_pow
  38. score, distance = score_fn((check.point1.lat, check.point1.lng), (check.point2.lat, check.point2.lng))
  39. case ScoreMethodEnum.country_race:
  40. p1_code = await reverse_geocode(check.point1.lat, check.point1.lng)
  41. p2_code = await reverse_geocode(check.point2.lat, check.point2.lng)
  42. score = 5000 if p1_code == p2_code else 0
  43. distance = 0
  44. case ScoreMethodEnum.hard:
  45. score, distance = scoring.score_hard((check.point1.lat, check.point1.lng), (check.point2.lat, check.point2.lng))
  46. case ScoreMethodEnum.nightmare:
  47. score, distance = scoring.score_nightmare((check.point1.lat, check.point1.lng), (check.point2.lat, check.point2.lng))
  48. case ScoreMethodEnum.ramp:
  49. score, distance = scoring.score((check.point1.lat, check.point1.lng), (check.point2.lat, check.point2.lng))
  50. if check.round_number is not None:
  51. score *= 1 + ((check.round_number - 1) * 0.5)
  52. case ScoreMethodEnum.ramp_hard:
  53. score, distance = scoring.score_hard((check.point1.lat, check.point1.lng), (check.point2.lat, check.point2.lng))
  54. if check.round_number is not None:
  55. score *= 1 + ((check.round_number - 1) * 0.5)
  56. case _:
  57. score, distance = scoring.score((check.point1.lat, check.point1.lng), (check.point2.lat, check.point2.lng))
  58. return Score(distance=distance, score=score)
  59. @router.get("/caches", response_model=CacheResponse)
  60. def caches():
  61. return CacheResponse(caches=points.get_cache_info())
  62. @router.get("/generators", response_model=GeneratorResponse)
  63. def generators():
  64. return GeneratorResponse(generators=generator_info)
  65. @router.get("/recent", response_model=RecentResponse)
  66. def recent(db: Session = Depends(get_db)):
  67. return RecentResponse(recent_games=[g.game_id for g in queries.get_recent_games(db, 5)])