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) {
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),
_ => {}
}
}

View File

@ -27,14 +27,12 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
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);