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:
parent
fdf87a38a2
commit
2b6eba69dd
@ -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 {
|
||||||
|
@ -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",
|
||||||
|
@ -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)]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user