From bf677e1f9ce07e2fa8971c15b9a082cddbb40dec Mon Sep 17 00:00:00 2001
From: cel 🌸 <cel@bunny.garden>
Date: Wed, 26 Mar 2025 15:29:11 +0000
Subject: refactor(filament): split logic into different files

---
 filamento/src/logic/connect.rs | 91 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 91 insertions(+)
 create mode 100644 filamento/src/logic/connect.rs

(limited to 'filamento/src/logic/connect.rs')

diff --git a/filamento/src/logic/connect.rs b/filamento/src/logic/connect.rs
new file mode 100644
index 0000000..4dc789e
--- /dev/null
+++ b/filamento/src/logic/connect.rs
@@ -0,0 +1,91 @@
+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;
+        }
+    }
+}
-- 
cgit