Skip to main content

ruma_events/
member_hints.rs

1//! Types for Matrix member hint state events ([MSC4171]).
2//!
3//! This implements `m.member_hints` state event described in [MSC4171].
4//!
5//! [MSC4171]: https://github.com/matrix-org/matrix-spec-proposals/pull/4171
6
7use std::collections::BTreeSet;
8
9use ruma_common::OwnedUserId;
10use ruma_macros::EventContent;
11use serde::{Deserialize, Serialize};
12
13use crate::EmptyStateKey;
14
15/// The content for an `m.member_hints` state event.
16///
17/// Any users (service members) listed in the content should not be considered when computing the
18/// room name or avatar based on the member list.
19#[derive(Clone, Debug, Default, Serialize, Deserialize, EventContent, PartialEq)]
20#[ruma_event(type = "io.element.functional_members", kind = State, state_key_type = EmptyStateKey)]
21#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
22pub struct MemberHintsEventContent {
23    /// The list of user IDs that should be considered a service member of the room.
24    pub service_members: BTreeSet<OwnedUserId>,
25}
26
27impl MemberHintsEventContent {
28    /// Create a new [`MemberHintsEventContent`] with the given set of service members.
29    pub fn new(service_members: BTreeSet<OwnedUserId>) -> Self {
30        Self { service_members }
31    }
32}
33
34#[cfg(test)]
35mod test {
36    use std::collections::BTreeSet;
37
38    use ruma_common::user_id;
39    use serde_json::{from_value as from_json_value, json};
40    use strass::assert_let;
41
42    use super::*;
43    use crate::{AnyStateEvent, StateEvent};
44
45    #[test]
46    fn deserialize() {
47        let user_id = user_id!("@slackbot:matrix.org");
48
49        let data = json!({
50            "type": "io.element.functional_members",
51            "state_key": "",
52            "content": {
53                "service_members": [
54                    user_id,
55                ]
56            },
57            "origin_server_ts": 111,
58            "event_id": "$3qfxjGYSu4sL25FtR0ep6vePOc",
59            "room_id": "!1234:example.org",
60            "sender": "@user:example.org"
61        });
62
63        let event = from_json_value::<AnyStateEvent>(data)
64            .expect("We should be able to deserialize the member hints event");
65
66        assert_let!(AnyStateEvent::MemberHints(StateEvent::Original(event)) = event);
67
68        assert!(event.content.service_members.contains(user_id));
69
70        let data = json!({
71            "type": "m.member_hints",
72            "state_key": "",
73            "content": {
74                "service_members": [
75                    user_id,
76                ]
77            },
78            "origin_server_ts": 111,
79            "event_id": "$3qfxjGYSu4sL25FtR0ep6vePOc",
80            "room_id": "!1234:example.org",
81            "sender": "@user:example.org"
82        });
83
84        let event = from_json_value::<AnyStateEvent>(data)
85            .expect("We should be able to deserialize the member hints event");
86
87        assert_let!(AnyStateEvent::MemberHints(StateEvent::Original(event)) = event);
88
89        assert!(event.content.service_members.contains(user_id));
90    }
91
92    #[test]
93    fn serialize() {
94        let user_id = user_id!("@slackbot:matrix.org");
95        let content = MemberHintsEventContent::new(BTreeSet::from([user_id.to_owned()]));
96
97        let serialized = serde_json::to_value(content)
98            .expect("We should be able to serialize the member hints content");
99
100        let expected = json!({
101            "service_members": [
102                user_id,
103            ]
104        });
105
106        assert_eq!(
107            expected, serialized,
108            "The serialized member hints content should match the expected one"
109        );
110    }
111}