events: Add knock_restricted join rule

According to MSC3787
This commit is contained in:
Kévin Commaille 2022-06-20 18:28:13 +02:00 committed by Kévin Commaille
parent 8081878934
commit 33a47427c1
2 changed files with 14 additions and 0 deletions

View File

@ -32,6 +32,7 @@ Improvements:
* Deprecate the `sender_key` and `device_id` fields for encrypted events (MSC3700) * Deprecate the `sender_key` and `device_id` fields for encrypted events (MSC3700)
* Move the `relations` field of `events::unsigned` types out of `unstable-msc2675` * Move the `relations` field of `events::unsigned` types out of `unstable-msc2675`
* Deserialize stringified integers for power levels without the `compat` feature * Deserialize stringified integers for power levels without the `compat` feature
* Add `JoinRule::KnockRestricted` (MSC3787)
# 0.9.2 # 0.9.2

View File

@ -37,6 +37,12 @@ impl RoomJoinRulesEventContent {
pub fn restricted(allow: Vec<AllowRule>) -> Self { pub fn restricted(allow: Vec<AllowRule>) -> Self {
Self { join_rule: JoinRule::Restricted(Restricted::new(allow)) } Self { join_rule: JoinRule::Restricted(Restricted::new(allow)) }
} }
/// Creates a new `RoomJoinRulesEventContent` with the knock restricted rule and the given set
/// of allow rules.
pub fn knock_restricted(allow: Vec<AllowRule>) -> Self {
Self { join_rule: JoinRule::KnockRestricted(Restricted::new(allow)) }
}
} }
impl<'de> Deserialize<'de> for RoomJoinRulesEventContent { impl<'de> Deserialize<'de> for RoomJoinRulesEventContent {
@ -97,6 +103,11 @@ pub enum JoinRule {
#[serde(rename = "restricted")] #[serde(rename = "restricted")]
Restricted(Restricted), Restricted(Restricted),
/// Users can join the room if they are invited, or if they meet any of the conditions
/// described in a set of [`AllowRule`]s, or they can request an invite to the room.
#[serde(rename = "knock_restricted")]
KnockRestricted(Restricted),
/// Anyone can join the room without any prior action. /// Anyone can join the room without any prior action.
#[serde(rename = "public")] #[serde(rename = "public")]
Public, Public,
@ -114,6 +125,7 @@ impl JoinRule {
JoinRule::Knock => "knock", JoinRule::Knock => "knock",
JoinRule::Private => "private", JoinRule::Private => "private",
JoinRule::Restricted(_) => "restricted", JoinRule::Restricted(_) => "restricted",
JoinRule::KnockRestricted(_) => "knock_restricted",
JoinRule::Public => "public", JoinRule::Public => "public",
JoinRule::_Custom(rule) => &rule.0, JoinRule::_Custom(rule) => &rule.0,
} }
@ -143,6 +155,7 @@ impl<'de> Deserialize<'de> for JoinRule {
"knock" => Ok(Self::Knock), "knock" => Ok(Self::Knock),
"private" => Ok(Self::Private), "private" => Ok(Self::Private),
"restricted" => from_raw_json_value(&json).map(Self::Restricted), "restricted" => from_raw_json_value(&json).map(Self::Restricted),
"knock_restricted" => from_raw_json_value(&json).map(Self::KnockRestricted),
"public" => Ok(Self::Public), "public" => Ok(Self::Public),
_ => Ok(Self::_Custom(PrivOwnedStr(join_rule.into()))), _ => Ok(Self::_Custom(PrivOwnedStr(join_rule.into()))),
} }