matrix_sdk_base/room/
create.rs1use matrix_sdk_common::ROOM_VERSION_RULES_FALLBACK;
16use ruma::{
17 OwnedUserId, RoomVersionId, assign,
18 events::{
19 EmptyStateKey, RedactContent, RedactedStateEventContent, StateEventType,
20 macros::EventContent,
21 room::create::{PreviousRoom, RoomCreateEventContent},
22 },
23 room::RoomType,
24 room_version_rules::RedactionRules,
25};
26use serde::{Deserialize, Serialize};
27
28#[derive(Clone, Debug, Deserialize, Serialize, EventContent)]
38#[ruma_event(type = "m.room.create", kind = State, state_key_type = EmptyStateKey, custom_redacted)]
39pub struct RoomCreateWithCreatorEventContent {
40 pub creator: OwnedUserId,
47
48 #[serde(
51 rename = "m.federate",
52 default = "ruma::serde::default_true",
53 skip_serializing_if = "ruma::serde::is_true"
54 )]
55 pub federate: bool,
56
57 #[serde(default = "default_create_room_version_id")]
61 pub room_version: RoomVersionId,
62
63 #[serde(skip_serializing_if = "Option::is_none")]
66 pub predecessor: Option<PreviousRoom>,
67
68 #[serde(skip_serializing_if = "Option::is_none", rename = "type")]
72 pub room_type: Option<RoomType>,
73
74 #[serde(skip_serializing_if = "Vec::is_empty", default)]
77 pub additional_creators: Vec<OwnedUserId>,
78}
79
80impl RoomCreateWithCreatorEventContent {
81 pub fn from_event_content(content: RoomCreateEventContent, sender: OwnedUserId) -> Self {
84 let RoomCreateEventContent {
85 federate,
86 room_version,
87 predecessor,
88 room_type,
89 additional_creators,
90 ..
91 } = content;
92 Self {
93 creator: sender,
94 federate,
95 room_version,
96 predecessor,
97 room_type,
98 additional_creators,
99 }
100 }
101
102 fn into_event_content(self) -> (RoomCreateEventContent, OwnedUserId) {
103 let Self { creator, federate, room_version, predecessor, room_type, additional_creators } =
104 self;
105
106 #[allow(deprecated)]
107 let content = assign!(RoomCreateEventContent::new_v11(), {
108 creator: Some(creator.clone()),
109 federate,
110 room_version,
111 predecessor,
112 room_type,
113 additional_creators,
114 });
115
116 (content, creator)
117 }
118
119 pub(crate) fn creators(&self) -> Vec<OwnedUserId> {
122 let rules = self.room_version.rules().unwrap_or(ROOM_VERSION_RULES_FALLBACK);
123
124 if rules.authorization.explicitly_privilege_room_creators {
125 std::iter::once(self.creator.clone())
126 .chain(self.additional_creators.iter().cloned())
127 .collect()
128 } else {
129 vec![self.creator.clone()]
130 }
131 }
132}
133
134pub type RedactedRoomCreateWithCreatorEventContent = RoomCreateWithCreatorEventContent;
136
137impl RedactedStateEventContent for RedactedRoomCreateWithCreatorEventContent {
138 type StateKey = EmptyStateKey;
139
140 fn event_type(&self) -> StateEventType {
141 StateEventType::RoomCreate
142 }
143}
144
145impl RedactContent for RoomCreateWithCreatorEventContent {
146 type Redacted = RedactedRoomCreateWithCreatorEventContent;
147
148 fn redact(self, rules: &RedactionRules) -> Self::Redacted {
149 let (content, sender) = self.into_event_content();
150 let content = content.redact(rules);
152 Self::from_event_content(content, sender)
153 }
154}
155
156fn default_create_room_version_id() -> RoomVersionId {
157 RoomVersionId::V1
158}