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)); let path = path.iter().map(|s| Ident::new(s, span));
match struct_name.to_string().as_str() { 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" { let redaction = if struct_name == "MessageEvent" {
quote! { RedactionEvent } quote! { RedactionEvent }
} else { } else {

View File

@ -36,6 +36,7 @@ event_enum! {
"m.call.invite", "m.call.invite",
"m.call.hangup", "m.call.hangup",
"m.call.candidates", "m.call.candidates",
"m.room.encrypted",
"m.room.message", "m.room.message",
"m.room.message.feedback", "m.room.message.feedback",
"m.room.redaction", "m.room.redaction",

View File

@ -7,7 +7,7 @@ use ruma_identifiers::UserId;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use strum::{Display, EnumString}; use strum::{Display, EnumString};
use crate::StateEvent; use crate::{StateEvent, StateEventStub, StrippedStateEventStub};
/// The current membership state of a user in the room. /// The current membership state of a user in the room.
/// ///
@ -162,13 +162,15 @@ pub enum MembershipChange {
NotImplemented, NotImplemented,
} }
impl MemberEvent { /// Internal function so all `MemberEventContent` state event kinds can share the same implementation.
/// Helper function for membership change. Check [the specification][spec] for details. fn membership_change(
/// content: &MemberEventContent,
/// [spec]: https://matrix.org/docs/spec/client_server/latest#m-room-member prev_content: Option<&MemberEventContent>,
pub fn membership_change(&self) -> MembershipChange { sender: &UserId,
state_key: &str,
) -> MembershipChange {
use MembershipState::*; 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 prev_content
} else { } else {
&MemberEventContent { &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, Invite) | (Leave, Leave) | (Ban, Ban) => MembershipChange::None,
(Invite, Join) | (Leave, Join) => MembershipChange::Joined, (Invite, Join) | (Leave, Join) => MembershipChange::Joined,
(Invite, Leave) => { (Invite, Leave) => {
if self.sender == self.state_key { if sender.as_ref() == state_key {
MembershipChange::InvitationRevoked MembershipChange::InvitationRevoked
} else { } else {
MembershipChange::InvitationRejected MembershipChange::InvitationRejected
@ -193,11 +195,11 @@ impl MemberEvent {
(Invite, Ban) | (Leave, Ban) => MembershipChange::Banned, (Invite, Ban) | (Leave, Ban) => MembershipChange::Banned,
(Join, Invite) | (Ban, Invite) | (Ban, Join) => MembershipChange::Error, (Join, Invite) | (Ban, Invite) | (Ban, Join) => MembershipChange::Error,
(Join, Join) => MembershipChange::ProfileChanged { (Join, Join) => MembershipChange::ProfileChanged {
displayname_changed: prev_content.displayname != self.content.displayname, displayname_changed: prev_content.displayname != content.displayname,
avatar_url_changed: prev_content.avatar_url != self.content.avatar_url, avatar_url_changed: prev_content.avatar_url != content.avatar_url,
}, },
(Join, Leave) => { (Join, Leave) => {
if self.sender == self.state_key { if sender.as_ref() == state_key {
MembershipChange::Left MembershipChange::Left
} else { } else {
MembershipChange::Kicked MembershipChange::Kicked
@ -209,6 +211,32 @@ impl MemberEvent {
(Knock, _) | (_, Knock) => MembershipChange::NotImplemented, (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)] #[cfg(test)]