use std::collections::BTreeSet;
use matrix_sdk_common::timer;
use matrix_sdk_crypto::OlmMachine;
use ruma::{OwnedUserId, RoomId};
use crate::{EncryptionState, Result, RoomMemberships, store::BaseStateStore};
pub async fn update(
olm_machine: Option<&OlmMachine>,
room_encryption_state: EncryptionState,
user_ids_to_track: &BTreeSet<OwnedUserId>,
) -> Result<()> {
if room_encryption_state.is_encrypted()
&& let Some(olm) = olm_machine
&& !user_ids_to_track.is_empty()
{
olm.update_tracked_users(user_ids_to_track.iter().map(AsRef::as_ref)).await?
}
Ok(())
}
pub async fn update_or_set_if_room_is_newly_encrypted(
olm_machine: Option<&OlmMachine>,
user_ids_to_track: &BTreeSet<OwnedUserId>,
new_room_encryption_state: EncryptionState,
previous_room_encryption_state: EncryptionState,
room_id: &RoomId,
state_store: &BaseStateStore,
) -> Result<()> {
let _timer = timer!(tracing::Level::TRACE, "update_or_set_if_room_is_newly_encrypted");
if new_room_encryption_state.is_encrypted()
&& let Some(olm) = olm_machine
{
if !previous_room_encryption_state.is_encrypted() {
let user_ids = state_store.get_user_ids(room_id, RoomMemberships::ACTIVE).await?;
olm.update_tracked_users(user_ids.iter().map(AsRef::as_ref)).await?
}
if !user_ids_to_track.is_empty() {
olm.update_tracked_users(user_ids_to_track.iter().map(AsRef::as_ref)).await?;
}
}
Ok(())
}