use std::env::args; mod adsb; mod location; mod aircrafts; mod jabber; #[derive(Debug, Clone, Copy)] pub struct UsageError; impl std::fmt::Display for UsageError { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { write!(fmt, "Usage error") } } impl std::error::Error for UsageError {} #[tokio::main] async fn main() -> Result<(), Box> { tokio::task::LocalSet::new().run_until(async move { let args: Vec = args().collect(); if args.len() != 4 { println!("Usage: {} ", args[0]); Err(UsageError)?; } let jid = args[1].to_owned(); let password = args[2].to_owned(); let muc = args[3].to_owned(); let aircrafts = aircrafts::Aircrafts::load("aircraftDatabase.csv"); let locations = location::Locations::load("locations.json"); let mut events = adsb::run("https://adsb.hq.c3d2.de/data.json", locations); let jabber = jabber::run(jid, password, muc); println!("wait for events..."); while let Some(event) = events.recv().await { println!("event: {:?}", event); let mut text; if let Some(aircraft) = aircrafts.find(&event.info.get_hex()) { println!("aircraft: {:?}", aircraft); text = format!("{} {} ({} {})", aircraft.owner, aircraft.registration, aircraft.manufacturername, aircraft.model ); } else if let Some(flight) = event.info.get_flight() { text = format!("Flug {} [{}]", flight, event.info.get_hex()); } else { text = format!("[{}]", event.info.get_hex()); } text = format!("{} {}", text, match event.action { adsb::Action::Appeared => "ist aufgetaucht", adsb::Action::Moved => "fliegt jetzt", adsb::Action::Disappeared => "ist abgetaucht.", }); if event.action != adsb::Action::Disappeared { text = format!("{} {:.0}m über {}", text, event.info.get_altitude_m(), event.location ); } println!(">> {}", text); jabber.send_message(text).await; } let result: Result<(), Box> = Ok(()); result }).await }