From 03f5b38403fbb7d12115eb47e1ef7fd9f6e0ec65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Commaille?= Date: Sun, 12 Jun 2022 11:29:45 +0200 Subject: [PATCH] events: Add support for knocking in membership_changes --- crates/ruma-common/CHANGELOG.md | 1 + .../src/events/room/member/change.rs | 34 +++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/crates/ruma-common/CHANGELOG.md b/crates/ruma-common/CHANGELOG.md index 5ecd843a..19d72bc8 100644 --- a/crates/ruma-common/CHANGELOG.md +++ b/crates/ruma-common/CHANGELOG.md @@ -26,6 +26,7 @@ Improvements: * Remove `BundledReaction` * Add unstable support for polls (MSC3381) * Add unstable support for Improved Signalling for 1:1 VoIP (MSC2746) +* Add support for knocking in `events::room::member::MembershipChange` # 0.9.2 diff --git a/crates/ruma-common/src/events/room/member/change.rs b/crates/ruma-common/src/events/room/member/change.rs index afb9cf2a..0dfb1904 100644 --- a/crates/ruma-common/src/events/room/member/change.rs +++ b/crates/ruma-common/src/events/room/member/change.rs @@ -46,6 +46,18 @@ pub enum MembershipChange<'a> { /// User had their invite revoked. InvitationRevoked, + /// User knocked. + Knocked, + + /// User had their knock accepted. + KnockAccepted, + + /// User retracted their knock. + KnockRetracted, + + /// User had their knock denied. + KnockDenied, + /// `displayname` or `avatar_url` changed. ProfileChanged { /// The details of the displayname change, if applicable. @@ -82,6 +94,10 @@ impl Change { /// Internal function so all `RoomMemberEventContent` state event kinds can share the same /// implementation. +/// +/// This must match the table for [`m.room.member`] in the spec. +/// +/// [`m.room.member`]: https://spec.matrix.org/v1.2/client-server-api/#mroommember pub(super) fn membership_change<'a>( details: MembershipDetails<'a>, prev_details: Option>, @@ -97,12 +113,20 @@ pub(super) fn membership_change<'a>( }; match (&prev_details.membership, &details.membership) { - (St::Invite, St::Invite) | (St::Leave, St::Leave) | (St::Ban, St::Ban) => Ch::None, + (St::Invite, St::Invite) + | (St::Leave, St::Leave) + | (St::Ban, St::Ban) + | (St::Knock, St::Knock) => Ch::None, (St::Invite, St::Join) | (St::Leave, St::Join) => Ch::Joined, (St::Invite, St::Leave) if sender == state_key => Ch::InvitationRevoked, (St::Invite, St::Leave) => Ch::InvitationRejected, - (St::Invite, St::Ban) | (St::Leave, St::Ban) => Ch::Banned, - (St::Join, St::Invite) | (St::Ban, St::Invite) | (St::Ban, St::Join) => Ch::Error, + (St::Invite, St::Ban) | (St::Leave, St::Ban) | (St::Knock, St::Ban) => Ch::Banned, + (St::Join, St::Invite) + | (St::Ban, St::Invite) + | (St::Ban, St::Join) + | (St::Join, St::Knock) + | (St::Ban, St::Knock) + | (St::Knock, St::Join) => Ch::Error, (St::Join, St::Join) => Ch::ProfileChanged { displayname_change: Change::new(prev_details.displayname, details.displayname), avatar_url_change: Change::new(prev_details.avatar_url, details.avatar_url), @@ -112,6 +136,10 @@ pub(super) fn membership_change<'a>( (St::Join, St::Ban) => Ch::KickedAndBanned, (St::Leave, St::Invite) => Ch::Invited, (St::Ban, St::Leave) => Ch::Unbanned, + (St::Leave, St::Knock) | (St::Invite, St::Knock) => Ch::Knocked, + (St::Knock, St::Invite) => Ch::KnockAccepted, + (St::Knock, St::Leave) if sender == state_key => Ch::KnockRetracted, + (St::Knock, St::Leave) => Ch::KnockDenied, _ => Ch::NotImplemented, } }