events: Clean up implementation of membership_change

This commit is contained in:
Jonas Platte 2022-04-25 12:53:51 +02:00
parent 40221e3cd8
commit 106441bdef
No known key found for this signature in database
GPG Key ID: BBA95679259D342F

View File

@ -355,43 +355,32 @@ pub enum MembershipChange {
/// Internal function so all `RoomMemberEventContent` state event kinds can share the same /// Internal function so all `RoomMemberEventContent` state event kinds can share the same
/// implementation. /// implementation.
fn membership_change( fn membership_change(
content: MembershipDetails<'_>, details: MembershipDetails<'_>,
prev_content: Option<MembershipDetails<'_>>, prev_details: Option<MembershipDetails<'_>>,
sender: &UserId, sender: &UserId,
state_key: &UserId, state_key: &UserId,
) -> MembershipChange { ) -> MembershipChange {
use MembershipChange as Ch; use MembershipChange as Ch;
use MembershipState as St; use MembershipState as St;
let prev_content = if let Some(prev_content) = prev_content { let prev_details = match prev_details {
prev_content Some(prev) => prev,
} else { None => MembershipDetails { avatar_url: None, displayname: None, membership: &St::Leave },
MembershipDetails { avatar_url: None, displayname: None, membership: &St::Leave }
}; };
match (&prev_content.membership, &content.membership) { 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) => Ch::None,
(St::Invite, St::Join) | (St::Leave, St::Join) => Ch::Joined, (St::Invite, St::Join) | (St::Leave, St::Join) => Ch::Joined,
(St::Invite, St::Leave) => { (St::Invite, St::Leave) if sender == state_key => Ch::InvitationRevoked,
if sender == state_key { (St::Invite, St::Leave) => Ch::InvitationRejected,
Ch::InvitationRevoked
} else {
Ch::InvitationRejected
}
}
(St::Invite, St::Ban) | (St::Leave, St::Ban) => Ch::Banned, (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::Join, St::Invite) | (St::Ban, St::Invite) | (St::Ban, St::Join) => Ch::Error,
(St::Join, St::Join) => Ch::ProfileChanged { (St::Join, St::Join) => Ch::ProfileChanged {
displayname_changed: prev_content.displayname != content.displayname, displayname_changed: prev_details.displayname != details.displayname,
avatar_url_changed: prev_content.avatar_url != content.avatar_url, avatar_url_changed: prev_details.avatar_url != details.avatar_url,
}, },
(St::Join, St::Leave) => { (St::Join, St::Leave) if sender == state_key => Ch::Left,
if sender == state_key { (St::Join, St::Leave) => Ch::Kicked,
Ch::Left
} else {
Ch::Kicked
}
}
(St::Join, St::Ban) => Ch::KickedAndBanned, (St::Join, St::Ban) => Ch::KickedAndBanned,
(St::Leave, St::Invite) => Ch::Invited, (St::Leave, St::Invite) => Ch::Invited,
(St::Ban, St::Leave) => Ch::Unbanned, (St::Ban, St::Leave) => Ch::Unbanned,