base: Don't expose the client fields publicly.
parent
1639f0fdd8
commit
d8b9dc8519
|
@ -329,11 +329,11 @@ impl AsyncClient {
|
|||
self.base_client.calculate_room_names().await
|
||||
}
|
||||
|
||||
/// Returns the rooms this client knows about.
|
||||
/// Returns the joined rooms this client knows about.
|
||||
///
|
||||
/// A `HashMap` of room id to `matrix::models::Room`
|
||||
pub async fn get_rooms(&self) -> Arc<RwLock<HashMap<RoomId, Arc<tokio::sync::RwLock<Room>>>>> {
|
||||
self.base_client.joined_rooms.clone()
|
||||
pub fn joined_rooms(&self) -> Arc<RwLock<HashMap<RoomId, Arc<tokio::sync::RwLock<Room>>>>> {
|
||||
self.base_client.joined_rooms()
|
||||
}
|
||||
|
||||
/// This allows `AsyncClient` to manually sync state with the provided `StateStore`.
|
||||
|
@ -798,7 +798,7 @@ impl AsyncClient {
|
|||
};
|
||||
|
||||
let request_builder = if Request::METADATA.requires_authentication {
|
||||
let session = self.base_client.session.read().await;
|
||||
let session = self.base_client.session().read().await;
|
||||
|
||||
if let Some(session) = session.as_ref() {
|
||||
request_builder.bearer_auth(&session.access_token)
|
||||
|
@ -884,7 +884,7 @@ impl AsyncClient {
|
|||
#[cfg(feature = "encryption")]
|
||||
{
|
||||
let encrypted = {
|
||||
let room = self.base_client.get_room(room_id).await;
|
||||
let room = self.base_client.get_joined_room(room_id).await;
|
||||
|
||||
match room {
|
||||
Some(r) => r.read().await.is_encrypted(),
|
||||
|
@ -894,7 +894,7 @@ impl AsyncClient {
|
|||
|
||||
if encrypted {
|
||||
let missing_sessions = {
|
||||
let room = self.base_client.get_room(room_id).await;
|
||||
let room = self.base_client.get_joined_room(room_id).await;
|
||||
let room = room.as_ref().unwrap().read().await;
|
||||
let users = room.members.keys();
|
||||
self.base_client.get_missing_sessions(users).await?
|
||||
|
|
|
@ -67,23 +67,23 @@ pub type Token = String;
|
|||
pub struct Client {
|
||||
/// The current client session containing our user id, device id and access
|
||||
/// token.
|
||||
pub session: Arc<RwLock<Option<Session>>>,
|
||||
session: Arc<RwLock<Option<Session>>>,
|
||||
/// The current sync token that should be used for the next sync call.
|
||||
pub sync_token: Arc<RwLock<Option<Token>>>,
|
||||
pub(crate) sync_token: Arc<RwLock<Option<Token>>>,
|
||||
/// A map of the rooms our user is joined in.
|
||||
pub joined_rooms: Arc<RwLock<HashMap<RoomId, Arc<RwLock<Room>>>>>,
|
||||
joined_rooms: Arc<RwLock<HashMap<RoomId, Arc<RwLock<Room>>>>>,
|
||||
/// A list of ignored users.
|
||||
pub ignored_users: Arc<RwLock<Vec<UserId>>>,
|
||||
pub(crate) ignored_users: Arc<RwLock<Vec<UserId>>>,
|
||||
/// The push ruleset for the logged in user.
|
||||
pub push_ruleset: Arc<RwLock<Option<Ruleset>>>,
|
||||
pub(crate) push_ruleset: Arc<RwLock<Option<Ruleset>>>,
|
||||
/// Any implementor of EventEmitter will act as the callbacks for various
|
||||
/// events.
|
||||
pub event_emitter: Arc<RwLock<Option<Box<dyn EventEmitter>>>>,
|
||||
event_emitter: Arc<RwLock<Option<Box<dyn EventEmitter>>>>,
|
||||
/// Any implementor of `StateStore` will be called to save `Room` and
|
||||
/// some `BaseClient` state during `AsyncClient::sync` calls.
|
||||
///
|
||||
/// There is a default implementation `JsonStore` that saves JSON to disk.
|
||||
pub state_store: Arc<RwLock<Option<Box<dyn StateStore>>>>,
|
||||
state_store: Arc<RwLock<Option<Box<dyn StateStore>>>>,
|
||||
/// Does the `Client` need to sync with the state store.
|
||||
needs_state_store_sync: Arc<AtomicBool>,
|
||||
|
||||
|
@ -152,6 +152,12 @@ impl Client {
|
|||
})
|
||||
}
|
||||
|
||||
/// The current client session containing our user id, device id and access
|
||||
/// token.
|
||||
pub fn session(&self) -> &Arc<RwLock<Option<Session>>> {
|
||||
&self.session
|
||||
}
|
||||
|
||||
/// Is the client logged in.
|
||||
pub async fn logged_in(&self) -> bool {
|
||||
// TODO turn this into a atomic bool so this method doesn't need to be
|
||||
|
@ -267,10 +273,22 @@ impl Client {
|
|||
.clone()
|
||||
}
|
||||
|
||||
pub(crate) async fn get_room(&self, room_id: &RoomId) -> Option<Arc<RwLock<Room>>> {
|
||||
/// Get a joined room with the given room id.
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// `room_id` - The unique id of the room that should be fetched.
|
||||
pub(crate) async fn get_joined_room(&self, room_id: &RoomId) -> Option<Arc<RwLock<Room>>> {
|
||||
self.joined_rooms.read().await.get(room_id).cloned()
|
||||
}
|
||||
|
||||
/// Returns the joined rooms this client knows about.
|
||||
///
|
||||
/// A `HashMap` of room id to `matrix::models::Room`
|
||||
pub fn joined_rooms(&self) -> Arc<RwLock<HashMap<RoomId, Arc<tokio::sync::RwLock<Room>>>>> {
|
||||
self.joined_rooms.clone()
|
||||
}
|
||||
|
||||
/// Handle a m.ignored_user_list event, updating the room state if necessary.
|
||||
///
|
||||
/// Returns true if the room name changed, false otherwise.
|
||||
|
@ -373,7 +391,7 @@ impl Client {
|
|||
/// * `event` - The event that should be handled by the client.
|
||||
pub async fn receive_presence_event(&self, room_id: &RoomId, event: &PresenceEvent) -> bool {
|
||||
// this should be the room that was just created in the `Client::sync` loop.
|
||||
if let Some(room) = self.get_room(room_id).await {
|
||||
if let Some(room) = self.get_joined_room(room_id).await {
|
||||
let mut room = room.write().await;
|
||||
room.receive_presence_event(event)
|
||||
} else {
|
||||
|
@ -631,7 +649,7 @@ impl Client {
|
|||
&self,
|
||||
room_id: &RoomId,
|
||||
) -> Result<Vec<send_event_to_device::Request>> {
|
||||
let room = self.get_room(room_id).await.expect("No room found");
|
||||
let room = self.get_joined_room(room_id).await.expect("No room found");
|
||||
let mut olm = self.olm.lock().await;
|
||||
|
||||
match &mut *olm {
|
||||
|
@ -756,7 +774,7 @@ impl Client {
|
|||
return;
|
||||
};
|
||||
|
||||
let room = if let Some(room) = self.get_room(&room_id).await {
|
||||
let room = if let Some(room) = self.get_joined_room(&room_id).await {
|
||||
Arc::clone(&room)
|
||||
} else {
|
||||
return;
|
||||
|
@ -797,7 +815,7 @@ impl Client {
|
|||
return;
|
||||
};
|
||||
|
||||
let room = if let Some(room) = self.get_room(&room_id).await {
|
||||
let room = if let Some(room) = self.get_joined_room(&room_id).await {
|
||||
Arc::clone(&room)
|
||||
} else {
|
||||
return;
|
||||
|
@ -834,7 +852,7 @@ impl Client {
|
|||
return;
|
||||
};
|
||||
|
||||
let room = if let Some(room) = self.get_room(&room_id).await {
|
||||
let room = if let Some(room) = self.get_joined_room(&room_id).await {
|
||||
Arc::clone(&room)
|
||||
} else {
|
||||
return;
|
||||
|
@ -867,7 +885,7 @@ impl Client {
|
|||
return;
|
||||
};
|
||||
|
||||
let room = if let Some(room) = self.get_room(&room_id).await {
|
||||
let room = if let Some(room) = self.get_joined_room(&room_id).await {
|
||||
Arc::clone(&room)
|
||||
} else {
|
||||
return;
|
||||
|
@ -894,7 +912,7 @@ impl Client {
|
|||
|
||||
pub(crate) async fn emit_presence_event(&self, room_id: &RoomId, event: &PresenceEvent) {
|
||||
if let Some(ee) = &self.event_emitter.read().await.as_ref() {
|
||||
if let Some(room) = self.get_room(&room_id).await {
|
||||
if let Some(room) = self.get_joined_room(&room_id).await {
|
||||
ee.on_presence_event(Arc::clone(&room), &event).await;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -493,7 +493,7 @@ mod test {
|
|||
|
||||
let _response = client.sync(sync_settings).await.unwrap();
|
||||
|
||||
let rooms_lock = &client.base_client.joined_rooms;
|
||||
let rooms_lock = &client.base_client.joined_rooms();
|
||||
let rooms = rooms_lock.read().await;
|
||||
let room = &rooms
|
||||
.get(&RoomId::try_from("!SVkFJHzfwvuaIEawgC:localhost").unwrap())
|
||||
|
|
|
@ -290,7 +290,7 @@ mod test {
|
|||
let base_client = &client.base_client;
|
||||
|
||||
// assert the synced client and the logged in client are equal
|
||||
assert_eq!(*base_client.session.read().await, Some(session));
|
||||
assert_eq!(*base_client.session().read().await, Some(session));
|
||||
assert_eq!(
|
||||
base_client.sync_token().await,
|
||||
Some("s526_47314_0_7_1_1_1_11444_1".to_string())
|
||||
|
|
Loading…
Reference in New Issue