Add membership_change method to stub and stripped event

Fix redaction event detection in event_enum! macro. Add encrypted event
to AnyMessageEvent enum.
This commit is contained in:
Devin R 2020-06-23 19:12:23 -04:00 committed by Jonas Platte
parent fdf87a38a2
commit 2b6eba69dd
3 changed files with 71 additions and 42 deletions

View File

@ -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 {

View File

@ -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",

View File

@ -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,13 +162,15 @@ pub enum 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 {
/// 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) = &self.prev_content {
let prev_content = if let Some(prev_content) = &prev_content {
prev_content
} else {
&MemberEventContent {
@ -180,11 +182,11 @@ impl MemberEvent {
}
};
match (prev_content.membership, &self.content.membership) {
match (prev_content.membership, &content.membership) {
(Invite, Invite) | (Leave, Leave) | (Ban, Ban) => MembershipChange::None,
(Invite, Join) | (Leave, Join) => MembershipChange::Joined,
(Invite, Leave) => {
if self.sender == self.state_key {
if sender.as_ref() == state_key {
MembershipChange::InvitationRevoked
} else {
MembershipChange::InvitationRejected
@ -193,11 +195,11 @@ impl MemberEvent {
(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,
displayname_changed: prev_content.displayname != content.displayname,
avatar_url_changed: prev_content.avatar_url != content.avatar_url,
},
(Join, Leave) => {
if self.sender == self.state_key {
if sender.as_ref() == state_key {
MembershipChange::Left
} else {
MembershipChange::Kicked
@ -209,6 +211,32 @@ impl MemberEvent {
(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 {
membership_change(&self.content, self.prev_content.as_ref(), &self.sender, &self.state_key)
}
}
impl StateEventStub<MemberEventContent> {
/// 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<MemberEventContent> {
/// 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)
}
}
#[cfg(test)]