From e6c995ef1ab8be61c84850327debee567b0e7d4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Commaille?= Date: Tue, 20 Dec 2022 10:55:18 +0100 Subject: [PATCH] events: Implement membership_change on [Redacted]RoomMemberEventContent --- crates/ruma-common/src/events/room/member.rs | 45 +++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/crates/ruma-common/src/events/room/member.rs b/crates/ruma-common/src/events/room/member.rs index 26bd032c..50630a9a 100644 --- a/crates/ruma-common/src/events/room/member.rs +++ b/crates/ruma-common/src/events/room/member.rs @@ -17,7 +17,7 @@ use crate::{ }, serde::{CanBeEmpty, Raw, StringEnum}, OwnedMxcUri, OwnedServerName, OwnedServerSigningKeyId, OwnedTransactionId, OwnedUserId, - PrivOwnedStr, RoomVersionId, + PrivOwnedStr, RoomVersionId, UserId, }; mod change; @@ -143,6 +143,26 @@ impl RoomMemberEventContent { membership: &self.membership, } } + + /// Helper function for membership change. + /// + /// This requires data from the full event: + /// + /// * The previous details computed from `event.unsigned.prev_content`, + /// * The sender of the event, + /// * The state key of the event. + /// + /// Check [the specification][spec] for details. + /// + /// [spec]: https://spec.matrix.org/v1.4/client-server-api/#mroommember + pub fn membership_change<'a>( + &'a self, + prev_details: Option>, + sender: &UserId, + state_key: &UserId, + ) -> MembershipChange<'a> { + membership_change(self.details(), prev_details, sender, state_key) + } } impl RedactContent for RoomMemberEventContent { @@ -187,6 +207,29 @@ impl RedactedRoomMemberEventContent { pub fn details(&self) -> MembershipDetails<'_> { MembershipDetails { avatar_url: None, displayname: None, membership: &self.membership } } + + /// Helper function for membership change. + /// + /// Since redacted events don't have `unsigned.prev_content`, you have to pass the `.details()` + /// of the previous `m.room.member` event manually (if there is a previous `m.room.member` + /// event). + /// + /// This also requires data from the full event: + /// + /// * The sender of the event, + /// * The state key of the event. + /// + /// Check [the specification][spec] for details. + /// + /// [spec]: https://spec.matrix.org/v1.4/client-server-api/#mroommember + pub fn membership_change<'a>( + &'a self, + prev_details: Option>, + sender: &UserId, + state_key: &UserId, + ) -> MembershipChange<'a> { + membership_change(self.details(), prev_details, sender, state_key) + } } impl EventContent for RedactedRoomMemberEventContent {