fix: device list when leaving rooms
parent
4323cf5fec
commit
64789537f5
|
@ -380,31 +380,6 @@ pub async fn sync_events_route(
|
||||||
.map(|pdu| pdu.to_sync_room_event())
|
.map(|pdu| pdu.to_sync_room_event())
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
// TODO: Only until leave point
|
|
||||||
let mut edus = db
|
|
||||||
.rooms
|
|
||||||
.edus
|
|
||||||
.roomlatests_since(&room_id, since)?
|
|
||||||
.filter_map(|r| r.ok()) // Filter out buggy events
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
|
|
||||||
if db
|
|
||||||
.rooms
|
|
||||||
.edus
|
|
||||||
.last_roomactive_update(&room_id, &db.globals)?
|
|
||||||
> since
|
|
||||||
{
|
|
||||||
edus.push(
|
|
||||||
serde_json::from_str(
|
|
||||||
&serde_json::to_string(&AnySyncEphemeralRoomEvent::Typing(
|
|
||||||
db.rooms.edus.roomactives_all(&room_id)?,
|
|
||||||
))
|
|
||||||
.expect("event is valid, we just created it"),
|
|
||||||
)
|
|
||||||
.expect("event is valid, we just created it"),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
let left_room = sync_events::LeftRoom {
|
let left_room = sync_events::LeftRoom {
|
||||||
account_data: sync_events::AccountData { events: Vec::new() },
|
account_data: sync_events::AccountData { events: Vec::new() },
|
||||||
timeline: sync_events::Timeline {
|
timeline: sync_events::Timeline {
|
||||||
|
@ -415,6 +390,49 @@ pub async fn sync_events_route(
|
||||||
state: sync_events::State { events: Vec::new() },
|
state: sync_events::State { events: Vec::new() },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let mut left_since_last_sync = false;
|
||||||
|
for pdu in db.rooms.pdus_since(&sender_id, &room_id, since)? {
|
||||||
|
let pdu = pdu?;
|
||||||
|
if pdu.kind == EventType::RoomMember && pdu.state_key == Some(sender_id.to_string()) {
|
||||||
|
let content = serde_json::from_value::<
|
||||||
|
Raw<ruma::events::room::member::MemberEventContent>,
|
||||||
|
>(pdu.content.clone())
|
||||||
|
.expect("Raw::from_value always works")
|
||||||
|
.deserialize()
|
||||||
|
.map_err(|_| Error::bad_database("Invalid PDU in database."))?;
|
||||||
|
|
||||||
|
if content.membership == MembershipState::Leave {
|
||||||
|
left_since_last_sync = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if left_since_last_sync {
|
||||||
|
device_list_left.extend(
|
||||||
|
db.rooms
|
||||||
|
.room_members(&room_id)
|
||||||
|
.filter_map(|user_id| {
|
||||||
|
Some(
|
||||||
|
UserId::try_from(user_id.ok()?.clone())
|
||||||
|
.map_err(|_| {
|
||||||
|
Error::bad_database("Invalid member event state key in db.")
|
||||||
|
})
|
||||||
|
.ok()?,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.filter(|user_id| {
|
||||||
|
// Don't send key updates from the sender to the sender
|
||||||
|
sender_id != user_id
|
||||||
|
})
|
||||||
|
.filter(|user_id| {
|
||||||
|
// Only send if the sender doesn't share any encrypted room with the target
|
||||||
|
// anymore
|
||||||
|
!share_encrypted_room(&db, sender_id, user_id, &room_id)
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if !left_room.is_empty() {
|
if !left_room.is_empty() {
|
||||||
left_rooms.insert(room_id.clone(), left_room);
|
left_rooms.insert(room_id.clone(), left_room);
|
||||||
}
|
}
|
||||||
|
@ -461,7 +479,6 @@ pub async fn sync_events_route(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: mark users as left when WE left an encrypted room they were in
|
|
||||||
for user_id in left_encrypted_users {
|
for user_id in left_encrypted_users {
|
||||||
// If the user doesn't share an encrypted room with the target anymore, we need to tell
|
// If the user doesn't share an encrypted room with the target anymore, we need to tell
|
||||||
// them
|
// them
|
||||||
|
|
Loading…
Reference in New Issue