events: Add support for MSC4171
This commit is contained in:
parent
e31b9dd3a4
commit
d82e2a02d5
@ -1,5 +1,9 @@
|
||||
# [unreleased]
|
||||
|
||||
Improvements:
|
||||
|
||||
- Add unstable support for MSC4171 for the m.member_hints state event.
|
||||
|
||||
Breaking changes:
|
||||
|
||||
- Take newly introduced `DirectUserIdentifier(str)` as a key for `DirectEventContent`.
|
||||
|
@ -43,6 +43,7 @@ unstable-msc3955 = ["unstable-msc1767"]
|
||||
unstable-msc3956 = ["unstable-msc1767"]
|
||||
unstable-msc4075 = ["unstable-msc3401"]
|
||||
unstable-msc4095 = []
|
||||
unstable-msc4171 = []
|
||||
unstable-pdu = []
|
||||
|
||||
# Allow some mandatory fields to be missing, defaulting them to an empty string
|
||||
|
@ -138,6 +138,9 @@ event_enum! {
|
||||
"org.matrix.msc3401.call.member" => super::call::member,
|
||||
#[ruma_enum(alias = "m.room.preview_urls")]
|
||||
"org.matrix.room.preview_urls" => super::room::preview_url,
|
||||
#[cfg(feature = "unstable-msc4171")]
|
||||
#[ruma_enum(alias = "m.member_hints")]
|
||||
"io.element.functional_members" => super::member_hints,
|
||||
}
|
||||
|
||||
/// Any to-device event.
|
||||
|
@ -162,6 +162,8 @@ pub mod key;
|
||||
#[cfg(feature = "unstable-msc3488")]
|
||||
pub mod location;
|
||||
pub mod marked_unread;
|
||||
#[cfg(feature = "unstable-msc4171")]
|
||||
pub mod member_hints;
|
||||
#[cfg(feature = "unstable-msc1767")]
|
||||
pub mod message;
|
||||
#[cfg(feature = "unstable-pdu")]
|
||||
|
113
crates/ruma-events/src/member_hints.rs
Normal file
113
crates/ruma-events/src/member_hints.rs
Normal file
@ -0,0 +1,113 @@
|
||||
//! Types for Matrix member hint state events ([MSC4171]).
|
||||
//!
|
||||
//! This implements `m.member_hints` state event described in [MSC4171].
|
||||
//!
|
||||
//! [MSC4171]: https://github.com/matrix-org/matrix-spec-proposals/pull/4171
|
||||
|
||||
use std::collections::BTreeSet;
|
||||
|
||||
use ruma_common::OwnedUserId;
|
||||
use ruma_macros::EventContent;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::EmptyStateKey;
|
||||
|
||||
/// The content for an `m.member_hints` state event.
|
||||
///
|
||||
/// Any users (service members) listed in the content should not be considered when computing the
|
||||
/// room name or avatar based on the member list.
|
||||
#[derive(Clone, Debug, Default, Serialize, Deserialize, EventContent, PartialEq)]
|
||||
#[ruma_event(type = "io.element.functional_members", kind = State, state_key_type = EmptyStateKey)]
|
||||
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
|
||||
pub struct MemberHintsEventContent {
|
||||
/// The list of user IDs that should be considered a service member of the room.
|
||||
pub service_members: BTreeSet<OwnedUserId>,
|
||||
}
|
||||
|
||||
impl MemberHintsEventContent {
|
||||
/// Create a new [`MemberHintsEventContent`] with the given set of service members.
|
||||
pub fn new(service_members: BTreeSet<OwnedUserId>) -> Self {
|
||||
Self { service_members }
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use std::collections::BTreeSet;
|
||||
|
||||
use assert_matches2::assert_matches;
|
||||
use ruma_common::user_id;
|
||||
use serde_json::{from_value as from_json_value, json};
|
||||
|
||||
use super::*;
|
||||
use crate::AnyStateEvent;
|
||||
|
||||
#[test]
|
||||
fn deserialize() {
|
||||
let user_id = user_id!("@slackbot:matrix.org");
|
||||
|
||||
let data = json!({
|
||||
"type": "io.element.functional_members",
|
||||
"state_key": "",
|
||||
"content": {
|
||||
"service_members": [
|
||||
user_id,
|
||||
]
|
||||
},
|
||||
"origin_server_ts": 111,
|
||||
"event_id": "$3qfxjGYSu4sL25FtR0ep6vePOc",
|
||||
"room_id": "!1234:example.org",
|
||||
"sender": "@user:example.org"
|
||||
});
|
||||
|
||||
let event = from_json_value::<AnyStateEvent>(data)
|
||||
.expect("We should be able to deserialize the member hints event");
|
||||
|
||||
assert_matches!(event, AnyStateEvent::MemberHints(event));
|
||||
assert_matches!(event, crate::StateEvent::Original(event));
|
||||
|
||||
assert!(event.content.service_members.contains(user_id));
|
||||
|
||||
let data = json!({
|
||||
"type": "m.member_hints",
|
||||
"state_key": "",
|
||||
"content": {
|
||||
"service_members": [
|
||||
user_id,
|
||||
]
|
||||
},
|
||||
"origin_server_ts": 111,
|
||||
"event_id": "$3qfxjGYSu4sL25FtR0ep6vePOc",
|
||||
"room_id": "!1234:example.org",
|
||||
"sender": "@user:example.org"
|
||||
});
|
||||
|
||||
let event = from_json_value::<AnyStateEvent>(data)
|
||||
.expect("We should be able to deserialize the member hints event");
|
||||
|
||||
assert_matches!(event, AnyStateEvent::MemberHints(event));
|
||||
assert_matches!(event, crate::StateEvent::Original(event));
|
||||
|
||||
assert!(event.content.service_members.contains(user_id));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn serialize() {
|
||||
let user_id = user_id!("@slackbot:matrix.org");
|
||||
let content = MemberHintsEventContent::new(BTreeSet::from([user_id.to_owned()]));
|
||||
|
||||
let serialized = serde_json::to_value(content)
|
||||
.expect("We should be able to serialize the member hints content");
|
||||
|
||||
let expected = json!({
|
||||
"service_members": [
|
||||
user_id,
|
||||
]
|
||||
});
|
||||
|
||||
assert_eq!(
|
||||
expected, serialized,
|
||||
"The serialized member hints content should match the expected one"
|
||||
);
|
||||
}
|
||||
}
|
@ -270,6 +270,7 @@ unstable-msc4108 = ["ruma-client-api?/unstable-msc4108"]
|
||||
unstable-msc4121 = ["ruma-client-api?/unstable-msc4121"]
|
||||
unstable-msc4125 = ["ruma-federation-api?/unstable-msc4125"]
|
||||
unstable-msc4140 = ["ruma-client-api?/unstable-msc4140"]
|
||||
unstable-msc4171 = ["ruma-events?/unstable-msc4171"]
|
||||
unstable-msc4186 = ["ruma-client-api?/unstable-msc4186"]
|
||||
unstable-msc4210 = ["ruma-common/unstable-msc4210"]
|
||||
unstable-pdu = ["ruma-events?/unstable-pdu"]
|
||||
@ -324,6 +325,7 @@ __unstable-mscs = [
|
||||
"unstable-msc4121",
|
||||
"unstable-msc4125",
|
||||
"unstable-msc4140",
|
||||
"unstable-msc4171",
|
||||
"unstable-msc4186",
|
||||
]
|
||||
__ci = [
|
||||
|
Loading…
x
Reference in New Issue
Block a user