diff --git a/src/assets/icons/kit/diverted.svg b/src/assets/icons/kit/diverted.svg new file mode 100644 index 00000000..7404c0f7 --- /dev/null +++ b/src/assets/icons/kit/diverted.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/common/vatsim/CommonPilotDestination.vue b/src/components/common/vatsim/CommonPilotDestination.vue index 1358e6e4..32403059 100644 --- a/src/components/common/vatsim/CommonPilotDestination.vue +++ b/src/components/common/vatsim/CommonPilotDestination.vue @@ -1,26 +1,55 @@ @@ -29,6 +58,7 @@ import CommonInfoBlock from '~/components/common/blocks/CommonInfoBlock.vue'; import type { VatsimShortenedAircraft } from '~/types/data/vatsim'; import AircraftIcon from '@/assets/icons/kit/aircraft.svg?component'; +import DivertedIcon from '@/assets/icons/kit/diverted.svg?component'; import { useMapStore } from '~/store/map'; const props = defineProps({ @@ -41,10 +71,12 @@ const props = defineProps({ const dataStore = useDataStore(); const mapStore = useMapStore(); -const airports = computed(() => dataStore.vatspy.value?.data.airports.filter(x => x.icao === props.pilot.departure || x.icao === props.pilot.arrival) ?? []); +const airports = computed(() => dataStore.vatspy.value?.data.airports.filter(x => x.icao === props.pilot.departure || x.icao === props.pilot.arrival || x.icao === props.pilot.diverted_arrival || x.icao === props.pilot.diverted_origin) ?? []); const depAirport = computed(() => airports.value.find(x => x.icao === props.pilot.departure)); const arrAirport = computed(() => airports.value.find(x => x.icao === props.pilot.arrival)); +const divArrAirport = computed(() => airports.value.find(x => x.icao === props.pilot.diverted_arrival)); +const divOrgAirport = computed(() => airports.value.find(x => x.icao === props.pilot.diverted_origin)); diff --git a/src/components/map/popups/MapPopupFlightPlan.vue b/src/components/map/popups/MapPopupFlightPlan.vue index 4eec61c6..55ba5ab9 100644 --- a/src/components/map/popups/MapPopupFlightPlan.vue +++ b/src/components/map/popups/MapPopupFlightPlan.vue @@ -5,6 +5,9 @@ :pilot="{ departure: flightPlan.departure, arrival: flightPlan.arrival, + diverted: flightPlan.diverted, + diverted_arrival: flightPlan.diverted_arrival, + diverted_origin: flightPlan.diverted_origin, }" />
; export interface VatsimController { @@ -141,7 +144,7 @@ export type VatsimShortenedData = { general: VatsimGeneral; pilots: Array< Omit & - Partial, 'aircraft_faa' | 'aircraft_short' | 'departure' | 'arrival'>> & + Partial, 'aircraft_faa' | 'aircraft_short' | 'departure' | 'arrival' | 'diverted' | 'diverted_arrival' | 'diverted_origin'>> & Partial> & { filteredColor?: UserMapSettingsColor; filteredOpacity?: number; diff --git a/src/utils/backend/storage.ts b/src/utils/backend/storage.ts index 1e80ed08..415d06e1 100644 --- a/src/utils/backend/storage.ts +++ b/src/utils/backend/storage.ts @@ -183,6 +183,7 @@ export interface RadarStorage { navigraph: typeof cycles | null; patreonInfo: PatreonInfo | null; airlines: RadarDataAirlinesAllList; + extendedPilotsMap: { [key: string]: VatsimExtendedPilot }; } export const radarStorage: RadarStorage = { @@ -232,6 +233,7 @@ export const radarStorage: RadarStorage = { virtual: {}, all: {}, }, + extendedPilotsMap: {}, }; export function getRadarStorage() { diff --git a/src/utils/backend/styles.ts b/src/utils/backend/styles.ts index 8390b218..c277493a 100644 --- a/src/utils/backend/styles.ts +++ b/src/utils/backend/styles.ts @@ -2,6 +2,8 @@ import type { PartialRecord } from '~/types'; export const colorsList = { mapSectorBorder: '#2d2d30', + divertedBackground: '#de5656', + divertedTextColor: '#97979d', lightgray0: '#F7F7FA', lightgray50: '#F2F2F7', diff --git a/src/utils/backend/vatsim/update.ts b/src/utils/backend/vatsim/update.ts index 0bfcd91d..8bf8526e 100644 --- a/src/utils/backend/vatsim/update.ts +++ b/src/utils/backend/vatsim/update.ts @@ -106,6 +106,7 @@ export async function updateVatsimExtendedPilots() { })).filter(x => x.controllers.length); radarStorage.vatsim.extendedPilots = []; + const updatePilots: { [key: string]: VatsimExtendedPilot } = {}; const pilotsToProcess: { pilot: VatsimExtendedPilot; @@ -244,11 +245,62 @@ export async function updateVatsimExtendedPilots() { extendedPilot.status = 'enroute'; } + // Diversion Detection + if (extendedPilot.status === 'departed' || extendedPilot.status === 'climbing' || + extendedPilot.status === 'cruising' || extendedPilot.status === 'enroute' || + extendedPilot.status === 'descending' || extendedPilot.status === 'arriving') { + const oldPilot = radarStorage.extendedPilotsMap[extendedPilot.cid]; + const arrival = extendedPilot.flight_plan?.arrival; + const oldFlightPlan = oldPilot?.flight_plan; + + if (arrival && oldFlightPlan) { + if (oldFlightPlan.diverted) { + extendedPilot.flight_plan ??= {}; + + if (oldFlightPlan.diverted_arrival !== arrival) { + if (oldFlightPlan.diverted_origin === arrival || arrival === 'ZZZZ') { + extendedPilot.flight_plan.diverted = false; + } + else { + extendedPilot.flight_plan.diverted_arrival = arrival; + extendedPilot.flight_plan.diverted_origin = oldFlightPlan.diverted_origin; + extendedPilot.flight_plan.diverted = true; + } + } + else { + extendedPilot.flight_plan = { + ...extendedPilot.flight_plan, + diverted_arrival: oldFlightPlan.diverted_arrival, + diverted_origin: oldFlightPlan.diverted_origin, + diverted: true, + }; + } + } + else if (arrival !== 'ZZZZ' && oldFlightPlan.arrival !== 'ZZZZ' && + oldFlightPlan.arrival && oldFlightPlan.arrival !== arrival && extendedPilot.flight_plan?.flight_rules !== 'V') { + extendedPilot.flight_plan = { + ...extendedPilot.flight_plan, + diverted: true, + diverted_arrival: arrival, + diverted_origin: oldFlightPlan.arrival, + }; + } + } + } + origPilot.status = extendedPilot.status; origPilot.toGoDist = extendedPilot.toGoDist; origPilot.depDist = extendedPilot.depDist; + origPilot.arrival = extendedPilot.flight_plan?.arrival; + origPilot.diverted = extendedPilot.flight_plan?.diverted; + origPilot.diverted_arrival = extendedPilot.flight_plan?.diverted_arrival; + origPilot.diverted_origin = extendedPilot.flight_plan?.diverted_origin; + + updatePilots[extendedPilot.cid] = extendedPilot; radarStorage.vatsim.extendedPilots.push(extendedPilot); } + + radarStorage.extendedPilotsMap = updatePilots; } const xmlParser = new XMLParser({ diff --git a/src/utils/backend/worker/data-worker.ts b/src/utils/backend/worker/data-worker.ts index 23ee1e63..36d3e9ea 100644 --- a/src/utils/backend/worker/data-worker.ts +++ b/src/utils/backend/worker/data-worker.ts @@ -164,6 +164,50 @@ defineCronJob('* * * * * *', async () => { console.error(e); } + /* data?.pilots.push({ + cid: 10000, + name: "Dummy", + callsign: "DELTA", + server: "Nah ah", + pilot_rating: 1, + military_rating: 0, + latitude: 48.137154, + longitude: 11.576124, + altitude: 10000, + groundspeed: 100, + transponder: "7700", + heading: 360, + qnh_i_hg: 100, + qnh_mb: 100, + flight_plan: { + flight_rules: 'I', + aircraft: "C170", + aircraft_faa: "", + aircraft_short: "", + departure: "EDDM", + cruise_tas: "", + altitude: "10000", + arrival: "EDDH", + alternate: "EDDK", + deptime: "", + enroute_time: "", + fuel_time: "", + remarks: "DUMMY", + route: "", + revision_id: 1, + assigned_transponder: "7700", + locked: false, + diverted: true, + diverted_arrival: "EDDV", + diverted_origin: "EDDH", + }, + logon_time: "", + last_updated: "", + frequencies: ["122.800"], + sim: "MSFS", + icon: "c17" + });*/ + dataInProgress = false; dataLatestFinished = Date.now(); });