heliwatch/src/main.rs

72 lines
2.5 KiB
Rust

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<dyn std::error::Error + Send + Sync>> {
tokio::task::LocalSet::new().run_until(async move {
let args: Vec<String> = args().collect();
if args.len() != 4 {
println!("Usage: {} <jid> <password> <muc>", args[0]);
Err(UsageError)?;
}
let jid = args[1].to_owned();
let password = args[2].to_owned();
let muc = args[3].to_owned();
let jabber = jabber::run(jid, password, muc).await;
let aircrafts = aircrafts::Aircrafts::load("aircraftDatabase.csv");
let locations = location::Locations::load("locations.json");
let mut events = adsb::run("http://radiobert.serv.zentralwerk.org:8080/data.json", locations);
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<dyn std::error::Error + Send + Sync>> = Ok(());
result
}).await
}