From 2b6eba69dd7cc2e930f551f2441baf6c0957e408 Mon Sep 17 00:00:00 2001 From: Devin R Date: Tue, 23 Jun 2020 19:12:23 -0400 Subject: [PATCH] Add membership_change method to stub and stripped event Fix redaction event detection in event_enum! macro. Add encrypted event to AnyMessageEvent enum. --- ruma-events-macros/src/event_enum.rs | 2 +- ruma-events/src/enums.rs | 1 + ruma-events/src/room/member.rs | 110 +++++++++++++++++---------- 3 files changed, 71 insertions(+), 42 deletions(-) diff --git a/ruma-events-macros/src/event_enum.rs b/ruma-events-macros/src/event_enum.rs index d3806ed0..22fd410b 100644 --- a/ruma-events-macros/src/event_enum.rs +++ b/ruma-events-macros/src/event_enum.rs @@ -218,7 +218,7 @@ fn to_event_path(name: &LitStr, struct_name: &Ident) -> TokenStream { let path = path.iter().map(|s| Ident::new(s, span)); match struct_name.to_string().as_str() { - "MessageEvent" | "MessageEventStub" if *event_str == "m.room.redaction" => { + "MessageEvent" | "MessageEventStub" if name == "m.room.redaction" => { let redaction = if struct_name == "MessageEvent" { quote! { RedactionEvent } } else { diff --git a/ruma-events/src/enums.rs b/ruma-events/src/enums.rs index 1269f0f4..25c52b01 100644 --- a/ruma-events/src/enums.rs +++ b/ruma-events/src/enums.rs @@ -36,6 +36,7 @@ event_enum! { "m.call.invite", "m.call.hangup", "m.call.candidates", + "m.room.encrypted", "m.room.message", "m.room.message.feedback", "m.room.redaction", diff --git a/ruma-events/src/room/member.rs b/ruma-events/src/room/member.rs index abdfd439..63ea364d 100644 --- a/ruma-events/src/room/member.rs +++ b/ruma-events/src/room/member.rs @@ -7,7 +7,7 @@ use ruma_identifiers::UserId; use serde::{Deserialize, Serialize}; use strum::{Display, EnumString}; -use crate::StateEvent; +use crate::{StateEvent, StateEventStub, StrippedStateEventStub}; /// The current membership state of a user in the room. /// @@ -162,52 +162,80 @@ pub enum MembershipChange { NotImplemented, } +/// Internal function so all `MemberEventContent` state event kinds can share the same implementation. +fn membership_change( + content: &MemberEventContent, + prev_content: Option<&MemberEventContent>, + sender: &UserId, + state_key: &str, +) -> MembershipChange { + use MembershipState::*; + let prev_content = if let Some(prev_content) = &prev_content { + prev_content + } else { + &MemberEventContent { + avatar_url: None, + displayname: None, + is_direct: None, + membership: Leave, + third_party_invite: None, + } + }; + + match (prev_content.membership, &content.membership) { + (Invite, Invite) | (Leave, Leave) | (Ban, Ban) => MembershipChange::None, + (Invite, Join) | (Leave, Join) => MembershipChange::Joined, + (Invite, Leave) => { + if sender.as_ref() == state_key { + MembershipChange::InvitationRevoked + } else { + MembershipChange::InvitationRejected + } + } + (Invite, Ban) | (Leave, Ban) => MembershipChange::Banned, + (Join, Invite) | (Ban, Invite) | (Ban, Join) => MembershipChange::Error, + (Join, Join) => MembershipChange::ProfileChanged { + displayname_changed: prev_content.displayname != content.displayname, + avatar_url_changed: prev_content.avatar_url != content.avatar_url, + }, + (Join, Leave) => { + if sender.as_ref() == state_key { + MembershipChange::Left + } else { + MembershipChange::Kicked + } + } + (Join, Ban) => MembershipChange::KickedAndBanned, + (Leave, Invite) => MembershipChange::Invited, + (Ban, Leave) => MembershipChange::Unbanned, + (Knock, _) | (_, Knock) => MembershipChange::NotImplemented, + } +} + impl MemberEvent { /// Helper function for membership change. Check [the specification][spec] for details. /// /// [spec]: https://matrix.org/docs/spec/client_server/latest#m-room-member pub fn membership_change(&self) -> MembershipChange { - use MembershipState::*; - let prev_content = if let Some(prev_content) = &self.prev_content { - prev_content - } else { - &MemberEventContent { - avatar_url: None, - displayname: None, - is_direct: None, - membership: Leave, - third_party_invite: None, - } - }; + membership_change(&self.content, self.prev_content.as_ref(), &self.sender, &self.state_key) + } +} - match (prev_content.membership, &self.content.membership) { - (Invite, Invite) | (Leave, Leave) | (Ban, Ban) => MembershipChange::None, - (Invite, Join) | (Leave, Join) => MembershipChange::Joined, - (Invite, Leave) => { - if self.sender == self.state_key { - MembershipChange::InvitationRevoked - } else { - MembershipChange::InvitationRejected - } - } - (Invite, Ban) | (Leave, Ban) => MembershipChange::Banned, - (Join, Invite) | (Ban, Invite) | (Ban, Join) => MembershipChange::Error, - (Join, Join) => MembershipChange::ProfileChanged { - displayname_changed: prev_content.displayname != self.content.displayname, - avatar_url_changed: prev_content.avatar_url != self.content.avatar_url, - }, - (Join, Leave) => { - if self.sender == self.state_key { - MembershipChange::Left - } else { - MembershipChange::Kicked - } - } - (Join, Ban) => MembershipChange::KickedAndBanned, - (Leave, Invite) => MembershipChange::Invited, - (Ban, Leave) => MembershipChange::Unbanned, - (Knock, _) | (_, Knock) => MembershipChange::NotImplemented, - } +impl StateEventStub { + /// Helper function for membership change. Check [the specification][spec] for details. + /// + /// [spec]: https://matrix.org/docs/spec/client_server/latest#m-room-member + pub fn membership_change(&self) -> MembershipChange { + membership_change(&self.content, self.prev_content.as_ref(), &self.sender, &self.state_key) + } +} + +impl StrippedStateEventStub { + /// Helper function for membership change. Check [the specification][spec] for details. + /// + /// [spec]: https://matrix.org/docs/spec/client_server/latest#m-room-member + pub fn membership_change(&self) -> MembershipChange { + membership_change(&self.content, None, &self.sender, &self.state_key) } }