from uuid import UUID from dcs.mapping import LatLng, Point from fastapi import APIRouter, Depends, HTTPException, status from starlette.responses import Response from game import Game from game.ato import Flight from game.server import GameContext from game.server.leaflet import LeafletPoint from game.server.waypoints.models import FlightWaypointJs from game.sim import GameUpdateEvents router: APIRouter = APIRouter(prefix="/waypoints") def waypoints_for_flight(flight: Flight) -> list[FlightWaypointJs]: return [ FlightWaypointJs.for_waypoint(w, flight, i) for i, w in enumerate(flight.flight_plan.waypoints, 1) ] @router.get( "/{flight_id}", operation_id="list_all_waypoints_for_flight", response_model=list[FlightWaypointJs], ) def all_waypoints_for_flight( flight_id: UUID, game: Game = Depends(GameContext.require) ) -> list[FlightWaypointJs]: return waypoints_for_flight(game.db.flights.get(flight_id)) @router.post( "/{flight_id}/{waypoint_idx}/position", operation_id="set_waypoint_position", status_code=status.HTTP_204_NO_CONTENT, response_class=Response, ) def set_position( flight_id: UUID, waypoint_idx: int, position: LeafletPoint, game: Game = Depends(GameContext.require), ) -> None: from game.server import EventStream flight = game.db.flights.get(flight_id) if waypoint_idx == 0: raise HTTPException(status_code=status.HTTP_403_FORBIDDEN) waypoint = flight.flight_plan.waypoints[waypoint_idx] waypoint.position = Point.from_latlng( LatLng(position.lat, position.lng), game.theater.terrain ) package_model = ( GameContext.get_model() .ato_model_for(flight.blue) .find_matching_package_model(flight.package) ) if package_model is None: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"Could not find PackageModel owning {flight}", ) package_model.update_tot() EventStream.put_nowait(GameUpdateEvents().update_flight(flight))