Merge branch 'main' into mauroromito/directory_search

This commit is contained in:
Mauro
2024-03-01 17:18:08 +01:00
committed by GitHub
8 changed files with 63 additions and 140 deletions

20
Cargo.lock generated
View File

@@ -6068,7 +6068,7 @@ checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
[[package]]
name = "uniffi"
version = "0.26.0"
source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa"
source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1"
dependencies = [
"anyhow",
"camino",
@@ -6089,7 +6089,7 @@ dependencies = [
[[package]]
name = "uniffi_bindgen"
version = "0.26.0"
source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa"
source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1"
dependencies = [
"anyhow",
"askama",
@@ -6113,7 +6113,7 @@ dependencies = [
[[package]]
name = "uniffi_build"
version = "0.26.0"
source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa"
source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1"
dependencies = [
"anyhow",
"camino",
@@ -6123,7 +6123,7 @@ dependencies = [
[[package]]
name = "uniffi_checksum_derive"
version = "0.26.0"
source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa"
source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1"
dependencies = [
"quote",
"syn 2.0.48",
@@ -6132,7 +6132,7 @@ dependencies = [
[[package]]
name = "uniffi_core"
version = "0.26.0"
source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa"
source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1"
dependencies = [
"anyhow",
"async-compat",
@@ -6148,7 +6148,7 @@ dependencies = [
[[package]]
name = "uniffi_macros"
version = "0.26.0"
source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa"
source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1"
dependencies = [
"bincode",
"camino",
@@ -6166,7 +6166,7 @@ dependencies = [
[[package]]
name = "uniffi_meta"
version = "0.26.0"
source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa"
source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1"
dependencies = [
"anyhow",
"bytes",
@@ -6177,7 +6177,7 @@ dependencies = [
[[package]]
name = "uniffi_testing"
version = "0.26.0"
source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa"
source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1"
dependencies = [
"anyhow",
"camino",
@@ -6189,7 +6189,7 @@ dependencies = [
[[package]]
name = "uniffi_udl"
version = "0.26.0"
source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa"
source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1"
dependencies = [
"anyhow",
"textwrap",
@@ -6494,7 +6494,7 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1"
[[package]]
name = "weedle2"
version = "5.0.0"
source = "git+https://github.com/mozilla/uniffi-rs?rev=2e4e2ae53e83c832cdff80cb4c8779038789f7aa#2e4e2ae53e83c832cdff80cb4c8779038789f7aa"
source = "git+https://github.com/mozilla/uniffi-rs?rev=0a5e2eb5760b4ce5549021ec91de546716de8db1#0a5e2eb5760b4ce5549021ec91de546716de8db1"
dependencies = [
"nom",
]

View File

@@ -50,8 +50,8 @@ tokio = { version = "1.30.0", default-features = false, features = ["sync"] }
tokio-stream = "0.1.14"
tracing = { version = "0.1.40", default-features = false, features = ["std"] }
tracing-core = "0.1.32"
uniffi = { git = "https://github.com/mozilla/uniffi-rs", rev = "2e4e2ae53e83c832cdff80cb4c8779038789f7aa" }
uniffi_bindgen = { git = "https://github.com/mozilla/uniffi-rs", rev = "2e4e2ae53e83c832cdff80cb4c8779038789f7aa" }
uniffi = { git = "https://github.com/mozilla/uniffi-rs", rev = "0a5e2eb5760b4ce5549021ec91de546716de8db1" }
uniffi_bindgen = { git = "https://github.com/mozilla/uniffi-rs", rev = "0a5e2eb5760b4ce5549021ec91de546716de8db1" }
vodozemac = "0.5.1"
zeroize = "1.6.0"

View File

@@ -128,15 +128,10 @@ impl Room {
self.inner.active_room_call_participants().iter().map(|u| u.to_string()).collect()
}
pub fn inviter(&self) -> Option<Arc<RoomMember>> {
pub fn inviter(&self) -> Option<RoomMember> {
if self.inner.state() == RoomState::Invited {
RUNTIME.block_on(async move {
self.inner
.invite_details()
.await
.ok()
.and_then(|a| a.inviter)
.map(|m| Arc::new(RoomMember::new(m)))
self.inner.invite_details().await.ok().and_then(|a| a.inviter).map(|m| m.into())
})
} else {
None
@@ -189,10 +184,10 @@ impl Room {
)))
}
pub async fn member(&self, user_id: String) -> Result<Arc<RoomMember>, ClientError> {
pub async fn member(&self, user_id: String) -> Result<RoomMember, ClientError> {
let user_id = UserId::parse(&*user_id).context("Invalid user id.")?;
let member = self.inner.get_member(&user_id).await?.context("No user found")?;
Ok(Arc::new(RoomMember::new(member)))
Ok(member.into())
}
pub fn member_avatar_url(&self, user_id: String) -> Result<Option<String>, ClientError> {
@@ -631,10 +626,10 @@ impl RoomMembersIterator {
self.chunk_iterator.len()
}
fn next_chunk(&self, chunk_size: u32) -> Option<Vec<Arc<RoomMember>>> {
fn next_chunk(&self, chunk_size: u32) -> Option<Vec<RoomMember>> {
self.chunk_iterator
.next(chunk_size)
.map(|members| members.into_iter().map(RoomMember::new).map(Arc::new).collect())
.map(|members| members.into_iter().map(|m| m.into()).collect())
}
}

View File

@@ -23,7 +23,7 @@ pub struct RoomInfo {
alternative_aliases: Vec<String>,
membership: Membership,
latest_event: Option<Arc<EventTimelineItem>>,
inviter: Option<Arc<RoomMember>>,
inviter: Option<RoomMember>,
active_members_count: u64,
invited_members_count: u64,
joined_members_count: u64,
@@ -75,9 +75,7 @@ impl RoomInfo {
membership: room.state().into(),
latest_event,
inviter: match room.state() {
RoomState::Invited => {
room.invite_details().await?.inviter.map(|inner| Arc::new(RoomMember { inner }))
}
RoomState::Invited => room.invite_details().await?.inviter.map(|m| m.into()),
_ => None,
},
active_members_count: room.active_members_count(),

View File

@@ -1,11 +1,5 @@
use matrix_sdk::room::{RoomMember as SdkRoomMember, RoomMemberRole};
use super::RUNTIME;
use crate::{
event::{MessageLikeEventType, StateEventType},
ClientError,
};
#[derive(Clone, uniffi::Enum)]
pub enum MembershipState {
/// The user is banned.
@@ -45,110 +39,6 @@ impl From<matrix_sdk::ruma::events::room::member::MembershipState> for Membershi
}
}
#[derive(uniffi::Object)]
pub struct RoomMember {
pub(crate) inner: SdkRoomMember,
}
#[uniffi::export]
impl RoomMember {
pub fn user_id(&self) -> String {
self.inner.user_id().to_string()
}
pub fn display_name(&self) -> Option<String> {
self.inner.display_name().map(|d| d.to_owned())
}
pub fn avatar_url(&self) -> Option<String> {
self.inner.avatar_url().map(ToString::to_string)
}
pub fn membership(&self) -> MembershipState {
self.inner.membership().to_owned().into()
}
pub fn is_name_ambiguous(&self) -> bool {
self.inner.name_ambiguous()
}
pub fn power_level(&self) -> i64 {
self.inner.power_level()
}
pub fn suggested_role_for_power_level(&self) -> RoomMemberRole {
self.inner.suggested_role_for_power_level()
}
pub fn normalized_power_level(&self) -> i64 {
self.inner.normalized_power_level()
}
pub fn is_ignored(&self) -> bool {
self.inner.is_ignored()
}
pub fn is_account_user(&self) -> bool {
self.inner.is_account_user()
}
/// Adds the room member to the current account data's ignore list
/// which will ignore the user across all rooms.
pub fn ignore(&self) -> Result<(), ClientError> {
RUNTIME.block_on(async move {
self.inner.ignore().await?;
Ok(())
})
}
/// Removes the room member from the current account data's ignore list
/// which will unignore the user across all rooms.
pub fn unignore(&self) -> Result<(), ClientError> {
RUNTIME.block_on(async move {
self.inner.unignore().await?;
Ok(())
})
}
pub fn can_ban(&self) -> bool {
self.inner.can_ban()
}
pub fn can_invite(&self) -> bool {
self.inner.can_invite()
}
pub fn can_kick(&self) -> bool {
self.inner.can_kick()
}
pub fn can_redact_own(&self) -> bool {
self.inner.can_redact_own()
}
pub fn can_redact_other(&self) -> bool {
self.inner.can_redact_other()
}
pub fn can_send_state(&self, state_event: StateEventType) -> bool {
self.inner.can_send_state(state_event.into())
}
pub fn can_send_message(&self, event: MessageLikeEventType) -> bool {
self.inner.can_send_message(event.into())
}
pub fn can_trigger_room_notification(&self) -> bool {
self.inner.can_trigger_room_notification()
}
}
impl RoomMember {
pub fn new(room_member: SdkRoomMember) -> Self {
RoomMember { inner: room_member }
}
}
#[uniffi::export]
pub fn suggested_role_for_power_level(power_level: i64) -> RoomMemberRole {
// It's not possible to expose the constructor on the Enum through Uniffi ☹️
@@ -160,3 +50,32 @@ pub fn suggested_power_level_for_role(role: RoomMemberRole) -> i64 {
// It's not possible to expose methods on an Enum through Uniffi ☹️
role.suggested_power_level()
}
#[derive(uniffi::Record)]
pub struct RoomMember {
pub user_id: String,
pub display_name: Option<String>,
pub avatar_url: Option<String>,
pub membership: MembershipState,
pub is_name_ambiguous: bool,
pub power_level: i64,
pub normalized_power_level: i64,
pub is_ignored: bool,
pub suggested_role_for_power_level: RoomMemberRole,
}
impl From<SdkRoomMember> for RoomMember {
fn from(m: SdkRoomMember) -> Self {
RoomMember {
user_id: m.user_id().to_string(),
display_name: m.display_name().map(|s| s.to_owned()),
avatar_url: m.avatar_url().map(|a| a.to_string()),
membership: m.membership().clone().into(),
is_name_ambiguous: m.name_ambiguous(),
power_level: m.power_level(),
normalized_power_level: m.normalized_power_level(),
is_ignored: m.is_ignored(),
suggested_role_for_power_level: m.suggested_role_for_power_level(),
}
}
}

View File

@@ -122,7 +122,8 @@ impl RoomMember {
/// Get the normalized power level of this member.
///
/// The normalized power level depends on the maximum power level that can
/// be found in a certain room, it's always in the range of 0-100.
/// be found in a certain room, positive values are always in the range of
/// 0-100.
pub fn normalized_power_level(&self) -> i64 {
if self.max_power_level > 0 {
(self.power_level() * 100) / self.max_power_level

View File

@@ -98,7 +98,8 @@ impl RequestConfig {
self
}
/// The number of times a request should be retried. The default is no limit
/// The number of times a request should be retried. The default is no
/// limit.
#[must_use]
pub fn retry_limit(mut self, retry_limit: u64) -> Self {
self.retry_limit = Some(retry_limit);

View File

@@ -81,6 +81,7 @@ pub use self::{
};
use crate::{
attachment::AttachmentConfig,
config::RequestConfig,
error::WrongRoomState,
event_handler::{EventHandler, EventHandlerDropGuard, EventHandlerHandle, SyncEvent},
media::{MediaFormat, MediaRequest},
@@ -410,7 +411,15 @@ impl Room {
.members_request_deduplicated_handler
.run(self.room_id().to_owned(), async move {
let request = get_member_events::v3::Request::new(self.inner.room_id().to_owned());
let response = self.client.send(request, None).await?;
let response = self
.client
.send(
request,
// In some cases it can take longer than 30s to load:
// https://github.com/element-hq/synapse/issues/16872
Some(RequestConfig::new().timeout(Duration::from_secs(60)).retry_limit(3)),
)
.await?;
// That's a large `Future`. Let's `Box::pin` to reduce its size on the stack.
Box::pin(self.client.base_client().receive_members(self.room_id(), &response))