Compare commits

...

5 Commits

Author SHA1 Message Date
Damir Jelić a6916dd9dd chore(sdk): Bump the version
CI / Check style (push) Failing after 38s
CI / Run clippy (push) Has been skipped
CI / linux / WASM (push) Has been skipped
CI / linux / appservice / stable / warp (push) Has been skipped
CI / macOS / appservice / stable / warp (push) Has been skipped
CI / linux / features-markdown (push) Has been skipped
CI / linux / features-socks (push) Has been skipped
CI / linux / features-sso_login (push) Has been skipped
CI / linux / features-no-sled (push) Has been skipped
CI / linux / features-sled_cryptostore (push) Has been skipped
CI / linux / features-no-encryption-and-sled (push) Has been skipped
CI / linux / features-require_auth_for_profile_requests (push) Has been skipped
CI / linux / features-no-encryption (push) Has been skipped
CI / linux / features-rustls-tls (push) Has been skipped
CI / linux / beta (push) Has been skipped
CI / linux / stable (push) Has been skipped
CI / macOS / stable (push) Has been skipped
2021-09-10 21:41:37 +02:00
Damir Jelić b96624890e Merge branch 'event-handler-encryption-info' 2021-09-10 21:36:16 +02:00
Jonas Platte d6d51ef4b1 Show Option<EncryptionInfo> event handler context in doc example 2021-09-10 17:12:17 +02:00
Jonas Platte 24253128ae Add support for Option<EncryptionInfo> as event handler context 2021-09-09 21:03:01 +02:00
Jonas Platte 8f46a87f52 Inline handle_sync_events_wrapped
It was only used in one place.
2021-09-09 20:44:25 +02:00
4 changed files with 52 additions and 36 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ license = "Apache-2.0"
name = "matrix-sdk"
readme = "README.md"
repository = "https://github.com/matrix-org/matrix-rust-sdk"
version = "0.3.0"
version = "0.4.0"
[package.metadata.docs.rs]
features = ["docs"]
+13 -2
View File
@@ -927,6 +927,7 @@ impl Client {
/// # let homeserver = Url::parse("http://localhost:8080").unwrap();
/// # let client = Client::new(homeserver).unwrap();
/// use matrix_sdk::{
/// deserialized_responses::EncryptionInfo,
/// room::Room,
/// ruma::{
/// events::{
@@ -952,10 +953,20 @@ impl Client {
/// )
/// .await
/// .register_event_handler(
/// |ev: SyncMessageEvent<MessageEventContent>,
/// room: Room,
/// encryption_info: Option<EncryptionInfo>| async move {
/// // An `Option<EncryptionInfo>` parameter lets you distinguish between
/// // unencrypted events and events that were decrypted by the SDK.
/// },
/// )
/// .await
/// .register_event_handler(
/// |ev: SyncStateEvent<TopicEventContent>| async move {
/// // Also possible: Omit any or all arguments after the first.
/// // You can omit any or all arguments after the first.
/// }
/// ).await;
/// )
/// .await;
///
/// // Custom events work exactly the same way, you just need to declare
/// // the content struct and use the EventContent derive macro on it.
+37 -32
View File
@@ -32,7 +32,7 @@
use std::{borrow::Cow, future::Future, ops::Deref};
use matrix_sdk_base::deserialized_responses::SyncRoomEvent;
use matrix_sdk_base::deserialized_responses::{EncryptionInfo, SyncRoomEvent};
use ruma::{events::AnySyncStateEvent, serde::Raw};
use serde::Deserialize;
use serde_json::value::RawValue as RawJsonValue;
@@ -117,6 +117,7 @@ pub struct EventHandlerData<'a> {
pub client: Client,
pub room: Option<room::Room>,
pub raw: &'a RawJsonValue,
pub encryption_info: Option<&'a EncryptionInfo>,
}
/// Context for an event handler.
@@ -169,6 +170,12 @@ impl EventHandlerContext for RawEvent {
}
}
impl EventHandlerContext for Option<EncryptionInfo> {
fn from_data(data: &EventHandlerData<'_>) -> Option<Self> {
Some(data.encryption_info.cloned())
}
}
/// Return types supported for event handlers implement this trait.
///
/// It is not meant to be implemented outside of matrix-sdk.
@@ -211,7 +218,19 @@ impl Client {
room: &Option<room::Room>,
events: &[Raw<T>],
) -> serde_json::Result<()> {
self.handle_sync_events_wrapped(kind, room, events, |x| x).await
#[derive(Deserialize)]
struct ExtractType<'a> {
#[serde(borrow, rename = "type")]
event_type: Cow<'a, str>,
}
self.handle_sync_events_wrapped_with(
room,
events,
|ev| (ev, None),
|raw| Ok((kind, raw.deserialize_as::<ExtractType>()?.event_type)),
)
.await
}
pub(crate) async fn handle_sync_state_events(
@@ -226,11 +245,16 @@ impl Client {
unsigned: Option<UnsignedDetails>,
}
self.handle_sync_events_wrapped_with(room, state_events, std::convert::identity, |raw| {
let StateEventDetails { event_type, unsigned } = raw.deserialize_as()?;
let redacted = unsigned.and_then(|u| u.redacted_because).is_some();
Ok((EventKind::State { redacted }, event_type))
})
self.handle_sync_events_wrapped_with(
room,
state_events,
|ev| (ev, None),
|raw| {
let StateEventDetails { event_type, unsigned } = raw.deserialize_as()?;
let redacted = unsigned.and_then(|u| u.redacted_because).is_some();
Ok((EventKind::State { redacted }, event_type))
},
)
.await
}
@@ -239,7 +263,6 @@ impl Client {
room: &Option<room::Room>,
timeline_events: &[SyncRoomEvent],
) -> serde_json::Result<()> {
// FIXME: add EncryptionInfo to context
#[derive(Deserialize)]
struct TimelineEventDetails<'a> {
#[serde(borrow, rename = "type")]
@@ -251,7 +274,7 @@ impl Client {
self.handle_sync_events_wrapped_with(
room,
timeline_events,
|e| &e.event,
|e| (&e.event, e.encryption_info.as_ref()),
|raw| {
let TimelineEventDetails { event_type, state_key, unsigned } =
raw.deserialize_as()?;
@@ -268,35 +291,16 @@ impl Client {
.await
}
async fn handle_sync_events_wrapped<'a, T: 'a, U: 'a>(
&self,
kind: EventKind,
room: &Option<room::Room>,
events: &'a [U],
get_event: impl Fn(&'a U) -> &'a Raw<T>,
) -> Result<(), serde_json::Error> {
#[derive(Deserialize)]
struct ExtractType<'a> {
#[serde(borrow, rename = "type")]
event_type: Cow<'a, str>,
}
self.handle_sync_events_wrapped_with(room, events, get_event, |raw| {
Ok((kind, raw.deserialize_as::<ExtractType>()?.event_type))
})
.await
}
async fn handle_sync_events_wrapped_with<'a, T: 'a, U: 'a>(
&self,
room: &Option<room::Room>,
list: &'a [U],
get_event: impl Fn(&'a U) -> &'a Raw<T>,
get_event_details: impl Fn(&'a U) -> (&'a Raw<T>, Option<&'a EncryptionInfo>),
get_id: impl Fn(&Raw<T>) -> serde_json::Result<(EventKind, Cow<'_, str>)>,
) -> serde_json::Result<()> {
for x in list {
let event = get_event(x);
let (ev_kind, ev_type) = get_id(event)?;
let (raw_event, encryption_info) = get_event_details(x);
let (ev_kind, ev_type) = get_id(raw_event)?;
let event_handler_id = (ev_kind, &*ev_type);
if let Some(handlers) = self.event_handlers.read().await.get(&event_handler_id) {
@@ -304,7 +308,8 @@ impl Client {
let data = EventHandlerData {
client: self.clone(),
room: room.clone(),
raw: event.json(),
raw: raw_event.json(),
encryption_info,
};
matrix_sdk_common::executor::spawn((handler)(data));
}
+1 -1
View File
@@ -36,7 +36,7 @@ tracing = "0.1"
url = "2"
warp = { git = "https://github.com/seanmonstar/warp.git", rev = "629405", optional = true, default-features = false }
matrix-sdk = { version = "0.3", path = "../matrix_sdk", default-features = false, features = ["appservice"] }
matrix-sdk = { version = "0.4", path = "../matrix_sdk", default-features = false, features = ["appservice"] }
[dependencies.ruma]
version = "0.4.0"