use std::cell::RefCell; use std::sync::Arc; use matrix_sdk::Client as MatrixClient; use tokio::sync::broadcast::Receiver; use tokio::sync::mpsc::UnboundedSender; use super::client::RoomTopicEvent; use super::worker_tasks::{oneshot, LoginStyle, WorkerTask}; use crate::base::Room; #[derive(Debug)] pub struct Receivers { pub rooms_receiver: RefCell>, pub room_topic_receiver: RefCell>, } impl Clone for Receivers { fn clone(&self) -> Self { Self { rooms_receiver: RefCell::new(self.rooms_receiver.borrow().resubscribe()), room_topic_receiver: RefCell::new(self.room_topic_receiver.borrow().resubscribe()), } } } #[derive(Debug)] pub struct Requester { pub matrix_client: Arc, pub tx: UnboundedSender, pub receivers: Receivers, } impl Requester { pub fn init(&self) { let (reply, response) = oneshot(); self.tx.send(WorkerTask::Init(reply)).unwrap(); response.recv() } pub fn login(&self, style: LoginStyle) -> anyhow::Result<()> { let (reply, response) = oneshot(); self.tx.send(WorkerTask::Login(style, reply)).unwrap(); response.recv() } }