jabber: wait to have connected

This commit is contained in:
Astro 2021-10-30 00:36:50 +02:00
parent 4e1570b2fd
commit 54efe3f631
2 changed files with 17 additions and 14 deletions

View File

@ -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) { let muc_jid: FullJid = match FullJid::from_str(&muc_jid) {
Ok(jid) => jid, Ok(jid) => jid,
Err(err) => panic!("MUC Jid invalid: {:?}", err), 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(), tx: tx.clone(),
}; };
let client = AsyncClient::new(&jid, &password).unwrap(); let mut client = AsyncClient::new(&jid, &password).unwrap();
let (mut sink, mut stream) = client.split(); 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 { tokio::task::spawn_local(async move {
while let Some(event) = stream.next().await { while let Some(event) = stream.next().await {
match event { 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) => { Event::Stanza(el) => {
println!("<< {:?}", el);
if el.is("presence", "jabber:client") { if el.is("presence", "jabber:client") {
match Presence::try_from(el) { match Presence::try_from(el) {
Ok(presence) => { Ok(presence) => {
@ -61,7 +67,6 @@ pub fn run(jid: String, password: String, muc_jid: String) -> Handle {
} }
} }
} }
ev => println!("<< {:?}", ev),
_ => {} _ => {}
} }
} }

View File

@ -27,14 +27,12 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let jid = args[1].to_owned(); let jid = args[1].to_owned();
let password = args[2].to_owned(); let password = args[2].to_owned();
let muc = args[3].to_owned(); let muc = args[3].to_owned();
let jabber = jabber::run(jid, password, muc).await;
let aircrafts = aircrafts::Aircrafts::load("aircraftDatabase.csv"); let aircrafts = aircrafts::Aircrafts::load("aircraftDatabase.csv");
let locations = location::Locations::load("locations.json"); let locations = location::Locations::load("locations.json");
let mut events = adsb::run("https://adsb.hq.c3d2.de/data.json", locations); 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 { while let Some(event) = events.recv().await {
println!("event: {:?}", event); println!("event: {:?}", event);