47 lines
1.2 KiB
Rust
47 lines
1.2 KiB
Rust
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<Receiver<Room>>,
|
|
pub room_topic_receiver: RefCell<Receiver<RoomTopicEvent>>,
|
|
}
|
|
|
|
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<MatrixClient>,
|
|
pub tx: UnboundedSender<WorkerTask>,
|
|
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()
|
|
}
|
|
}
|