From d578e763c0d547d1cc4b2781960b6e54d4475760 Mon Sep 17 00:00:00 2001 From: Raffson Date: Sat, 25 Jun 2022 23:09:51 +0200 Subject: [PATCH] Push full flight information in the event stream. https://github.com/dcs-liberation/dcs_liberation/issues/2263 --- client/src/api/eventstream.tsx | 23 ++++++++++------------- client/src/api/flightsSlice.ts | 31 +++++++++++++++++-------------- game/server/eventstream/models.py | 7 +++++-- game/sim/gameupdateevents.py | 6 +++--- 4 files changed, 35 insertions(+), 32 deletions(-) diff --git a/client/src/api/eventstream.tsx b/client/src/api/eventstream.tsx index f1be7522..94672f6b 100644 --- a/client/src/api/eventstream.tsx +++ b/client/src/api/eventstream.tsx @@ -6,10 +6,10 @@ import { endCombat, newCombat, updateCombat } from "./combatSlice"; import { updateControlPoint } from "./controlPointsSlice"; import { deselectFlight, - registerFlight, + registerFlights, selectFlight, - unregisterFlight, - updateFlight, + unregisterFlights, + updateFlights, updateFlightPositions, } from "./flightsSlice"; import { @@ -43,7 +43,7 @@ interface GameUpdateEvents { updated_unculled_zones: UnculledZone[]; threat_zones_updated: boolean; new_flights: Flight[]; - updated_flights: string[]; + updated_flights: Flight[]; deleted_flights: string[]; selected_flight: string | null; deselected_flight: boolean; @@ -103,19 +103,16 @@ export const handleStreamedEvents = ( ); } - for (const flight of events.new_flights) { - dispatch(registerFlight(flight)); + if (events.new_flights.length > 0) { + dispatch(registerFlights(events.new_flights)); } - for (const id of events.updated_flights) { - backend.get(`/flights/${id}?with_waypoints=true`).then((response) => { - const flight = response.data as Flight; - dispatch(updateFlight(flight)); - }); + if (events.updated_flights.length > 0) { + dispatch(updateFlights(events.updated_flights)); } - for (const id of events.deleted_flights) { - dispatch(unregisterFlight(id)); + if (events.deleted_flights.length > 0) { + dispatch(unregisterFlights(events.deleted_flights)); } if (events.deselected_flight) { diff --git a/client/src/api/flightsSlice.ts b/client/src/api/flightsSlice.ts index 6329f7da..2ff706e7 100644 --- a/client/src/api/flightsSlice.ts +++ b/client/src/api/flightsSlice.ts @@ -18,20 +18,23 @@ export const flightsSlice = createSlice({ name: "flights", initialState, reducers: { - registerFlight: (state, action: PayloadAction) => { - const flight = action.payload; - if (flight.id in state.flights) { - console.log(`Overriding flight with ID: ${flight.id}`); + registerFlights: (state, action: PayloadAction) => { + for (const flight of action.payload) { + if (flight.id in state.flights) { + console.log(`Overriding flight with ID: ${flight.id}`); + } + state.flights[flight.id] = flight; } - state.flights[flight.id] = flight; }, - unregisterFlight: (state, action: PayloadAction) => { - const id = action.payload; - delete state.flights[id]; + unregisterFlights: (state, action: PayloadAction) => { + for (const id of action.payload) { + delete state.flights[id]; + } }, - updateFlight: (state, action: PayloadAction) => { - const flight = action.payload; - state.flights[flight.id] = flight; + updateFlights: (state, action: PayloadAction) => { + for (const flight of action.payload) { + state.flights[flight.id] = flight; + } }, deselectFlight: (state) => { state.selected = null; @@ -67,9 +70,9 @@ export const flightsSlice = createSlice({ }); export const { - registerFlight, - unregisterFlight, - updateFlight, + registerFlights, + unregisterFlights, + updateFlights, deselectFlight, selectFlight, updateFlightPositions, diff --git a/game/server/eventstream/models.py b/game/server/eventstream/models.py index 1a1ed910..45c61e44 100644 --- a/game/server/eventstream/models.py +++ b/game/server/eventstream/models.py @@ -25,7 +25,7 @@ class GameUpdateEventsJs(BaseModel): updated_unculled_zones: list[UnculledZoneJs] threat_zones_updated: bool new_flights: list[FlightJs] - updated_flights: set[UUID] + updated_flights: list[FlightJs] deleted_flights: set[UUID] selected_flight: UUID | None deselected_flight: bool @@ -71,7 +71,10 @@ class GameUpdateEventsJs(BaseModel): new_flights=[ FlightJs.for_flight(f, with_waypoints=True) for f in events.new_flights ], - updated_flights=events.updated_flights, + updated_flights=[ + FlightJs.for_flight(f, with_waypoints=True) + for f in events.updated_flights + ], deleted_flights=events.deleted_flights, selected_flight=events.selected_flight, deselected_flight=events.deselected_flight, diff --git a/game/sim/gameupdateevents.py b/game/sim/gameupdateevents.py index a427f435..4834c61c 100644 --- a/game/sim/gameupdateevents.py +++ b/game/sim/gameupdateevents.py @@ -25,7 +25,7 @@ class GameUpdateEvents: unculled_zones_updated: list[Point] = field(default_factory=list) threat_zones_updated: bool = False new_flights: set[Flight] = field(default_factory=set) - updated_flights: set[UUID] = field(default_factory=set) + updated_flights: set[Flight] = field(default_factory=set) deleted_flights: set[UUID] = field(default_factory=set) selected_flight: UUID | None = None deselected_flight: bool = False @@ -81,11 +81,11 @@ class GameUpdateEvents: return self def update_flight(self, flight: Flight) -> GameUpdateEvents: - self.updated_flights.add(flight.id) + self.updated_flights.add(flight) return self def update_flights_in_package(self, package: Package) -> GameUpdateEvents: - self.updated_flights.update({f.id for f in package.flights}) + self.updated_flights.update({f for f in package.flights}) return self def delete_flight(self, flight: Flight) -> GameUpdateEvents: