use lampada::{Connected, Logic, error::WriteError}; use tokio::sync::oneshot; use tracing::debug; use crate::{ Command, UpdateMessage, error::{ConnectionJobError, Error, RosterError}, presence::{Online, PresenceType}, }; use super::ClientLogic; pub async fn handle_connect(logic: ClientLogic, connection: Connected) { let (send, recv) = oneshot::channel(); debug!("getting roster"); logic .clone() .handle_online(Command::GetRoster(send), connection.clone()) .await; debug!("sent roster req"); let roster = recv.await; debug!("got roster"); match roster { Ok(r) => match r { Ok(roster) => { let online = logic.db().read_cached_status().await; let online = match online { Ok(online) => online, Err(e) => { let _ = logic .update_sender() .send(UpdateMessage::Error(Error::Connecting( ConnectionJobError::StatusCacheError(e.into()), ))) .await; Online::default() } }; let (send, recv) = oneshot::channel(); logic .clone() .handle_online( Command::SendPresence(None, PresenceType::Online(online.clone()), send), connection, ) .await; let set_status = recv.await; match set_status { Ok(s) => match s { Ok(()) => { let _ = logic .update_sender() .send(UpdateMessage::Online(online, roster)) .await; } Err(e) => { let _ = logic .update_sender() .send(UpdateMessage::Error(Error::Connecting(e.into()))) .await; } }, Err(e) => { let _ = logic .update_sender() .send(UpdateMessage::Error(Error::Connecting( ConnectionJobError::SendPresence(WriteError::Actor(e.into())), ))) .await; } } } Err(e) => { let _ = logic .update_sender() .send(UpdateMessage::Error(Error::Connecting(e.into()))) .await; } }, Err(e) => { let _ = logic .update_sender() .send(UpdateMessage::Error(Error::Connecting( ConnectionJobError::RosterRetreival(RosterError::Write(WriteError::Actor( e.into(), ))), ))) .await; } } }