From 54efe3f631823da9ce0337238356eff12b9d5615 Mon Sep 17 00:00:00 2001 From: Astro Date: Sat, 30 Oct 2021 00:36:50 +0200 Subject: [PATCH] jabber: wait to have connected --- src/jabber.rs | 27 ++++++++++++++++----------- src/main.rs | 4 +--- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/jabber.rs b/src/jabber.rs index 21aaa82..12b0abc 100644 --- a/src/jabber.rs +++ b/src/jabber.rs @@ -21,7 +21,7 @@ impl Handle { } } -pub fn run(jid: String, password: String, muc_jid: String) -> Handle { +pub async fn run(jid: String, password: String, muc_jid: String) -> Handle { let muc_jid: FullJid = match FullJid::from_str(&muc_jid) { Ok(jid) => jid, Err(err) => panic!("MUC Jid invalid: {:?}", err), @@ -32,20 +32,26 @@ pub fn run(jid: String, password: String, muc_jid: String) -> Handle { tx: tx.clone(), }; - let client = AsyncClient::new(&jid, &password).unwrap(); - let (mut sink, mut stream) = client.split(); + let mut client = AsyncClient::new(&jid, &password).unwrap(); + loop { + match client.next().await { + Some(Event::Online { .. }) => { + println!("XMPP client now online at {}", jid); + let packet = Packet::Stanza(make_join_presence(muc_jid.clone())); + client.send(packet).await + .unwrap(); + break; + } + Some(_) => {} + None => panic!("XMPP cannot connect"), + } + } + let (mut sink, mut stream) = client.split(); tokio::task::spawn_local(async move { while let Some(event) = stream.next().await { match event { - Event::Online { .. } => { - println!("XMPP client now online at {}", jid); - let packet = Packet::Stanza(make_join_presence(muc_jid.clone())); - tx.send(packet).await - .unwrap(); - } Event::Stanza(el) => { - println!("<< {:?}", el); if el.is("presence", "jabber:client") { match Presence::try_from(el) { Ok(presence) => { @@ -61,7 +67,6 @@ pub fn run(jid: String, password: String, muc_jid: String) -> Handle { } } } - ev => println!("<< {:?}", ev), _ => {} } } diff --git a/src/main.rs b/src/main.rs index 2e4dd2b..6030177 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,14 +27,12 @@ async fn main() -> Result<(), Box> { 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("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);