You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
5.0 KiB

<?php
chdir(dirname(__FILE__).'/..');
require 'vendor/autoload.php';
$flights = ORM::for_table('flights')
->where('active', 1)
->find_many();
foreach($flights as $flight) {
$user = ORM::for_table('users')
->where('id', $flight->user_id)
->where_not_equal('flightaware_apikey', '')
->find_one();
if($user) {
echo date('Y-m-d H:i:s')."\n";
echo "Processing flight ".$flight->flight." for ".$user->url."\n";
$ch = curl_init('http://flightxml.flightaware.com/json/FlightXML2/InFlightInfo?ident='.$flight->flight);
curl_setopt($ch, CURLOPT_USERPWD, $user->flightaware_username.':'.$user->flightaware_apikey);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($ch);
$data = json_decode($json, true);
#$data = json_decode($flight->lastposition, true);
$flightData = $data['InFlightInfoResult'];
$flight->lastposition = $json;
$flight->save();
if($flightData['departureTime']) {
if($flightData['departureTime'] < strtotime($flight->date_created)) {
echo "This flight departed before the checkin was made so this is probably the wrong flight\n";
} else {
$has_new_location = false;
$flight_ended = false;
// Add this point to the list
if($flight->positions)
$positions = json_decode($flight->positions, true);
else
$positions = [];
if($flightData['latitude']) {
$positions[] = [
'date' => date('Y-m-d H:i:s'),
'lat' => $flightData['latitude'],
'lng' => $flightData['longitude'],
'altitude' => $flightData['altitude']*100*0.3048,
'heading' => $flightData['heading'],
'speed' => $flightData['groundspeed'],
];
$flight->positions = json_encode($positions);
$has_new_location = true;
}
if($has_new_location) {
$latitude = $flightData['latitude'];
$longitude = $flightData['longitude'];
} else {
$latitude = $positions[count($positions)-1]['lat'];
$longitude = $positions[count($positions)-1]['lng'];
}
if($flightData['arrivalTime']) {
$flight->arrival_time = date('Y-m-d H:i:s', $flightData['arrivalTime']);
$flight->active = 0;
$flight_ended = true;
}
if($flight_ended || $has_new_location) {
$flight->departure_time = date('Y-m-d H:i:s', $flightData['departureTime']);
$flight->save();
$checkin = [
'type' => ['h-card'],
'properties' => [
'name' => [$flight->flight],
'url' => ['http://flightaware.com/live/flight/'.$flight->flight],
'latitude' => [$latitude],
'longitude' => [$longitude],
]
];
// Geocode the location
$geocode = json_decode(file_get_contents('https://atlas.p3k.io/api/geocode?latitude='.$latitude.'&longitude='.$longitude), true);
if($geocode) {
$checkin['properties']['locality'] = [$geocode['locality']];
$checkin['properties']['region'] = [$geocode['region']];
$checkin['properties']['country-name'] = [$geocode['country']];
$tz = new DateTimeZone($geocode['timezone']);
} else {
$tz = new DateTimeZone('UTC');
}
$departure = new DateTime($flight->departure_time);
$departure->setTimeZone($tz);
$trip = [
'type' => ['h-trip'],
'properties' => [
'mode-of-transport' => ['plane'],
'start' => [$departure->format('c')],
'flight' => [$flightData['ident']],
'flight-id' => [$flightData['faFlightID']],
'aircraft' => [$flightData['type']],
'origin' => [$flightData['origin']],
'destination' => [$flightData['destination']],
'speed' => [
[
'type' => ['h-measure'],
'properties' => [
'num' => [$flightData['groundspeed']],
'unit' => ['mph'],
]
]
],
'route' => [Config::$base_url.'flight/'.$flight->id.'/'.$flightData['faFlightID'].'/route.json']
]
];
if($flight->arrival_time) {
$arrival = new DateTime($flight->arrival_time);
$arrival->setTimeZone($tz);
$trip['properties']['end'] = [$arrival->format('c')];
}
// Convert this to a Micropub request
$micropub = [
'action' => 'update',
'url' => $flight->url,
'replace' => [
'checkin' => $checkin,
'trip' => $trip,
]
];
$r = micropub_post_for_user($user, $micropub, null, true);
print_r($r['response']);
}
}
} else {
echo "It looks like the flight has not yet departed\n";
}
print_r($data);
} else {
echo "User ".$user->url." has no FlightAware credentials\n";
}
}