base: Correctly update the room info for invited rooms

master
Damir Jelić 2021-05-25 09:31:32 +02:00
parent 7a5daf6ac7
commit e058191b99
4 changed files with 27 additions and 16 deletions

View File

@ -3421,6 +3421,7 @@ mod test {
.with_status(200) .with_status(200)
.match_header("authorization", "Bearer 1234") .match_header("authorization", "Bearer 1234")
.with_body(test_json::SYNC.to_string()) .with_body(test_json::SYNC.to_string())
.expect_at_least(1)
.create(); .create();
let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000));
@ -3430,6 +3431,19 @@ mod test {
let room = client.get_joined_room(&room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); let room = client.get_joined_room(&room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap();
assert_eq!("tutorial".to_string(), room.display_name().await.unwrap()); assert_eq!("tutorial".to_string(), room.display_name().await.unwrap());
let _m = mock("GET", Matcher::Regex(r"^/_matrix/client/r0/sync\?.*$".to_string()))
.with_status(200)
.match_header("authorization", "Bearer 1234")
.with_body(test_json::INVITE_SYNC.to_string())
.expect_at_least(1)
.create();
let _response = client.sync_once(SyncSettings::new()).await.unwrap();
let invited_room = client.get_invited_room(&room_id!("!696r7674:example.com")).unwrap();
assert_eq!("My Room Name".to_string(), invited_room.display_name().await.unwrap());
} }
#[tokio::test] #[tokio::test]

View File

@ -685,7 +685,7 @@ impl BaseClient {
for room_id in rooms { for room_id in rooms {
if let Some(room) = changes.room_infos.get_mut(room_id) { if let Some(room) = changes.room_infos.get_mut(room_id) {
room.base_info.dm_target = Some(user_id.clone()); room.base_info.dm_target = Some(user_id.clone());
} else if let Some(room) = self.store.get_bare_room(room_id) { } else if let Some(room) = self.store.get_room(room_id) {
let mut info = room.clone_info(); let mut info = room.clone_info();
info.base_info.dm_target = Some(user_id.clone()); info.base_info.dm_target = Some(user_id.clone());
changes.add_room(info); changes.add_room(info);
@ -931,7 +931,7 @@ impl BaseClient {
async fn apply_changes(&self, changes: &StateChanges) { async fn apply_changes(&self, changes: &StateChanges) {
for (room_id, room_info) in &changes.room_infos { for (room_id, room_info) in &changes.room_infos {
if let Some(room) = self.store.get_bare_room(&room_id) { if let Some(room) = self.store.get_room(&room_id) {
room.update_summary(room_info.clone()) room.update_summary(room_info.clone())
} }
} }
@ -958,7 +958,7 @@ impl BaseClient {
.collect(); .collect();
let mut ambiguity_cache = AmbiguityCache::new(self.store.clone()); let mut ambiguity_cache = AmbiguityCache::new(self.store.clone());
if let Some(room) = self.store.get_bare_room(room_id) { if let Some(room) = self.store.get_room(room_id) {
let mut room_info = room.clone_info(); let mut room_info = room.clone_info();
room_info.mark_members_synced(); room_info.mark_members_synced();

View File

@ -291,11 +291,6 @@ impl Store {
Ok((Self::new(Box::new(inner.clone())), inner.inner)) Ok((Self::new(Box::new(inner.clone())), inner.inner))
} }
pub(crate) fn get_bare_room(&self, room_id: &RoomId) -> Option<Room> {
#[allow(clippy::map_clone)]
self.rooms.get(room_id).map(|r| r.clone())
}
/// Get all the rooms this store knows about. /// Get all the rooms this store knows about.
pub fn get_rooms(&self) -> Vec<Room> { pub fn get_rooms(&self) -> Vec<Room> {
self.rooms.iter().filter_map(|r| self.get_room(r.key())).collect() self.rooms.iter().filter_map(|r| self.get_room(r.key())).collect()
@ -303,15 +298,17 @@ impl Store {
/// Get the room with the given room id. /// Get the room with the given room id.
pub fn get_room(&self, room_id: &RoomId) -> Option<Room> { pub fn get_room(&self, room_id: &RoomId) -> Option<Room> {
self.get_bare_room(room_id).and_then(|r| match r.room_type() { self.rooms
RoomType::Joined => Some(r), .get(room_id)
RoomType::Left => Some(r), .and_then(|r| match r.room_type() {
RoomType::Invited => self.get_stripped_room(room_id), RoomType::Joined => Some(r.clone()),
}) RoomType::Left => Some(r.clone()),
RoomType::Invited => self.get_stripped_room(room_id),
})
.or_else(|| self.get_stripped_room(room_id))
} }
fn get_stripped_room(&self, room_id: &RoomId) -> Option<Room> { fn get_stripped_room(&self, room_id: &RoomId) -> Option<Room> {
#[allow(clippy::map_clone)]
self.stripped_rooms.get(room_id).map(|r| r.clone()) self.stripped_rooms.get(room_id).map(|r| r.clone())
} }
@ -404,7 +401,7 @@ impl StateChanges {
/// Update the `StateChanges` struct with the given `RoomInfo`. /// Update the `StateChanges` struct with the given `RoomInfo`.
pub fn add_stripped_room(&mut self, room: RoomInfo) { pub fn add_stripped_room(&mut self, room: RoomInfo) {
self.invited_room_info.insert(room.room_id.as_ref().to_owned(), room); self.room_infos.insert(room.room_id.as_ref().to_owned(), room);
} }
/// Update the `StateChanges` struct with the given `AnyBasicEvent`. /// Update the `StateChanges` struct with the given `AnyBasicEvent`.

View File

@ -720,7 +720,7 @@ lazy_static! {
lazy_static! { lazy_static! {
pub static ref INVITE_SYNC: JsonValue = json!({ pub static ref INVITE_SYNC: JsonValue = json!({
"device_one_time_keys_count": {}, "device_one_time_keys_count": {},
"next_batch": "s526_47314_0_7_1_1_1_11444_1", "next_batch": "s526_47314_0_7_1_1_1_11444_2",
"device_lists": { "device_lists": {
"changed": [ "changed": [
"@example:example.org" "@example:example.org"